diff --git a/examples/anchordocking/anchordocking.pas b/examples/anchordocking/anchordocking.pas index d3fb424c88..ef702b6940 100644 --- a/examples/anchordocking/anchordocking.pas +++ b/examples/anchordocking/anchordocking.pas @@ -386,6 +386,7 @@ type HeaderButtonSize: integer; procedure LoadFromConfig(Config: TConfigStorage); procedure SaveToConfig(Config: TConfigStorage); + function IsEqual(Settings: TAnchorDockSettings): boolean; reintroduce; end; TAnchorDockMaster = class; @@ -513,6 +514,7 @@ type procedure SaveSettingsToConfig(Config: TConfigStorage); procedure LoadSettings(Settings: TAnchorDockSettings); procedure SaveSettings(Settings: TAnchorDockSettings); + function SettingsAreEqual(Settings: TAnchorDockSettings): boolean; // manual docking procedure ManualFloat(AControl: TControl); @@ -1003,6 +1005,24 @@ begin Config.UndoAppendBasePath; end; +function TAnchorDockSettings.IsEqual(Settings: TAnchorDockSettings): boolean; +begin + debugln(['TAnchorDockSettings.IsEqual ',DragTreshold,' ',Settings.DragTreshold]); + Result:=(DragTreshold=Settings.DragTreshold) + and (DockOutsideMargin=Settings.DockOutsideMargin) + and (DockParentMargin=Settings.DockParentMargin) + and (PageAreaInPercent=Settings.PageAreaInPercent) + and (HeaderAlignTop=Settings.HeaderAlignTop) + and (HeaderAlignLeft=Settings.HeaderAlignLeft) + and (HeaderHint=Settings.HeaderHint) + and (SplitterWidth=Settings.SplitterWidth) + and (ScaleOnResize=Settings.ScaleOnResize) + and (ShowHeaderCaption=Settings.ShowHeaderCaption) + and (HideHeaderCaptionFloatingControl=Settings.HideHeaderCaptionFloatingControl) + and (AllowDragging=Settings.AllowDragging) + and (HeaderButtonSize=Settings.HeaderButtonSize); +end; + { TAnchorDockMaster } function TAnchorDockMaster.GetControls(Index: integer): TControl; @@ -2361,6 +2381,20 @@ begin Settings.HeaderButtonSize:=HeaderButtonSize; end; +function TAnchorDockMaster.SettingsAreEqual(Settings: TAnchorDockSettings + ): boolean; +var + Cur: TAnchorDockSettings; +begin + Cur:=TAnchorDockSettings.Create; + try + SaveSettings(Cur); + Result:=Cur.IsEqual(Settings); + finally + Cur.Free; + end; +end; + procedure TAnchorDockMaster.ManualFloat(AControl: TControl); var Site: TAnchorDockHostSite; diff --git a/examples/anchordocking/anchordockoptionsdlg.pas b/examples/anchordocking/anchordockoptionsdlg.pas index 1296bc87f3..576c539410 100644 --- a/examples/anchordocking/anchordockoptionsdlg.pas +++ b/examples/anchordocking/anchordockoptionsdlg.pas @@ -35,7 +35,7 @@ interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, ButtonPanel, - StdCtrls, ComCtrls, AnchorDocking, AnchorDockStr; + StdCtrls, ComCtrls, LCLProc, AnchorDocking, AnchorDockStr; type @@ -60,7 +60,9 @@ type procedure SplitterWidthTrackBarChange(Sender: TObject); private FMaster: TAnchorDockMaster; + FSettings: TAnchorDockSettings; procedure SetMaster(const AValue: TAnchorDockMaster); + procedure SetSettings(AValue: TAnchorDockSettings); procedure UpdateDragThresholdLabel; procedure UpdateHeaderAlignTopLabel; procedure UpdateHeaderAlignLeftLabel; @@ -68,7 +70,10 @@ type public procedure SaveToMaster; procedure LoadFromMaster; + procedure SaveToSettings(TheSettings: TAnchorDockSettings); + procedure LoadFromSettings(TheSettings: TAnchorDockSettings); property Master: TAnchorDockMaster read FMaster write SetMaster; + property Settings: TAnchorDockSettings read FSettings write SetSettings; end; function ShowAnchorDockOptions(ADockMaster: TAnchorDockMaster): TModalResult; @@ -125,7 +130,10 @@ end; procedure TAnchorDockOptionsFrame.OkClick(Sender: TObject); begin - SaveToMaster; + if Settings<>nil then + SaveToSettings(Settings); + if Master<>nil then + SaveToMaster; end; procedure TAnchorDockOptionsFrame.DragThresholdTrackBarChange(Sender: TObject); @@ -141,6 +149,14 @@ begin LoadFromMaster; end; +procedure TAnchorDockOptionsFrame.SetSettings(AValue: TAnchorDockSettings); +begin + if FSettings=AValue then Exit; + FSettings:=AValue; + if Settings<>nil then + LoadFromSettings(Settings); +end; + procedure TAnchorDockOptionsFrame.UpdateDragThresholdLabel; begin DragThresholdLabel.Caption:=adrsDragThreshold @@ -166,49 +182,79 @@ begin end; procedure TAnchorDockOptionsFrame.SaveToMaster; +var + CurSettings: TAnchorDockSettings; begin - Master.DragTreshold := DragThresholdTrackBar.Position; - Master.HeaderAlignTop := HeaderAlignTopTrackBar.Position; - Master.HeaderAlignLeft := HeaderAlignLeftTrackBar.Position; - Master.SplitterWidth := SplitterWidthTrackBar.Position; - Master.ScaleOnResize := ScaleOnResizeCheckBox.Checked; - Master.ShowHeaderCaption := ShowHeaderCaptionCheckBox.Checked; - Master.HideHeaderCaptionFloatingControl := HideHeaderCaptionForFloatingCheckBox.Checked; + CurSettings:=TAnchorDockSettings.Create; + try + SaveToSettings(CurSettings); + Master.LoadSettings(CurSettings); + finally + CurSettings.Free; + end; end; procedure TAnchorDockOptionsFrame.LoadFromMaster; +var + CurSettings: TAnchorDockSettings; +begin + CurSettings:=TAnchorDockSettings.Create; + try + Master.SaveSettings(CurSettings); + LoadFromSettings(CurSettings); + finally + CurSettings.Free; + end; +end; + +procedure TAnchorDockOptionsFrame.SaveToSettings( + TheSettings: TAnchorDockSettings); +begin + TheSettings.DragTreshold := DragThresholdTrackBar.Position; + DebugLn(['TAnchorDockOptionsFrame.SaveToSettings ',TheSettings.DragTreshold,' ',DragThresholdTrackBar.Position]); + TheSettings.HeaderAlignTop := HeaderAlignTopTrackBar.Position; + TheSettings.HeaderAlignLeft := HeaderAlignLeftTrackBar.Position; + TheSettings.SplitterWidth := SplitterWidthTrackBar.Position; + TheSettings.ScaleOnResize := ScaleOnResizeCheckBox.Checked; + TheSettings.ShowHeaderCaption := ShowHeaderCaptionCheckBox.Checked; + TheSettings.HideHeaderCaptionFloatingControl := HideHeaderCaptionForFloatingCheckBox.Checked; +end; + +procedure TAnchorDockOptionsFrame.LoadFromSettings( + TheSettings: TAnchorDockSettings); begin DragThresholdTrackBar.Hint:= adrsAmountOfPixelTheMouseHasToDragBeforeDragStarts; - DragThresholdTrackBar.Position:=Master.DragTreshold; + DragThresholdTrackBar.Position:=TheSettings.DragTreshold; UpdateDragThresholdLabel; HeaderAlignTopTrackBar.Hint:= adrsMoveHeaderToTopWhenWidthHeight100HeaderAlignTop; - HeaderAlignTopTrackBar.Position:=Master.HeaderAlignTop; + HeaderAlignTopTrackBar.Position:=TheSettings.HeaderAlignTop; UpdateHeaderAlignTopLabel; HeaderAlignLeftTrackBar.Hint:= adrsMoveHeaderToLeftWhenWidthHeight100HeaderAlignLeft; - HeaderAlignLeftTrackBar.Position:=Master.HeaderAlignLeft; + HeaderAlignLeftTrackBar.Position:=TheSettings.HeaderAlignLeft; UpdateHeaderAlignLeftLabel; SplitterWidthTrackBar.Hint:=adrsSplitterThickness; - SplitterWidthTrackBar.Position:=Master.SplitterWidth; + SplitterWidthTrackBar.Position:=TheSettings.SplitterWidth; UpdateSplitterWidthLabel; ScaleOnResizeCheckBox.Caption:=adrsScaleOnResize; ScaleOnResizeCheckBox.Hint:=adrsScaleSubSitesWhenASiteIsResized; - ScaleOnResizeCheckBox.Checked:=Master.ScaleOnResize; + ScaleOnResizeCheckBox.Checked:=TheSettings.ScaleOnResize; ShowHeaderCaptionCheckBox.Caption:=adrsShowHeaderCaptions; ShowHeaderCaptionCheckBox.Hint:=adrsShowCaptionsOfDockedControlsInTheHeader; - ShowHeaderCaptionCheckBox.Checked:=Master.ShowHeaderCaption; + ShowHeaderCaptionCheckBox.Checked:=TheSettings.ShowHeaderCaption; HideHeaderCaptionForFloatingCheckBox.Caption:=adrsNoCaptionsForFloatingSites; HideHeaderCaptionForFloatingCheckBox.Hint:= adrsHideHeaderCaptionsForSitesWithOnlyOneDockedControl; - HideHeaderCaptionForFloatingCheckBox.Checked:=Master.HideHeaderCaptionFloatingControl; + HideHeaderCaptionForFloatingCheckBox.Checked:= + TheSettings.HideHeaderCaptionFloatingControl; end; end. diff --git a/examples/anchordocking/design/registeranchordocking.pas b/examples/anchordocking/design/registeranchordocking.pas index c5dfa85171..580df75766 100644 --- a/examples/anchordocking/design/registeranchordocking.pas +++ b/examples/anchordocking/design/registeranchordocking.pas @@ -81,7 +81,7 @@ type procedure MakeIDEWindowDockSite(AForm: TCustomForm; ASides: TDockSides = [alBottom]); override; procedure MakeIDEWindowDockable(AControl: TWinControl); override; function AddableInWindowMenu(AForm: TCustomForm): boolean; override; - function GetDefaultLayoutFilename: string; + function GetDefaultLayoutFilename(Full: boolean): string; procedure LoadDefaultLayout; procedure LoadUserLayout; procedure SaveUserLayout; @@ -107,6 +107,8 @@ type TAnchorDockIDEFrame = class(TAbstractIDEOptionsEditor) EnableCheckBox: TCheckBox; NoteLabel: TLabel; + private + FSettings: TAnchorDockSettings; public OptionsFrame: TAnchorDockOptionsFrame; constructor Create(TheOwner: TComponent); override; @@ -261,9 +263,11 @@ begin Result:=true; end; -function TIDEAnchorDockMaster.GetDefaultLayoutFilename: string; +function TIDEAnchorDockMaster.GetDefaultLayoutFilename(Full: boolean): string; begin - Result:=AppendPathDelim(LazarusIDE.GetPrimaryConfigPath)+DefaultConfigFileName; + Result:=DefaultConfigFileName; + if Full then + Result:=AppendPathDelim(LazarusIDE.GetPrimaryConfigPath)+Result; end; procedure TIDEAnchorDockMaster.LoadDefaultLayout; @@ -285,7 +289,7 @@ var Filename: String; Config: TConfigStorage; begin - Filename:=DefaultConfigFileName; + Filename:=GetDefaultLayoutFilename(false); try debugln(['TIDEAnchorDockMaster.LoadUserLayout ',Filename]); Config:=GetIDEConfigStorage(Filename,true); @@ -315,7 +319,7 @@ var Filename: String; Config: TConfigStorage; begin - Filename:=DefaultConfigFileName; + Filename:=GetDefaultLayoutFilename(false); try debugln(['TIDEAnchorDockMaster.SaveDefaultLayout ',Filename]); Config:=GetIDEConfigStorage(Filename,false); @@ -558,7 +562,7 @@ begin if FChangeStamp