Browse Source

Updated from main repo

Massimo Magnano 2 years ago
parent
commit
c0be89a361
100 changed files with 841 additions and 72 deletions
  1. 12 0
      .github/FUNDING.yml
  2. 1 1
      README.md
  3. 2 2
      bcbutton.pas
  4. 3 3
      bcbuttonfocus.pas
  5. 14 5
      bccombobox.pas
  6. 3 7
      bcgamegrid.pas
  7. 1 1
      bclabel.pas
  8. 128 0
      bcmaterialedit.pas
  9. 130 0
      bcmaterialfloatspinedit.pas
  10. 128 0
      bcmaterialprogressbarmarquee.pas
  11. 130 0
      bcmaterialspinedit.pas
  12. 1 1
      bcpanel.pas
  13. 39 7
      bcradialprogressbar.pas
  14. 6 3
      bctools.pas
  15. 1 0
      bctrackbarupdown.pas
  16. 17 4
      bctypes.pas
  17. 30 14
      bgracontrols.lpk
  18. 8 1
      bgracontrols.pas
  19. 1 1
      bgracontrolsinfo.pas
  20. 1 1
      bgrapascalscriptcomponent.lpk
  21. 1 1
      bgraspriteanimation.pas
  22. 53 0
      bgrasvgimagelist.pas
  23. 7 3
      bgrasvgimagelistform/bgrasvgimagelistproject.lpi
  24. 25 15
      bgrasvgtheme.pas
  25. 13 0
      bgratheme.pas
  26. 25 0
      bgrathemebutton.pas
  27. 61 2
      bgrathemecheckbox.pas
  28. BIN
      docs/img/analogcontrols.png
  29. BIN
      docs/img/bcbutton.png
  30. BIN
      docs/img/bcbuttonfocus.png
  31. BIN
      docs/img/bcimagebutton.png
  32. BIN
      docs/img/bctoolbar.png
  33. BIN
      docs/img/bcxbutton.png
  34. BIN
      docs/img/bgraribbon.png
  35. BIN
      docs/img/logo.png
  36. BIN
      docs/img/progressbar.png
  37. BIN
      icons/tbcbutton.png
  38. BIN
      icons/tbcbuttonfocus.png
  39. BIN
      icons/tbcradialprogressbar.png
  40. BIN
      icons/tbgraflashprogressbar.png
  41. BIN
      icons/tdtthemedclock.png
  42. BIN
      images/tbcbutton.png
  43. BIN
      images/tbcbutton_150.png
  44. BIN
      images/tbcbutton_200.png
  45. BIN
      images/tbcbuttonfocus.png
  46. BIN
      images/tbcbuttonfocus_150.png
  47. BIN
      images/tbcbuttonfocus_200.png
  48. BIN
      images/tbccombobox.png
  49. BIN
      images/tbccombobox_150.png
  50. BIN
      images/tbccombobox_200.png
  51. BIN
      images/tbclabel_200.png
  52. BIN
      images/tbclistbox.png
  53. BIN
      images/tbclistbox_150.png
  54. BIN
      images/tbclistbox_200.png
  55. BIN
      images/tbcmaterialdesignbutton.png
  56. BIN
      images/tbcmaterialdesignbutton_150.png
  57. BIN
      images/tbcmaterialdesignbutton_200.png
  58. BIN
      images/tbcmdbutton.png
  59. BIN
      images/tbcmdbutton_150.png
  60. BIN
      images/tbcmdbutton_200.png
  61. BIN
      images/tbcmdbuttonfocus.png
  62. BIN
      images/tbcmdbuttonfocus_150.png
  63. BIN
      images/tbcmdbuttonfocus_200.png
  64. BIN
      images/tbcpanel_150.png
  65. BIN
      images/tbcpanel_200.png
  66. BIN
      images/tbcpaperlistbox.png
  67. BIN
      images/tbcpaperlistbox_150.png
  68. BIN
      images/tbcpaperlistbox_200.png
  69. BIN
      images/tbcpaperpanel_150.png
  70. BIN
      images/tbcpaperpanel_200.png
  71. BIN
      images/tbcsvgviewer.png
  72. BIN
      images/tbcsvgviewer_150.png
  73. BIN
      images/tbcsvgviewer_200.png
  74. BIN
      images/tbctoolbar.png
  75. BIN
      images/tbctoolbar_150.png
  76. BIN
      images/tbctoolbar_200.png
  77. BIN
      images/tbctrackbarupdown.png
  78. BIN
      images/tbctrackbarupdown_150.png
  79. BIN
      images/tbctrackbarupdown_200.png
  80. BIN
      images/tbcxbutton.png
  81. BIN
      images/tbcxbutton_150.png
  82. BIN
      images/tbcxbutton_200.png
  83. BIN
      images/tbgracolortheme_150.png
  84. BIN
      images/tbgracolortheme_200.png
  85. BIN
      images/tbgragraphiccontrol_150.png
  86. BIN
      images/tbgragraphiccontrol_200.png
  87. BIN
      images/tbgraimagelist.png
  88. BIN
      images/tbgraimagelist_150.png
  89. BIN
      images/tbgraimagelist_200.png
  90. BIN
      images/tbgraimagetheme_150.png
  91. BIN
      images/tbgraimagetheme_200.png
  92. BIN
      images/tbgraknob.png
  93. BIN
      images/tbgraknob_150.png
  94. BIN
      images/tbgraknob_200.png
  95. BIN
      images/tbgraresizespeedbutton.png
  96. BIN
      images/tbgraresizespeedbutton_150.png
  97. BIN
      images/tbgraresizespeedbutton_200.png
  98. BIN
      images/tbgrashape.png
  99. BIN
      images/tbgrashape_150.png
  100. BIN
      images/tbgrashape_200.png

+ 12 - 0
.github/FUNDING.yml

@@ -0,0 +1,12 @@
+# These are supported funding model platforms
+
+github: # Replace with up to 4 GitHub Sponsors-enabled usernames e.g., [user1, user2]
+patreon: # Replace with a single Patreon username
+open_collective: # Replace with a single Open Collective username
+ko_fi: # Replace with a single Ko-fi username
+tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
+community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
+liberapay: # Replace with a single Liberapay username
+issuehunt: # Replace with a single IssueHunt username
+otechie: # Replace with a single Otechie username
+custom: ['https://sourceforge.net/p/lazpaint/donate/?source=navbar'] # Replace with up to 4 custom sponsorship URLs e.g., ['link1', 'link2']

+ 1 - 1
README.md

@@ -6,7 +6,7 @@ BGRA Controls is a set of graphical UI elements that you can use with Lazarus LC
 
 
 ### Support Us
 ### Support Us
 
 
