docking, set MW event when new widgets are docked

This commit is contained in:
Basile Burg 2016-07-07 09:07:15 +02:00
parent 1be94f8095
commit 44b2ed66f1
2 changed files with 38 additions and 2 deletions

View File

@ -316,6 +316,7 @@ type
fProjActionsLock: boolean; fProjActionsLock: boolean;
procedure updateMainMenuProviders; procedure updateMainMenuProviders;
procedure updateFloatingWidgetOnTop(onTop: boolean); procedure updateFloatingWidgetOnTop(onTop: boolean);
procedure widgetDockingChanged(sender: TCEWidget; newState: TWidgetDockingState);
// action provider handling; // action provider handling;
procedure clearActProviderEntries; procedure clearActProviderEntries;
@ -1097,7 +1098,6 @@ begin
Handled := true; Handled := true;
end; end;
//TODO-cdocking: set splitter MW event when a new widget is docked
procedure TCEMainForm.setSplitterWheelEvent; procedure TCEMainForm.setSplitterWheelEvent;
var var
i: integer; i: integer;
@ -1122,6 +1122,11 @@ begin
end; end;
end; end;
procedure TCEMainForm.widgetDockingChanged(sender: TCEWidget; newState: TWidgetDockingState);
begin
setSplitterWheelEvent;
end;
procedure TCEMainForm.InitDocking; procedure TCEMainForm.InitDocking;
var var
i: Integer; i: Integer;
@ -1148,6 +1153,7 @@ begin
if not widg.isDockable then continue; if not widg.isDockable then continue;
DockMaster.MakeDockable(widg, true); DockMaster.MakeDockable(widg, true);
DockMaster.GetAnchorSite(widg).Header.HeaderPosition := adlhpTop; DockMaster.GetAnchorSite(widg).Header.HeaderPosition := adlhpTop;
widg.onDockingChanged:= @widgetDockingChanged;
end; end;
// load existing or default docking // load existing or default docking

View File

@ -6,7 +6,7 @@ interface
uses uses
Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls, ActnList, Menus, Classes, SysUtils, FileUtil, Forms, Controls, ExtCtrls, ActnList, Menus,
AnchorDocking, ce_interfaces, ce_dsgncontrols; AnchorDocking, ce_interfaces, ce_dsgncontrols, ce_common;
type type
@ -15,6 +15,11 @@ type
*) *)
PTCEWidget = ^TCEWidget; PTCEWidget = ^TCEWidget;
TCEWidget = class;
TWidgetDockingState = (wdsUndocked, wdsDocked);
TWidgetDockingChangedEvent = procedure(sender: TCEWidget; newState: TWidgetDockingState) of object;
{ TCEWidget } { TCEWidget }
TCEWidget = class(TForm, ICEContextualActions) TCEWidget = class(TForm, ICEContextualActions)
@ -30,6 +35,7 @@ type
fUpdaterDelay: TTimer; fUpdaterDelay: TTimer;
fImperativeUpdateCount: Integer; fImperativeUpdateCount: Integer;
fLoopUpdateCount: Integer; fLoopUpdateCount: Integer;
fOnDockingChanged: TWidgetDockingChangedEvent;
procedure setDelayDur(aValue: Integer); procedure setDelayDur(aValue: Integer);
procedure setLoopInt(aValue: Integer); procedure setLoopInt(aValue: Integer);
procedure updaterAutoProc(Sender: TObject); procedure updaterAutoProc(Sender: TObject);
@ -39,6 +45,9 @@ type
fIsModal: boolean; fIsModal: boolean;
fToolBarFlat: boolean; fToolBarFlat: boolean;
fToolBarVisible: 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. // a descendant overrides to implement a periodic update.
procedure updateLoop; virtual; procedure updateLoop; virtual;
// a descendant overrides to implement an imperative update. // a descendant overrides to implement an imperative update.
@ -93,6 +102,7 @@ type
property toolbarFlat: boolean read fToolBarFlat write setToolBarFlat; property toolbarFlat: boolean read fToolBarFlat write setToolBarFlat;
property toolbarVisible: boolean read fToolBarVisible write setToolBarVisible; property toolbarVisible: boolean read fToolBarVisible write setToolBarVisible;
property onDockingChanged: TWidgetDockingChangedEvent read fOnDockingChanged write fOnDockingChanged;
end; end;
(** (**
@ -209,6 +219,26 @@ begin
toolbar.Flat := value; toolbar.Flat := value;
fToolBarFlat := value; fToolBarFlat := value;
end; 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} {$ENDREGION}
{$REGION ICEContextualActions---------------------------------------------------} {$REGION ICEContextualActions---------------------------------------------------}