فهرست منبع

using BCComboBox

Johann 6 سال پیش
والد
کامیت
a1f5073325
5فایلهای تغییر یافته به همراه202 افزوده شده و 123 حذف شده
  1. 44 75
      lazpaint/lazpaintmainform.lfm
  2. 12 6
      lazpaint/lazpaintmainform.pas
  3. 67 11
      lazpaint/maintoolbar.inc
  4. 49 29
      lazpaint/ugraph.pas
  5. 30 2
      lazpaint/umenu.pas

+ 44 - 75
lazpaint/lazpaintmainform.lfm

@@ -1110,16 +1110,13 @@ object FMain: TFMain
         Style = tbsCheck
         Style = tbsCheck
       end
       end
     end
     end
-    object Combo_GradientColorspace: TComboBox
-      Left = 156
-      Height = 36
-      Top = 1
-      Width = 148
-      Font.Height = -15
-      ItemHeight = 0
-      ParentFont = False
-      Style = csDropDownList
-      TabOrder = 1
+    object Combo_GradientColorspace: TBCComboBox
+      Left = 154
+      Height = 29
+      Top = 3
+      Width = 151
+      ItemIndex = -1
+      DropDownBorderColor = clBlack
     end
     end
   end
   end
   object Panel_Undo: TPanel
   object Panel_Undo: TPanel
@@ -1282,32 +1279,6 @@ object FMain: TFMain
         Style = tbsCheck
         Style = tbsCheck
       end
       end
     end
     end
-    object ComboBox_ArrowStart: TComboBox
-      Left = 0
-      Height = 36
-      Top = 1
-      Width = 56
-      AutoSize = False
-      DropDownCount = 12
-      Font.Height = -15
-      ItemHeight = 21
-      ParentFont = False
-      Style = csOwnerDrawFixed
-      TabOrder = 1
-    end
-    object ComboBox_ArrowEnd: TComboBox
-      Left = 57
-      Height = 36
-      Top = 1
-      Width = 56
-      AutoSize = False
-      DropDownCount = 12
-      Font.Height = -15
-      ItemHeight = 21
-      ParentFont = False
-      Style = csOwnerDrawFixed
-      TabOrder = 2
-    end
     object SpinEdit_ArrowSizeX: TBCTrackbarUpdown
     object SpinEdit_ArrowSizeX: TBCTrackbarUpdown
       Left = 116
       Left = 116
       Height = 25
       Height = 25
@@ -1420,7 +1391,7 @@ object FMain: TFMain
       Font.Name = 'Arial'
       Font.Name = 'Arial'
       HasTrackBar = True
       HasTrackBar = True
       ArrowColor = clBtnText
       ArrowColor = clBtnText
-      TabOrder = 3
+      TabOrder = 1
       TabStop = True
       TabStop = True
       UseDockManager = False
       UseDockManager = False
     end
     end
@@ -1536,10 +1507,26 @@ object FMain: TFMain
       Font.Name = 'Arial'
       Font.Name = 'Arial'
       HasTrackBar = True
       HasTrackBar = True
       ArrowColor = clBtnText
       ArrowColor = clBtnText
-      TabOrder = 4
+      TabOrder = 2
       TabStop = True
       TabStop = True
       UseDockManager = False
       UseDockManager = False
     end
     end
+    object ComboBox_ArrowStart: TBCComboBox
+      Left = 2
+      Height = 29
+      Top = 2
+      Width = 54
+      ItemIndex = -1
+      DropDownBorderColor = clBlack
+    end
+    object ComboBox_ArrowEnd: TBCComboBox
+      Left = 59
+      Height = 29
+      Top = 2
+      Width = 54
+      ItemIndex = -1
+      DropDownBorderColor = clBlack
+    end
   end
   end
   object Panel_JoinStyle: TPanel
   object Panel_JoinStyle: TPanel
     Left = 460
     Left = 460
@@ -2137,27 +2124,6 @@ object FMain: TFMain
     ParentColor = False
     ParentColor = False
     ParentFont = False
     ParentFont = False
     TabOrder = 19
     TabOrder = 19
-    object Combo_SplineStyle: TComboBox
-      Left = 57
-      Height = 32
-      Top = 1
-      Width = 148
-      Font.Height = -15
-      ItemHeight = 0
-      Items.Strings = (
-        'Inside'
-        'Inside + ends'
-        'Crossing'
-        'Crossing + ends'
-        'Outside'
-        'Round outside'
-        'Vertex to side'
-        'Easy Bézier'
-      )
-      ParentFont = False
-      Style = csDropDownList
-      TabOrder = 0
-    end
     object Label_Curve: TLabel
     object Label_Curve: TLabel
       Left = 5
       Left = 5
       Height = 28
       Height = 28