-If you like BGRAControls please [support @lainz on Patreon](https://www.patreon.com/lainz) and [support @circular17 with PayPal](https://sourceforge.net/p/lazpaint/donate/?source=navbar).
+If you like BGRAControls please [support @circular17 with PayPal](https://sourceforge.net/p/lazpaint/donate/?source=navbar).
 
 
 ### Installing
 ### Installing
 
 

+ 2 - 2
bcbutton.pas

@@ -844,7 +844,7 @@ begin
   if FTextApplyGlobalOpacity then
   if FTextApplyGlobalOpacity then
   begin
   begin
     { Drawing text }
     { Drawing text }
-    RenderText(r, scaledState.FontEx, actualCaption, ABGRA);
+    RenderText(r, scaledState.FontEx, actualCaption, ABGRA, Enabled);
     RenderGlyph(r_g, g);
     RenderGlyph(r_g, g);
     { Set global opacity }
     { Set global opacity }
     ABGRA.ApplyGlobalOpacity(FGlobalOpacity);
     ABGRA.ApplyGlobalOpacity(FGlobalOpacity);
@@ -854,7 +854,7 @@ begin
     { Set global opacity }
     { Set global opacity }
     ABGRA.ApplyGlobalOpacity(FGlobalOpacity);
     ABGRA.ApplyGlobalOpacity(FGlobalOpacity);
     { Drawing text }
     { Drawing text }
-    RenderText(r, scaledState.FontEx, actualCaption, ABGRA);
+    RenderText(r, scaledState.FontEx, actualCaption, ABGRA, Enabled);
     RenderGlyph(r_g, g);
     RenderGlyph(r_g, g);
   end;
   end;
   if g <> FGlyph then g.Free;
   if g <> FGlyph then g.Free;

+ 3 - 3
bcbuttonfocus.pas

@@ -357,6 +357,7 @@ type
     { The unique name of the control in the form. }
     { The unique name of the control in the form. }
     property Name;
     property Name;
     { TabStop }
     { TabStop }
+    property TabOrder;
     property TabStop;
     property TabStop;
     property ThemeManager: TBCThemeManager read FBCThemeManager write SetFBCThemeManager;
     property ThemeManager: TBCThemeManager read FBCThemeManager write SetFBCThemeManager;
     property OnPaintButton;
     property OnPaintButton;
@@ -775,7 +776,7 @@ begin
   if FTextApplyGlobalOpacity then
   if FTextApplyGlobalOpacity then
   begin
   begin
     { Drawing text }
     { Drawing text }
-    RenderText(r, AState.FontEx, actualCaption, ABGRA);
+    RenderText(r, AState.FontEx, actualCaption, ABGRA, Enabled);
     RenderGlyph(r_g, g);
     RenderGlyph(r_g, g);
     { Set global opacity }
     { Set global opacity }
     ABGRA.ApplyGlobalOpacity(FGlobalOpacity);
     ABGRA.ApplyGlobalOpacity(FGlobalOpacity);
@@ -785,7 +786,7 @@ begin
     { Set global opacity }
     { Set global opacity }
     ABGRA.ApplyGlobalOpacity(FGlobalOpacity);
     ABGRA.ApplyGlobalOpacity(FGlobalOpacity);
     { Drawing text }
     { Drawing text }
-    RenderText(r, AState.FontEx, actualCaption, ABGRA);
+    RenderText(r, AState.FontEx, actualCaption, ABGRA, Enabled);
     RenderGlyph(r_g, g);
     RenderGlyph(r_g, g);
   end;
   end;
   if g <> FGlyph then g.Free;
   if g <> FGlyph then g.Free;
@@ -1787,7 +1788,6 @@ begin
   try
   try
     with GetControlClassDefaultSize do
     with GetControlClassDefaultSize do
       SetInitialBounds(0, 0, CX, CY);
       SetInitialBounds(0, 0, CX, CY);
-    TabStop := True;
     ControlStyle := ControlStyle + [csAcceptsControls];
     ControlStyle := ControlStyle + [csAcceptsControls];
     FBGRANormal := TBGRABitmapEx.Create(Width, Height, BGRAPixelTransparent);
     FBGRANormal := TBGRABitmapEx.Create(Width, Height, BGRAPixelTransparent);
     FBGRAHover := TBGRABitmapEx.Create(Width, Height, BGRAPixelTransparent);
     FBGRAHover := TBGRABitmapEx.Create(Width, Height, BGRAPixelTransparent);

+ 14 - 5
bccombobox.pas

@@ -6,7 +6,7 @@ unit BCComboBox;
 interface
 interface
 
 
 uses
 uses
-  Classes, SysUtils, LResources, Forms, Controls, ExtCtrls, Graphics, Dialogs, BCButton,
+  {$ifdef WINDOWS}Windows,{$endif} Classes, SysUtils, LResources, Forms, Controls, ExtCtrls, Graphics, Dialogs, BCButton,
   StdCtrls, BCTypes, BCBaseCtrls, BGRABitmap, BGRABitmapTypes, LMessages, LCLType;
   StdCtrls, BCTypes, BCBaseCtrls, BGRABitmap, BGRABitmapTypes, LMessages, LCLType;
 
 
 type
 type
@@ -59,7 +59,7 @@ type
     function GetStateHover: TBCButtonState;
     function GetStateHover: TBCButtonState;
     function GetStateNormal: TBCButtonState;
     function GetStateNormal: TBCButtonState;
     function GetStaticButton: boolean;
     function GetStaticButton: boolean;
-    procedure ListBoxKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState
+    procedure ListBoxKeyDown(Sender: TObject; var Key: Word; {%H-}Shift: TShiftState
       );
       );
     procedure ListBoxMouseUp({%H-}Sender: TObject; {%H-}Button: TMouseButton;
     procedure ListBoxMouseUp({%H-}Sender: TObject; {%H-}Button: TMouseButton;
                           {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
                           {%H-}Shift: TShiftState; {%H-}X, {%H-}Y: Integer);
@@ -89,10 +89,10 @@ type
     procedure SetStaticButton(AValue: boolean);
     procedure SetStaticButton(AValue: boolean);
   protected
   protected
     function GetStyleExtension: String; override;
     function GetStyleExtension: String; override;
-    procedure WMSetFocus(var Message: {$IFDEF FPC}TLMSetFocus{$ELSE}TWMSetFocus{$ENDIF}); message {$IFDEF FPC}LM_SETFOCUS{$ELSE}WM_SETFOCUS{$ENDIF};
+    procedure WMSetFocus(var {%H-}Message: {$IFDEF FPC}TLMSetFocus{$ELSE}TWMSetFocus{$ENDIF}); message {$IFDEF FPC}LM_SETFOCUS{$ELSE}WM_SETFOCUS{$ENDIF};
     procedure WMKillFocus(var Message: {$IFDEF FPC}TLMKillFocus{$ELSE}TWMKillFocus{$ENDIF}); message {$IFDEF FPC}LM_KILLFOCUS{$ELSE}WM_KILLFOCUS{$ENDIF};
     procedure WMKillFocus(var Message: {$IFDEF FPC}TLMKillFocus{$ELSE}TWMKillFocus{$ENDIF}); message {$IFDEF FPC}LM_KILLFOCUS{$ELSE}WM_KILLFOCUS{$ENDIF};
     procedure UpdateFocus(AFocused: boolean);
     procedure UpdateFocus(AFocused: boolean);
-    procedure KeyDown(var Key: Word; Shift: TShiftState); override;
+    procedure KeyDown(var Key: Word; {%H-}Shift: TShiftState); override;
     procedure UTF8KeyPress(var UTF8Key: TUTF8Char); override;
     procedure UTF8KeyPress(var UTF8Key: TUTF8Char); override;
     procedure CreateForm;
     procedure CreateForm;
     procedure FreeForm;
     procedure FreeForm;
@@ -410,9 +410,18 @@ begin
 end;
 end;
 
 
 procedure TBCComboBox.OnTimerCheckFormHide(Sender: TObject);
 procedure TBCComboBox.OnTimerCheckFormHide(Sender: TObject);
+  {$ifdef WINDOWS}
+  function IsDropDownOnTop: boolean;
+  begin
+    result := Assigned(FForm) and (GetForegroundWindow = FForm.Handle);
+  end;
+  {$endif}
+
 begin
 begin
   if Assigned(FForm) and FForm.Visible and
   if Assigned(FForm) and FForm.Visible and
-    ({$IFDEF DARWIN}not FForm.Active or {$ENDIF}FQueryFormHide) then
+    ({$IFDEF DARWIN}not FForm.Active or {$ENDIF}
+     {$IFDEF WINDOWS}not IsDropDownOnTop or{$ENDIF}
+     FQueryFormHide) then
   begin
   begin
     FForm.Visible := false;
     FForm.Visible := false;
     FQueryFormHide := false;
     FQueryFormHide := false;

+ 3 - 7
bcgamegrid.pas

@@ -182,14 +182,10 @@ begin
         (pos.y <= r.Bottom) then
         (pos.y <= r.Bottom) then
       begin
       begin
         //DebugLn(['TControl.Click ',DbgSName(Self)]);
         //DebugLn(['TControl.Click ',DbgSName(Self)]);
-        if Assigned(FOnClickControl) and (Action <> nil) and
-          (not CompareMethods(TMethod(Action.OnExecute), TMethod(FOnClickControl))) then
-          // the OnClick is set and differs from the Action => call the OnClick
-          FOnClickControl(Self, n, x, y)
-        else if (not (csDesigning in ComponentState)) and (ActionLink <> nil) then
-          ActionLink.Execute(Self)
-        else if Assigned(FOnClickControl) then
+        if Assigned(FOnClickControl) then
           FOnClickControl(Self, n, x, y);
           FOnClickControl(Self, n, x, y);
+        if (not (csDesigning in ComponentState)) and (ActionLink <> nil) then
+          ActionLink.Execute(Self)
       end;
       end;
 
 
       Inc(n);
       Inc(n);

+ 1 - 1
bclabel.pas

@@ -156,7 +156,7 @@ begin
   CalculateBorderRect(FBorder,r);
   CalculateBorderRect(FBorder,r);
 
 
   RenderBackgroundAndBorder(FBGRA.ClipRect, FBackground, TBGRABitmap(FBGRA), FRounding, FBorder, FInnerMargin);
   RenderBackgroundAndBorder(FBGRA.ClipRect, FBackground, TBGRABitmap(FBGRA), FRounding, FBorder, FInnerMargin);
-  RenderText(FBGRA.ClipRect, FFontEx, Caption, TBGRABitmap(FBGRA));
+  RenderText(FBGRA.ClipRect, FFontEx, Caption, TBGRABitmap(FBGRA), Enabled);
 
 
   {$IFDEF INDEBUG}
   {$IFDEF INDEBUG}
   FRenderCount := FRenderCount +1;
   FRenderCount := FRenderCount +1;

+ 128 - 0
bcmaterialedit.pas

@@ -0,0 +1,128 @@
+unit BCMaterialEdit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+  StdCtrls;
+
+type
+
+  { TBCMaterialEdit }
+
+  TBCMaterialEdit = class(TCustomPanel)
+  private
+    FAccentColor: TColor;
+    FDisabledColor: TColor;
+    Flbl: TLabel;
+    Fedt: TEdit;
+    Ffocused: boolean;
+    FOnChange: TNotifyEvent;
+    FTexto: string;
+    procedure ChangeEdit(Sender: TObject);
+    procedure EnterEdit(Sender: TObject);
+    procedure ExitEdit(Sender: TObject);
+    procedure SetTexto(AValue: string);
+  protected
+    procedure Paint; override;
+  public
+    constructor Create(AOwner: TComponent); override;
+  published
+    property Color;
+    property Text: string read FTexto write SetTexto;
+    property Edit: TEdit read Fedt;
+    property Title: TLabel read Flbl;
+    property DisabledColor: TColor read FDisabledColor write FDisabledColor;
+    property AccentColor: TColor read FAccentColor write FAccentColor;
+    property OnChange: TNotifyEvent read FOnChange write FOnChange;
+  end;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+  RegisterComponents('BGRA Controls', [TBCMaterialEdit]);
+end;
+
+{ TBCMaterialEdit }
+
+procedure TBCMaterialEdit.EnterEdit(Sender: TObject);
+begin
+  Ffocused := True;
+  Invalidate;
+  Flbl.Font.Color := accentColor;
+end;
+
+procedure TBCMaterialEdit.ChangeEdit(Sender: TObject);
+begin
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TBCMaterialEdit.ExitEdit(Sender: TObject);
+begin
+  Ffocused := False;
+  Invalidate;
+  Flbl.Font.Color := DisabledColor;
+end;
+
+procedure TBCMaterialEdit.SetTexto(AValue: string);
+begin
+  if FTexto = AValue then
+    Exit;
+  FTexto := AValue;
+  Flbl.Caption := FTexto;
+  //Fedt.TextHint := FTexto;
+end;
+
+procedure TBCMaterialEdit.Paint;
+begin
+  inherited Paint;
+  Canvas.Brush.Color := Color;
+  Canvas.Pen.Color := Color;
+  Canvas.Rectangle(0, 0, Width, Height);
+  if (fFocused) then
+  begin
+    Canvas.Pen.Color := AccentColor;
+    Canvas.Line(0, Height - 2, Width, Height - 2);
+    Canvas.Line(0, Height - 1, Width, Height - 1);
+  end
+  else
+  begin
+    Canvas.Pen.Color := DisabledColor;
+    Canvas.Line(0, Height - 1, Width, Height - 1);
+  end;
+end;
+
+constructor TBCMaterialEdit.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  Self.BevelOuter := bvNone;
+  Self.Color := clWhite;
+  AccentColor := clHighlight;
+  DisabledColor := $00B8AFA8;
+  Flbl := TLabel.Create(Self);
+  Flbl.Align := alTop;
+  Flbl.Caption := 'Buscar';
+  Flbl.BorderSpacing.Around := 4;
+  Flbl.Font.Style := [fsBold];
+  Flbl.Font.Color := $00B8AFA8;
+  Flbl.Parent := Self;
+  Fedt := TEdit.Create(Self);
+  Fedt.Color := Color;
+  Fedt.Font.Color := clBlack;
+  Fedt.OnEnter := @EnterEdit;
+  Fedt.OnExit := @ExitEdit;
+  Fedt.OnChange:=@ChangeEdit;
+  Fedt.Align := alClient;
+  Fedt.BorderStyle := bsNone;
+  //Fedt.TextHint := 'Buscar';
+  Fedt.BorderSpacing.Around := 4;
+  Fedt.Parent := Self;
+end;
+
+end.

+ 130 - 0
bcmaterialfloatspinedit.pas

@@ -0,0 +1,130 @@
+unit BCMaterialFloatSpinEdit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+  StdCtrls, Spin;
+
+type
+
+  { TBCMaterialFloatSpinEdit }
+
+  TBCMaterialFloatSpinEdit = class(TCustomPanel)
+  private
+    FAccentColor: TColor;
+    FDisabledColor: TColor;
+    Flbl: TLabel;
+    Fedt: TFloatSpinEdit;
+    Ffocused: boolean;
+    FOnChange: TNotifyEvent;
+    FTexto: string;
+    procedure ChangeEdit(Sender: TObject);
+    procedure EnterEdit(Sender: TObject);
+    procedure ExitEdit(Sender: TObject);
+    procedure SetTexto(AValue: string);
+  protected
+    procedure Paint; override;
+  public
+    constructor Create(AOwner: TComponent); override;
+  published
+    property Color;
+    property Text: string read FTexto write SetTexto;
+    property Edit: TFloatSpinEdit read Fedt;
+    property Title: TLabel read Flbl;
+    property DisabledColor: TColor read FDisabledColor write FDisabledColor;
+    property AccentColor: TColor read FAccentColor write FAccentColor;
+    property OnChange: TNotifyEvent read FOnChange write FOnChange;
+  end;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+  RegisterComponents('BGRA Controls', [TBCMaterialFloatSpinEdit]);
+end;
+
+{ TBCMaterialFloatSpinEdit }
+
+procedure TBCMaterialFloatSpinEdit.EnterEdit(Sender: TObject);
+begin
+  Ffocused := True;
+  Invalidate;
+  Flbl.Font.Color := AccentColor;
+end;
+
+procedure TBCMaterialFloatSpinEdit.ChangeEdit(Sender: TObject);
+begin
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TBCMaterialFloatSpinEdit.ExitEdit(Sender: TObject);
+begin
+  Ffocused := False;
+  Invalidate;
+  Flbl.Font.Color := DisabledColor;
+end;
+
+procedure TBCMaterialFloatSpinEdit.SetTexto(AValue: string);
+begin
+  if FTexto = AValue then
+    Exit;
+  FTexto := AValue;
+  Flbl.Caption := FTexto;
+  //Fedt.TextHint := FTexto;
+end;
+
+procedure TBCMaterialFloatSpinEdit.Paint;
+begin
+  inherited Paint;
+  Canvas.Brush.Color := Color;
+  Canvas.Pen.Color := Color;
+  Canvas.Rectangle(0, 0, Width, Height);
+  if (fFocused) then
+  begin
+    Canvas.Pen.Color := AccentColor;
+    Canvas.Line(0, Height - 2, Width, Height - 2);
+    Canvas.Line(0, Height - 1, Width, Height - 1);
+  end
+  else
+  begin
+    Canvas.Pen.Color := DisabledColor;
+    Canvas.Line(0, Height - 1, Width, Height - 1);
+  end;
+end;
+
+constructor TBCMaterialFloatSpinEdit.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  Self.BevelOuter := bvNone;
+  Self.Color := clWhite;
+  AccentColor := clHighlight;
+  DisabledColor := $00B8AFA8;
+  Flbl := TLabel.Create(Self);
+  Flbl.Align := alTop;
+  Flbl.Caption := 'Buscar';
+  Flbl.BorderSpacing.Around := 4;
+  Flbl.Font.Style := [fsBold];
+  Flbl.Font.Color := $00B8AFA8;
+  Flbl.Parent := Self;
+  Fedt := TFloatSpinEdit.Create(Self);
+  Fedt.Color := Color;
+  Fedt.Font.Color := clBlack;
+  Fedt.OnEnter := @EnterEdit;
+  Fedt.OnExit := @ExitEdit;
+  Fedt.OnChange:=@ChangeEdit;
+  Fedt.Align := alClient;
+  Fedt.BorderStyle := bsNone;
+  //Fedt.TextHint := 'Buscar';
+  Fedt.BorderSpacing.Around := 4;
+  Fedt.Parent := Self;
+  Fedt.MinValue := 0;
+  Fedt.MaxValue := MaxInt;
+end;
+
+end.

+ 128 - 0
bcmaterialprogressbarmarquee.pas

@@ -0,0 +1,128 @@
+unit BCMaterialProgressBarMarquee;
+
+{$mode delphi}
+
+interface
+
+uses
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, BGRAGraphicControl,
+  ExtCtrls, BGRABitmap, BGRABitmapTypes;
+
+type
+
+  { TBCMaterialProgressBarMarquee }
+
+  TBCMaterialProgressBarMarquee = class(TBGRAGraphicControl)
+  private
+    FBarColor: TColor;
+    progressbasr_cx, progressbar_cw: integer;
+    progressbar_x, progressbar_w: integer;
+    progressbar_increase: boolean;
+    FTimer: TTimer;
+    procedure SetBarColor(AValue: TColor);
+    procedure TimerOnTimer(Sender: TObject);
+  protected
+    procedure SetEnabled(Value: Boolean); override;
+    procedure SetVisible(Value: Boolean); override;
+  public
+    procedure DiscardBitmap;
+    procedure RedrawBitmapContent; override;
+    constructor Create(AOwner: TComponent); override;
+  published
+    property BarColor: TColor read FBarColor write SetBarColor;
+    property Visible;
+  end;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+  RegisterComponents('BGRA Controls', [TBCMaterialProgressBarMarquee]);
+end;
+
+{ TBCMaterialProgressBarMarquee }
+
+procedure TBCMaterialProgressBarMarquee.TimerOnTimer(Sender: TObject);
+begin
+  if progressbar_increase then
+  begin
+    progressbar_w := progressbar_w + progressbar_cw;
+    if (progressbar_w >= Width - 5) then
+    begin
+      progressbar_increase := False;
+    end;
+  end
+  else
+  begin
+    progressbar_w := progressbar_w - progressbar_cw;
+    if (progressbar_w <= progressbar_cw) then
+    begin
+      progressbar_increase := True;
+    end;
+  end;
+  progressbar_x := progressbar_x + progressbasr_cx;
+  if (progressbar_x >= Width) then
+    progressbar_x := -progressbar_w;
+  DiscardBitmap;
+end;
+
+procedure TBCMaterialProgressBarMarquee.SetEnabled(Value: Boolean);
+begin
+  inherited SetEnabled(Value);
+  FTimer.Enabled := Value and Visible;
+  DiscardBitmap;
+end;
+
+procedure TBCMaterialProgressBarMarquee.SetVisible(Value: Boolean);
+begin
+  inherited SetVisible(Value);
+  FTimer.Enabled := Enabled and Value;
+  DiscardBitmap;
+end;
+
+procedure TBCMaterialProgressBarMarquee.SetBarColor(AValue: TColor);
+begin
+  if FBarColor = AValue then
+    Exit;
+  FBarColor := AValue;
+  DiscardBitmap;
+end;
+
+procedure TBCMaterialProgressBarMarquee.DiscardBitmap;
+begin
+  inherited DiscardBitmap;
+  progressbar_cw := Width div 50;
+  progressbasr_cx := progressbar_cw * 2;
+end;
+
+procedure TBCMaterialProgressBarMarquee.RedrawBitmapContent;
+begin
+  if FTimer.Enabled then
+  begin
+  Bitmap.Fill(Color);
+  Bitmap.Rectangle(Rect(progressbar_x, 0, progressbar_x + progressbar_w, Bitmap.Height),
+    BarColor, BarColor);
+  end
+  else
+  begin
+    Bitmap.Fill(BarColor);
+  end;
+end;
+
+constructor TBCMaterialProgressBarMarquee.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  progressbar_w := Width;
+  progressbar_x := -progressbar_w;
+  progressbar_increase := False;
+  FTimer := TTimer.Create(Self);
+  FTimer.Interval := 15;
+  FTimer.OnTimer := TimerOnTimer;
+  FTimer.Enabled := True;
+  Color := clWhite;
+  BarColor := $00E2A366;
+end;
+
+end.

+ 130 - 0
bcmaterialspinedit.pas

@@ -0,0 +1,130 @@
+unit BCMaterialSpinEdit;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+  Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, ExtCtrls,
+  StdCtrls, Spin;
+
+type
+
+  { TBCMaterialSpinEdit }
+
+  TBCMaterialSpinEdit = class(TCustomPanel)
+  private
+    FAccentColor: TColor;
+    FDisabledColor: TColor;
+    Flbl: TLabel;
+    Fedt: TSpinEdit;
+    Ffocused: boolean;
+    FOnChange: TNotifyEvent;
+    FTexto: string;
+    procedure ChangeEdit(Sender: TObject);
+    procedure EnterEdit(Sender: TObject);
+    procedure ExitEdit(Sender: TObject);
+    procedure SetTexto(AValue: string);
+  protected
+    procedure Paint; override;
+  public
+    constructor Create(AOwner: TComponent); override;
+  published
+    property Color;
+    property Text: string read FTexto write SetTexto;
+    property Edit: TSpinEdit read Fedt;
+    property Title: TLabel read Flbl;
+    property DisabledColor: TColor read FDisabledColor write FDisabledColor;
+    property AccentColor: TColor read FAccentColor write FAccentColor;
+    property OnChange: TNotifyEvent read FOnChange write FOnChange;
+  end;
+
+procedure Register;
+
+implementation
+
+procedure Register;
+begin
+  RegisterComponents('BGRA Controls', [TBCMaterialSpinEdit]);
+end;
+
+{ TBCMaterialSpinEdit }
+
+procedure TBCMaterialSpinEdit.EnterEdit(Sender: TObject);
+begin
+  Ffocused := True;
+  Invalidate;
+  Flbl.Font.Color := AccentColor;
+end;
+
+procedure TBCMaterialSpinEdit.ChangeEdit(Sender: TObject);
+begin
+  if Assigned(FOnChange) then
+    FOnChange(Self);
+end;
+
+procedure TBCMaterialSpinEdit.ExitEdit(Sender: TObject);
+begin
+  Ffocused := False;
+  Invalidate;
+  Flbl.Font.Color := DisabledColor;
+end;
+
+procedure TBCMaterialSpinEdit.SetTexto(AValue: string);
+begin
+  if FTexto = AValue then
+    Exit;
+  FTexto := AValue;
+  Flbl.Caption := FTexto;
+  //Fedt.TextHint := FTexto;
+end;
+
+procedure TBCMaterialSpinEdit.Paint;
+begin
+  inherited Paint;
+  Canvas.Brush.Color := Color;
+  Canvas.Pen.Color := Color;
+  Canvas.Rectangle(0, 0, Width, Height);
+  if (fFocused) then
+  begin
+    Canvas.Pen.Color := AccentColor;
+    Canvas.Line(0, Height - 2, Width, Height - 2);
+    Canvas.Line(0, Height - 1, Width, Height - 1);
+  end
+  else
+  begin
+    Canvas.Pen.Color := DisabledColor;
+    Canvas.Line(0, Height - 1, Width, Height - 1);
+  end;
+end;
+
+constructor TBCMaterialSpinEdit.Create(AOwner: TComponent);
+begin
+  inherited Create(AOwner);
+  Self.BevelOuter := bvNone;
+  Self.Color := clWhite;
+  AccentColor := clHighlight;
+  DisabledColor := $00B8AFA8;
+  Flbl := TLabel.Create(Self);
+  Flbl.Align := alTop;
+  Flbl.Caption := 'Buscar';
+  Flbl.BorderSpacing.Around := 4;
+  Flbl.Font.Style := [fsBold];
+  Flbl.Font.Color := $00B8AFA8;
+  Flbl.Parent := Self;
+  Fedt := TSpinEdit.Create(Self);
+  Fedt.Color := Color;
+  Fedt.Font.Color := clBlack;
+  Fedt.OnEnter := @EnterEdit;
+  Fedt.OnExit := @ExitEdit;
+  Fedt.OnChange:=@ChangeEdit;
+  Fedt.Align := alClient;
+  Fedt.BorderStyle := bsNone;
+  //Fedt.TextHint := 'Buscar';
+  Fedt.BorderSpacing.Around := 4;
+  Fedt.Parent := Self;
+  Fedt.MinValue := 0;
+  Fedt.MaxValue := MaxInt;
+end;
+
+end.

+ 1 - 1
bcpanel.pas

@@ -271,7 +271,7 @@ begin
   end;
   end;
 
 
   if Caption <> '' then
   if Caption <> '' then
-    RenderText(r,FFontEx,Caption,TBGRABitmap(FBGRA));
+    RenderText(r,FFontEx,Caption,TBGRABitmap(FBGRA),Enabled);
 
 
   if Assigned(FOnAfterRenderBCPanel) then
   if Assigned(FOnAfterRenderBCPanel) then
     FOnAfterRenderBCPanel(Self, FBGRA, r);
     FOnAfterRenderBCPanel(Self, FBGRA, r);

+ 39 - 7
bcradialprogressbar.pas

@@ -21,9 +21,11 @@ type
 
 
   TBCRadialProgressBar = class(TBCGraphicControl)
   TBCRadialProgressBar = class(TBCGraphicControl)
   private
   private
+    FDrawText: boolean;
     { Private declarations }
     { Private declarations }
     FMaxValue: integer;
     FMaxValue: integer;
     FMinValue: integer;
     FMinValue: integer;
+    FRotation: single;
     FValue: integer;
     FValue: integer;
     FBitmap: TBGRABitmap;
     FBitmap: TBGRABitmap;
     FLineColor: TColor;
     FLineColor: TColor;
@@ -33,6 +35,7 @@ type
     FFontShadowOffsetY: integer;
     FFontShadowOffsetY: integer;
     FFontShadowRadius: integer;
     FFontShadowRadius: integer;
     FLineWidth: single;
     FLineWidth: single;
+    procedure SetDrawText(AValue: boolean);
     procedure SetFFontShadowColor(AValue: TColor);
     procedure SetFFontShadowColor(AValue: TColor);
     procedure SetFFontShadowOffsetX(AValue: integer);
     procedure SetFFontShadowOffsetX(AValue: integer);
     procedure SetFFontShadowOffsetY(AValue: integer);
     procedure SetFFontShadowOffsetY(AValue: integer);
@@ -41,6 +44,7 @@ type
     procedure SetFLineColor(AValue: TColor);
     procedure SetFLineColor(AValue: TColor);
     procedure SetMaxValue(AValue: integer);
     procedure SetMaxValue(AValue: integer);
     procedure SetMinValue(AValue: integer);
     procedure SetMinValue(AValue: integer);
+    procedure SetRotation(AValue: single);
     procedure SetValue(AValue: integer);
     procedure SetValue(AValue: integer);
     procedure SetLineWidth(AValue: single);
     procedure SetLineWidth(AValue: single);
   protected
   protected
@@ -54,6 +58,8 @@ type
     { Public declarations }
     { Public declarations }
     constructor Create(AOwner: TComponent); override;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     destructor Destroy; override;
+    property Rotation: single read FRotation write SetRotation default 0;
+    property DrawText: boolean read FDrawText write SetDrawText default true;
   published
   published
     { Published declarations }
     { Published declarations }
     property Align;
     property Align;
@@ -133,6 +139,14 @@ begin
   Invalidate;
   Invalidate;
 end;
 end;
 
 
+procedure TBCRadialProgressBar.SetDrawText(AValue: boolean);
+begin
+  if FDrawText=AValue then Exit;
+  FDrawText:=AValue;
+  RenderControl;
+  Invalidate;
+end;
+
 procedure TBCRadialProgressBar.SetFFontShadowOffsetX(AValue: integer);
 procedure TBCRadialProgressBar.SetFFontShadowOffsetX(AValue: integer);
 begin
 begin
   if FFontShadowOffsetX = AValue then
   if FFontShadowOffsetX = AValue then
@@ -182,6 +196,14 @@ begin
   Invalidate;
   Invalidate;
 end;
 end;
 
 
+procedure TBCRadialProgressBar.SetRotation(AValue: single);
+begin
+  if FRotation=AValue then Exit;
+  FRotation:=AValue;
+  RenderControl;
+  Invalidate;
+end;
+
 procedure TBCRadialProgressBar.SetValue(AValue: integer);
 procedure TBCRadialProgressBar.SetValue(AValue: integer);
 begin
 begin
   if FValue = AValue then
   if FValue = AValue then
@@ -228,8 +250,12 @@ begin
   FreeAndNil(FBitmap);
   FreeAndNil(FBitmap);
   FBitmap := TBGRABitmap.Create(Width, Height);
   FBitmap := TBGRABitmap.Create(Width, Height);
 
 
+  FBitmap.Canvas2D.resetTransform;
+  FBitmap.Canvas2D.translate(FBitmap.Width/2, FBitmap.Height/2);
+  FBitmap.Canvas2D.rotate(FRotation*Pi/180);
+
   FBitmap.Canvas2D.beginPath;
   FBitmap.Canvas2D.beginPath;
-  FBitmap.Canvas2D.arc(Width / 2, Height / 2, Height / 2.5, 0, pi * 2, False);
+  FBitmap.Canvas2D.arc(0, 0, Height / 2.5, 0, pi * 2, False);
   FBitmap.Canvas2D.fillStyle(Color);
   FBitmap.Canvas2D.fillStyle(Color);
   FBitmap.Canvas2D.fill;
   FBitmap.Canvas2D.fill;
 
 
@@ -244,7 +270,7 @@ begin
 
 
   FBitmap.Canvas2D.beginPath;
   FBitmap.Canvas2D.beginPath;
   if Value <> MinValue then
   if Value <> MinValue then
-    FBitmap.Canvas2D.arc(Width / 2, Height / 2, Height / 2.5, pi * 1.5,
+    FBitmap.Canvas2D.arc(0, 0, Height / 2.5, pi * 1.5,
       (pi * 1.5) + ((pi * 2) * Value / MaxValue), False);
       (pi * 1.5) + ((pi * 2) * Value / MaxValue), False);
   FBitmap.Canvas2D.fillStyle(BGRAPixelTransparent);
   FBitmap.Canvas2D.fillStyle(BGRAPixelTransparent);
   FBitmap.Canvas2D.fill;
   FBitmap.Canvas2D.fill;
@@ -258,11 +284,15 @@ begin
   else
   else
     textStr := FloatToStr((Value / MaxValue) * 100) + '%';
     textStr := FloatToStr((Value / MaxValue) * 100) + '%';
 
 
-  textBmp := TextShadow(Width, Height, textStr, Font.Height,
-    Font.Color, FontShadowColor, FontShadowOFfsetX,
-    FontShadowOffsetY, FontSHadowRadius, Font.Style, Font.Name) as TBGRABitmap;
-  FBitmap.PutImage(0, 0, textBmp, dmDrawWithTransparency);
-  textBmp.Free;
+  if DrawText then
+  begin
+    textBmp := TextShadow(Width, Height, textStr, Font.Height,
+      Font.Color, FontShadowColor, FontShadowOFfsetX,
+      FontShadowOffsetY, FontSHadowRadius, Font.Style, Font.Name) as TBGRABitmap;
+
+    FBitmap.PutImage(0, 0, textBmp, dmDrawWithTransparency);
+    textBmp.Free;
+  end;
 end;
 end;
 
 
 procedure TBCRadialProgressBar.SetColor(Value: TColor);
 procedure TBCRadialProgressBar.SetColor(Value: TColor);
@@ -291,6 +321,8 @@ begin
   Font.Color := clBlack;
   Font.Color := clBlack;
   Font.Height := 20;
   Font.Height := 20;
   Color := clWhite;
   Color := clWhite;
+  FRotation := 0;
+  FDrawText := True;
 end;
 end;
 
 
 destructor TBCRadialProgressBar.Destroy;
 destructor TBCRadialProgressBar.Destroy;

+ 6 - 3
bctools.pas

@@ -68,7 +68,7 @@ procedure RenderBorderF(x1,y1,x2,y2: single; ABorder: TBCBorder;
   ATargetBGRA: TBGRABitmap; ARounding: TBCRounding = nil);
   ATargetBGRA: TBGRABitmap; ARounding: TBCRounding = nil);
 // Render BCFont (used e.g. by TBCButton, TBCPanel, TBCLabel)
 // Render BCFont (used e.g. by TBCButton, TBCPanel, TBCLabel)
 procedure RenderText(const ARect: TRect; AFont: TBCFont;
 procedure RenderText(const ARect: TRect; AFont: TBCFont;
-  const AText: String; ATargetBGRA: TBGRABitmap);
+  const AText: String; ATargetBGRA: TBGRABitmap; AEnabled: boolean);
 // Return LCL horizontal equivalent for BCAlignment
 // Return LCL horizontal equivalent for BCAlignment
 function BCAlign2HAlign(AAlign: TBCAlignment): TAlignment;
 function BCAlign2HAlign(AAlign: TBCAlignment): TAlignment;
 // Return LCL vertical equivalent for BCAlignment
 // Return LCL vertical equivalent for BCAlignment
@@ -202,13 +202,14 @@ begin
 end;
 end;
 
 
 procedure RenderText(const ARect: TRect; AFont: TBCFont;
 procedure RenderText(const ARect: TRect; AFont: TBCFont;
-  const AText: String; ATargetBGRA: TBGRABitmap);
+  const AText: String; ATargetBGRA: TBGRABitmap; AEnabled: boolean);
 var
 var
   shd: TBGRABitmap;
   shd: TBGRABitmap;
   hal: TAlignment;
   hal: TAlignment;
   val: TTextLayout;
   val: TTextLayout;
   st: TTextStyle;
   st: TTextStyle;
   r: TRect;
   r: TRect;
+  c: TColor;
 begin
 begin
   if AText = '' then exit;
   if AText = '' then exit;
 
 
@@ -245,7 +246,9 @@ begin
     shd.Free;
     shd.Free;
   end;
   end;
 
 
-  ATargetBGRA.TextRect(r,r.Left,r.Top,AText,st,AFont.Color);
+  if AEnabled or (AFont.DisabledColor = clNone) then
+     c := AFont.Color else c := AFont.DisabledColor;
+  ATargetBGRA.TextRect(r,r.Left,r.Top,AText,st,c);
 
 
 end;
 end;
 
 

+ 1 - 0
bctrackbarupdown.pas

@@ -585,6 +585,7 @@ begin
     SetFocus;
     SetFocus;
     SelectAll;
     SelectAll;
   end;
   end;
+  inherited MouseDown(Button, Shift, X, Y);
 end;
 end;
 
 
 procedure TCustomBCTrackbarUpdown.MouseMove(Shift: TShiftState; X, Y: Integer);
 procedure TCustomBCTrackbarUpdown.MouseMove(Shift: TShiftState; X, Y: Integer);

+ 17 - 4
bctypes.pas

@@ -166,7 +166,7 @@ type
 
 
   TBCFont = class(TBCProperty)
   TBCFont = class(TBCProperty)
   private
   private
-    FColor: TColor;
+    FColor, FDisabledColor: TColor;
     FEndEllipsis: boolean;
     FEndEllipsis: boolean;
     FFontQuality: TBGRAFontQuality;
     FFontQuality: TBGRAFontQuality;
     FHeight: integer;
     FHeight: integer;
@@ -185,8 +185,9 @@ type
     FStyle: TFontStyles;
     FStyle: TFontStyles;
     FTextAlignment: TBCAlignment;
     FTextAlignment: TBCAlignment;
     FWordBreak: boolean;
     FWordBreak: boolean;
-    function IsNamStored: boolean;
+    function IsNameStored: boolean;
     procedure SetColor(AValue: TColor);
     procedure SetColor(AValue: TColor);
+    procedure SetDisabledColor(AValue: TColor);
     procedure SetEndEllipsis(AValue: boolean);
     procedure SetEndEllipsis(AValue: boolean);
     procedure SetFontQuality(AValue: TBGRAFontQuality);
     procedure SetFontQuality(AValue: TBGRAFontQuality);
     procedure SetHeight(AValue: integer);
     procedure SetHeight(AValue: integer);
@@ -211,10 +212,11 @@ type
     procedure Scale(AScale: single; APreserveDefaultHeight: boolean = true);
     procedure Scale(AScale: single; APreserveDefaultHeight: boolean = true);
   published
   published
     property Color: TColor read FColor write SetColor;
     property Color: TColor read FColor write SetColor;
+    property DisabledColor: TColor read FDisabledColor write SetDisabledColor default clNone;
     property EndEllipsis: boolean read FEndEllipsis write SetEndEllipsis default false;
     property EndEllipsis: boolean read FEndEllipsis write SetEndEllipsis default false;
     property FontQuality: TBGRAFontQuality read FFontQuality write SetFontQuality;
     property FontQuality: TBGRAFontQuality read FFontQuality write SetFontQuality;
     property Height: integer read FHeight write SetHeight default 0;
     property Height: integer read FHeight write SetHeight default 0;
-    property Name: string read FName write SetName stored IsNamStored;
+    property Name: string read FName write SetName stored IsNameStored;
     property SingleLine: boolean read FSingleLine write SetSingleLine default true;
     property SingleLine: boolean read FSingleLine write SetSingleLine default true;
     property Shadow: boolean read FShadow write SetShadow;
     property Shadow: boolean read FShadow write SetShadow;
     property ShadowColor: TColor read FShadowColor write SetShadowColor default clBlack;
     property ShadowColor: TColor read FShadowColor write SetShadowColor default clBlack;
@@ -641,7 +643,7 @@ end;
 
 
 { TBCFont }
 { TBCFont }
 
 
-function TBCFont.IsNamStored: boolean;
+function TBCFont.IsNameStored: boolean;
 begin
 begin
   Result := DefFontData.Name <> Name;
   Result := DefFontData.Name <> Name;
 end;
 end;
@@ -655,6 +657,15 @@ begin
   Change;
   Change;
 end;
 end;
 
 
+procedure TBCFont.SetDisabledColor(AValue: TColor);
+begin
+  if FDisabledColor = AValue then
+    Exit;
+  FDisabledColor := AValue;
+
+  Change;
+end;
+
 procedure TBCFont.SetEndEllipsis(AValue: boolean);
 procedure TBCFont.SetEndEllipsis(AValue: boolean);
 begin
 begin
   if FEndEllipsis = AValue then
   if FEndEllipsis = AValue then
@@ -842,6 +853,7 @@ begin
   FStyle := [];
   FStyle := [];
   FName := DefFontData.Name;
   FName := DefFontData.Name;
   FColor := clDefault;
   FColor := clDefault;
+  FDisabledColor := clNone;
   FWordBreak := False;
   FWordBreak := False;
   FSingleLine := True;
   FSingleLine := True;
   FEndEllipsis := False;
   FEndEllipsis := False;
@@ -852,6 +864,7 @@ begin
   if Source is TBCFont then
   if Source is TBCFont then
   begin
   begin
     FColor := TBCFont(Source).FColor;
     FColor := TBCFont(Source).FColor;
+    FDisabledColor := TBCFont(Source).FDisabledColor;
     FEndEllipsis := TBCFont(Source).FEndEllipsis;
     FEndEllipsis := TBCFont(Source).FEndEllipsis;
     FFontQuality := TBCFont(Source).FFontQuality;
     FFontQuality := TBCFont(Source).FFontQuality;
     FHeight := TBCFont(Source).FHeight;
     FHeight := TBCFont(Source).FHeight;

+ 30 - 14
bgracontrols.lpk

@@ -1,6 +1,6 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <CONFIG>
 <CONFIG>
-  <Package Version="4">
+  <Package Version="5">
     <Name Value="bgracontrols"/>
     <Name Value="bgracontrols"/>
     <Type Value="RunAndDesignTime"/>
     <Type Value="RunAndDesignTime"/>
     <Author Value="Dibo, Circular, Lainz and others"/>
     <Author Value="Dibo, Circular, Lainz and others"/>
@@ -28,8 +28,8 @@
     </CompilerOptions>
     </CompilerOptions>
     <Description Value="BGRA Controls is a set of graphical UI elements that you can use with Lazarus LCL applications."/>
     <Description Value="BGRA Controls is a set of graphical UI elements that you can use with Lazarus LCL applications."/>
     <License Value="Modified LGPL"/>
     <License Value="Modified LGPL"/>
-    <Version Major="7" Minor="2"/>
-    <Files Count="63">
+    <Version Major="7" Minor="6"/>
+    <Files Count="66">
       <Item1>
       <Item1>
         <Filename Value="atshapelinebgra.pas"/>
         <Filename Value="atshapelinebgra.pas"/>
         <HasRegisterProc Value="True"/>
         <HasRegisterProc Value="True"/>
@@ -313,29 +313,45 @@
         <UnitName Value="MaterialColors"/>
         <UnitName Value="MaterialColors"/>
       </Item58>
       </Item58>
       <Item59>
       <Item59>
-        <Filename Value="mouseandkeyinput/mouseandkeyinput.pas"/>
-        <AddToUsesPkgSection Value="False"/>
-        <UnitName Value="MouseAndKeyInput"/>
-      </Item59>
-      <Item60>
         <Filename Value="bclistboxex.pas"/>
         <Filename Value="bclistboxex.pas"/>
         <UnitName Value="BCListBoxEx"/>
         <UnitName Value="BCListBoxEx"/>
-      </Item60>
-      <Item61>
+      </Item59>
+      <Item60>
         <Filename Value="bgrasvgtheme.pas"/>
         <Filename Value="bgrasvgtheme.pas"/>
         <HasRegisterProc Value="True"/>
         <HasRegisterProc Value="True"/>
         <UnitName Value="BGRASVGTheme"/>
         <UnitName Value="BGRASVGTheme"/>
-      </Item61>
-      <Item62>
+      </Item60>
+      <Item61>
         <Filename Value="bgrasvgimagelist.pas"/>
         <Filename Value="bgrasvgimagelist.pas"/>
         <HasRegisterProc Value="True"/>
         <HasRegisterProc Value="True"/>
         <UnitName Value="BGRASVGImageList"/>
         <UnitName Value="BGRASVGImageList"/>
-      </Item62>
-      <Item63>
+      </Item61>
+      <Item62>
         <Filename Value="bgrasvgimagelistform/bgrasvgimagelistform.pas"/>
         <Filename Value="bgrasvgimagelistform/bgrasvgimagelistform.pas"/>
         <UnitName Value="bgrasvgimagelistform"/>
         <UnitName Value="bgrasvgimagelistform"/>
+      </Item62>
+      <Item63>
+        <Filename Value="bcmaterialedit.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="BCMaterialEdit"/>
       </Item63>
       </Item63>
+      <Item64>
+        <Filename Value="bcmaterialfloatspinedit.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="BCMaterialFloatSpinEdit"/>
+      </Item64>
+      <Item65>
+        <Filename Value="bcmaterialspinedit.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="BCMaterialSpinEdit"/>
+      </Item65>
+      <Item66>
+        <Filename Value="bcmaterialprogressbarmarquee.pas"/>
+        <HasRegisterProc Value="True"/>
+        <UnitName Value="BCMaterialProgressBarMarquee"/>
+      </Item66>
     </Files>
     </Files>
+    <CompatibilityMode Value="True"/>
     <LazDoc Paths="fpdoc"/>
     <LazDoc Paths="fpdoc"/>
     <RequiredPkgs Count="2">
     <RequiredPkgs Count="2">
       <Item1>
       <Item1>

+ 8 - 1
bgracontrols.pas

@@ -20,7 +20,9 @@ uses
   BGRAThemeCheckBox, BGRAThemeRadioButton, BGRAVirtualScreen, 
   BGRAThemeCheckBox, BGRAThemeRadioButton, BGRAVirtualScreen, 
   ColorSpeedButton, DTAnalogClock, DTAnalogCommon, DTAnalogGauge, 
   ColorSpeedButton, DTAnalogClock, DTAnalogCommon, DTAnalogGauge, 
   dtthemedclock, dtthemedgauge, MaterialColors, BCListBoxEx, BGRASVGTheme, 
   dtthemedclock, dtthemedgauge, MaterialColors, BCListBoxEx, BGRASVGTheme, 
-  BGRASVGImageList, bgrasvgimagelistform, LazarusPackageIntf;
+  BGRASVGImageList, bgrasvgimagelistform, BCMaterialEdit, 
+  BCMaterialFloatSpinEdit, BCMaterialSpinEdit, BCMaterialProgressBarMarquee, 
+  LazarusPackageIntf;
 
 
 implementation
 implementation
 
 
@@ -68,6 +70,11 @@ begin
   RegisterUnit('dtthemedgauge', @dtthemedgauge.Register);
   RegisterUnit('dtthemedgauge', @dtthemedgauge.Register);
   RegisterUnit('BGRASVGTheme', @BGRASVGTheme.Register);
   RegisterUnit('BGRASVGTheme', @BGRASVGTheme.Register);
   RegisterUnit('BGRASVGImageList', @BGRASVGImageList.Register);
   RegisterUnit('BGRASVGImageList', @BGRASVGImageList.Register);
+  RegisterUnit('BCMaterialEdit', @BCMaterialEdit.Register);
+  RegisterUnit('BCMaterialFloatSpinEdit', @BCMaterialFloatSpinEdit.Register);
+  RegisterUnit('BCMaterialSpinEdit', @BCMaterialSpinEdit.Register);
+  RegisterUnit('BCMaterialProgressBarMarquee', 
+    @BCMaterialProgressBarMarquee.Register);
 end;
 end;
 
 
 initialization
 initialization

+ 1 - 1
bgracontrolsinfo.pas

@@ -9,7 +9,7 @@ uses
   Classes, SysUtils;
   Classes, SysUtils;
 
 
 const
 const
-  BGRAControlsVersion = 7020000;
+  BGRAControlsVersion = 7060000;
 
 
   function BGRAControlsVersionStr: string;
   function BGRAControlsVersionStr: string;
 
 

+ 1 - 1
bgrapascalscriptcomponent.lpk

@@ -11,7 +11,7 @@
         <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
         <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
       </SearchPaths>
       </SearchPaths>
     </CompilerOptions>
     </CompilerOptions>
-    <Version Major="7" Minor="2"/>
+    <Version Major="7" Minor="6"/>
     <Files Count="3">
     <Files Count="3">
       <Item1>
       <Item1>
         <Filename Value="bgrapascalscript.pas"/>
         <Filename Value="bgrapascalscript.pas"/>

+ 1 - 1
bgraspriteanimation.pas

@@ -105,7 +105,7 @@ type
     { Protected declarations }
     { Protected declarations }
     procedure Paint; override;
     procedure Paint; override;
     procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
     procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
-      WithThemeSpace: Boolean); override;
+      {%H-}WithThemeSpace: Boolean); override;
   public
   public
     { Public declarations }
     { Public declarations }
     procedure GifImageToSprite(Gif: TBGRAAnimatedGif);
     procedure GifImageToSprite(Gif: TBGRAAnimatedGif);

