/** Redraw all the Window */ void Window::Invalidate() { DefaultControl[0] = -1; DefaultControl[1] = -1; ScrollControl = -1; unsigned int i = 0; for (std::vector<Control*>::iterator m = Controls.begin(); m != Controls.end(); ++m, ++i) { Control *ctrl = *m; ctrl->MarkDirty(); switch (ctrl->ControlType) { case IE_GUI_SCROLLBAR: if ((ScrollControl == -1) || (ctrl->Flags & IE_GUI_SCROLLBAR_DEFAULT)) ScrollControl = i; break; case IE_GUI_BUTTON: if (ctrl->Flags & IE_GUI_BUTTON_DEFAULT) { DefaultControl[0] = i; } if (ctrl->Flags & IE_GUI_BUTTON_CANCEL) { DefaultControl[1] = i; } break; case IE_GUI_GAMECONTROL: DefaultControl[0] = DefaultControl[1] = i; break; default: ; } } Flags |= WF_CHANGED; }
/** This function Draws the Window on the Output Screen */ void Window::DrawWindow() { if (!Visible) return; // no point in drawing invisible windows Video* video = core->GetVideoDriver(); Region clip( XPos, YPos, Width, Height ); //Frame && Changed if ( (Flags & (WF_FRAME|WF_CHANGED) ) == (WF_FRAME|WF_CHANGED) ) { Region screen( 0, 0, core->Width, core->Height ); video->SetScreenClip( NULL ); //removed this? video->DrawRect( screen, ColorBlack ); if (core->WindowFrames[0]) video->BlitSprite( core->WindowFrames[0], 0, 0, true ); if (core->WindowFrames[1]) video->BlitSprite( core->WindowFrames[1], core->Width - core->WindowFrames[1]->Width, 0, true ); if (core->WindowFrames[2]) video->BlitSprite( core->WindowFrames[2], (core->Width - core->WindowFrames[2]->Width) / 2, 0, true ); if (core->WindowFrames[3]) video->BlitSprite( core->WindowFrames[3], (core->Width - core->WindowFrames[3]->Width) / 2, core->Height - core->WindowFrames[3]->Height, true ); } video->SetScreenClip( &clip ); //Float || Changed bool bgRefreshed = false; if (BackGround && (Flags & (WF_FLOAT|WF_CHANGED) ) ) { DrawBackground(NULL); bgRefreshed = true; } std::vector< Control*>::iterator m; for (m = Controls.begin(); m != Controls.end(); ++m) { Control* c = *m; // FIXME: drawing BG in the same loop as controls can produce incorrect results with overlapping controls. the only case I know of this occuring it is ok due to no BG drawing // furthermore, overlapping controls are still a problem when NeedsDraw() returns false for the top control, but true for the bottom (see the level up icon on char portraits) // we will fix both issues later by refactoring with the concept of views and subviews if (BackGround && !bgRefreshed && !c->IsOpaque() && c->NeedsDraw()) { const Region& fromClip = c->ControlFrame(); DrawBackground(&fromClip); } if (Flags & (WF_FLOAT)) { // FIXME: this is a total hack. Required for anything drawing over GameControl (nothing really at all to do with floating) c->MarkDirty(); } c->Draw( XPos, YPos ); } if ( (Flags&WF_CHANGED) && (Visible == WINDOW_GRAYED) ) { Color black = { 0, 0, 0, 128 }; video->DrawRect(clip, black); } video->SetScreenClip( NULL ); Flags &= ~WF_CHANGED; }