@@ -2181,7 +2147,7 @@ object FMain: TFMain
       Font.Height = -15
       Font.Height = -15
       Images = ImageList16
       Images = ImageList16
       ParentFont = False
       ParentFont = False
-      TabOrder = 1
+      TabOrder = 0
       object Tool_CurveModeAngle: TToolButton
       object Tool_CurveModeAngle: TToolButton
         Left = 59
         Left = 59
         Hint = 'Draw an angle'
         Hint = 'Draw an angle'
@@ -2211,6 +2177,14 @@ object FMain: TFMain
         Style = tbsCheck
         Style = tbsCheck
       end
       end
     end
     end
+    object Combo_SplineStyle: TBCComboBox
+      Left = 56
+      Height = 29
+      Top = 3
+      Width = 152
+      ItemIndex = -1
+      DropDownBorderColor = clBlack
+    end
   end
   end
   object Panel_Embedded: TPanel
   object Panel_Embedded: TPanel
     Left = 240
     Left = 240
@@ -3421,19 +3395,6 @@ object FMain: TFMain
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
     end
     end
-    object ComboBox_BrushSelect: TComboBox
-      Left = 56
-      Height = 36
-      Top = 1
-      Width = 56
-      AutoSize = False
-      DropDownCount = 12
-      Font.Height = -15
-      ItemHeight = 21
-      ParentFont = False
-      Style = csOwnerDrawFixed
-      TabOrder = 0
-    end
     object Label_Spacing: TLabel
     object Label_Spacing: TLabel
       Left = 117
       Left = 117
       Height = 28
       Height = 28
@@ -3459,7 +3420,7 @@ object FMain: TFMain
       Images = ImageList16
       Images = ImageList16
       ParentColor = False
       ParentColor = False
       ParentFont = False
       ParentFont = False
-      TabOrder = 1
+      TabOrder = 0
       object ToolButton21: TToolButton
       object ToolButton21: TToolButton
         Left = 1
         Left = 1
         Top = 0
         Top = 0
@@ -3588,10 +3549,18 @@ object FMain: TFMain
       Font.Name = 'Arial'
       Font.Name = 'Arial'
       HasTrackBar = True
       HasTrackBar = True
       ArrowColor = clBtnText
       ArrowColor = clBtnText
-      TabOrder = 2
+      TabOrder = 1
       TabStop = True
       TabStop = True
       UseDockManager = False
       UseDockManager = False
     end
     end
+    object ComboBox_BrushSelect: TBCComboBox
+      Left = 54
+      Height = 29
+      Top = 3
+      Width = 58
+      ItemIndex = -1
+      DropDownBorderColor = clBlack
+    end
   end
   end
   object Panel_Ratio: TPanel
   object Panel_Ratio: TPanel
     Left = 10
     Left = 10

+ 12 - 6
lazpaint/lazpaintmainform.pas

@@ -11,7 +11,7 @@ interface
 uses
 uses
   Classes, LMessages, SysUtils, LazFileUtils, LResources, Forms, Controls,
   Classes, LMessages, SysUtils, LazFileUtils, LResources, Forms, Controls,
   Graphics, Dialogs, Menus, ExtDlgs, ComCtrls, ActnList, StdCtrls, ExtCtrls,
   Graphics, Dialogs, Menus, ExtDlgs, ComCtrls, ActnList, StdCtrls, ExtCtrls,
-  Buttons, types, LCLType, BGRAImageList, BCTrackbarUpdown,
+  Buttons, types, LCLType, BGRAImageList, BCTrackbarUpdown, BCComboBox, BCButton,
 
 
   BGRABitmap, BGRABitmapTypes, BGRALayers, BGRASVGOriginal,
   BGRABitmap, BGRABitmapTypes, BGRALayers, BGRASVGOriginal,
 
 
@@ -28,6 +28,11 @@ type
   { TFMain }
   { TFMain }
 
 
   TFMain = class(TForm)
   TFMain = class(TForm)
+    ComboBox_ArrowStart: TBCComboBox;
+    ComboBox_ArrowEnd: TBCComboBox;
+    ComboBox_BrushSelect: TBCComboBox;
+    Combo_SplineStyle: TBCComboBox;
+    Combo_GradientColorspace: TBCComboBox;
     SpinEdit_PenOpacity: TBCTrackbarUpdown;
     SpinEdit_PenOpacity: TBCTrackbarUpdown;
     FilterWaveDisplacement: TAction;
     FilterWaveDisplacement: TAction;
     SpinEdit_BackOpacity: TBCTrackbarUpdown;
     SpinEdit_BackOpacity: TBCTrackbarUpdown;