+ 53 - 0
bgrasvgimagelist.pas

@@ -20,11 +20,14 @@ type
     FHorizontalAlignment: TAlignment;
     FHorizontalAlignment: TAlignment;
     FItems: TListOfTStringList;
     FItems: TListOfTStringList;
     FReferenceDPI: integer;
     FReferenceDPI: integer;
+    FTargetRasterImageList: TImageList;
     FUseSVGAlignment: boolean;
     FUseSVGAlignment: boolean;
     FVerticalAlignment: TTextLayout;
     FVerticalAlignment: TTextLayout;
     FWidth: integer;
     FWidth: integer;
+    FRasterized: boolean;
     procedure ReadData(Stream: TStream);
     procedure ReadData(Stream: TStream);
     procedure SetHeight(AValue: integer);
     procedure SetHeight(AValue: integer);
+    procedure SetTargetRasterImageList(AValue: TImageList);
     procedure SetWidth(AValue: integer);
     procedure SetWidth(AValue: integer);
     procedure WriteData(Stream: TStream);
     procedure WriteData(Stream: TStream);
   protected
   protected
@@ -34,6 +37,9 @@ type
     function GetCount: integer;
     function GetCount: integer;
     // Get SVG string
     // Get SVG string
     function GetSVGString(AIndex: integer): string; overload;
     function GetSVGString(AIndex: integer): string; overload;
