Bläddra i källkod

adjust toolbar for fill mode and label

johann 5 år sedan
förälder
incheckning
0a84a7c2b0

Filskillnaden har hållts tillbaka eftersom den är för stor
+ 303 - 304
lazpaint/lazpaintmainform.lfm


+ 23 - 8
lazpaint/lazpaintmainform.pas

@@ -44,6 +44,8 @@ type
     Label_Back: TLabel;
     Label_ShadowOffset: TLabel;
     Label_TextBlur: TLabel;
+    TimerHideFill: TTimer;
+    TimerArrange: TTimer;
     VectorialFill_Pen: TLCVectorialFillControl;
     VectorialFill_Back: TLCVectorialFillControl;
     Panel_BackFill: TPanel;
@@ -523,6 +525,8 @@ type
     procedure SpinEdit_TextSizeChange(Sender: TObject; AByUser: boolean);
     procedure SpinEdit_TextBlurChange(Sender: TObject; AByUser: boolean);
     procedure GridNb_SpinEditChange(Sender: TObject; AByUser: boolean);
+    procedure TimerArrangeTimer(Sender: TObject);
+    procedure TimerHideFillTimer(Sender: TObject);
     procedure VectorialFill_TextureClick(Sender: TObject);
     procedure PaintBox_PenPreviewPaint(Sender: TObject);
     procedure PaintBox_PictureMouseDown(Sender: TObject; Button: TMouseButton;
@@ -670,7 +674,13 @@ type
     procedure ManagerToleranceChanged(Sender: TObject);
     procedure ManagerToolbarChanged(Sender: TObject);
     procedure VectorialFill_BackChange(Sender: TObject);
+    procedure VectorialFill_BackResize(Sender: TObject);
     procedure VectorialFill_PenChange(Sender: TObject);
+    procedure VectorialFill_PenResize(Sender: TObject);
+    procedure VectorialFill_ShowBackFill(Sender: TObject; Shift: TShiftState;
+      X, Y: Integer);
+    procedure VectorialFill_ShowPenFill(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
   private
     { private declarations }
     FLayout: TMainFormLayout;
@@ -776,7 +786,10 @@ type
     procedure ToggleLayersVisible;
     function ShowColorDialogFor(ATarget: TColorTarget): boolean;
     procedure ShowPenPreview(ShouldRepaint: boolean= False);
-    procedure HidePenPreview(TimeMs: Integer = 300);
+    procedure HidePenPreview(ATimeMs: Integer = 300; AClearTime: boolean = false);
+    procedure ShowPenFill;
+    procedure ShowBackFill;
+    procedure HideFill(ATimeMs: Integer = 300; AClearTime: boolean = false);
     procedure OnPaintHandler;
     procedure OnImageChangedHandler({%H-}AEvent: TLazPaintImageObservationEvent);
     procedure LabelAutosize(ALabel: TLabel);
@@ -839,6 +852,7 @@ type
     procedure UpdateLineCapBar;
     procedure UpdateFillToolbar(AUpdateColorDiff: boolean);
     procedure UpdateToolbar;
+    procedure QueryArrange;
     function ChooseTool(Tool : TPaintToolType): boolean;
     procedure PictureSelectedLayerIndexChanged({%H-}sender: TLazPaintImage);
     procedure PictureSelectedLayerIndexChanging({%H-}sender: TLazPaintImage);
@@ -1202,6 +1216,7 @@ begin
   ReleaseMouseButtons(Shift);
   UpdateSpecialKeys(Shift);
   HidePenPreview;
+  HideFill;
   if LazPaintInstance.TopMostHasFocus then
   begin
     if LazPaintInstance.TopMostOkToUnfocus then
@@ -1835,7 +1850,7 @@ end;
 
 procedure TFMain.FormResize(Sender: TObject);
 begin
-  if shouldArrangeOnResize then FLayout.Arrange;
+  if shouldArrangeOnResize then QueryArrange;
 end;
 
 procedure TFMain.ImageActionExecute(Sender: TObject);
@@ -3626,14 +3641,14 @@ procedure TFMain.MenuCoordinatesToolbarClick(Sender: TObject);
 begin
   Panel_Coordinates.Visible := not Panel_Coordinates.Visible;
   Config.SetDefaultCoordinatesToolbarVisible(Panel_Coordinates.Visible);
-  Layout.Arrange;
+  QueryArrange;
 end;
 
 procedure TFMain.MenuCopyPasteToolbarClick(Sender: TObject);
 begin
   Panel_CopyPaste.Visible := not Panel_CopyPaste.Visible;
   Config.SetDefaultCopyPasteToolbarVisible(Panel_CopyPaste.Visible);
-  Layout.Arrange;
+  QueryArrange;
 end;
 
 procedure TFMain.MenuDockToolboxLeftClick(Sender: TObject);
@@ -3650,7 +3665,7 @@ procedure TFMain.MenuFileToolbarClick(Sender: TObject);
 begin
   Panel_File.Visible := not Panel_File.Visible;
   Config.SetDefaultFileToolbarVisible(Panel_File.Visible);
-  Layout.Arrange;
+  QueryArrange;
 end;
 
 procedure TFMain.MenuShowPaletteClick(Sender: TObject);
@@ -3667,7 +3682,7 @@ procedure TFMain.MenuUndoRedoToolbarClick(Sender: TObject);
 begin
   Panel_Undo.Visible := not Panel_Undo.Visible;
   Config.SetDefaultUndoRedoToolbarVisible(Panel_Undo.Visible);
-  Layout.Arrange;
+  QueryArrange;
 end;
 
 procedure TFMain.MenuViewClick(Sender: TObject);
@@ -3684,7 +3699,7 @@ procedure TFMain.MenuZoomToolbarClick(Sender: TObject);
 begin
   Panel_Zoom.Visible := not Panel_Zoom.Visible;
   Config.SetDefaultZoomToolbarVisible(Panel_Zoom.Visible);
-  Layout.Arrange;
+  QueryArrange;
 end;
 
 procedure TFMain.EditPasteUpdate(Sender: TObject);
@@ -4323,7 +4338,7 @@ end;
 
 procedure TFMain.ManagerToolbarChanged(Sender: TObject);
 begin
-  if Assigned(FLayout) then FLayout.Arrange;
+  QueryArrange;
 end;
 
 procedure TFMain.UpdateStatusText;

+ 108 - 29
lazpaint/maintoolbar.inc

@@ -8,12 +8,22 @@ begin
   Panel_ToolbarBackground.PopupMenu := PopupToolbar;
   Perspective_Repeat.OnClick := @Perspective_RepeatClick;
   Perspective_TwoPlanes.OnClick := @Perspective_TwoPlanesClick;
+  VectorialFill_Pen.VerticalPadding:= DoScaleY(6, OriginalDPI);
+  VectorialFill_Back.VerticalPadding:= DoScaleY(6, OriginalDPI);
   VectorialFill_Pen.OnChooseColor := @VectorialFill_PenChooseColor;
   VectorialFill_Back.OnChooseColor := @VectorialFill_BackChooseColor;
   VectorialFill_Pen.OnTextureClick := @VectorialFill_TextureClick;
   VectorialFill_Back.OnTextureClick := @VectorialFill_TextureClick;
   VectorialFill_Pen.OnFillChange:=@VectorialFill_PenChange;
   VectorialFill_Back.OnFillChange:=@VectorialFill_BackChange;
+  VectorialFill_Pen.OnResize:=@VectorialFill_PenResize;
+  VectorialFill_Back.OnResize:=@VectorialFill_BackResize;
+  Label_Pen.OnMouseMove:=@VectorialFill_ShowPenFill;
+  Panel_PenFill.OnMouseMove:=@VectorialFill_ShowPenFill;
+  VectorialFill_Pen.OnMouseMove:=@VectorialFill_ShowPenFill;
+  Label_Back.OnMouseMove:=@VectorialFill_ShowBackFill;
+  Panel_BackFill.OnMouseMove:=@VectorialFill_ShowBackFill;
+  VectorialFill_Back.OnMouseMove:=@VectorialFill_ShowBackFill;
   Image_SwapColors.OnMouseDown := @Image_SwapColorsMouseDown;
   Tool_DrawShapeBorder.OnClick := @Tool_DrawShapeBorderClick;
   Tool_Aliasing.OnClick := @Tool_AliasingClick;
@@ -193,6 +203,7 @@ begin
   LabelAutosize(Label_OutlineWidth);
   LabelAutosize(Label_Brush);
   LabelAutosize(Label_Spacing);
+  LabelAutosize(Label_Ratio);
   Image_SwapColors.Hint := Image_SwapColors.Hint + ' (X)';
 
   Tool_CurveModeAuto.Hint := Tool_CurveModeAuto.Hint + ' (A)';
@@ -225,27 +236,34 @@ end;
 
 procedure TFMain.LabelAutosize(ALabel: TLabel);
 var
-  NewSize,Delta: integer;
-  Container: TWinControl;
-  ANext: TControl;
-  I: Integer;
-begin
-  ALabel.Canvas.Font.Name := ALabel.Font.Name;
-  ALabel.Canvas.Font.Height := ALabel.Font.Height;
-  ALabel.Canvas.Font.Style := ALabel.Font.Style;
-  NewSize := ALabel.Canvas.TextWidth(ALabel.Caption+' ');
-  if ALabel.Width <> NewSize then
+  delta, nextPos: integer;
+  container: TWinControl;
+  nextControl: TControl;
+  I, prefWidth, prefHeight: Integer;
+begin
+  ALabel.Font.Height := -ALabel.Height*50 div 96;
+  prefWidth := ALabel.Width;
+  prefHeight := ALabel.Width;
+  ALabel.GetPreferredSize(prefWidth, prefHeight);
+  ALabel.Width := prefWidth+DoScaleX(5, OriginalDPI);
+  nextPos := MaxLongInt;
+  container := ALabel.Parent;
+  for i := 0 to container.ControlCount-1 do
   begin
-    Delta := NewSize-ALabel.Width;
-    Container := ALabel.Parent;
-    Container.Width := Container.Width+Delta;
-    For I := 0 to Container.ControlCount-1 do
+    nextControl := container.Controls[I];
+    if (nextControl.Left > ALabel.Left) and (nextControl.Left < nextPos) then
+      nextPos := nextControl.Left;
+  end;
+  if nextPos < MaxLongInt then
+  begin
+    delta := ALabel.Left+ALabel.Width-nextPos;
+    for i := 0 to container.ControlCount-1 do
     begin
-      ANext := Container.Controls[I];
-      if ANext.Left > ALabel.Left then
-        ANext.Left := ANext.Left+Delta;
+      nextControl := container.Controls[I];
+      if nextControl.Left > ALabel.Left then
+        nextControl.Left := nextControl.Left + delta;
     end;
-    ALabel.Width := NewSize;
+    container.Width := container.Width + delta;
   end;
 end;
 
@@ -414,8 +432,7 @@ begin
   Label_ShadowOffset.Visible := shadowOn;
   SpinEdit_TextShadowX.Visible := shadowOn;
   SpinEdit_TextShadowY.Visible := shadowOn;
-  if Panel_TextShadow.Visible then
-    FLayout.Arrange;
+  if Panel_TextShadow.Visible then QueryArrange;
 end;
 
 procedure TFMain.UpdateLineCapToolbar;
@@ -509,6 +526,11 @@ begin
   UpdateCurveModeToolbar;
 end;
 
+procedure TFMain.QueryArrange;
+begin
+  TimerArrange.Enabled := true;
+end;
+
 procedure TFMain.UpdateLineCapBar;
 var
   newVisible: Boolean;
@@ -518,7 +540,7 @@ begin
   if newVisible <> Panel_LineCap.Visible then
   begin
     Panel_LineCap.Visible := newVisible;
-    if Assigned(FLayout) then FLayout.Arrange;
+    QueryArrange;
   end;
 end;
 
@@ -653,6 +675,19 @@ begin
   FInGridNb := false;
 end;
 
+procedure TFMain.TimerArrangeTimer(Sender: TObject);
+begin
+  TimerArrange.Enabled:= false;
+  if Assigned(FLayout) then FLayout.Arrange;
+end;
+
+procedure TFMain.TimerHideFillTimer(Sender: TObject);
+begin
+  TimerHideFill.Enabled := false;
+  Panel_PenFill.Height := Panel_SwapColor.Height;
+  Panel_BackFill.Height := Panel_SwapColor.Height;
+end;
+
 procedure TFMain.SpinEdit_GridNbExit(Sender: TObject);
 begin
   if SpinEdit_GridNbX.Value < MinDeformationGridSize-1 then SpinEdit_GridNbX.Value := MinDeformationGridSize-1;
@@ -764,6 +799,12 @@ begin
   FInFillChange:= false;
 end;
 
+procedure TFMain.VectorialFill_BackResize(Sender: TObject);
+begin
+  Panel_BackFill.Width := VectorialFill_Back.Left + VectorialFill_Back.Width + DoScaleX(6, OriginalDPI);
+  QueryArrange;
+end;
+
 procedure TFMain.VectorialFill_PenChange(Sender: TObject);
 var
   tempFill: TVectorialFill;
@@ -795,6 +836,24 @@ begin
   FInFillChange:= false;
 end;
 
+procedure TFMain.VectorialFill_PenResize(Sender: TObject);
+begin
+  Panel_PenFill.Width := VectorialFill_Pen.Left + VectorialFill_Pen.Width + DoScaleX(6, OriginalDPI);
+  QueryArrange;
+end;
+
+procedure TFMain.VectorialFill_ShowBackFill(Sender: TObject;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  ShowBackFill;
+end;
+
+procedure TFMain.VectorialFill_ShowPenFill(Sender: TObject; Shift: TShiftState;
+  X, Y: Integer);
+begin
+  ShowPenFill;
+end;
+
 procedure TFMain.VectorialFill_PenChooseColor(ASender: TObject; AButton: TMouseButton;
   AColorIndex: integer; var AColorValue: TBGRAPixel; out AHandled: boolean);
 var
@@ -913,7 +972,7 @@ begin
      if Tool_DrawShapeBorder.Down then include(opt, toDrawShape) else exclude(opt, toDrawShape);
      if Tool_FillShape.Down then include(opt, toFillShape) else exclude(opt, toFillShape);
      ToolManager.ShapeOptions := opt;
-     FLayout.Arrange;
+     QueryArrange;
   end;
 end;
 
@@ -1268,29 +1327,49 @@ procedure TFMain.ShowPenPreview(ShouldRepaint: boolean);
 begin
   if not Panel_PenWidthPreview.Visible then
   begin
-    Panel_PenWidthPreview.Left := Panel_PenWidth.Left;
+    Panel_PenWidthPreview.Left := min(Panel_PenWidth.Left, ClientWidth-Panel_PenWidthPreview.Width);
     Panel_PenWidthPreview.Top := Panel_PenWidth.Top+Panel_PenWidth.Height;
     Panel_PenWidthPreview.Visible := True;
   end else
     if ShouldRepaint then
       PaintBox_PenPreview.Repaint;
-  TimerHidePenPreview.Enabled := false;
-  HidePenPreview(3000);
+  HidePenPreview(3000, true);
 end;
 
-procedure TFMain.HidePenPreview(TimeMs: Integer);
+procedure TFMain.HidePenPreview(ATimeMs: Integer; AClearTime: boolean);
 begin
+  if AClearTime then TimerHidePenPreview.Enabled := false;
   if Panel_PenWidthPreview.Visible then
   begin
-    TimerHidePenPreview.Interval := TimeMs;
+    TimerHidePenPreview.Interval := ATimeMs;
     TimerHidePenPreview.Enabled := true;
   end;
 end;
 
+procedure TFMain.ShowPenFill;
+begin
+  Panel_PenFill.Height := VectorialFill_Pen.Top+VectorialFill_Pen.Height+DoScaleY(3, OriginalDPI);
+  HideFill(3000, true);
+end;
+
+procedure TFMain.ShowBackFill;
+begin
+  Panel_BackFill.Height := VectorialFill_Back.Top+VectorialFill_Back.height+DoScaleY(3, OriginalDPI);
+  HideFill(3000, true);
+end;
+
+procedure TFMain.HideFill(ATimeMs: Integer; AClearTime: boolean);
+begin
+  if AClearTime then TimerHideFill.Enabled := false;
+  TimerHideFill.Interval := ATimeMs;
+  TimerHideFill.Enabled := true;
+end;
+
 procedure TFMain.Panel_ToolbarBackgroundMouseMove(Sender: TObject;
   Shift: TShiftState; X, Y: Integer);
 begin
-  HidePenPreview();
+  HidePenPreview;
+  HideFill;
 end;
 
 procedure TFMain.Panel_PenWidthMouseMove(Sender: TObject; Shift: TShiftState;
@@ -1564,7 +1643,7 @@ begin
      if ToolManager.TextPhong <> Tool_TextPhong.Down then
      begin
        ToolManager.TextPhong:= Tool_TextPhong.Down;
-       FLayout.Arrange;
+       QueryArrange;
        UpdateEditPicture;
      end;
   end;

+ 15 - 6
lazpaint/umenu.pas

@@ -35,6 +35,7 @@ type
     procedure ApplyShortcuts;
     procedure ActionShortcut(AName: string; AShortcut: TUTF8Char);
     procedure ApplyTheme;
+    function GetIndividualToolbarHeight: integer;
   public
     constructor Create(AInstance: TLazPaintCustomInstance; AActionList: TActionList);
     procedure PredefinedMainMenus(const AMainMenus: array of TMenuItem);
@@ -307,6 +308,11 @@ begin
   end;
 end;
 
+function TMainFormMenu.GetIndividualToolbarHeight: integer;
+begin
+  result := DoScaleY(26,OriginalDPI);
+end;
+
 constructor TMainFormMenu.Create(AInstance: TLazPaintCustomInstance; AActionList: TActionList);
 begin
   FInstance := AInstance;
@@ -324,6 +330,7 @@ end;
 
 procedure TMainFormMenu.Toolbars(const AToolbars: array of TPanel; AToolbarBackground: TPanel);
 var i,j: NativeInt;
+  prefWidth, prefHeight: integer;
 begin
   setlength(FToolbars, length(AToolbars));
   for i := 0 to high(FToolbars) do
@@ -339,9 +346,7 @@ begin
         if (Controls[j].Name = 'Label_Coordinates') or
            (Controls[j].Name = 'Label_CurrentZoom') or
            (Controls[j].Name = 'Label_CurrentDiff') then
-          Controls[j].Font.Height := -Controls[j].Height*55 div ScreenInfo.PixelsPerInchY
-        else
-          Controls[j].Font.Height := -Controls[j].Height*50 div ScreenInfo.PixelsPerInchY;
+          Controls[j].Font.Height := -Controls[j].Height*55 div 96;
       end;
     end;
   end;
@@ -399,7 +404,7 @@ begin
   if Assigned(FImageList) then
     FActionList.Images := FImageList;
 
-  tbHeightOrig := DoScaleY(26,OriginalDPI);
+  tbHeightOrig := GetIndividualToolbarHeight;
   tbHeight := tbHeightOrig;
   for i := 0 to high(FToolbars) do
   with FToolbars[i].tb do
@@ -434,8 +439,11 @@ begin
 end;
 
 procedure TMainFormMenu.ArrangeToolbars(ClientWidth: integer);
-var i,j,k,curx,cury,maxh, w, minNextX, delta: integer; tb: TPanel;
+var i,j,k,curx,cury,maxh, w, minNextX, delta,
+  tbNormalHeight: integer;
+  tb: TPanel;
 begin
+   tbNormalHeight := GetIndividualToolbarHeight;
    curx := 0;
    cury := 0;
    maxh := 0;
@@ -448,7 +456,7 @@ begin
        for j := 0 to tb.ControlCount-1 do
        begin
          tb.Controls[j].Top := 1;
-         tb.Controls[j].Height := tb.Height-3;
+         tb.Controls[j].Height := tbNormalHeight-3;
          if tb.Controls[j] is TToolBar then
          begin
            minNextX := MaxLongInt;
@@ -482,6 +490,7 @@ begin
        tb.Top := cury;
        inc(curx, tb.Width);
        if tb.Height > maxh then maxh := tb.Height;
+       maxh := min(maxh, tbNormalHeight);
      end else
      begin
        //hide fix for Gtk

+ 4 - 4
lazpaintcontrols/lctoolbars.pas

@@ -10,7 +10,7 @@ uses
 function CreateToolBar(AImages: TImageList; AOwner: TComponent = nil): TToolbar;
 procedure ReorderToolbarContent(AToolbar: TToolbar);
 function GetToolbarSize(AToolbar: TToolbar; APadding: integer = 1): TSize;
-procedure SetToolbarImages(AToolbar: TToolbar; AImages: TImageList);
+procedure SetToolbarImages(AToolbar: TToolbar; AImages: TImageList; HorizPadding: integer = 5; VertPadding: integer = 4);
 procedure EnableDisableToolButtons(AButtons: array of TToolButton; AEnabled: boolean);
 procedure ShowAppendToolButtons(AButtons: array of TControl);
 function AddToolbarLabel(AToolbar: TToolbar; ACaption: string; AExistingContainer: TCustomControl): TLabel;
@@ -91,11 +91,11 @@ begin
   result.cy += APadding;
 end;
 
-procedure SetToolbarImages(AToolbar: TToolbar; AImages: TImageList);
+procedure SetToolbarImages(AToolbar: TToolbar; AImages: TImageList; HorizPadding: integer; VertPadding: integer);
 begin
   AToolbar.Images := AImages;
-  AToolbar.ButtonWidth:= AImages.Width+5;
-  AToolbar.ButtonHeight:= AImages.Height+4;
+  AToolbar.ButtonWidth:= AImages.Width+HorizPadding;
+  AToolbar.ButtonHeight:= AImages.Height+VertPadding;
 end;
 
 function GetResourceString(AFilename: string): string;

+ 59 - 0
lazpaintcontrols/lcvectorialfillcontrol.pas

@@ -36,6 +36,15 @@ type
     function GetTexRepetition: TTextureRepetition;
     function GetTexture: TBGRABitmap;
     function GetToolIconSize: integer;
+    function GetVerticalPadding: integer;
+    procedure InterfaceMouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure InterfaceMouseEnter(Sender: TObject);
+    procedure InterfaceMouseLeave(Sender: TObject);
+    procedure InterfaceMouseMove(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
+    procedure InterfaceMouseUp(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
     procedure SetAllowedFillTypes(AValue: TVectorialFillTypes);
     procedure SetCanAdjustToShape(AValue: boolean);
     procedure SetFillType(AValue: TVectorialFillType);
@@ -51,6 +60,7 @@ type
     procedure SetTextureOpacity(AValue: byte);
     procedure SetTextureRepetition(AValue: TTextureRepetition);
     procedure SetToolIconSize(AValue: integer);
+    procedure SetVerticalPadding(AValue: integer);
   protected
     FInterface: TVectorialFillInterface;
     FOnAdjustToShape: TNotifyEvent;
@@ -94,6 +104,7 @@ type
     property Enabled;
     property Visible;
     property ToolIconSize: integer read GetToolIconSize write SetToolIconSize;
+    property VerticalPadding: integer read GetVerticalPadding write SetVerticalPadding;
     property AllowedFillTypes: TVectorialFillTypes read GetAllowedFillTypes write SetAllowedFillTypes;
     property OnChooseColor: TChooseColorEvent read FOnChooseColor write SetOnChooseColor;
     property OnFillChange: TNotifyEvent read FOnFillChange write FOnFillChange;
@@ -101,6 +112,11 @@ type
     property OnAdjustToShape: TNotifyEvent read FOnAdjustToShape write FOnAdjustToShape;
     property OnFillTypeChange: TNotifyEvent read FOnFillTypeChange write FOnFillTypeChange;
     property OnTextureClick: TNotifyEvent read FOnTextureClick write SetOnTextureClick;
+    property OnMouseDown;
+    property OnMouseMove;
+    property OnMouseUp;
+    property OnMouseEnter;
+    property OnMouseLeave;
   end;
 
 procedure Register;
@@ -200,6 +216,39 @@ begin
   result := FInterface.ImageListSize.cy;
 end;
 
+function TLCVectorialFillControl.GetVerticalPadding: integer;
+begin
+  result := FInterface.VerticalPadding;
+end;
+
+procedure TLCVectorialFillControl.InterfaceMouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(OnMouseDown) then OnMouseDown(self, Button, Shift, X,Y);
+end;
+
+procedure TLCVectorialFillControl.InterfaceMouseEnter(Sender: TObject);
+begin
+  if Assigned(OnMouseEnter) then OnMouseEnter(self);
+end;
+
+procedure TLCVectorialFillControl.InterfaceMouseLeave(Sender: TObject);
+begin
+  if Assigned(OnMouseLeave) then OnMouseLeave(self);
+end;
+
+procedure TLCVectorialFillControl.InterfaceMouseMove(Sender: TObject;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(OnMouseMove) then OnMouseMove(self, Shift, X,Y);
+end;
+
+procedure TLCVectorialFillControl.InterfaceMouseUp(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(OnMouseUp) then OnMouseUp(self, Button, Shift, X,Y);
+end;
+
 procedure TLCVectorialFillControl.SetAllowedFillTypes(
   AValue: TVectorialFillTypes);
 begin
@@ -285,6 +334,11 @@ begin
   FInterface.ImageListSize := Size(AValue,AValue);
 end;
 
+procedure TLCVectorialFillControl.SetVerticalPadding(AValue: integer);
+begin
+  FInterface.VerticalPadding:= AValue;
+end;
+
 procedure TLCVectorialFillControl.CalculatePreferredSize(var PreferredWidth,
   PreferredHeight: integer; WithThemeSpace: Boolean);
 begin
@@ -333,6 +387,11 @@ begin
   FInterface.OnTextureChange:=@DoOnTextureChange;
   FInterface.OnAdjustToShape:=@DoOnAdjustToShape;
   FInterface.OnFillTypeChange:=@DoOnFillTypeChange;
+  FInterface.OnMouseMove:=@InterfaceMouseMove;
+  FInterface.OnMouseDown:=@InterfaceMouseDown;
+  FInterface.OnMouseUp:=@InterfaceMouseUp;
+  FInterface.OnMouseEnter:=@InterfaceMouseEnter;
+  FInterface.OnMouseLeave:=@InterfaceMouseLeave;
   FInterface.Container := self;
 end;
 

+ 144 - 1
lazpaintcontrols/lcvectorialfillinterface.pas

@@ -24,6 +24,30 @@ type
   { TVectorialFillInterface }
 
   TVectorialFillInterface = class(TComponent)
+  private
+    FOnMouseDown: TMouseEvent;
+    FOnMouseEnter: TNotifyEvent;
+    FOnMouseLeave: TNotifyEvent;
+    FOnMouseMove: TMouseMoveEvent;
+    FOnMouseUp: TMouseEvent;
+    FVerticalPadding: integer;
+    procedure SetVerticalPadding(AValue: integer);
+    procedure ToolbarMouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure ToolbarMouseEnter(Sender: TObject);
+    procedure ToolbarMouseLeave(Sender: TObject);
+    procedure ToolbarMouseMove(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
+    procedure ToolbarMouseUp(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure AnyButtonMouseDown(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
+    procedure AnyButtonMouseEnter(Sender: TObject);
+    procedure AnyButtonMouseLeave(Sender: TObject);
+    procedure AnyButtonMouseMove(Sender: TObject; Shift: TShiftState; X,
+      Y: Integer);
+    procedure AnyButtonMouseUp(Sender: TObject; Button: TMouseButton;
+      Shift: TShiftState; X, Y: Integer);
   protected
     FFillType: TVectorialFillType;
     FAllowedFillTypes: TVectorialFillTypes;
@@ -132,6 +156,9 @@ type
     procedure HideGradientInterface;
     procedure HideTextureInterface;
     procedure Init(AImageListWidth,AImageListHeight: Integer);
+    procedure AttachMouseEvent(AControl: TToolBar); overload;
+    procedure AttachMouseEvent(AControl: TToolButton); overload;
+    procedure AttachMouseEvent(AControl: TBCTrackbarUpdown); overload;
   public
     constructor Create(AOwner: TComponent); override;
     constructor Create(AOwner: TComponent; AImageListWidth,AImageListHeight: Integer);
@@ -162,8 +189,14 @@ type
     property OnAdjustToShape: TNotifyEvent read FOnAdjustToShape write FOnAdjustToShape;
     property OnFillTypeChange: TNotifyEvent read FOnFillTypeChange write FOnFillTypeChange;
     property OnChooseColor: TChooseColorEvent read FOnChooseColor write FOnChooseColor;
+    property OnMouseDown: TMouseEvent read FOnMouseDown write FOnMouseDown;
+    property OnMouseMove: TMouseMoveEvent read FOnMouseMove write FOnMouseMove;
+    property OnMouseUp: TMouseEvent read FOnMouseUp write FOnMouseUp;
+    property OnMouseEnter: TNotifyEvent read FOnMouseEnter write FOnMouseEnter;
+    property OnMouseLeave: TNotifyEvent read FOnMouseLeave write FOnMouseLeave;
     property Container: TWinControl read FContainer write SetContainer;
     property ImageListSize: TSize read FImageListSize write SetImageListSize;
+    property VerticalPadding: integer read FVerticalPadding write SetVerticalPadding;
     property PreferredSize: TSize read GetPreferredSize;
     property AllowedFillTypes: TVectorialFillTypes read FAllowedFillTypes write SetAllowedFillTypes;
   end;
@@ -195,7 +228,7 @@ begin
   FImageListLoaded := true;
   if Assigned(FToolbar) then
   begin
-    SetToolbarImages(FToolbar, FImageList);
+    SetToolbarImages(FToolbar, FImageList, 5, VerticalPadding);
     for i := 0 to FToolbar.ControlCount-1 do
       if FToolbar.Controls[i] is TBCTrackbarUpdown then
         FToolbar.Controls[i].Width := FToolbar.ButtonWidth*2
@@ -477,6 +510,7 @@ begin
   FUpDownSolidAlpha.Increment:= 15;
   FUpDownSolidAlpha.OnChange:=@UpDownSolidAlphaChange;
   AddToolbarControl(FToolbar, FUpDownSolidAlpha);
+  AttachMouseEvent(FUpDownSolidAlpha);
 end;
 
 procedure TVectorialFillInterface.CreateGradientInterface;
@@ -501,7 +535,9 @@ begin
   FUpDownStartAlpha.Increment:= 15;
   FUpDownStartAlpha.OnChange:=@UpDownStartAlphaChange;
   AddToolbarControl(FToolbar, FUpDownStartAlpha);
+  AttachMouseEvent(FUpDownStartAlpha);
   FButtonSwapColor := AddToolbarButton(FToolbar, 'Swap colors', 23, @ButtonSwapColorClick);
+  AttachMouseEvent(FButtonSwapColor);
   FShapeEndColor := TShape.Create(FToolbar);
   FShapeEndColor.Width := FToolbar.ButtonWidth;
   FShapeEndColor.Height := FToolbar.ButtonHeight;
@@ -515,8 +551,11 @@ begin
   FUpDownEndAlpha.Increment:= 15;
   FUpDownEndAlpha.OnChange:=@UpDownEndAlphaChange;
   AddToolbarControl(FToolbar, FUpDownEndAlpha);
+  AttachMouseEvent(FUpDownEndAlpha);
   FButtonGradRepetition := AddToolbarButton(FToolbar, 'Gradient repetition...', 7+ord(FGradRepetition), @ButtonGradRepetitionClick);
+  AttachMouseEvent(FButtonGradRepetition);
   FButtonGradInterp := AddToolbarButton(FToolbar, 'Color interpolation...', 11+ord(FGradInterp), @ButtonGradInterpClick);
+  AttachMouseEvent(FButtonGradInterp);
 
   FGradRepetitionMenu := TPopupMenu.Create(self);
   FGradRepetitionMenu.Images := FImageList;
@@ -549,7 +588,9 @@ begin
 
   FButtonAdjustToTexture := AddToolbarButton(FToolbar, 'Adjust to shape', 21, @AdjustToShapeClick);
   FButtonAdjustToTexture.Enabled := FCanAdjustToShape;
+  AttachMouseEvent(FButtonAdjustToTexture);
   FButtonTexRepeat := AddToolbarButton(FToolbar, 'Texture repetition...', -1, @ButtonTexRepeatClick);
+  AttachMouseEvent(FButtonTexRepeat);
   FUpDownTexAlpha := TBCTrackbarUpdown.Create(FToolbar);
   FUpDownTexAlpha.Width := FToolbar.ButtonWidth*2;
   FUpDownTexAlpha.Height := FToolbar.ButtonHeight;
@@ -558,7 +599,9 @@ begin
   FUpDownTexAlpha.Increment:= 15;
   FUpDownTexAlpha.OnChange:=@UpDownTexAlphaChange;
   AddToolbarControl(FToolbar, FUpDownTexAlpha);
+  AttachMouseEvent(FUpDownTexAlpha);
   FButtonLoadTexture := AddToolbarButton(FToolbar, 'Load texture...', 22, @ButtonLoadTextureClick);
+  AttachMouseEvent(FButtonLoadTexture);
   FTexturePreview := TImage.Create(FToolbar);
   FTexturePreview.Width := FToolbar.ButtonWidth;
   FTexturePreview.Height := FToolbar.ButtonHeight;
@@ -628,6 +671,7 @@ begin
   FTexOpacity:= 255;
   FCanAdjustToShape:= true;
 
+  FVerticalPadding:= 4;
   FImageList := TBGRAImageList.Create(self);
   FImageListLoaded:= false;
   FImageListSize := Size(AImageListWidth,AImageListHeight);
@@ -640,10 +684,15 @@ begin
 
   FToolbar := CreateToolBar(FImageList);
   FToolbar.Wrapable := false;
+  AttachMouseEvent(FToolbar);
   FButtonFillNone := AddToolbarCheckButton(FToolbar, 'No fill', 0, @ButtonFillChange, False, False);
+  AttachMouseEvent(FButtonFillNone);
   FButtonFillSolid := AddToolbarCheckButton(FToolbar, 'Solid color', 1, @ButtonFillChange, False, False);
+  AttachMouseEvent(FButtonFillSolid);
   FButtonFillGradient := AddToolbarButton(FToolbar, 'Gradient fill', 2+ord(FGradType), @ButtonFillGradClick);
+  AttachMouseEvent(FButtonFillGradient);
   FButtonFillTexture := AddToolbarButton(FToolbar, 'Texture fill', 24, @ButtonFillTexClick);
+  AttachMouseEvent(FButtonFillTexture);
   FButtonFillTexture.Wrap := true;
 
   //menu to access gradient interface
@@ -664,6 +713,33 @@ begin
   UpdateAccordingToFillType;
 end;
 
+procedure TVectorialFillInterface.AttachMouseEvent(AControl: TToolBar);
+begin
+  AControl.OnMouseMove:=@ToolbarMouseMove;
+  AControl.OnMouseDown:=@ToolbarMouseDown;
+  AControl.OnMouseUp:=@ToolbarMouseUp;
+  AControl.OnMouseEnter:=@ToolbarMouseEnter;
+  AControl.OnMouseLeave:=@ToolbarMouseLeave;
+end;
+
+procedure TVectorialFillInterface.AttachMouseEvent(AControl: TToolButton);
+begin
+  AControl.OnMouseMove:=@AnyButtonMouseMove;
+  AControl.OnMouseDown:=@AnyButtonMouseDown;
+  AControl.OnMouseUp:=@AnyButtonMouseUp;
+  AControl.OnMouseEnter:=@AnyButtonMouseEnter;
+  AControl.OnMouseLeave:=@AnyButtonMouseLeave;
+end;
+
+procedure TVectorialFillInterface.AttachMouseEvent(AControl: TBCTrackbarUpdown);
+begin
+  AControl.OnMouseMove:=@AnyButtonMouseMove;
+  AControl.OnMouseDown:=@AnyButtonMouseDown;
+  AControl.OnMouseUp:=@AnyButtonMouseUp;
+  AControl.OnMouseEnter:=@AnyButtonMouseEnter;
+  AControl.OnMouseLeave:=@AnyButtonMouseLeave;
+end;
+
 procedure TVectorialFillInterface.SetSolidColor(AValue: TBGRAPixel);
 begin
   if FSolidColor=AValue then Exit;
@@ -841,6 +917,73 @@ begin
   end;
 end;
 
+procedure TVectorialFillInterface.ToolbarMouseMove(Sender: TObject;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(FOnMouseMove) then FOnMouseMove(self, Shift, X+FToolbar.Left,Y+FToolbar.Top);
+end;
+
+procedure TVectorialFillInterface.ToolbarMouseUp(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(FOnMouseUp) then FOnMouseUp(self, Button, Shift, X+FToolbar.Left,Y+FToolbar.Top);
+end;
+
+procedure TVectorialFillInterface.AnyButtonMouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(FOnMouseDown) then FOnMouseDown(self, Button, Shift,
+      X+FToolbar.Left+TControl(Sender).Left,Y+FToolbar.Top+TControl(Sender).Top);
+end;
+
+procedure TVectorialFillInterface.AnyButtonMouseEnter(Sender: TObject);
+begin
+  If Assigned(FOnMouseEnter) then FOnMouseEnter(self);
+end;
+
+procedure TVectorialFillInterface.AnyButtonMouseLeave(Sender: TObject);
+begin
+  If Assigned(FOnMouseLeave) then FOnMouseLeave(self);
+end;
+
+procedure TVectorialFillInterface.AnyButtonMouseMove(Sender: TObject;
+  Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(FOnMouseMove) then FOnMouseMove(self, Shift,
+      X+FToolbar.Left+TControl(Sender).Left,Y+FToolbar.Top+TControl(Sender).Top);
+end;
+
+procedure TVectorialFillInterface.AnyButtonMouseUp(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(FOnMouseUp) then FOnMouseUp(self, Button, Shift,
+      X+FToolbar.Left+TControl(Sender).Left,Y+FToolbar.Top+TControl(Sender).Top);
+end;
+
+procedure TVectorialFillInterface.ToolbarMouseDown(Sender: TObject;
+  Button: TMouseButton; Shift: TShiftState; X, Y: Integer);
+begin
+  if Assigned(FOnMouseDown) then FOnMouseDown(self, Button, Shift, X+FToolbar.Left,Y+FToolbar.Top);
+end;
+
+procedure TVectorialFillInterface.SetVerticalPadding(AValue: integer);
+begin
+  if FVerticalPadding=AValue then Exit;
+  FVerticalPadding:=AValue;
+  if Assigned(FToolbar) and Assigned(FImageList) then
+    FToolbar.ButtonHeight:= FImageList.Height+AValue;
+end;
+
+procedure TVectorialFillInterface.ToolbarMouseEnter(Sender: TObject);
+begin
+  If Assigned(FOnMouseEnter) then FOnMouseEnter(self);
+end;
+
+procedure TVectorialFillInterface.ToolbarMouseLeave(Sender: TObject);
+begin
+  If Assigned(FOnMouseLeave) then FOnMouseLeave(self);
+end;
+
 procedure TVectorialFillInterface.AdjustToShapeClick(Sender: TObject);
 begin
   if Assigned(FOnAdjustToShape) then FOnAdjustToShape(self);

Vissa filer visades inte eftersom för många filer har ändrats