@@ -66,7 +71,6 @@ type
     ToolHotSpot: TAction;
     ToolHotSpot: TAction;
     Combo_Ratio: TComboBox;
     Combo_Ratio: TComboBox;
     FileUseImageBrowser: TAction;
     FileUseImageBrowser: TAction;
-    Combo_GradientColorspace: TComboBox;
     ItemUseImageBrowser: TMenuItem;
     ItemUseImageBrowser: TMenuItem;
     Label_Ratio: TLabel;
     Label_Ratio: TLabel;
     Panel_Ratio: TPanel;
     Panel_Ratio: TPanel;
@@ -80,7 +84,6 @@ type
     BrushRemoveCurrent: TAction;
     BrushRemoveCurrent: TAction;
     BrushLoadFromFile: TAction;
     BrushLoadFromFile: TAction;
     BrushCreateGeometric: TAction;
     BrushCreateGeometric: TAction;
-    ComboBox_BrushSelect: TComboBox;
     Label_Brush: TLabel;
     Label_Brush: TLabel;
     Label_Spacing: TLabel;
     Label_Spacing: TLabel;
     MenuDockToolboxLeft: TMenuItem;
     MenuDockToolboxLeft: TMenuItem;
@@ -102,8 +105,6 @@ type
     ToolButton7: TToolButton;
     ToolButton7: TToolButton;
     ToolChangeDocking: TAction;
     ToolChangeDocking: TAction;
     FilterBlurBox: TAction;
     FilterBlurBox: TAction;
-    ComboBox_ArrowStart: TComboBox;
-    ComboBox_ArrowEnd: TComboBox;
     EditPasteAsNewLayer: TAction;
     EditPasteAsNewLayer: TAction;
     ItemDockLayersAndColors: TMenuItem;
     ItemDockLayersAndColors: TMenuItem;
     ItemFullscreen: TMenuItem;
     ItemFullscreen: TMenuItem;
@@ -309,7 +310,6 @@ type
     ToolBar15: TToolBar;
     ToolBar15: TToolBar;
     Tool_TextFont: TToolButton;
     Tool_TextFont: TToolButton;
     Tool_TextShadow: TToolButton;
     Tool_TextShadow: TToolButton;
-    Combo_SplineStyle: TComboBox;
     PaintBox_Picture: TPaintBox;
     PaintBox_Picture: TPaintBox;
     PaintBox_PenPreview: TPaintBox;
     PaintBox_PenPreview: TPaintBox;
     Panel_Embedded: TPanel;
     Panel_Embedded: TPanel;
@@ -412,12 +412,18 @@ type
     procedure ComboBox_ArrowEndChange(Sender: TObject);
     procedure ComboBox_ArrowEndChange(Sender: TObject);
     procedure ComboBox_ArrowEndDrawItem({%H-}Control: TWinControl; Index: Integer;
     procedure ComboBox_ArrowEndDrawItem({%H-}Control: TWinControl; Index: Integer;
       ARect: TRect; State: TOwnerDrawState);
       ARect: TRect; State: TOwnerDrawState);
+    procedure ComboBox_ArrowEndDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
+        AState: TBCButtonState; ARect: TRect);
     procedure ComboBox_ArrowStartChange(Sender: TObject);
     procedure ComboBox_ArrowStartChange(Sender: TObject);
     procedure ComboBox_ArrowStartDrawItem({%H-}Control: TWinControl; Index: Integer;
     procedure ComboBox_ArrowStartDrawItem({%H-}Control: TWinControl; Index: Integer;
       ARect: TRect; State: TOwnerDrawState);
       ARect: TRect; State: TOwnerDrawState);
+    procedure ComboBox_ArrowStartDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
+        AState: TBCButtonState; ARect: TRect);
     procedure ComboBox_BrushSelectChange(Sender: TObject);
     procedure ComboBox_BrushSelectChange(Sender: TObject);
     procedure ComboBox_BrushSelectDrawItem({%H-}Control: TWinControl;
     procedure ComboBox_BrushSelectDrawItem({%H-}Control: TWinControl;
       Index: Integer; ARect: TRect; State: TOwnerDrawState);
       Index: Integer; ARect: TRect; State: TOwnerDrawState);
+    procedure ComboBox_BrushSelectDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
+        AState: TBCButtonState; ARect: TRect);
     procedure Combo_RatioChange(Sender: TObject);
     procedure Combo_RatioChange(Sender: TObject);
     procedure EditCopyExecute(Sender: TObject);
     procedure EditCopyExecute(Sender: TObject);
     procedure EditCopyUpdate(Sender: TObject);
     procedure EditCopyUpdate(Sender: TObject);

+ 67 - 11
lazpaint/maintoolbar.inc

