TextArea::TextArea(Color hitextcolor, Color initcolor, Color lowtextcolor) { keeplines = 100; rows = 0; startrow = 0; minrow = 0; Cursor = NULL; CurPos = 0; CurLine = 0; seltext = -1; Value = 0xffffffff; ResetEventHandler( TextAreaOnChange ); ResetEventHandler( TextAreaOutOfText ); PortraitResRef[0]=0; palette = core->CreatePalette( hitextcolor, lowtextcolor ); initpalette = core->CreatePalette( initcolor, lowtextcolor ); Color tmp = { hitextcolor.b, hitextcolor.g, hitextcolor.r, 0 }; selected = core->CreatePalette( tmp, lowtextcolor ); tmp.r = 255; tmp.g = 152; tmp.b = 102; lineselpal = core->CreatePalette( tmp, lowtextcolor ); InternalFlags = 1; //Drop Capitals means initials on! core->GetDictionary()->Lookup("Drop Capitals", InternalFlags); if (InternalFlags) { InternalFlags = TA_INITIALS; } }
MapControl::MapControl(void) { if (core->HasFeature(GF_IWD_MAP_DIMENSIONS) ) { MAP_DIV=4; MAP_MULT=32; } else { MAP_DIV=3; MAP_MULT=32; } LinkedLabel = NULL; ScrollX = 0; ScrollY = 0; NotePosX = 0; NotePosY = 0; mouseIsDown = false; mouseIsDragging = false; Changed = true; convertToGame = true; memset(Flag,0,sizeof(Flag) ); // initialize var and event callback to no-ops VarName[0] = 0; ResetEventHandler( MapControlOnPress ); ResetEventHandler( MapControlOnRightPress ); ResetEventHandler( MapControlOnDoublePress ); MyMap = core->GetGame()->GetCurrentArea(); if (MyMap->SmallMap) { MapMOS = MyMap->SmallMap; MapMOS->acquire(); } else MapMOS = NULL; }
Button::Button() { Unpressed = Pressed = Selected = Disabled = NULL; State = IE_GUI_BUTTON_UNPRESSED; ResetEventHandler( ButtonOnPress ); ResetEventHandler( ButtonOnDoublePress ); ResetEventHandler( ButtonOnShiftPress ); ResetEventHandler( ButtonOnRightPress ); ResetEventHandler( ButtonOnDragDrop ); ResetEventHandler( ButtonOnDrag ); ResetEventHandler( MouseEnterButton ); ResetEventHandler( MouseLeaveButton ); ResetEventHandler( MouseOverButton ); //Text = ( char * ) calloc( 64, sizeof(char) ); Text = NULL; hasText = false; font = core->GetButtonFont(); normal_palette = NULL; disabled_palette = font->GetPalette()->Copy(); for (int i = 0; i < 256; i++) { disabled_palette->col[i].r = ( disabled_palette->col[i].r * 2 ) / 3; disabled_palette->col[i].g = ( disabled_palette->col[i].g * 2 ) / 3; disabled_palette->col[i].b = ( disabled_palette->col[i].b * 2 ) / 3; } Flags = IE_GUI_BUTTON_NORMAL; ToggleState = false; Picture = NULL; Clipping = 1.0; memset(&SourceRGB,0,sizeof(SourceRGB)); memset(&DestRGB,0,sizeof(DestRGB)); memset( borders, 0, sizeof( borders )); starttime = 0; }
WorldMapControl::WorldMapControl(const char *font, int direction) { ScrollX = 0; ScrollY = 0; MouseIsDown = false; Changed = true; Area = NULL; Value = direction; Game* game = core->GetGame(); WorldMap* worldmap = core->GetWorldMap(); CopyResRef(currentArea, game->CurrentArea); int entry = core->GetAreaAlias(currentArea); if (entry >= 0) { WMPAreaEntry *m = worldmap->GetEntry(entry); CopyResRef(currentArea, m->AreaResRef); } //if there is no trivial area, look harder if (!worldmap->GetArea(currentArea, (unsigned int &) entry) && core->HasFeature(GF_FLEXIBLE_WMAP) ) { WMPAreaEntry *m = worldmap->FindNearestEntry(currentArea, (unsigned int &) entry); if (m) { CopyResRef(currentArea, m->AreaResRef); } } //this also updates visible locations worldmap->CalculateDistances(currentArea, Value); // alpha bit is unfortunately ignored if (font[0]) { ftext = core->GetFont(font); } else { ftext = NULL; } // initialize label colors // NOTE: it would be better to initialize these colors from // some 2da file Color normal = { 0xf0, 0xf0, 0xf0, 0xff }; Color selected = { 0xf0, 0x80, 0x80, 0xff }; Color notvisited = { 0x80, 0x80, 0xf0, 0xff }; Color black = { 0x00, 0x00, 0x00, 0x00 }; pal_normal = core->CreatePalette ( normal, black ); pal_selected = core->CreatePalette ( selected, black ); pal_notvisited = core->CreatePalette ( notvisited, black ); ResetEventHandler( WorldMapControlOnPress ); ResetEventHandler( WorldMapControlOnEnter ); }
//setting up the textarea for smooth scrolling, the first //TEXTAREA_OUTOFTEXT callback is called automatically void TextArea::SetupScroll(unsigned long tck) { SetPreservedRow(0); smooth = ftext->maxHeight; startrow = 0; ticks = tck; //clearing the textarea Clear(); unsigned int i = (unsigned int) (Height/smooth); while (i--) { char *str = (char *) malloc(1); str[0]=0; lines.push_back(str); lrows.push_back(0); } i = (unsigned int) lines.size(); Flags |= IE_GUI_TEXTAREA_SMOOTHSCROLL; GetTime( starttime ); if (RunEventHandler( TextAreaOutOfText )) { //event handler destructed this object? return; } if (i==lines.size()) { ResetEventHandler( TextAreaOutOfText ); return; } //recalculates rows AppendText("\n",-1); }
Label::Label(Font* font) { this->font = font; Buffer = NULL; useRGB = false; ResetEventHandler( LabelOnPress ); Alignment = IE_FONT_ALIGN_CENTER|IE_FONT_ALIGN_MIDDLE; palette = NULL; }
TextEdit::TextEdit(const Region& frame, unsigned short maxLength, unsigned short px, unsigned short py) : Control(frame) { ControlType = IE_GUI_EDIT; max = maxLength; FontPosX = px; FontPosY = py; Alignment = IE_FONT_ALIGN_MIDDLE | IE_FONT_ALIGN_LEFT; font = NULL; Cursor = NULL; Back = NULL; CurPos = 0; Text.reserve(max); ResetEventHandler( EditOnChange ); ResetEventHandler( EditOnDone ); ResetEventHandler( EditOnCancel ); //Original engine values //Color white = {0xc8, 0xc8, 0xc8, 0x00}, black = {0x3c, 0x3c, 0x3c, 0x00}; palette = new Palette( ColorWhite, ColorBlack ); }
ScrollBar::ScrollBar(void) { Pos = 0; Value = 10; State = 0; ResetEventHandler( ScrollBarOnChange ); ta = NULL; for(int i=0;i<SB_RES_COUNT;i++) { Frames[i]=NULL; } }
Label::Label(const Region& frame, Font* font, const String& string) : Control(frame) { ControlType = IE_GUI_LABEL; this->font = font; useRGB = false; ResetEventHandler( LabelOnPress ); palette = NULL; SetAlignment(IE_FONT_ALIGN_CENTER|IE_FONT_ALIGN_MIDDLE); SetText(string); }
Progressbar::Progressbar(const Region& frame, unsigned short KnobStepsCount, bool Clear) : Control(frame) { ControlType = IE_GUI_PROGRESSBAR; BackGround = NULL; BackGround2 = NULL; this->Clear = Clear; this->KnobStepsCount = KnobStepsCount; PBarAnim = NULL; PBarCap = NULL; KnobXPos = KnobYPos = 0; CapXPos = CapYPos = 0; ResetEventHandler( EndReached ); }
Slider::Slider(short KnobXPos, short KnobYPos, short KnobStep, unsigned short KnobStepsCount, bool Clear) { this->KnobXPos = KnobXPos; this->KnobYPos = KnobYPos; this->KnobStep = KnobStep; this->KnobStepsCount = KnobStepsCount; Knob = NULL; GrabbedKnob = NULL; BackGround = NULL; this->Clear = Clear; ResetEventHandler( SliderOnChange ); State = IE_GUI_SLIDER_KNOB; Pos = 0; Value = 1; }
Button::Button(Region& frame) : Control(frame), buttonImages() { ControlType = IE_GUI_BUTTON; State = IE_GUI_BUTTON_UNPRESSED; ResetEventHandler( ButtonOnPress ); ResetEventHandler( ButtonOnDoublePress ); ResetEventHandler( ButtonOnShiftPress ); ResetEventHandler( ButtonOnRightPress ); ResetEventHandler( ButtonOnDragDrop ); ResetEventHandler( ButtonOnDrag ); ResetEventHandler( MouseEnterButton ); ResetEventHandler( MouseLeaveButton ); ResetEventHandler( MouseOverButton ); //Text = ( char * ) calloc( 64, sizeof(char) ); Text = NULL; hasText = false; font = core->GetButtonFont(); normal_palette = NULL; disabled_palette = font->GetPalette()->Copy(); for (int i = 0; i < 256; i++) { disabled_palette->col[i].r = ( disabled_palette->col[i].r * 2 ) / 3; disabled_palette->col[i].g = ( disabled_palette->col[i].g * 2 ) / 3; disabled_palette->col[i].b = ( disabled_palette->col[i].b * 2 ) / 3; } Flags = IE_GUI_BUTTON_NORMAL; ToggleState = false; Picture = NULL; Clipping = 1.0; memset(&SourceRGB,0,sizeof(SourceRGB)); memset(&DestRGB,0,sizeof(DestRGB)); memset( borders, 0, sizeof( borders )); starttime = 0; Anchor.null(); PushOffset = Point(2, 2); }
void TextArea::Draw(unsigned short x, unsigned short y) { /** Don't come back recursively */ if (InternalFlags&TA_BITEMYTAIL) { return; } int tx=x+XPos; int ty=y+YPos; Region clip( tx, ty, Width, Height ); Video *video = core->GetVideoDriver(); if (Flags&IE_GUI_TEXTAREA_SPEAKER) { if (AnimPicture) { video->BlitSprite(AnimPicture, tx,ty, true, &clip); clip.x+=AnimPicture->Width; clip.w-=AnimPicture->Width; } } //this might look better in GlobalTimer //or you might want to change the animated button to work like this if (Flags &IE_GUI_TEXTAREA_SMOOTHSCROLL) { unsigned long thisTime; GetTime( thisTime); if (thisTime>starttime) { starttime = thisTime+ticks; smooth--; while (smooth<=0) { smooth+=ftext->maxHeight; if (startrow<rows) { startrow++; } } /** Forcing redraw of whole screen before drawing text*/ Owner->Invalidate(); InternalFlags |= TA_BITEMYTAIL; Owner->DrawWindow(); InternalFlags &= ~TA_BITEMYTAIL; } } if (!Changed && !(Owner->Flags&WF_FLOAT) ) { return; } Changed = false; if (XPos == 65535) { return; } size_t linesize = lines.size(); if (linesize == 0) { return; } //smooth vertical scrolling up if (Flags & IE_GUI_TEXTAREA_SMOOTHSCROLL) { clip.y+=smooth; clip.h-=smooth; } //if textarea is 'selectable' it actually means, it is a listbox //in this case the selected value equals the line number //if it is 'not selectable' it can still have selectable lines //but then it is like the dialog window in the main game screen: //the selected value is encoded into the line if (!(Flags & IE_GUI_TEXTAREA_SELECTABLE) ) { char* Buffer = (char *) malloc( 1 ); Buffer[0] = 0; int len = 0; int lastlen = 0; for (size_t i = 0; i < linesize; i++) { if (strnicmp( "[s=", lines[i], 3 ) == 0) { int tlen; unsigned long idx, acolor, bcolor; char* rest; idx = strtoul( lines[i] + 3, &rest, 0 ); if (*rest != ',') goto notmatched; acolor = strtoul( rest + 1, &rest, 16 ); if (*rest != ',') goto notmatched; bcolor = strtoul( rest + 1, &rest, 16 ); if (*rest != ']') goto notmatched; tlen = (int)(strstr( rest + 1, "[/s]" ) - rest - 1); if (tlen < 0) goto notmatched; len += tlen + 23; Buffer = (char *) realloc( Buffer, len + 2 ); if (seltext == (int) i) { sprintf( Buffer + lastlen, "[color=%6.6lX]%.*s[/color]", acolor, tlen, rest + 1 ); } else { sprintf( Buffer + lastlen, "[color=%6.6lX]%.*s[/color]", bcolor, tlen, rest + 1 ); } } else { notmatched: len += ( int ) strlen( lines[i] ) + 1; Buffer = (char *) realloc( Buffer, len + 2 ); memcpy( &Buffer[lastlen], lines[i], len - lastlen ); } lastlen = len; if (i != linesize - 1) { Buffer[lastlen - 1] = '\n'; Buffer[lastlen] = 0; } } video->SetClipRect( &clip ); int pos; if (startrow==CurLine) { pos = CurPos; } else { pos = -1; } ftext->PrintFromLine( startrow, clip, ( unsigned char * ) Buffer, palette, IE_FONT_ALIGN_LEFT, finit, Cursor, pos ); free( Buffer ); video->SetClipRect( NULL ); //streaming text if (linesize>50) { //the buffer is filled enough return; } if (core->GetAudioDrv()->IsSpeaking() ) { //the narrator is still talking return; } if (RunEventHandler( TextAreaOutOfText )) { return; } if (linesize==lines.size()) { ResetEventHandler( TextAreaOutOfText ); return; } AppendText("\n",-1); return; } // normal scrolling textarea int rc = 0; int sr = startrow; unsigned int i; int yl; for (i = 0; i < linesize; i++) { if (rc + lrows[i] <= sr) { rc += lrows[i]; continue; } sr -= rc; Palette* pal = NULL; if (seltext == (int) i) pal = selected; else if (Value == i) pal = lineselpal; else pal = palette; ftext->PrintFromLine( sr, clip, ( unsigned char * ) lines[i], pal, IE_FONT_ALIGN_LEFT, finit, NULL ); yl = ftext->size[1].h*(lrows[i]-sr); clip.y+=yl; clip.h-=yl; break; } for (i++; i < linesize; i++) { Palette* pal = NULL; if (seltext == (int) i) pal = selected; else if (Value == i) pal = lineselpal; else pal = palette; ftext->Print( clip, ( unsigned char * ) lines[i], pal, IE_FONT_ALIGN_LEFT, true ); yl = ftext->size[1].h*lrows[i]; clip.y+=yl; clip.h-=yl; } }