+    procedure Rasterize;
+    procedure RasterizeIfNeeded;
+    procedure QueryRasterize;
   public
   public
     constructor Create(AOwner: TComponent); override;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     destructor Destroy; override;
@@ -81,6 +87,7 @@ type
     property UseSVGAlignment: boolean read FUseSVGAlignment write FUseSVGAlignment default False;
     property UseSVGAlignment: boolean read FUseSVGAlignment write FUseSVGAlignment default False;
     property HorizontalAlignment: TAlignment read FHorizontalAlignment write FHorizontalAlignment default taCenter;
     property HorizontalAlignment: TAlignment read FHorizontalAlignment write FHorizontalAlignment default taCenter;
     property VerticalAlignment: TTextLayout read FVerticalAlignment write FVerticalAlignment default tlCenter;
     property VerticalAlignment: TTextLayout read FVerticalAlignment write FVerticalAlignment default tlCenter;
+    property TargetRasterImageList: TImageList read FTargetRasterImageList write SetTargetRasterImageList default nil;
   end;
   end;
 
 
 procedure Register;
 procedure Register;
@@ -115,6 +122,15 @@ begin
   if FHeight = AValue then
   if FHeight = AValue then
     Exit;
     Exit;
   FHeight := AValue;
   FHeight := AValue;