@@ -19,8 +19,10 @@ begin
   Tool_CapSquare.OnClick := @Tool_CapSquareClick;
   Tool_CapSquare.OnClick := @Tool_CapSquareClick;
   ComboBox_ArrowStart.OnChange := @ComboBox_ArrowStartChange;
   ComboBox_ArrowStart.OnChange := @ComboBox_ArrowStartChange;
   ComboBox_ArrowStart.OnDrawItem := @ComboBox_ArrowStartDrawItem;
   ComboBox_ArrowStart.OnDrawItem := @ComboBox_ArrowStartDrawItem;
+  ComboBox_ArrowStart.OnDrawSelectedItem := @ComboBox_ArrowStartDrawSelectedItem;
   ComboBox_ArrowEnd.OnChange := @ComboBox_ArrowEndChange;
   ComboBox_ArrowEnd.OnChange := @ComboBox_ArrowEndChange;
   ComboBox_ArrowEnd.OnDrawItem := @ComboBox_ArrowEndDrawItem;
   ComboBox_ArrowEnd.OnDrawItem := @ComboBox_ArrowEndDrawItem;
+  ComboBox_ArrowEnd.OnDrawSelectedItem := @ComboBox_ArrowEndDrawSelectedItem;
   Tool_JoinBevel.OnClick := @Tool_JoinBevelClick;
   Tool_JoinBevel.OnClick := @Tool_JoinBevelClick;
   Tool_JoinRound.OnClick := @Tool_JoinRoundClick;
   Tool_JoinRound.OnClick := @Tool_JoinRoundClick;
   Tool_JoinMiter.OnClick := @Tool_JoinMiterClick;
   Tool_JoinMiter.OnClick := @Tool_JoinMiterClick;
@@ -32,6 +34,14 @@ begin
   Tool_EraseAlpha.OnClick := @Tool_EraseOptionClick;
   Tool_EraseAlpha.OnClick := @Tool_EraseOptionClick;
   Tool_EraseBlur.OnClick := @Tool_EraseOptionClick;
   Tool_EraseBlur.OnClick := @Tool_EraseOptionClick;
   Tool_GridMoveWithoutDeformation.OnClick := @Tool_GridMoveWithoutDeformationClick;
   Tool_GridMoveWithoutDeformation.OnClick := @Tool_GridMoveWithoutDeformationClick;
+  Combo_SplineStyle.Items.Add('Inside');
+  Combo_SplineStyle.Items.Add('Inside + ends');
+  Combo_SplineStyle.Items.Add('Crossing');
+  Combo_SplineStyle.Items.Add('Crossing + ends');
+  Combo_SplineStyle.Items.Add('Outside');
+  Combo_SplineStyle.Items.Add('Round outside');
+  Combo_SplineStyle.Items.Add('Vertex to side');
+  Combo_SplineStyle.Items.Add('Easy Bézier');
   Combo_SplineStyle.OnChange := @Combo_SplineStyleChange;
   Combo_SplineStyle.OnChange := @Combo_SplineStyleChange;
   Tool_CurveMovePoint.OnClick := @Tool_CurveMovePointClick;
   Tool_CurveMovePoint.OnClick := @Tool_CurveMovePointClick;
   Tool_CurveModeAuto.OnClick := @Tool_CurveModeAutoClick;
   Tool_CurveModeAuto.OnClick := @Tool_CurveModeAutoClick;
@@ -69,6 +79,7 @@ begin
   TimerHidePenPreview.OnTimer := @TimerHidePenPreviewTimer;
   TimerHidePenPreview.OnTimer := @TimerHidePenPreviewTimer;
   ComboBox_BrushSelect.OnChange := @ComboBox_BrushSelectChange;
   ComboBox_BrushSelect.OnChange := @ComboBox_BrushSelectChange;
   ComboBox_BrushSelect.OnDrawItem := @ComboBox_BrushSelectDrawItem;
   ComboBox_BrushSelect.OnDrawItem := @ComboBox_BrushSelectDrawItem;
+  ComboBox_BrushSelect.OnDrawSelectedItem:= @ComboBox_BrushSelectDrawSelectedItem;
   Combo_Ratio.OnChange := @Combo_RatioChange;
   Combo_Ratio.OnChange := @Combo_RatioChange;
 
 
   Panel_LineCap_FullSize := Panel_LineCap.Width;
   Panel_LineCap_FullSize := Panel_LineCap.Width;
@@ -96,9 +107,6 @@ begin
   SpinEdit_PenWidth.OnExit:= @SpinEdit_PenWidthExit;
   SpinEdit_PenWidth.OnExit:= @SpinEdit_PenWidthExit;
   SpinEdit_PenWidth.BarExponent := 3;
   SpinEdit_PenWidth.BarExponent := 3;
 
 
