Procházet zdrojové kódy

vertical splitter to resize docked controls / image view

Johann ELSASS před 4 roky
rodič
revize
d99db66b1c
2 změnil soubory, kde provedl 89 přidání a 10 odebrání
  1. 13 1
      lazpaint/uconfig.pas
  2. 76 9
      lazpaint/umainformlayout.pas

+ 13 - 1
lazpaint/uconfig.pas

@@ -143,6 +143,8 @@ type
     function DefaultScreenSize: TRect;
     function DefaultDockLayersAndColors: boolean;
     procedure SetDefaultDockLayersAndColors(value: boolean);
+    function DefaultDockLayersAndColorsWidth: integer;
+    procedure SetDefaultDockLayersAndColorsWidth(AValue: integer);
     function ScreenSizeChanged: boolean;
     procedure SetDefaultScreenSize(value: TRect);
     function DefaultMainWindowMaximized: boolean;
@@ -521,9 +523,19 @@ begin
   iniOptions.WriteBool('Window','DockLayersAndColors',value);
 end;
 
+function TLazPaintConfig.DefaultDockLayersAndColorsWidth: integer;
+begin
+  result := iniOptions.ReadInteger('Window','DockLayersAndColorsWidth',0);
+end;
+
+procedure TLazPaintConfig.SetDefaultDockLayersAndColorsWidth(AValue: integer);
+begin
+  iniOptions.WriteInteger('Window','DockLayersAndColorsWidth',AValue);
+end;
+
 procedure TLazPaintConfig.SetDefaultScreenSize(value: TRect);
 begin
- iniOptions.WriteString('Window','ScreenSize',RectToStr(value));
+  iniOptions.WriteString('Window','ScreenSize',RectToStr(value));
 end;
 
 function TLazPaintConfig.DefaultMainWindowMaximized: boolean;

+ 76 - 9
lazpaint/umainformlayout.pas

@@ -10,12 +10,13 @@ uses
   Menus, UPaletteToolbar, BGRABitmapTypes, Controls, UImageView;
 
 const SelectionPaintDelay = 100/(1000*60*60*24);
+  VerticalSplitterWidth = 4;
 
 type
   TOnPictureAreaChange = procedure(ASender: TObject; ANewArea: TRect) of object;
   TToolWindowDocking = (twNone, twWindow, twLeft, twTop, twRight, twBottom);
   TLayoutStage = (lsAfterTopToolbar, lsAfterDockedToolBox, lsAfterPaletteToolbar,
-               lsAfterDockedControlsPanel, lsAfterStatusBar);
+               lsAfterDockedControlsPanel, lsAfterVerticalSplitter, lsAfterStatusBar);
 
   { TMainFormLayout }
 
@@ -41,6 +42,7 @@ type
     FDarkTheme: boolean;
     FDockedControlsPanel: TPanel;
     FDockedChooseColorSplitter: TSplitter;
+    FVerticalSplitter: TSplitter;
     FPaintBox: TOpaquePaintBox;
     FImageView: TImageView;
     function GetFillSelectionHighlight: boolean;
@@ -76,6 +78,7 @@ type
     procedure ToolboxGroupToolbarButton_MouseLeave(Sender: TObject);
     procedure ToolboxSimpleButton_Click(Sender: TObject);
     procedure PaletteVisibilityChangedByUser(Sender: TObject);
+    procedure VerticalSplitterMoved(Sender: TObject);
     procedure ZoomChanged(sender: TZoom; ANewZoom: single);
   protected
     FDockedToolboxGroup: array of record
@@ -86,9 +89,11 @@ type
       end;
     function GetWorkArea: TRect; override;
     function GetWorkAreaAt(AStage: TLayoutStage): TRect;
+    function VerticalSplitterNeeded: boolean;
     procedure DoArrange;
     procedure ApplyTheme;
     function DockedControlsPanelWidth: integer;
+    function DockedControlsPanelInnerMargin: integer;
     procedure ApplyThemeToDockedToolboxGroup(AGroupIndex: integer);
     procedure ShowToolboxGroup(AGroupIndex: integer);
     procedure HideToolboxGroup(AGroupIndex: integer);