+  QueryRasterize;
+end;
+
+procedure TBGRASVGImageList.SetTargetRasterImageList(AValue: TImageList);
+begin
+  if FTargetRasterImageList=AValue then Exit;
+  if Assigned(FTargetRasterImageList) then FTargetRasterImageList.Clear;
+  FTargetRasterImageList:=AValue;
+  QueryRasterize;
 end;
 end;
 
 
 procedure TBGRASVGImageList.SetWidth(AValue: integer);
 procedure TBGRASVGImageList.SetWidth(AValue: integer);
@@ -122,6 +138,7 @@ begin
   if FWidth = AValue then
   if FWidth = AValue then
     Exit;
     Exit;
   FWidth := AValue;
   FWidth := AValue;
+  QueryRasterize;
 end;
 end;
 
 
 procedure TBGRASVGImageList.WriteData(Stream: TStream);
 procedure TBGRASVGImageList.WriteData(Stream: TStream);
@@ -197,16 +214,19 @@ begin
   list := TStringList.Create;
   list := TStringList.Create;
   list.Text := ASVG;
   list.Text := ASVG;
   Result := FItems.Add(list);
   Result := FItems.Add(list);
+  QueryRasterize;
 end;
 end;
 
 
 procedure TBGRASVGImageList.Remove(AIndex: integer);
 procedure TBGRASVGImageList.Remove(AIndex: integer);
 begin
 begin
   FItems.Remove(FItems[AIndex]);
   FItems.Remove(FItems[AIndex]);