-  ComboBox_ArrowStart.ItemIndex := 0;
-  ComboBox_ArrowEnd.ItemIndex := 0;
-
   SpinEdit_ArrowSizeX.MinValue := 10;
   SpinEdit_ArrowSizeX.MinValue := 10;
   SpinEdit_ArrowSizeX.MaxValue := 99;
   SpinEdit_ArrowSizeX.MaxValue := 99;
   SpinEdit_ArrowSizeX.Value := 20;
   SpinEdit_ArrowSizeX.Value := 20;
@@ -845,7 +853,20 @@ var
 begin
 begin
   if Index = -1 then exit;
   if Index = -1 then exit;
   kind := ComboBox_ArrowStart.Items[Index];
   kind := ComboBox_ArrowStart.Items[Index];
-  DrawArrow(ComboBox_ArrowStart.Canvas,ARect,True,kind,ToolManager.ToolLineCap,State);
+  DrawArrow(ComboBox_ArrowStart,ARect,True,kind,ToolManager.ToolLineCap,State);
+end;
+
+procedure TFMain.ComboBox_ArrowStartDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
+    AState: TBCButtonState; ARect: TRect);
+var
+  cb: TBCComboBox;
+  kind: String;
+begin
+  cb := ComboBox_ArrowStart;
+  if cb.ItemIndex = -1 then exit;
+  kind := cb.Text;
+  ARect.Inflate(-2,-2);
+  DrawArrow(ABGRA,ARect,True,kind,ToolManager.ToolLineCap,AState.FontEx.Color);
 end;
 end;
 
 
 procedure TFMain.ComboBox_ArrowEndChange(Sender: TObject);
 procedure TFMain.ComboBox_ArrowEndChange(Sender: TObject);
@@ -885,7 +906,20 @@ var
 begin
 begin
   if Index = -1 then exit;
   if Index = -1 then exit;
   kind := ComboBox_ArrowEnd.Items[Index];
   kind := ComboBox_ArrowEnd.Items[Index];
-  DrawArrow(ComboBox_ArrowEnd.Canvas,ARect,False,kind,ToolManager.ToolLineCap,State);
+  DrawArrow(ComboBox_ArrowEnd,ARect,False,kind,ToolManager.ToolLineCap,State);
+end;
+
+procedure TFMain.ComboBox_ArrowEndDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
+    AState: TBCButtonState; ARect: TRect);
+var
+  cb: TBCComboBox;
+  kind: String;
+begin
+  cb := ComboBox_ArrowEnd;
+  if cb.ItemIndex = -1 then exit;
+  kind := cb.Text;
+  ARect.Inflate(-2,-2);
+  DrawArrow(ABGRA,ARect,False,kind,ToolManager.ToolLineCap,AState.FontEx.Color);
 end;
 end;
 
 
 procedure TFMain.SpinEdit_ArrowSizeChange(Sender: TObject; AByUser: boolean);
 procedure TFMain.SpinEdit_ArrowSizeChange(Sender: TObject; AByUser: boolean);
@@ -1498,18 +1532,20 @@ var brushIndex: integer;
     bmp: TBGRABitmap;
     bmp: TBGRABitmap;
     c2: TBGRAPixel;
     c2: TBGRAPixel;
     c: TBGRAPixel;
     c: TBGRAPixel;
+    cb: TBCComboBox;
 begin
 begin
   if Index = -1 then exit;
   if Index = -1 then exit;
+  cb := ComboBox_BrushSelect;
   if odSelected in State then
   if odSelected in State then
   begin
   begin
-    c2 := ColorToBGRA(ColorToRGB(clHighlight));
-    c := ColorToBGRA(ColorToRGB(clHighlightText));
+    c2 := ColorToBGRA(cb.DropDownHighlight);
+    c := ColorToBGRA(cb.DropDownFontHighlight);
   end else
   end else
   begin
   begin
-    c2 := ColorToBGRA(ColorToRGB(clWindow));
-    c := ColorToBGRA(ColorToRGB(clWindowText));
+    c2 := ColorToBGRA(cb.DropDownColor);
+    c := ColorToBGRA(cb.DropDownFontColor);
   end;
   end;
-  brushIndex := StrToInt(ComboBox_BrushSelect.Items[Index]);
+  brushIndex := StrToInt(cb.Items[Index]);
   bi := ToolManager.ToolBrushAt[brushIndex];
   bi := ToolManager.ToolBrushAt[brushIndex];
   if bi <> nil then
   if bi <> nil then
   with bi do
   with bi do
