index 38f17fd0c928a893b7bbb1bc75662ea46da8b9ef..26eb5b05770853c06620e6ba91fc0af8e4fc4a29 100644 (file)
--- a/src/flexui/fui_ctls.pas
+++ b/src/flexui/fui_ctls.pas
var
+ uiInsideDispatcher: Boolean = false;
uiTopList: array of TUIControl = nil;
uiGrabCtl: TUIControl = nil;
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
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
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;
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);