+  QueryRasterize;
 end;
 end;
 
 
 procedure TBGRASVGImageList.Exchange(AIndex1, AIndex2: integer);
 procedure TBGRASVGImageList.Exchange(AIndex1, AIndex2: integer);
 begin
 begin
   FItems.Exchange(AIndex1, AIndex2);
   FItems.Exchange(AIndex1, AIndex2);
+  QueryRasterize;
 end;
 end;
 
 
 function TBGRASVGImageList.GetSVGString(AIndex: integer): string;
 function TBGRASVGImageList.GetSVGString(AIndex: integer): string;
@@ -214,9 +234,42 @@ begin
   Result := FItems[AIndex].Text;
   Result := FItems[AIndex].Text;
 end;
 end;
 
 
+procedure TBGRASVGImageList.Rasterize;
+begin
+  if Assigned(FTargetRasterImageList) then
+  begin
+    FTargetRasterImageList.Clear;
+    FTargetRasterImageList.Width := Width;
+    FTargetRasterImageList.Height := Height;
+    {$IFDEF DARWIN}
+    PopulateImageList(FTargetRasterImageList, [Width, Width*2]);
+    {$ELSE}
+    PopulateImageList(FTargetRasterImageList, [Width]);
+    {$ENDIF}
+  end;
+end;
+
+procedure TBGRASVGImageList.RasterizeIfNeeded;
+begin
+  if not FRasterized then
+  begin
+    Rasterize;
+    FRasterized := true;
+  end;
+end;
+
+procedure TBGRASVGImageList.QueryRasterize;
+var method: TThreadMethod;
+begin
+  FRasterized := false;
+  method := RasterizeIfNeeded;
+  TThread.ForceQueue(nil, method);
+end;
+
 procedure TBGRASVGImageList.Replace(AIndex: integer; ASVG: string);
 procedure TBGRASVGImageList.Replace(AIndex: integer; ASVG: string);
 begin
 begin
   FItems[AIndex].Text := ASVG;
   FItems[AIndex].Text := ASVG;