@@ -1517,11 +1553,31 @@ begin
     bi.Size := ARect.Bottom-ARect.Top-2;
     bi.Size := ARect.Bottom-ARect.Top-2;
     bmp := TBGRABitmap.Create(ARect.Right-ARect.Left,ARect.Bottom-ARect.Top, c2);
     bmp := TBGRABitmap.Create(ARect.Right-ARect.Left,ARect.Bottom-ARect.Top, c2);
     bi.Put(bmp, (bmp.Width-1) div 2, bi.BrushImage.Height div 2 + 1, c);
     bi.Put(bmp, (bmp.Width-1) div 2, bi.BrushImage.Height div 2 + 1, c);
-    ComboBox_BrushSelect.Canvas.Draw(ARect.Left,ARect.Top,bmp.Bitmap);
+    cb.Canvas.Draw(ARect.Left,ARect.Top,bmp.Bitmap);
     bmp.Free;
     bmp.Free;
   end;
   end;
 end;
 end;
 
 
+procedure TFMain.ComboBox_BrushSelectDrawSelectedItem(Sender: TObject; const ABGRA: TBGRABitmap;
+    AState: TBCButtonState; ARect: TRect);
+var
+  cb: TBCComboBox;
+  brushIndex: LongInt;
+  bi: TLazPaintBrush;
+  c: TColor;
+begin
+  cb := ComboBox_BrushSelect;
+  if cb.ItemIndex = -1 then exit;
+  brushIndex := StrToInt(cb.Text);
+  bi := ToolManager.ToolBrushAt[brushIndex];
+  c:= AState.FontEx.Color;
+  if bi <> nil then
+  begin
+    bi.Size := ARect.Height-2;
+    bi.Put(ABGRA, ARect.Left+ ARect.Width div 2, ARect.Top+ bi.BrushImage.Height div 2 +1, c);
+  end;
+end;
+
 procedure TFMain.ComboBox_BrushSelectChange(Sender: TObject);
 procedure TFMain.ComboBox_BrushSelectChange(Sender: TObject);
 begin
 begin
   if initialized then
   if initialized then

+ 49 - 29
lazpaint/ugraph.pas

@@ -6,7 +6,7 @@ interface
 
 
 uses
 uses
   Classes, SysUtils, bgrabitmap, bgrabitmaptypes, LazPaintType, Graphics, BGRALayers, LCLType,
   Classes, SysUtils, bgrabitmap, bgrabitmaptypes, LazPaintType, Graphics, BGRALayers, LCLType,
-  BCButton;
+  BCButton, BCComboBox;
 
 
 const FrameDashLength = 4;
 const FrameDashLength = 4;
   NicePointMaxRadius = 4;
   NicePointMaxRadius = 4;
@@ -54,7 +54,8 @@ function WaveDisplacementFilter(source: TBGRACustomBitmap;
   AWaveLength, ADisplacement, APhase: single): TBGRACustomBitmap;
   AWaveLength, ADisplacement, APhase: single): TBGRACustomBitmap;
 
 
 function DoResample(source :TBGRABitmap; newWidth, newHeight: integer; StretchMode: TResampleMode): TBGRABitmap;
 function DoResample(source :TBGRABitmap; newWidth, newHeight: integer; StretchMode: TResampleMode): TBGRABitmap;
-procedure DrawArrow(ACanvas: TCanvas; ARect: TRect; AStart: boolean; AKindStr: string; ALineCap: TPenEndCap; State: TOwnerDrawState);
+procedure DrawArrow(AComboBox: TBCComboBox; ARect: TRect; AStart: boolean; AKindStr: string; ALineCap: TPenEndCap; State: TOwnerDrawState); overload;
+procedure DrawArrow(ABitmap: TBGRABitmap; ARect: TRect; AStart: boolean; AKindStr: string; ALineCap: TPenEndCap; AColor: TBGRAPixel); overload;
 procedure BCAssignSystemStyle(AButton: TBCButton; ADarkTheme: boolean);
 procedure BCAssignSystemStyle(AButton: TBCButton; ADarkTheme: boolean);
 
 
 implementation
 implementation
@@ -127,8 +128,8 @@ var highlight, btnFace, btnShadow, btnText: TColor;
 begin
 begin
   if ADarkTheme then
   if ADarkTheme then
   begin
   begin
-    highlight := clDarkBtnHighlight;
-    btnFace := clDarkBtnFace;
+    highlight := $a0a0a0;
+    btnFace := clDarkEditableFace;
     btnText := clLightText;
     btnText := clLightText;
     btnShadow:= clBlack;
     btnShadow:= clBlack;
   end else
   end else
@@ -791,26 +792,16 @@ begin
   result := source.Resample(newWidth,newHeight,StretchMode) as TBGRABitmap;
   result := source.Resample(newWidth,newHeight,StretchMode) as TBGRABitmap;
 end;
 end;
 
 
