bgrathemeradiobutton.pas 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. // SPDX-License-Identifier: LGPL-3.0-linking-exception
  2. unit BGRAThemeRadioButton;
  3. {$mode delphi}
  4. interface
  5. uses
  6. Classes, SysUtils, LResources, Forms, Controls, Graphics, Dialogs,
  7. BGRATheme, Types;
  8. type
  9. { TBGRAThemeRadioButton }
  10. TBGRAThemeRadioButton = class(TBGRAThemeControl)
  11. private
  12. FChecked: boolean;
  13. FOnChange: TNotifyEvent;
  14. FState: TBGRAThemeButtonState;
  15. procedure SetChecked(AValue: boolean);
  16. protected
  17. class function GetControlClassDefaultSize: TSize; override;
  18. procedure MouseEnter; override;
  19. procedure MouseLeave; override;
  20. procedure MouseDown(Button: TMouseButton; Shift: TShiftState;
  21. X, Y: integer); override;
  22. procedure MouseUp(Button: TMouseButton; Shift: TShiftState; X, Y: integer); override;
  23. procedure Click; override;
  24. procedure SetEnabled(Value: boolean); override;
  25. procedure TextChanged; override;
  26. procedure Paint; override;
  27. procedure Resize; override;
  28. procedure UncheckOthers;
  29. public
  30. constructor Create(AOwner: TComponent); override;
  31. published
  32. property Align;
  33. property Anchors;
  34. property BorderSpacing;
  35. property Caption;
  36. property Checked: boolean read FChecked write SetChecked;
  37. property Font;
  38. property Enabled;
  39. property OnChange: TNotifyEvent read FOnChange write FOnChange;
  40. end;
  41. procedure Register;
  42. implementation
  43. uses BGRABitmapTypes;
  44. procedure Register;
  45. begin
  46. RegisterComponents('BGRA Themes', [TBGRAThemeRadioButton]);
  47. end;
  48. { TBGRAThemeRadioButton }
  49. procedure TBGRAThemeRadioButton.SetChecked(AValue: boolean);
  50. begin
  51. if FChecked = AValue then
  52. Exit;
  53. FChecked := AValue;
  54. if FChecked then
  55. UncheckOthers;
  56. Invalidate;
  57. if Assigned(FOnChange) then FOnChange(Self);
  58. end;
  59. class function TBGRAThemeRadioButton.GetControlClassDefaultSize: TSize;
  60. begin
  61. Result.CX := 165;
  62. Result.CY := 19;
  63. end;
  64. procedure TBGRAThemeRadioButton.MouseEnter;
  65. begin
  66. inherited MouseEnter;
  67. FState := btbsHover;
  68. Invalidate;
  69. end;
  70. procedure TBGRAThemeRadioButton.MouseLeave;
  71. begin
  72. inherited MouseLeave;
  73. FState := btbsNormal;
  74. Invalidate;
  75. end;
  76. procedure TBGRAThemeRadioButton.MouseDown(Button: TMouseButton;
  77. Shift: TShiftState; X, Y: integer);
  78. begin
  79. inherited MouseDown(Button, Shift, X, Y);
  80. FState := btbsActive;
  81. Checked := True;
  82. end;
  83. procedure TBGRAThemeRadioButton.MouseUp(Button: TMouseButton;
  84. Shift: TShiftState; X, Y: integer);
  85. begin
  86. inherited MouseUp(Button, Shift, X, Y);
  87. if ClientRect.Contains(Point(X, Y)) then
  88. FState := btbsHover
  89. else
  90. FState := btbsNormal;
  91. Invalidate;
  92. end;
  93. procedure TBGRAThemeRadioButton.Click;
  94. begin
  95. inherited Click;
  96. end;
  97. procedure TBGRAThemeRadioButton.SetEnabled(Value: boolean);
  98. begin
  99. inherited SetEnabled(Value);
  100. if Value then
  101. FState := btbsNormal
  102. else
  103. FState := btbsDisabled;
  104. Invalidate;
  105. end;
  106. procedure TBGRAThemeRadioButton.TextChanged;
  107. begin
  108. inherited TextChanged;
  109. Invalidate;
  110. end;
  111. procedure TBGRAThemeRadioButton.Paint;
  112. var
  113. surface: TBGRAThemeSurface;
  114. begin
  115. surface := TBGRAThemeSurface.Create(self);
  116. try
  117. if Assigned(Theme) then
  118. Theme.DrawRadioButton(Caption, FState, Focused, Checked, ClientRect, surface)
  119. else
  120. BGRADefaultTheme.DrawRadioButton(Caption, FState, Focused, Checked, ClientRect, surface);
  121. finally
  122. surface.Free;
  123. end;
  124. end;
  125. procedure TBGRAThemeRadioButton.Resize;
  126. begin
  127. Invalidate;
  128. inherited Resize;
  129. end;
  130. procedure TBGRAThemeRadioButton.UncheckOthers;
  131. var
  132. i: integer;
  133. control: TWinControl;
  134. begin
  135. if Parent is TWinControl then
  136. begin
  137. control := TWinControl(Parent);
  138. for i := 0 to control.ControlCount - 1 do
  139. if (control.Controls[i] <> Self) and (control.Controls[i] is
  140. TBGRAThemeRadioButton) then
  141. TBGRAThemeRadioButton(control.Controls[i]).Checked := False;
  142. end;
  143. end;
  144. constructor TBGRAThemeRadioButton.Create(AOwner: TComponent);
  145. begin
  146. inherited Create(AOwner);
  147. FState := btbsNormal;
  148. ControlStyle := ControlStyle + [csParentBackground];
  149. with GetControlClassDefaultSize do
  150. SetInitialBounds(0, 0, CX, CY);
  151. end;
  152. end.