+  QueryRasterize;
 end;
 end;
 
 
 function TBGRASVGImageList.GetCount: integer;
 function TBGRASVGImageList.GetCount: integer;

+ 7 - 3
bgrasvgimagelistform/bgrasvgimagelistproject.lpi

@@ -1,11 +1,13 @@
 <?xml version="1.0" encoding="UTF-8"?>
 <?xml version="1.0" encoding="UTF-8"?>
 <CONFIG>
 <CONFIG>
   <ProjectOptions>
   <ProjectOptions>
-    <Version Value="11"/>
+    <Version Value="12"/>
     <PathDelim Value="\"/>
     <PathDelim Value="\"/>
     <General>
     <General>
+      <Flags>
+        <CompatibilityMode Value="True"/>
+      </Flags>
       <SessionStorage Value="InProjectDir"/>
       <SessionStorage Value="InProjectDir"/>
-      <MainUnit Value="0"/>
       <Title Value="bgrasvgimagelistproject"/>
       <Title Value="bgrasvgimagelistproject"/>
       <Scaled Value="True"/>
       <Scaled Value="True"/>
       <ResourceType Value="res"/>
       <ResourceType Value="res"/>
@@ -24,7 +26,6 @@
     </PublishOptions>
     </PublishOptions>
     <RunParams>
     <RunParams>
       <FormatVersion Value="2"/>
       <FormatVersion Value="2"/>
-      <Modes Count="0"/>
     </RunParams>
     </RunParams>
     <RequiredPackages Count="2">
     <RequiredPackages Count="2">
       <Item1>
       <Item1>
@@ -59,6 +60,9 @@
       <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
       <UnitOutputDirectory Value="lib\$(TargetCPU)-$(TargetOS)"/>
     </SearchPaths>
     </SearchPaths>
     <Linking>
     <Linking>
+      <Debugging>
+        <DebugInfoType Value="dsDwarf2Set"/>
+      </Debugging>
       <Options>
       <Options>
         <Win32>
         <Win32>
           <GraphicApplication Value="True"/>
           <GraphicApplication Value="True"/>

+ 25 - 15
bgrasvgtheme.pas

@@ -77,6 +77,8 @@ type
     constructor Create(AOwner: TComponent); override;
     constructor Create(AOwner: TComponent); override;
     destructor Destroy; override;
     destructor Destroy; override;
   public
   public
+    function PreferredButtonHeight(const hasGlyph: boolean): Integer; override;
+    function PreferredButtonWidth(const hasGlyph: boolean): Integer; override;
     procedure DrawButton(Caption: string; State: TBGRAThemeButtonState;
     procedure DrawButton(Caption: string; State: TBGRAThemeButtonState;
       Focused: boolean; ARect: TRect; ASurface: TBGRAThemeSurface; AImageIndex: Integer = -1; AImageList: TBGRASVGImageList = nil); override;
       Focused: boolean; ARect: TRect; ASurface: TBGRAThemeSurface; AImageIndex: Integer = -1; AImageList: TBGRASVGImageList = nil); override;
     procedure DrawRadioButton(Caption: string; State: TBGRAThemeButtonState;
     procedure DrawRadioButton(Caption: string; State: TBGRAThemeButtonState;
@@ -618,6 +620,18 @@ begin
   inherited Destroy;
   inherited Destroy;
 end;
 end;
 
 
+function TBGRASVGTheme.PreferredButtonHeight(const hasGlyph: boolean): Integer;
+begin
+  Result := (FButtonTextSpacing * 2);
+end;
+
+function TBGRASVGTheme.PreferredButtonWidth(const hasGlyph: boolean): Integer;
+begin
+  Result := (FButtonTextSpacing * 2);
+  if (hasGlyph) then
+    Result := Result + FGlyphTextSpacing;
+end;
+
 procedure TBGRASVGTheme.DrawButton(Caption: string;
 procedure TBGRASVGTheme.DrawButton(Caption: string;
   State: TBGRAThemeButtonState; Focused: boolean; ARect: TRect;
   State: TBGRAThemeButtonState; Focused: boolean; ARect: TRect;
   ASurface: TBGRAThemeSurface; AImageIndex: Integer;
   ASurface: TBGRAThemeSurface; AImageIndex: Integer;
@@ -684,24 +698,10 @@ begin
       ScaleForBitmap(GlyphTextSpacing), actualCaption, bcFont);
       ScaleForBitmap(GlyphTextSpacing), actualCaption, bcFont);
     if not rGlyph.IsEmpty then
     if not rGlyph.IsEmpty then
       AImageList.Draw(AImageIndex, Bitmap, RectF(rGlyph));
       AImageList.Draw(AImageIndex, Bitmap, RectF(rGlyph));
-    RenderText(r, bcFont, actualCaption, Bitmap);
+    RenderText(r, bcFont, actualCaption, Bitmap, State <> btbsDisabled);
 
 
     ColorizeSurface(ASurface, State);
     ColorizeSurface(ASurface, State);
     DrawBitmap;
     DrawBitmap;
-
-    if Focused then
-    begin
-      DestCanvas.Pen.Color := DestCanvas.Font.Color;
-      DestCanvas.Pen.Style := psDash;
-      DestCanvas.Brush.Style := bsClear;
-      r := ARect;
-      r.Inflate(-ScaleForCanvas(FButtonSliceScalingLeft),
-        -ScaleForCanvas(FButtonSliceScalingTop),
-        -ScaleForCanvas(FButtonSliceScalingRight),
-        -ScaleForCanvas(FButtonSliceScalingBottom));
-      DestCanvas.Rectangle(r);
-      DestCanvas.Pen.Style := psSolid;
-    end;
   end;
   end;
 end;
 end;
 
 
@@ -827,6 +827,7 @@ procedure TBGRASVGTheme.DrawCheckBox(Caption: string; State: TBGRAThemeButtonSta
 var
 var
   Style: TTextStyle;
   Style: TTextStyle;
   svg: TBGRASVG;
   svg: TBGRASVG;
+  r: TRect;
 begin
 begin
   with ASurface do
   with ASurface do
   begin
   begin
@@ -851,6 +852,15 @@ begin
         ARect.Right, ARect.Bottom),
         ARect.Right, ARect.Bottom),
         ARect.Height +  ScaleForCanvas(CheckBoxTextSpacing), 0, Caption, Style);
         ARect.Height +  ScaleForCanvas(CheckBoxTextSpacing), 0, Caption, Style);
     end;
     end;
+    if Focused then
+    begin
+      DestCanvas.Pen.Color := DestCanvas.Font.Color;
+      DestCanvas.Pen.Style := psDash;
+      DestCanvas.Brush.Style := bsClear;
+      r := ARect;
+      DestCanvas.Rectangle(r);
+      DestCanvas.Pen.Style := psSolid;
+    end;
   end;
   end;
 end;
 end;
 
 

+ 13 - 0
bgratheme.pas

@@ -72,6 +72,9 @@ type
     destructor Destroy; override;
     destructor Destroy; override;
     procedure InvalidateThemedControls;
     procedure InvalidateThemedControls;
 
 