-procedure DrawArrow(ACanvas: TCanvas; ARect: TRect; AStart: boolean; AKindStr: string; ALineCap: TPenEndCap; State: TOwnerDrawState);
-var bmp : TBGRABitmap;
-  c,c2: TBGRAPixel;
-  x1,x2,xm1,xm2,y,w,temp: single;
+procedure DrawArrowMask(AMask: TBGRABitmap; AStart: boolean; AKindStr: string; ALineCap: TPenEndCap);
+var
   kind: TArrowKind;
   kind: TArrowKind;
+  x1,x2,xm1,xm2,y,w,temp: single;
 begin
 begin
+  AMask.Fill(BGRABlack);
   kind := StrToArrowKind(AKindStr);
   kind := StrToArrowKind(AKindStr);
-  if odSelected in State then
-  begin
-    c2 := ColorToBGRA(ColorToRGB(clHighlight));
-    c := ColorToBGRA(ColorToRGB(clHighlightText));
-  end else
-  begin
-    c2 := ColorToBGRA(ColorToRGB(clWindow));
-    c := ColorToBGRA(ColorToRGB(clWindowText));
-  end;
-  with Size(ARect) do bmp:= TBGRABitmap.Create(cx,cy,c2);
-  ApplyArrowStyle(bmp.Arrow,AStart,kind,PointF(1.5,1.5));
-  bmp.LineCap := ALineCap;
-  w := bmp.Height/5;
+  ApplyArrowStyle(AMask.Arrow,AStart,kind,PointF(1.5,1.5));
+  AMask.LineCap := ALineCap;
+  w := AMask.Height/5;
   if w > 0 then
   if w > 0 then
   begin
   begin
     x1 := w*2.5;
     x1 := w*2.5;
@@ -826,19 +817,48 @@ begin
       x2 := -temp;
       x2 := -temp;
     end else
     end else
     begin
     begin
-      xm1 := (bmp.Width-0.5)-xm1;
-      xm2 := (bmp.Width-0.5)-xm2;
+      xm1 := (AMask.Width-0.5)-xm1;
+      xm2 := (AMask.Width-0.5)-xm2;
     end;
     end;
     x1 -= 0.5;
     x1 -= 0.5;
-    x2 += bmp.Width-0.5;
-    y := (bmp.Height-1)/2;
+    x2 += AMask.Width-0.5;
+    y := (AMask.Height-1)/2;
     if kind in[akTail,akNone,akTip] then w *= 2;
     if kind in[akTail,akNone,akTip] then w *= 2;
-    bmp.DrawLineAntialias(x1,y,x2,y,c,w);
-    if bmp.Width > bmp.Height*2 then
-      bmp.GradientFill(0,0,bmp.width,bmp.height,c2,BGRAPixelTransparent,gtLinear,PointF(xm1,0),PointF(xm2,0),dmDrawWithTransparency);
+    AMask.DrawLineAntialias(x1,y,x2,y,BGRAWhite,w);
+    if AMask.Width > AMask.Height*2 then
+      AMask.GradientFill(0,0,AMask.width,AMask.height,BGRABlack,BGRAPixelTransparent,gtLinear,PointF(xm1,0),PointF(xm2,0),dmDrawWithTransparency);
   end;
   end;
-  ACanvas.Draw(ARect.Left,ARect.Top,bmp.Bitmap);
+end;
+
+procedure DrawArrow(AComboBox: TBCComboBox; ARect: TRect; AStart: boolean; AKindStr: string; ALineCap: TPenEndCap; State: TOwnerDrawState);
+var mask, bmp : TBGRABitmap;
+  c,c2: TBGRAPixel;
+begin
+  if odSelected in State then
+  begin
+    c2 := ColorToBGRA(AComboBox.DropDownHighlight);
+    c := ColorToBGRA(AComboBox.DropDownFontHighlight);
+  end else
+  begin
+    c2 := ColorToBGRA(AComboBox.DropDownColor);
+    c := ColorToBGRA(AComboBox.DropDownFontColor);
+  end;
+  with Size(ARect) do mask:= TBGRABitmap.Create(cx,cy,BGRABlack);
+  DrawArrowMask(mask, AStart, AKindStr, ALineCap);
+  bmp := TBGRABitmap.Create(mask.Width,mask.Height,c2);
+  bmp.FillMask(0,0,mask,c,dmDrawWithTransparency);
+  bmp.Draw(ACombobox.Canvas,ARect.Left,ARect.Top,true);
   bmp.Free;
   bmp.Free;
