bgraimagetheme.pas 2.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. // SPDX-License-Identifier: LGPL-3.0-linking-exception
  2. unit BGRAImageTheme;
  3. {$mode objfpc}{$H+}
  4. interface
  5. uses
  6. Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs, BGRATheme,
  7. BGRASliceScaling, BGRABitmap, BGRABitmapTypes, BGRASVGImageList;
  8. type
  9. { TBGRAImageTheme }
  10. TBGRAImageTheme = class(TBGRATheme)
  11. private
  12. FBackgroundColor: TColor;
  13. FSliceScalingButton: TBGRAMultiSliceScaling;
  14. procedure SetFBackgroundColor(AValue: TColor);
  15. protected
  16. public
  17. constructor Create(AOwner: TComponent); override;
  18. destructor Destroy; override;
  19. procedure LoadResources(AFileName: string);
  20. procedure DrawButton(Caption: string; State: TBGRAThemeButtonState;
  21. Focused: boolean; ARect: TRect; ASurface: TBGRAThemeSurface; AImageIndex: Integer = -1; AImageList: TBGRASVGImageList = nil); override;
  22. published
  23. property BackgroundColor: TColor read FBackgroundColor
  24. write SetFBackgroundColor default clForm;
  25. end;
  26. procedure Register;
  27. implementation
  28. procedure Register;
  29. begin
  30. RegisterComponents('BGRA Themes', [TBGRAImageTheme]);
  31. end;
  32. { TBGRAImageTheme }
  33. procedure TBGRAImageTheme.SetFBackgroundColor(AValue: TColor);
  34. begin
  35. if FBackgroundColor = AValue then
  36. Exit;
  37. FBackgroundColor := AValue;
  38. end;
  39. constructor TBGRAImageTheme.Create(AOwner: TComponent);
  40. begin
  41. inherited Create(AOwner);
  42. BackgroundColor := clForm;
  43. end;
  44. destructor TBGRAImageTheme.Destroy;
  45. begin
  46. FSliceScalingButton.Free;
  47. inherited Destroy;
  48. end;
  49. procedure TBGRAImageTheme.LoadResources(AFileName: string);
  50. begin
  51. FreeAndNil(FSliceScalingButton);
  52. FSliceScalingButton := TBGRAMultiSliceScaling.Create(AFileName, 'Button');
  53. end;
  54. procedure TBGRAImageTheme.DrawButton(Caption: string;
  55. State: TBGRAThemeButtonState; Focused: boolean; ARect: TRect;
  56. ASurface: TBGRAThemeSurface; AImageIndex: Integer;
  57. AImageList: TBGRASVGImageList);
  58. var
  59. Style: TTextStyle;
  60. ImageIndex: integer;
  61. begin
  62. With ASurface do
  63. begin
  64. case State of
  65. btbsHover: ImageIndex := 1;
  66. btbsActive: ImageIndex := 2;
  67. btbsDisabled: ImageIndex := 3;
  68. else {btbsNormal}
  69. ImageIndex := 0;
  70. end;
  71. Bitmap.Fill(BackgroundColor);
  72. if Assigned(FSliceScalingButton) then
  73. FSliceScalingButton.Draw(ImageIndex, Bitmap, 0, 0, Bitmap.Width, Bitmap.Height);
  74. DrawBitmap;
  75. if Caption <> '' then
  76. begin
  77. fillchar(Style, sizeof(Style), 0);
  78. Style.Alignment := taCenter;
  79. Style.Layout := tlCenter;
  80. Style.Wordbreak := True;
  81. DestCanvas.TextRect(ARect, 0, 0, Caption, Style);
  82. end;
  83. end;
  84. end;
  85. end.