docking, widget didn't detect a change of site

This commit is contained in:
Basile Burg 2017-03-12 10:42:33 +01:00
parent cd686732d7
commit 64526231f8
No known key found for this signature in database
GPG Key ID: 1868039F415CB8CF
1 changed files with 32 additions and 22 deletions

View File

@ -17,7 +17,13 @@ type
TCEWidget = class; TCEWidget = class;
TWidgetDockingState = (wdsUndocked, wdsDocked); TWidgetDockingState =
(
wdsUndocked, // from docked to undocked
wdsDocked, // from undocked to docked
wdsRedocked // docked from a site to another
);
TWidgetDockingChangedEvent = procedure(sender: TCEWidget; newState: TWidgetDockingState) of object; TWidgetDockingChangedEvent = procedure(sender: TCEWidget; newState: TWidgetDockingState) of object;
{ TCEWidget } { TCEWidget }
@ -45,7 +51,7 @@ type
fIsModal: boolean; fIsModal: boolean;
fToolBarFlat: boolean; fToolBarFlat: boolean;
fToolBarVisible: boolean; fToolBarVisible: boolean;
fOldParent: TWinControl; fOldSiteParent: TWinControl;
// TODO-cdocking: find a better way to detect that the docking state changed // TODO-cdocking: find a better way to detect that the docking state changed
procedure Resize; override; procedure Resize; override;
// a descendant overrides to implement a periodic update. // a descendant overrides to implement a periodic update.
@ -69,7 +75,7 @@ type
public public
constructor create(aOwner: TComponent); override; constructor create(aOwner: TComponent); override;
destructor destroy; override; destructor destroy; override;
// prevent closing when 'locked' is cjecked in the header context menu // prevent closing when 'locked' is checked in the header context menu
function closeQuery: boolean; override; function closeQuery: boolean; override;
// restarts the wait period to the delayed update event. // restarts the wait period to the delayed update event.
// if not re-called during 'updaterByDelayDuration' ms then // if not re-called during 'updaterByDelayDuration' ms then
@ -178,8 +184,10 @@ end;
function TCEWidget.getIfModal: boolean; function TCEWidget.getIfModal: boolean;
begin begin
if isDockable then result := false if isDockable then
else result := fIsModal; result := false
else
result := fIsModal;
end; end;
procedure TCEWidget.showWidget; procedure TCEWidget.showWidget;
@ -195,7 +203,8 @@ begin
win.BringToFront; win.BringToFront;
end; end;
end end
else begin else
begin
if isModal then ShowModal else if isModal then ShowModal else
begin begin
Show; Show;
@ -222,23 +231,24 @@ end;
procedure TCEWidget.Resize; procedure TCEWidget.Resize;
var var
newParent: TWinControl; n: TWinControl = nil;
site: TAnchorDockHostSite; s: TAnchorDockHostSite;
begin begin
inherited; inherited;
site := DockMaster.GetAnchorSite(self); s := DockMaster.GetAnchorSite(self);
if site.isNil then if s.isNotNil then
exit; n := s.Parent;
newParent := site.Parent; if fOldSiteParent <> n then
if fOldParent <> newParent then
begin begin
if fOldParent.isNil and newParent.isNotNil and assigned(fOnDockingChanged) then if fOldSiteParent.isNil and n.isNotNil and assigned(fOnDockingChanged) then
fOnDockingChanged(self, wdsDocked) fOnDockingChanged(self, wdsDocked)
else if fOldParent.isNotNil and newParent.isNil and assigned(fOnDockingChanged) then else if fOldSiteParent.isNotNil and n.isNil and assigned(fOnDockingChanged) then
fOnDockingChanged(self, wdsUndocked); fOnDockingChanged(self, wdsUndocked)
else
fOnDockingChanged(self, wdsRedocked);
fOldSiteParent := n;
end; end;
end; end;
{$ENDREGION} {$ENDREGION}
{$REGION ICEContextualActions---------------------------------------------------} {$REGION ICEContextualActions---------------------------------------------------}