+  mask.Free;
+end;
+
+procedure DrawArrow(ABitmap: TBGRABitmap; ARect: TRect; AStart: boolean; AKindStr: string; ALineCap: TPenEndCap; AColor: TBGRAPixel); overload;
+var mask: TBGRABitmap;
+begin
+  with Size(ARect) do mask:= TBGRABitmap.Create(cx,cy,BGRABlack);
+  DrawArrowMask(mask, AStart, AKindStr, ALineCap);
+  ABitmap.FillMask(ARect.Left,ARect.Top, mask, AColor, dmDrawWithTransparency);
+  mask.Free;
 end;
 end;
 
 
 function CreateMarbleTexture(tx,ty: integer): TBGRABitmap;
 function CreateMarbleTexture(tx,ty: integer): TBGRABitmap;

+ 30 - 2
lazpaint/umenu.pas

@@ -51,7 +51,8 @@ type
 implementation
 implementation
 
 
 uses UResourceStrings, BGRAUTF8, LCScaleDPI, ComCtrls, Graphics,
 uses UResourceStrings, BGRAUTF8, LCScaleDPI, ComCtrls, Graphics,
-  Spin, StdCtrls, BGRAText, math, udarktheme, BCTrackbarUpdown, BCTypes;
+  StdCtrls, BGRAText, math, udarktheme, BCTrackbarUpdown, BCTypes,
+  ugraph, BCComboBox, BGRABitmapTypes;
 
 
 { TMainFormMenu }
 { TMainFormMenu }
 
 
@@ -208,7 +209,7 @@ end;
 
 
 procedure TMainFormMenu.ApplyTheme;
 procedure TMainFormMenu.ApplyTheme;
 var
 var
-  i, j: Integer;
+  i, j, h: Integer;
 begin
 begin
   for i := 0 to high(FToolbars) do
   for i := 0 to high(FToolbars) do
   begin
   begin
@@ -229,10 +230,36 @@ begin
             TToolbar(Controls[j]).OnPaintButton:= nil;
             TToolbar(Controls[j]).OnPaintButton:= nil;
           end;
           end;
         end else
         end else
+        if Controls[j] is TBCComboBox then
+        begin
+          BCAssignSystemStyle(TBCComboBox(Controls[j]).Button, FDarkTheme);
+          with TBCComboBox(Controls[j]) do
+          begin
+            h := FToolbars[i].tb.Height;
+            Button.StateNormal.FontEx.Height := (h-4) div 2;
+            Button.StateNormal.FontEx.ShadowColorOpacity:= 96;
+            Button.StateClicked.FontEx.Height := (h-4) div 2;
+            Button.StateClicked.FontEx.ShadowColorOpacity:= 96;
+            Button.StateHover.FontEx.Height := (h-4) div 2;
+            Button.StateHover.FontEx.ShadowColorOpacity:= 96;
+            if FDarkTheme then
+            begin
+              DropDownBorderColor:= clBlack;
+              DropDownFontColor:= clLightText;
+              DropDownColor:= clDarkBtnFace;
+            end else
+            begin
+              DropDownBorderColor := MergeBGRA(ColorToBGRA(clWindowText),ColorToBGRA(clWindow));
+              DropDownFontColor:= clWindowText;
+              DropDownColor:= clWindow;
+            end;
+          end;
+        end else
         if Controls[j] is TBCTrackbarUpdown then
         if Controls[j] is TBCTrackbarUpdown then
         begin
         begin
           if FDarkTheme then
           if FDarkTheme then
           begin
           begin
+            TBCTrackbarUpdown(Controls[j]).Border.Color := clDarkPanelShadow;
             TBCTrackbarUpdown(Controls[j]).Background.Color := clDarkEditableFace;
             TBCTrackbarUpdown(Controls[j]).Background.Color := clDarkEditableFace;
             TBCTrackbarUpdown(Controls[j]).ButtonBackground.Style:= bbsColor;
             TBCTrackbarUpdown(Controls[j]).ButtonBackground.Style:= bbsColor;
             TBCTrackbarUpdown(Controls[j]).ButtonBackground.Color:= $a0a0a0;
             TBCTrackbarUpdown(Controls[j]).ButtonBackground.Color:= $a0a0a0;
@@ -240,6 +267,7 @@ begin
           end
           end
           else
           else
           begin
           begin
+            TBCTrackbarUpdown(Controls[j]).Border.Color := MergeBGRA(ColorToBGRA(clWindowText),ColorToBGRA(clBtnFace));
             TBCTrackbarUpdown(Controls[j]).Background.Color := clWindow;
             TBCTrackbarUpdown(Controls[j]).Background.Color := clWindow;
             TBCTrackbarUpdown(Controls[j]).ButtonBackground.Style:= bbsColor;
             TBCTrackbarUpdown(Controls[j]).ButtonBackground.Style:= bbsColor;
             TBCTrackbarUpdown(Controls[j]).ButtonBackground.Color:= clBtnFace;
             TBCTrackbarUpdown(Controls[j]).ButtonBackground.Color:= clBtnFace;