From 34b9017efb5e80bd66438479d10d7d442f24ad6d Mon Sep 17 00:00:00 2001 From: Ketmar Dark Date: Wed, 4 Oct 2017 23:28:29 +0300 Subject: [PATCH] FlexUI: set window size vars to actual window size; Holmes: destroy help window when it is hidden --- src/flexui/fui_ctls.pas | 32 +++++++++++++++++++++++++++++++- src/game/g_holmes.pas | 9 +++++++-- src/game/g_window.pas | 6 ++++++ 3 files changed, 44 insertions(+), 3 deletions(-) diff --git a/src/flexui/fui_ctls.pas b/src/flexui/fui_ctls.pas index 38f17fd..26eb5b0 100644 --- a/src/flexui/fui_ctls.pas +++ b/src/flexui/fui_ctls.pas @@ -587,6 +587,7 @@ uses var + uiInsideDispatcher: Boolean = false; uiTopList: array of TUIControl = nil; uiGrabCtl: TUIControl = nil; @@ -850,9 +851,12 @@ var var svx, svy, svdx, svdy: Integer; svscale: Single; + odp: Boolean; begin processKills(); if (not evt.alive) then exit; + odp := uiInsideDispatcher; + uiInsideDispatcher := true; //writeln('ENTER: FUI DISPATCH'); ev := evt; // normalize mouse coordinates @@ -878,6 +882,7 @@ begin dispatchTo(uiGetFocusedCtl); end; finally + uiInsideDispatcher := odp; if (ev.x = svx) and (ev.y = svy) and (ev.dx = svdx) and (ev.dy = svdy) then begin // due to possible precision loss @@ -945,7 +950,12 @@ end; function uiGetFocusedCtl (): TUIControl; begin - if (Length(uiTopList) > 0) and (uiTopList[High(uiTopList)].enabled) then result := uiTopList[High(uiTopList)].mFocused else result := nil; + result := nil; + if (Length(uiTopList) > 0) and (uiTopList[High(uiTopList)].enabled) then + begin + result := uiTopList[High(uiTopList)].mFocused; + if (result = nil) then result := uiTopList[High(uiTopList)]; + end; end; @@ -1067,7 +1077,27 @@ end; destructor TUIControl.Destroy (); var f, c: Integer; + doActivateOtherWin: Boolean = false; begin + if (uiInsideDispatcher) then raise Exception.Create('FlexUI: cannot destroy objects in event dispatcher'); + if (uiGrabCtl = self) then uiGrabCtl := nil; + // just in case, check if this is top-level shit + for f := 0 to High(uiTopList) do + begin + if (uiTopList[f] = self) then + begin + if (uiGrabCtl <> nil) and (isMyChild(uiGrabCtl)) then uiGrabCtl := nil; + for c := f+1 to High(uiTopList) do uiTopList[c-1] := uiTopList[c]; + SetLength(uiTopList, Length(uiTopList)-1); + doActivateOtherWin := true; + break; + end; + end; + if (doActivateOtherWin) and (Length(uiTopList) > 0) and (uiTopList[High(uiTopList)].enabled) then + begin + uiTopList[High(uiTopList)].activated(); + end; + // other checks if (mParent <> nil) then begin setFocused(false); diff --git a/src/game/g_holmes.pas b/src/game/g_holmes.pas index 166cb61..9c846ab 100644 --- a/src/game/g_holmes.pas +++ b/src/game/g_holmes.pas @@ -488,10 +488,15 @@ end; procedure toggleHelpWindow (arg: Integer=-1); begin - if (winHelp = nil) then createHelpWindow(); + if (winHelp = nil) then + begin + if (arg = 0) then exit; + createHelpWindow(); + end; if (arg < 0) then begin if not uiVisibleWindow(winHelp) then uiAddWindow(winHelp) else uiRemoveWindow(winHelp); end else if (arg = 0) then begin if uiVisibleWindow(winHelp) then uiRemoveWindow(winHelp); end - else begin if not uiVisibleWindow(winHelp) then uiAddWindow(winHelp); end + else begin if (not uiVisibleWindow(winHelp)) then uiAddWindow(winHelp); end; + if (not uiVisibleWindow(winHelp)) then FreeAndNil(winHelp); end; procedure toggleOptionsWindow (arg: Integer=-1); diff --git a/src/game/g_window.pas b/src/game/g_window.pas index 80e63fd..e3cecb7 100644 --- a/src/game/g_window.pas +++ b/src/game/g_window.pas @@ -133,6 +133,8 @@ begin SDL_GL_MakeCurrent(h_Wnd, h_GL); SDL_ShowCursor(SDL_DISABLE); + fuiScrWdt := gScreenWidth; + fuiScrHgt := gScreenHeight; if (h_GL <> nil) then begin if (assigned(oglInitCB)) then oglInitCB(); end; {$ENDIF} @@ -179,6 +181,8 @@ begin gWinSizeX := gScreenWidth; gWinSizeY := gScreenHeight; {$IF not DEFINED(HEADLESS)} + fuiScrWdt := gScreenWidth; + fuiScrHgt := gScreenHeight; e_ResizeWindow(gScreenWidth, gScreenHeight); g_Game_SetupScreenSize(); g_Menu_Reset(); @@ -463,6 +467,8 @@ begin {$IF not DEFINED(HEADLESS)} h_Gl := SDL_GL_CreateContext(h_Wnd); if (h_Gl = nil) then exit; + fuiScrWdt := gScreenWidth; + fuiScrHgt := gScreenHeight; if (assigned(oglInitCB)) then oglInitCB(); {$ENDIF} -- 2.29.2