@@ -201,6 +206,13 @@ begin
   FPaletteToolbar.OnVisibilityChangedByUser:= @PaletteVisibilityChangedByUser;
   FPaletteToolbar.Container := FForm;
 
+  FVerticalSplitter := TSplitter.Create(nil);
+  FVerticalSplitter.Visible := False;
+  FVerticalSplitter.Align := alNone;
+  FVerticalSplitter.Width := DoScaleX(VerticalSplitterWidth, OriginalDPI);
+  FVerticalSplitter.Anchors := [akRight,akTop,akBottom];
+  FForm.InsertControl(FVerticalSplitter);
+
   FDockedControlsPanel := TPanel.Create(nil);
   FDockedControlsPanel.Visible := false;
   FDockedControlsPanel.Anchors:= [akRight,akTop,akBottom];
@@ -228,9 +240,12 @@ end;
 destructor TMainFormLayout.Destroy;
 begin
   FZoom.Layout := nil;
+  if not FDockedControlsPanel.Visible then
+    LazPaintInstance.Config.SetDefaultDockLayersAndColorsWidth(0);
   FreeAndNil(FImageView);
   FreeAndNil(FPaintBox);
   FreeAndNil(FDockedControlsPanel);
+  FreeAndNil(FVerticalSplitter);
   FreeAndNil(FStatusBar);
   FreeAndNil(FStatusTextSplit);
   FreeAndNil(FPaletteToolbar);
@@ -428,6 +443,12 @@ begin
   Arrange;
 end;
 
+procedure TMainFormLayout.VerticalSplitterMoved(Sender: TObject);
+begin
+  LazPaintInstance.Config.SetDefaultDockLayersAndColorsWidth(
+    FDockedControlsPanel.Width - DockedControlsPanelInnerMargin);
+end;
+
 procedure TMainFormLayout.ZoomChanged(sender: TZoom; ANewZoom: single);
 begin
   if Assigned(FImageView) then
@@ -570,13 +591,22 @@ begin
   if PaletteVisible then result.Right -= FPaletteToolbar.Width;
   if AStage = lsAfterPaletteToolbar then exit;
 
-  if FDockedControlsPanel.ControlCount > 0 then result.Right -= DockedControlsPanelWidth;
+  if VerticalSplitterNeeded then result.Right -= DockedControlsPanelWidth;
   if AStage = lsAfterDockedControlsPanel then exit;
 
+  if (AStage = lsAfterVerticalSplitter) and VerticalSplitterNeeded then
+    result.Right -= DoScaleX(VerticalSplitterWidth, OriginalDPI);
+  if AStage = lsAfterVerticalSplitter then exit;
+
   if StatusBarVisible then result.Bottom -= FStatusBar.Height;
   if AStage = lsAfterStatusBar then exit;
 end;
 
+function TMainFormLayout.VerticalSplitterNeeded: boolean;
+begin
+  result := FDockedControlsPanel.ControlCount > 0;
+end;
+
 procedure TMainFormLayout.DoArrange;
 var nbY,nbX,w,i: integer;
   updateChooseColorHeight: Boolean;
@@ -620,6 +650,14 @@ begin
   if PaletteVisible then
     with GetWorkAreaAt(lsAfterDockedToolBox) do
       FPaletteToolbar.SetBounds(Right - FPaletteToolbar.Width,Top,FPaletteToolbar.Width,Bottom-Top);
+
+  //temporarily disable controlside anchors
+  FVerticalSplitter.OnMoved:= nil;
+  FDockedControlsPanel.AnchorSideLeft.Control := nil;
+  FDockedControlsPanel.Anchors := FDockedControlsPanel.Anchors - [akLeft];
+  FPaintBox.AnchorSideRight.Control := nil;
+  FPaintBox.Anchors := FPaintBox.Anchors - [akRight];
+
   if FDockedControlsPanel.ControlCount > 0 then
   begin
     with GetWorkAreaAt(lsAfterPaletteToolbar) do
