From 44b2ed66f194bb88399d31b6af37be9d38fe6a73 Mon Sep 17 00:00:00 2001 From: Basile Burg Date: Thu, 7 Jul 2016 09:07:15 +0200 Subject: [PATCH] docking, set MW event when new widgets are docked --- src/ce_main.pas | 8 +++++++- src/ce_widget.pas | 32 +++++++++++++++++++++++++++++++- 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/src/ce_main.pas b/src/ce_main.pas index b81be245..60ad711d 100644 --- a/src/ce_main.pas +++ b/src/ce_main.pas @@ -316,6 +316,7 @@ type fProjActionsLock: boolean; procedure updateMainMenuProviders; procedure updateFloatingWidgetOnTop(onTop: boolean); + procedure widgetDockingChanged(sender: TCEWidget; newState: TWidgetDockingState); // action provider handling; procedure clearActProviderEntries; @@ -1097,7 +1098,6 @@ begin Handled := true; end; -//TODO-cdocking: set splitter MW event when a new widget is docked procedure TCEMainForm.setSplitterWheelEvent; var i: integer; @@ -1122,6 +1122,11 @@ begin end; end; +procedure TCEMainForm.widgetDockingChanged(sender: TCEWidget; newState: TWidgetDockingState); +begin + setSplitterWheelEvent; +end; + procedure TCEMainForm.InitDocking; var i: Integer; @@ -1148,6 +1153,7 @@ begin if not widg.isDockable then continue; DockMaster.MakeDockable(widg, true); DockMaster.GetAnchorSite(widg).Header.HeaderPosition := adlhpTop; + widg.onDockingChanged:= @widgetDockingChanged; end; // load existing or default docking diff --git a/src/ce_widget.pas b/src/ce_widget.pas index 467a49b5..953d0c82 100644 --- a/src/ce_widget.pas +++ b/src/ce_widget.pas @@ -6,7 +6,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls, ActnList, Menus, - AnchorDocking, ce_interfaces, ce_dsgncontrols; + AnchorDocking, ce_interfaces, ce_dsgncontrols, ce_common; type @@ -15,6 +15,11 @@ type *) PTCEWidget = ^TCEWidget; + TCEWidget = class; + + TWidgetDockingState = (wdsUndocked, wdsDocked); + TWidgetDockingChangedEvent = procedure(sender: TCEWidget; newState: TWidgetDockingState) of object; + { TCEWidget } TCEWidget = class(TForm, ICEContextualActions) @@ -30,6 +35,7 @@ type fUpdaterDelay: TTimer; fImperativeUpdateCount: Integer; fLoopUpdateCount: Integer; + fOnDockingChanged: TWidgetDockingChangedEvent; procedure setDelayDur(aValue: Integer); procedure setLoopInt(aValue: Integer); procedure updaterAutoProc(Sender: TObject); @@ -39,6 +45,9 @@ type fIsModal: boolean; fToolBarFlat: boolean; fToolBarVisible: boolean; + fOldParent: TWinControl; + // TODO-cdocking: find a better way to detect that the docking state changed + procedure Resize; override; // a descendant overrides to implement a periodic update. procedure updateLoop; virtual; // a descendant overrides to implement an imperative update. @@ -93,6 +102,7 @@ type property toolbarFlat: boolean read fToolBarFlat write setToolBarFlat; property toolbarVisible: boolean read fToolBarVisible write setToolBarVisible; + property onDockingChanged: TWidgetDockingChangedEvent read fOnDockingChanged write fOnDockingChanged; end; (** @@ -209,6 +219,26 @@ begin toolbar.Flat := value; fToolBarFlat := value; end; + +procedure TCEWidget.Resize; +var + newParent: TWinControl; + site: TAnchorDockHostSite; +begin + inherited; + site := DockMaster.GetAnchorSite(self); + if site.isNil then + exit; + newParent := site.Parent; + if fOldParent <> newParent then + begin + if fOldParent.isNil and newParent.isNotNil and assigned(fOnDockingChanged) then + fOnDockingChanged(self, wdsDocked) + else if fOldParent.isNotNil and newParent.isNil and assigned(fOnDockingChanged) then + fOnDockingChanged(self, wdsUndocked); + end; +end; + {$ENDREGION} {$REGION ICEContextualActions---------------------------------------------------}