+    function PreferredButtonWidth(const hasGlyph: boolean): Integer; virtual;
+    function PreferredButtonHeight(const hasGlyph: boolean): Integer; virtual;
+
     procedure DrawButton(Caption: string; State: TBGRAThemeButtonState;
     procedure DrawButton(Caption: string; State: TBGRAThemeButtonState;
       Focused: boolean; ARect: TRect; ASurface: TBGRAThemeSurface; AImageIndex: Integer = -1; AImageList: TBGRASVGImageList = nil); virtual;
       Focused: boolean; ARect: TRect; ASurface: TBGRAThemeSurface; AImageIndex: Integer = -1; AImageList: TBGRASVGImageList = nil); virtual;
     procedure DrawRadioButton(Caption: string; State: TBGRAThemeButtonState;
     procedure DrawRadioButton(Caption: string; State: TBGRAThemeButtonState;
@@ -248,6 +251,16 @@ begin
     ThemedControl[i].Invalidate;
     ThemedControl[i].Invalidate;
 end;
 end;
 
 
+function TBGRATheme.PreferredButtonWidth(const hasGlyph: boolean): Integer;
+begin
+  Result := 125;
+end;
+
+function TBGRATheme.PreferredButtonHeight(const hasGlyph: boolean): Integer;
+begin
+  Result := 35;
+end;
+
 procedure TBGRATheme.DrawButton(Caption: string; State: TBGRAThemeButtonState;
 procedure TBGRATheme.DrawButton(Caption: string; State: TBGRAThemeButtonState;
   Focused: boolean; ARect: TRect; ASurface: TBGRAThemeSurface;
   Focused: boolean; ARect: TRect; ASurface: TBGRAThemeSurface;
   AImageIndex: Integer; AImageList: TBGRASVGImageList);
   AImageIndex: Integer; AImageList: TBGRASVGImageList);

+ 25 - 0
bgrathemebutton.pas

@@ -25,6 +25,8 @@ type
     procedure SetState(AValue: TBGRAThemeButtonState);
     procedure SetState(AValue: TBGRAThemeButtonState);
     procedure TimerHoverElapse(Sender: TObject);
     procedure TimerHoverElapse(Sender: TObject);
   protected
   protected
+    procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer;
+      WithThemeSpace: Boolean); override;
     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
     procedure Notification(AComponent: TComponent; Operation: TOperation); override;
     class function GetControlClassDefaultSize: TSize; override;
     class function GetControlClassDefaultSize: TSize; override;
     procedure MouseEnter; override;
     procedure MouseEnter; override;
@@ -42,6 +44,7 @@ type
   public
   public
     constructor Create(AOwner: TComponent); override;
     constructor Create(AOwner: TComponent); override;
   published
   published
+    property Action;
     property ModalResult: TModalResult
     property ModalResult: TModalResult
       read FModalResult write FModalResult default mrNone;
       read FModalResult write FModalResult default mrNone;
     property Align;
     property Align;
@@ -53,6 +56,10 @@ type
     property ImageList: TBGRASVGImageList read FImageList write SetImageList;
     property ImageList: TBGRASVGImageList read FImageList write SetImageList;
     property ImageIndex: integer read FImageIndex write SetImageIndex;
     property ImageIndex: integer read FImageIndex write SetImageIndex;
     property OnClick;
     property OnClick;
+    property OnMouseDown;
+    property OnMouseUp;
+    property OnMouseEnter;
+    property OnMouseLeave;
   end;
   end;
 
 
 procedure Register;
 procedure Register;
@@ -98,6 +105,24 @@ begin
   UpdateHoverState;
   UpdateHoverState;
 end;
 end;
 
 
+procedure TBGRAThemeButton.CalculatePreferredSize(var PreferredWidth,
+  PreferredHeight: integer; WithThemeSpace: Boolean);
+begin
+  inherited CalculatePreferredSize(PreferredWidth, PreferredHeight,
+    WithThemeSpace);
+
+  if AutoSize then
+  begin
+    PreferredWidth := Canvas.TextWidth(Caption) + Theme.PreferredButtonWidth(Assigned(FImageList));
+    PreferredHeight := Canvas.TextHeight(Caption) + Theme.PreferredButtonHeight(Assigned(FImageList));
+    if Assigned(FImageList) then
+    begin
+      PreferredWidth := PreferredWidth + FImageList.Width;
+      PreferredHeight := PreferredHeight + FImageList.Height;
+    end;
+  end;
+end;
+
 procedure TBGRAThemeButton.Notification(AComponent: TComponent;
 procedure TBGRAThemeButton.Notification(AComponent: TComponent;
   Operation: TOperation);
   Operation: TOperation);
 begin
 begin

+ 61 - 2
bgrathemecheckbox.pas

@@ -7,7 +7,7 @@ interface
 
 
 uses
 uses
   Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
   Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
-  BGRATheme, Types;
+  BGRATheme, Types, LMessages, LCLType;
 
 
 type
 type
 
 
@@ -20,6 +20,11 @@ type
     FState: TBGRAThemeButtonState;
     FState: TBGRAThemeButtonState;
     procedure SetChecked(AValue: boolean);
     procedure SetChecked(AValue: boolean);
   protected
   protected
+    procedure KeyDown(var Key: word; Shift: TShiftState); override;
+    procedure KeyUp(var Key: word; Shift: TShiftState); override;
+    procedure WMSetFocus(var Message: {$IFDEF FPC}TLMSetFocus{$ELSE}TWMSetFocus{$ENDIF}); message {$IFDEF FPC}LM_SETFOCUS{$ELSE}WM_SETFOCUS{$ENDIF};
+    procedure WMKillFocus(var Message: {$IFDEF FPC}TLMKillFocus{$ELSE}TWMKillFocus{$ENDIF}); message {$IFDEF FPC}LM_KILLFOCUS{$ELSE}WM_KILLFOCUS{$ENDIF};
+    procedure UpdateFocus(AFocused: boolean);
     class function GetControlClassDefaultSize: TSize; override;
     class function GetControlClassDefaultSize: TSize; override;
     procedure MouseEnter; override;
     procedure MouseEnter; override;
     procedure MouseLeave; override;
     procedure MouseLeave; override;
@@ -42,6 +47,8 @@ type
     property Font;
     property Font;
     property Enabled;
     property Enabled;
     property OnChange: TNotifyEvent read FOnChange write FOnChange;
     property OnChange: TNotifyEvent read FOnChange write FOnChange;
+    property TabStop;
+    property TabOrder;
   end;
   end;
 
 
 procedure Register;
 procedure Register;
@@ -66,6 +73,58 @@ begin
   if Assigned(FOnChange) then FOnChange(Self);
   if Assigned(FOnChange) then FOnChange(Self);
 end;
 end;
 
 
+procedure TBGRAThemeCheckBox.KeyDown(var Key: word; Shift: TShiftState);
+begin
+  inherited KeyDown(Key, Shift);
+
+  if (Key = VK_SPACE) or (Key = VK_RETURN) then
+    MouseDown(mbLeft, [], 0, 0);
+end;
+
+procedure TBGRAThemeCheckBox.KeyUp(var Key: word; Shift: TShiftState);
+begin
+  if (Key = VK_SPACE) or (Key = VK_RETURN) then
+  begin
+    MouseUp(mbLeft, [], 0, 0);
+    MouseLeave;
+  end;
+
+  inherited KeyUp(Key, Shift);
+end;
+
+procedure TBGRAThemeCheckBox.WMSetFocus(var Message: TLMSetFocus);
+begin
+  inherited;
+
+  UpdateFocus(True);
+end;
+
+procedure TBGRAThemeCheckBox.WMKillFocus(var Message: TLMKillFocus);
+begin
+  inherited;
+
+  if Message.FocusedWnd <> Handle then
+    UpdateFocus(False);
+end;
+
+procedure TBGRAThemeCheckBox.UpdateFocus(AFocused: boolean);
+var
+  lForm: TCustomForm;
+begin
+  lForm := GetParentForm(Self);
+  if lForm = nil then
+    exit;
+
+  {$IFDEF FPC}//#
+  if AFocused then
+    ActiveDefaultControlChanged(lForm.ActiveControl)
+  else
+    ActiveDefaultControlChanged(nil);
+  {$ENDIF}
+
+  Invalidate;
+end;
+
 class function TBGRAThemeCheckBox.GetControlClassDefaultSize: TSize;
 class function TBGRAThemeCheckBox.GetControlClassDefaultSize: TSize;
 begin
 begin
   Result.CX := 165;
   Result.CX := 165;
@@ -155,7 +214,7 @@ begin
   inherited Create(AOwner);
   inherited Create(AOwner);
   FState := btbsNormal;
   FState := btbsNormal;
 
 
-  ControlStyle := ControlStyle + [csParentBackground];
+  ControlStyle := ControlStyle + [csParentBackground, csAcceptsControls];
 
 
   with GetControlClassDefaultSize do
   with GetControlClassDefaultSize do
     SetInitialBounds(0, 0, CX, CY);
     SetInitialBounds(0, 0, CX, CY);

BIN
docs/img/analogcontrols.png


BIN
docs/img/bcbutton.png


BIN
docs/img/bcbuttonfocus.png


BIN
docs/img/bcimagebutton.png


BIN
docs/img/bctoolbar.png


BIN
docs/img/bcxbutton.png


BIN
docs/img/bgraribbon.png


BIN
docs/img/logo.png


BIN
docs/img/progressbar.png


BIN
icons/tbcbutton.png


BIN
icons/tbcbuttonfocus.png


BIN
icons/tbcradialprogressbar.png


BIN
icons/tbgraflashprogressbar.png


BIN
icons/tdtthemedclock.png


BIN
images/tbcbutton.png


BIN
images/tbcbutton_150.png


BIN
images/tbcbutton_200.png


BIN
images/tbcbuttonfocus.png


BIN
images/tbcbuttonfocus_150.png


BIN
images/tbcbuttonfocus_200.png


BIN
images/tbccombobox.png


BIN
images/tbccombobox_150.png


BIN
images/tbccombobox_200.png


BIN
images/tbclabel_200.png


BIN
images/tbclistbox.png


BIN
images/tbclistbox_150.png


BIN
images/tbclistbox_200.png


BIN
images/tbcmaterialdesignbutton.png


BIN
images/tbcmaterialdesignbutton_150.png


BIN
images/tbcmaterialdesignbutton_200.png


BIN
images/tbcmdbutton.png


BIN
images/tbcmdbutton_150.png


BIN
images/tbcmdbutton_200.png


BIN
images/tbcmdbuttonfocus.png


BIN
images/tbcmdbuttonfocus_150.png


BIN
images/tbcmdbuttonfocus_200.png


BIN
images/tbcpanel_150.png


BIN
images/tbcpanel_200.png


BIN
images/tbcpaperlistbox.png


BIN
images/tbcpaperlistbox_150.png


BIN
images/tbcpaperlistbox_200.png


BIN
images/tbcpaperpanel_150.png


BIN
images/tbcpaperpanel_200.png


BIN
images/tbcsvgviewer.png


BIN
images/tbcsvgviewer_150.png


BIN
images/tbcsvgviewer_200.png


BIN
images/tbctoolbar.png


BIN
images/tbctoolbar_150.png


BIN
images/tbctoolbar_200.png


BIN
images/tbctrackbarupdown.png


BIN
images/tbctrackbarupdown_150.png


BIN
images/tbctrackbarupdown_200.png


BIN
images/tbcxbutton.png


BIN
images/tbcxbutton_150.png


BIN
images/tbcxbutton_200.png


BIN
images/tbgracolortheme_150.png


BIN
images/tbgracolortheme_200.png


BIN
images/tbgragraphiccontrol_150.png


BIN
images/tbgragraphiccontrol_200.png


BIN
images/tbgraimagelist.png


BIN
images/tbgraimagelist_150.png


BIN
images/tbgraimagelist_200.png


BIN
images/tbgraimagetheme_150.png


BIN
images/tbgraimagetheme_200.png


BIN
images/tbgraknob.png


BIN
images/tbgraknob_150.png


BIN
images/tbgraknob_200.png


BIN
images/tbgraresizespeedbutton.png


BIN
images/tbgraresizespeedbutton_150.png


BIN
images/tbgraresizespeedbutton_200.png


BIN
images/tbgrashape.png


BIN
images/tbgrashape_150.png


BIN
images/tbgrashape_200.png


Some files were not shown because too many files changed in this diff