@@ -630,7 +668,7 @@ begin
       for i := 0 to FDockedControlsPanel.ControlCount-1 do
         if FDockedControlsPanel.Controls[i].Name = 'ChooseColorControl' then
         begin
-          FDockedControlsPanel.Controls[i].Width := w - integer(FDockedControlsPanel.BevelOuter <> bvNone)*FDockedControlsPanel.BevelWidth*2 - FDockedControlsPanel.ChildSizing.LeftRightSpacing*2;
+          FDockedControlsPanel.Controls[i].Width := w - DockedControlsPanelInnerMargin;
           if updateChooseColorHeight then
             LazPaintInstance.AdjustChooseColorHeight;
         end;
@@ -644,7 +682,7 @@ begin
     FDockedControlsPanel.Visible:= false;
   if StatusBarVisible then
   begin
-    with GetWorkAreaAt(lsAfterDockedControlsPanel) do
+    with GetWorkAreaAt(lsAfterVerticalSplitter) do
       FStatusBar.SetBounds(Left,Bottom-FStatusBar.Height,Right-Left,FStatusBar.Height);
     if not FStatusBar.Visible then
     begin
@@ -656,6 +694,23 @@ begin
   if Assigned(FImageView) then
     with WorkArea do
     FImageView.SetBounds(Left, Top, Width, Height);
+
+  // enable controlside anchors
+  if VerticalSplitterNeeded then
+  begin
+    FVerticalSplitter.Left := FDockedControlsPanel.Left - FVerticalSplitter.Width;
+    FVerticalSplitter.Top := FDockedControlsPanel.Top;
+    FVerticalSplitter.Height := FDockedControlsPanel.Height;
+    FDockedControlsPanel.AnchorSideLeft.Side := asrRight;
+    FDockedControlsPanel.AnchorSideLeft.Control := FVerticalSplitter;
+    FDockedControlsPanel.Anchors := FDockedControlsPanel.Anchors + [akLeft];
+    FPaintBox.AnchorSideRight.Side := asrLeft;
+    FPaintBox.AnchorSideRight.Control := FVerticalSplitter;
+    FPaintBox.Anchors := FPaintBox.Anchors + [akRight];
+    FVerticalSplitter.Visible := true;
+    FVerticalSplitter.OnMoved:=@VerticalSplitterMoved;
+  end else
+    FVerticalSplitter.Visible := false;
 end;
 
 procedure TMainFormLayout.ApplyTheme;
@@ -699,19 +754,31 @@ end;
 
 function TMainFormLayout.DockedControlsPanelWidth: integer;
 var
-  w, i, bevelOfs: Integer;
+  w, i: Integer;
 begin
   w := 0;
   if FDockedControlsPanel.ControlCount > 0 then
   begin
-    for i := 0 to FDockedControlsPanel.ControlCount-1 do
-      w := max(w, FDockedControlsPanel.Controls[i].Tag);
-    bevelOfs := integer(FDockedControlsPanel.BevelOuter <> bvNone)*FDockedControlsPanel.BevelWidth;
-    inc(w, (FDockedControlsPanel.ChildSizing.LeftRightSpacing + bevelOfs)*2);
+    w := LazPaintInstance.Config.DefaultDockLayersAndColorsWidth;
+    if w = 0 then
+    begin
+      for i := 0 to FDockedControlsPanel.ControlCount-1 do
+        w := max(w, FDockedControlsPanel.Controls[i].Tag);
+    end;
+    w := min(w, GetWorkAreaAt(lsAfterPaletteToolbar).Width * 3 div 4);
+    inc(w, DockedControlsPanelInnerMargin);
   end;
   result := w;
 end;
 
+function TMainFormLayout.DockedControlsPanelInnerMargin: integer;
+var
+  bevelOfs: Integer;
+begin
+  bevelOfs := integer(FDockedControlsPanel.BevelOuter <> bvNone)*FDockedControlsPanel.BevelWidth;
+  result := (FDockedControlsPanel.ChildSizing.LeftRightSpacing + bevelOfs)*2;
+end;
+
 procedure TMainFormLayout.ApplyThemeToDockedToolboxGroup(AGroupIndex: integer);
 var
   panel: TPanel;