summaryrefslogtreecommitdiff
path: root/src/gui/gui_radiobutton.pas
diff options
context:
space:
mode:
Diffstat (limited to 'src/gui/gui_radiobutton.pas')
-rw-r--r--src/gui/gui_radiobutton.pas238
1 files changed, 238 insertions, 0 deletions
diff --git a/src/gui/gui_radiobutton.pas b/src/gui/gui_radiobutton.pas
new file mode 100644
index 00000000..db3a8e16
--- /dev/null
+++ b/src/gui/gui_radiobutton.pas
@@ -0,0 +1,238 @@
+unit gui_radiobutton;
+
+{$mode objfpc}{$H+}
+
+interface
+
+uses
+ Classes,
+ SysUtils,
+ fpgfx,
+ gfxbase,
+ gfx_widget;
+
+type
+
+ TfpgRadioButton = class(TfpgWidget)
+ private
+ FBackgroundColor: TfpgColor;
+ FChecked: boolean;
+ FFont: TfpgFont;
+ FGroupIndex: integer;
+ FOnChange: TNotifyEvent;
+ FText: string;
+ FBoxSize: integer;
+ FIsPressed: boolean;
+ function GetFontName: string;
+ procedure SetBackgroundColor(const AValue: TfpgColor);
+ procedure SetChecked(const AValue: boolean);
+ procedure SetFontName(const AValue: string);
+ procedure SetText(const AValue: string);
+ protected
+ procedure HandlePaint; override;
+ procedure HandleLMouseDown(x, y: integer; shiftstate: TShiftState); override;
+ procedure HandleLMouseUp(x, y: integer; shiftstate: TShiftState); override;
+ procedure HandleKeyRelease(var keycode: word; var shiftstate: TShiftState; var consumed: boolean); override;
+ public
+ constructor Create(AOwner: TComponent); override;
+ destructor Destroy; override;
+ property Font: TfpgFont read FFont;
+ published
+ property Checked: boolean read FChecked write SetChecked;
+ property Text: string read FText write SetText;
+ property FontName: string read GetFontName write SetFontName;
+ property BackgroundColor: TfpgColor read FBackgroundColor write SetBackgroundColor;
+ property GroupIndex: integer read FGroupIndex write FGroupIndex;
+ property OnChange: TNotifyEvent read FOnChange write FOnChange;
+ end;
+
+
+function CreateRadioButton(AOwner: TComponent; x, y: TfpgCoord; AText: string): TfpgRadioButton;
+
+implementation
+
+function CreateRadioButton(AOwner: TComponent; x, y: TfpgCoord; AText: string): TfpgRadioButton;
+begin
+ Result := TfpgRadioButton.Create(AOwner);
+ Result.Top := y;
+ Result.Left := x;
+ Result.Text := AText;
+ Result.Width := Result.Font.TextWidth(Result.Text) + 24;
+end;
+
+{ TfpgRadioButton }
+
+function TfpgRadioButton.GetFontName: string;
+begin
+ Result := FFont.FontDesc;
+end;
+
+procedure TfpgRadioButton.SetBackgroundColor(const AValue: TfpgColor);
+begin
+ if FBackgroundColor = AValue then
+ Exit; //==>
+ FBackgroundColor := AValue;
+ RePaint;
+end;
+
+procedure TfpgRadioButton.SetChecked(const AValue: boolean);
+var
+ i: integer;
+ wg: TfpgWidget;
+begin
+ if FChecked = AValue then
+ Exit; //==>
+ FChecked := AValue;
+
+ // Clear other radio buttons in the same group
+ if FChecked and (Parent <> nil) then
+ begin
+ for i := 0 to Parent.ComponentCount-1 do
+ begin
+ wg := TfpgWidget(Parent.Components[i]);
+ if (wg <> nil) and (wg <> self) and (wg is TfpgRadioButton) and
+ (TfpgRadioButton(wg).GroupIndex = GroupIndex) then
+ begin
+ TfpgRadioButton(wg).Checked := False;
+ end;
+ end; { for }
+ end; { if }
+
+ RePaint;
+end;
+
+procedure TfpgRadioButton.SetFontName(const AValue: string);
+begin
+ FFont.Free;
+ FFont := fpgGetFont(AValue);
+ RePaint;
+end;
+
+procedure TfpgRadioButton.SetText(const AValue: string);
+begin
+ if FText = AValue then
+ Exit; //==>
+ FText := AValue;
+ RePaint;
+end;
+
+procedure TfpgRadioButton.HandlePaint;
+var
+ r: TfpgRect;
+ ty: integer;
+ tx: integer;
+ img: TfpgImage;
+ ix: integer;
+begin
+ Canvas.BeginDraw;
+ inherited HandlePaint;
+
+ Canvas.SetColor(FBackgroundColor);
+ Canvas.FillRectangle(0, 0, Width, Height);
+ Canvas.SetFont(Font);
+
+ if FFocused then
+ begin
+ Canvas.SetColor(clText1);
+ Canvas.SetLineStyle(1, lsDot);
+ Canvas.DrawRectangle(1, 1, Width-1, Height-1);
+ end;
+ Canvas.SetLineStyle(1, lsSolid);
+
+ r.SetRect(2, (Height div 2) - (FBoxSize div 2), FBoxSize, FBoxSize);
+ if r.top < 0 then
+ r.top := 0;
+
+ // calculate which image to paint.
+ if Enabled then
+ begin
+ ix := Ord(FChecked);
+ if FIsPressed then
+ Inc(ix, 2);
+ end
+ else
+ ix := (2 + (Ord(FChecked) * 2)) - Ord(FChecked);
+
+ // paint the radio button
+ tx := r.right + 8;
+ inc(r.left, 2);
+ inc(r.top, 1);
+ img := fpgImages.GetImage('sys.radiobuttons');
+ Canvas.DrawImagePart(r.Left, r.Top, img, ix*12, 0, 12, 12);
+
+ ty := (Height div 2) - (Font.Height div 2);
+ if ty < 0 then
+ ty := 0;
+ if Enabled then
+ Canvas.SetTextColor(clText1)
+ else
+ Canvas.SetTextColor(clShadow1);
+ Canvas.DrawString(tx, ty, FText);
+
+ Canvas.EndDraw;
+end;
+
+procedure TfpgRadioButton.HandleLMouseDown(x, y: integer;
+ shiftstate: TShiftState);
+begin
+ inherited HandleLMouseDown(x, y, shiftstate);
+ FIsPressed := True;
+ Repaint;
+end;
+
+procedure TfpgRadioButton.HandleLMouseUp(x, y: integer; shiftstate: TShiftState);
+begin
+ inherited HandleLMouseUp(x, y, shiftstate);
+ FIsPressed := False;
+ if not Checked then
+ begin
+ Checked := not FChecked;
+ if Assigned(FOnChange) then
+ FOnChange(self);
+ end
+ else
+ RePaint;
+end;
+
+procedure TfpgRadioButton.HandleKeyRelease(var keycode: word;
+ var shiftstate: TShiftState; var consumed: boolean);
+begin
+ if (keycode = keySpace) then
+ begin
+ consumed := True;
+ Checked := not FChecked;
+ if Assigned(FOnChange) then
+ FOnChange(self);
+ end;
+
+ if consumed then
+ Exit; //==>
+
+ inherited HandleKeyRelease(keycode, shiftstate, consumed);
+end;
+
+constructor TfpgRadioButton.Create(AOwner: TComponent);
+begin
+ inherited Create(AOwner);
+ FText := 'RadioButton';
+ FFont := fpgGetFont('#Label1');
+ FHeight := FFont.Height + 4;
+ FWidth := 120;
+
+ FBackgroundColor := clWindowBackground;
+ FFocusable := True;
+ FBoxSize := 12;
+ FChecked := False;
+ FGroupIndex := 0;
+ FIsPressed := False;
+ FOnChange := nil;
+end;
+
+destructor TfpgRadioButton.Destroy;
+begin
+ FFont.Free;
+ inherited Destroy;
+end;
+
+end.
+