diff --git a/Source/components/simba.component_button.pas b/Source/components/simba.component_button.pas index d359d1c75..814208e0e 100644 --- a/Source/components/simba.component_button.pas +++ b/Source/components/simba.component_button.pas @@ -10,12 +10,13 @@ interface uses - Classes, SysUtils, Controls, StdCtrls, Buttons, Graphics, LMessages; + Classes, SysUtils, Controls, StdCtrls, Buttons, Graphics, LMessages, ImgList; type {$push} {$scopedenums on} ESimbaButtonImage = ( + NONE, OK, CLOSE, CLEAR_FILTER, @@ -29,6 +30,7 @@ interface const IMG_TO_LAZ_GLYPH: array[ESimbaButtonImage] of String = ( + '', 'btn_ok', 'btn_cancel', 'btnfiltercancel', @@ -40,20 +42,64 @@ interface ); type - TSimbaButton = class(TSpeedButton) + TSimbaButton = class(TCustomControl) protected + FImageList: TImageList; + FImageIndex: Integer; + FImage: ESimbaButtonImage; + + FDown: Boolean; + FXPadding: Integer; + FYPadding: Integer; + + function HasImage: Boolean; + function ImageSize: TPoint; + function CalculateSize: TPoint; + + procedure MouseEnter; override; + procedure MouseLeave; override; + procedure TextChanged; override; + + procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; + // Use parent font size, but use SimbaTheme.FontStyle and font styles if changed procedure CMParentFontChanged(var Message: TLMessage); message CM_PARENTFONTCHANGED; - procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); override; - procedure PaintBackground(var PaintRect: TRect); override; + procedure SetDown(AValue: Boolean); + procedure SetXPadding(AValue: Integer); + procedure SetYPadding(AValue: Integer); + + procedure SetImage(Img: ESimbaButtonImage); + procedure SetImageIndex(Index: Integer); public - XPadding: Integer; - YPadding: Integer; + procedure Paint; override; + procedure Click; override; // make click public constructor Create(AOwner: TComponent); override; - procedure SetImage(Img: ESimbaButtonImage); + property ImageList: TImageList read FImageList write FImageList; + property ImageIndex: Integer read FImageIndex write SetImageIndex; + property Image: ESimbaButtonImage read FImage write SetImage; + + property Down: Boolean read FDown write SetDown; + property XPadding: Integer read FXPadding write SetXPadding; + property YPadding: Integer read FYPadding write SetYPadding; + + property OnMouseDown; + property OnMouseUp; + property OnMouseEnter; + property OnMouseLeave; + property OnMouseMove; + end; + + TSimbaToggleButton = class(TSimbaButton) + public + procedure Click; override; + end; + + TSimbaCheckButton = class(TSimbaToggleButton) + public + constructor Create(AOwner: TComponent); override; end; TSimbaLabeledButton = class(TCustomControl) @@ -68,21 +114,9 @@ TSimbaLabeledButton = class(TCustomControl) property Button: TSimbaButton read FButton; end; - TSimbaToggleButton = class(TSimbaButton) - public - constructor Create(AOwner: TComponent); override; - end; - TSimbaTransparentButton = class(TSimbaButton) - protected - procedure PaintBackground(var PaintRect: TRect); override; public - constructor Create(AOwner: TComponent); override; - end; - - TSimbaCheckButton = class(TSimbaToggleButton) - public - constructor Create(AOwner: TComponent); override; + procedure Paint; override; end; TSimbaLabeledCheckButton = class(TCustomControl) @@ -112,36 +146,15 @@ TSimbaCheckButtonGroup = class(TCustomControl) implementation uses - simba.theme, simba.main, + simba.theme, simba.main, simba.fonthelpers, ATCanvasPrimitives; -procedure TSimbaTransparentButton.PaintBackground(var PaintRect: TRect); -begin - if Enabled and (Down or MouseInClient) then - Canvas.Brush.Color := SimbaTheme.ColorActive - else - Canvas.Brush.Color := Color; - - Canvas.FillRect(PaintRect); - if Down or MouseInClient then - CanvasPaintRoundedCorners(Canvas, PaintRect, [acckLeftTop, acckRightTop, acckLeftBottom, acckRightBottom], Color, Canvas.Brush.Color, Canvas.Brush.Color); -end; - -constructor TSimbaTransparentButton.Create(AOwner: TComponent); -begin - inherited Create(AOwner); - - ParentColor := True; -end; - -constructor TSimbaCheckButton.Create(AOwner: TComponent); +procedure TSimbaTransparentButton.Paint; begin - inherited Create(AOwner); + if Assigned(Parent) then + Color := Parent.Color; - XPadding := 0; - Images := SimbaForm.Images; - PressedImageIndex := 62; - SelectedImageIndex := 62; + inherited Paint(); end; procedure TSimbaLabeledCheckButton.TextChanged; @@ -213,7 +226,7 @@ function TSimbaCheckButtonGroup.Add(ACaption: String): Integer; CheckButton.Caption := ACaption; CheckButton.Align := alBottom; - Result := Self.GetControlIndex(CheckButton); + Result := GetControlIndex(CheckButton); end; procedure TSimbaButton.CMParentFontChanged(var Message: TLMessage); @@ -234,36 +247,205 @@ procedure TSimbaButton.CMParentFontChanged(var Message: TLMessage); end; end; +procedure TSimbaButton.SetDown(AValue: Boolean); +begin + if FDown=AValue then Exit; + FDown:=AValue; + Invalidate; +end; + +procedure TSimbaButton.SetXPadding(AValue: Integer); +begin + if FXPadding=AValue then Exit; + FXPadding := Scale96ToScreen(AValue); + + AdjustSize(); +end; + +procedure TSimbaButton.SetYPadding(AValue: Integer); +begin + if FYPadding=AValue then Exit; + FYPadding := Scale96ToScreen(AValue); + + AdjustSize(); +end; + +function TSimbaButton.HasImage: Boolean; +begin + Result := (FImage <> ESimbaButtonImage.NONE) or (FImageIndex > -1); +end; + +function TSimbaButton.ImageSize: TPoint; +begin + if (FImage <> ESimbaButtonImage.NONE) then + begin + Result.X := LCLGlyphs.WidthForPPI[FImageList.Width, Font.PixelsPerInch]; + Result.Y := LCLGlyphs.HeightForPPI[FImageList.Width, Font.PixelsPerInch]; + end + else if (FImageIndex > -1) then + begin + Result.X := FImageList.WidthForPPI[FImageList.Width, Font.PixelsPerInch]; + Result.Y := FImageList.HeightForPPI[FImageList.Width, Font.PixelsPerInch]; + end; +end; + +function TSimbaButton.CalculateSize: TPoint; +begin + Result.X := 0; + Result.Y := 0; + + if (Caption <> '') then + with TBitmap.Create() do + try + Canvas.Font := Self.Font; + Canvas.Font.Size := GetFontSize(Self, 1); + + Result.X := Canvas.TextWidth(Caption) + (BorderWidth * 2); + Result.Y := Canvas.TextHeight('Fj') + (BorderWidth * 2); + finally + Free(); + end; + + if HasImage then + begin + Result.X += ImageSize.X; + if ImageSize.Y > Result.Y then + Result.Y := ImageSize.Y; + end; + + Result.X += XPadding * 2; + Result.Y += YPadding * 2; +end; + procedure TSimbaButton.CalculatePreferredSize(var PreferredWidth, PreferredHeight: integer; WithThemeSpace: Boolean); begin inherited CalculatePreferredSize(PreferredWidth, PreferredHeight, WithThemeSpace); - PreferredWidth += XPadding * 2; - PreferredHeight += YPadding * 2; + with CalculateSize() do + begin + PreferredWidth := X; + PreferredHeight := Y; + end; +end; + +procedure TSimbaButton.MouseEnter; +begin + inherited MouseEnter; + + Invalidate(); +end; + +procedure TSimbaButton.MouseLeave; +begin + inherited MouseLeave; + + Invalidate(); +end; + +procedure TSimbaButton.TextChanged; +begin + inherited TextChanged; + + AdjustSize(); end; -procedure TSimbaButton.PaintBackground(var PaintRect: TRect); +procedure TSimbaButton.Paint; +var + Style: TTextStyle; + R: TRect; + ImgPoint: TPoint; begin - if Down or MouseInClient then + if MouseInClient or FDown then Canvas.Brush.Color := SimbaTheme.ColorActive else - Canvas.Brush.Color := SimbaTheme.ColorScrollBarActive; + Canvas.Brush.Color := Color; + + Canvas.FillRect(ClientRect); + CanvasPaintRoundedCorners(Canvas, ClientRect, [acckLeftTop, acckRightTop, acckLeftBottom, acckRightBottom], SimbaTheme.ColorFrame, Canvas.Brush.Color, Canvas.Brush.Color); + + if HasImage then + begin + if (Caption = '') then + begin + ImgPoint.X := (ClientWidth div 2) - (ImageSize.X div 2); + ImgPoint.Y := (ClientHeight div 2) - (ImageSize.Y div 2); + end else + begin + ImgPoint.X := XPadding; + ImgPoint.Y := (ClientHeight div 2) - (ImageSize.Y div 2); + end; + + if (FImage <> ESimbaButtonImage.NONE) then + LCLGlyphs.DrawForControl(Canvas, ImgPoint.X, ImgPoint.Y, LCLGlyphs.GetImageIndex(IMG_TO_LAZ_GLYPH[FImage]), LCLGlyphs.Width, Self, Enabled) + else + FImageList.DrawForControl(Canvas, ImgPoint.X, ImgPoint.Y, FImageIndex, FImageList.Width, Self, Enabled); + end; - Canvas.FillRect(PaintRect); - CanvasPaintRoundedCorners(Canvas, PaintRect, [acckLeftTop, acckRightTop, acckLeftBottom, acckRightBottom], SimbaTheme.ColorFrame, Canvas.Brush.Color, Canvas.Brush.Color); + Style := Canvas.TextStyle; + Style.Layout := tlCenter; + Style.Alignment:= taCenter; + + if (Caption <> '') then + begin + Canvas.Font.Color := SimbaTheme.ColorFont; + + R := ClientRect; + R.Bottom -= 2; + if HasImage then + R.Left := ImageSize.X + XPadding; + + Canvas.TextRect(R, 0,0, Caption, Style); + end; + + inherited Paint; +end; + +procedure TSimbaButton.Click; +begin + inherited Click; end; constructor TSimbaButton.Create(AOwner: TComponent); begin inherited Create(AOwner); + Color := SimbaTheme.ColorScrollBarActive; AutoSize := True; - XPadding := 5; + + FImageList := SimbaForm.Images; + FImageIndex := -1; + + XPadding := 6; + YPadding := 1; end; procedure TSimbaButton.SetImage(Img: ESimbaButtonImage); begin - ButtonGlyph.LCLGlyphName := IMG_TO_LAZ_GLYPH[Img]; + FImage := Img; + + AdjustSize(); +end; + +procedure TSimbaButton.SetImageIndex(Index: Integer); +begin + FImageIndex := Index; + FImage := ESimbaButtonImage.NONE; + + AdjustSize(); +end; + +procedure TSimbaToggleButton.Click; +begin + inherited Click(); + + Down := not Down; +end; + +constructor TSimbaCheckButton.Create(AOwner: TComponent); +begin + inherited Create(AOwner); + + SetImageIndex(IMG_TICK); end; procedure TSimbaLabeledButton.TextChanged; @@ -294,13 +476,5 @@ constructor TSimbaLabeledButton.Create(AOwner: TComponent); FLabel.Layout := tlCenter; end; -constructor TSimbaToggleButton.Create(AOwner: TComponent); -begin - inherited Create(AOwner); - - AllowAllUp := True; - GroupIndex := 1 + AOwner.ComponentCount; -end; - end. diff --git a/Source/components/simba.component_buttonpanel.pas b/Source/components/simba.component_buttonpanel.pas index 4339bac21..16fe1cb98 100644 --- a/Source/components/simba.component_buttonpanel.pas +++ b/Source/components/simba.component_buttonpanel.pas @@ -82,7 +82,7 @@ constructor TSimbaButtonPanel.Create(AOwner: TComponent); FButtonOk.Caption := 'Ok'; FButtonOk.BorderSpacing.Around := 8; FButtonOk.XPadding := 10; - FButtonOk.SetImage(ESimbaButtonImage.OK); + FButtonOk.Image := ESimbaButtonImage.OK; FButtonCancel := TButtonPanelButton.Create(Self); FButtonCancel.Parent := Self; @@ -90,7 +90,7 @@ constructor TSimbaButtonPanel.Create(AOwner: TComponent); FButtonCancel.Caption := 'Cancel'; FButtonCancel.BorderSpacing.Around := 8; FButtonCancel.XPadding := 10; - FButtonCancel.SetImage(ESimbaButtonImage.CLOSE); + FButtonCancel.Image := ESimbaButtonImage.CLOSE; FButtonCancel.OnResize := @DoButtonCancelResize; Color := SimbaTheme.ColorFrame; diff --git a/Source/components/simba.component_toolbar.pas b/Source/components/simba.component_toolbar.pas index 1512c0663..33192dc80 100644 --- a/Source/components/simba.component_toolbar.pas +++ b/Source/components/simba.component_toolbar.pas @@ -59,7 +59,7 @@ TSimbaToolButton = class(TSimbaTransparentButton) TSimbaToolButtonDivider = class(TSimbaToolButton) protected procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: Integer; WithThemeSpace: Boolean); override; - procedure PaintBackground(var PaintRect: TRect); override; + procedure Paint; override; end; TSimbaDropToolButton = class(TSimbaToolButton) @@ -69,7 +69,7 @@ TSimbaDropToolButton = class(TSimbaToolButton) function ScaleToToolbarSize(Value: Integer): Integer; procedure CalculatePreferredSize(var PreferredWidth, PreferredHeight: Integer; WithThemeSpace: Boolean); override; - procedure PaintBackground(var PaintRect: TRect); override; + procedure Paint; override; public DropdownMenu: TPopupMenu; @@ -94,11 +94,11 @@ procedure TSimbaDropToolButton.CalculatePreferredSize(var PreferredWidth, Prefer PreferredWidth := ScaleToToolbarSize(10); end; -procedure TSimbaDropToolButton.PaintBackground(var PaintRect: TRect); +procedure TSimbaDropToolButton.Paint; begin - inherited PaintBackground(PaintRect); + inherited Paint(); - CanvasPaintTriangleDown(Canvas, SimbaTheme.ColorFont, PaintRect.CenterPoint, IfThen(FToolbar.FButtonSize >= 20, 2, 1)); + CanvasPaintTriangleDown(Canvas, SimbaTheme.ColorFont, ClientRect.CenterPoint, IfThen(FToolbar.FButtonSize >= 20, 2, 1)); end; procedure TSimbaDropToolButton.Click; @@ -122,6 +122,8 @@ constructor TSimbaToolButton.Create(AOwner: TComponent); FToolBar := AOwner as TSimbaToolBar; + FImageList := FToolbar.FImages; + BorderSpacing.Left := 2; BorderSpacing.Right := 2; BorderSpacing.Top := 2; @@ -138,10 +140,10 @@ procedure TSimbaToolButtonDivider.CalculatePreferredSize(var PreferredWidth, Pre PreferredWidth := 1; end; -procedure TSimbaToolButtonDivider.PaintBackground(var PaintRect: TRect); +procedure TSimbaToolButtonDivider.Paint; begin Canvas.Brush.Color := ColorBlendHalf(SimbaTheme.ColorFrame, SimbaTheme.ColorLine); - Canvas.FillRect(PaintRect); + Canvas.FillRect(ClientRect); end; procedure TSimbaToolbar.SetButtonSize(Value: Integer); @@ -193,7 +195,6 @@ function TSimbaToolbar.AddButton(ImageIndex: Integer; HintText: String; AOnClick begin Result := TSimbaToolButton.Create(Self); Result.Parent := FFlowPanel; - Result.Images := FImages; Result.ImageIndex := ImageIndex; Result.Hint := HintText; Result.ShowHint := HintText <> ''; diff --git a/Source/components/simba.component_treeview.pas b/Source/components/simba.component_treeview.pas index 5665b13b7..9a85c9ffd 100644 --- a/Source/components/simba.component_treeview.pas +++ b/Source/components/simba.component_treeview.pas @@ -215,7 +215,7 @@ constructor TSimbaTreeView.Create(AOwner: TComponent; NodeClass: TTreeNodeClass) FFilterClearButton.OnClick := @DoClearFilterClick; FFilterClearButton.Hint := 'Clear Filter'; FFilterClearButton.ShowHint := True; - FFilterClearButton.SetImage(ESimbaButtonImage.CLEAR_FILTER); + FFilterClearButton.Image := ESimbaButtonImage.CLEAR_FILTER; with SimbaSettings do RegisterChangeHandler(Self, General.CustomImageSize, @DoSettingChanged_ImageSize); diff --git a/Source/forms/simba.findinfilesform.lfm b/Source/forms/simba.findinfilesform.lfm index d2db7ef79..559168c41 100644 --- a/Source/forms/simba.findinfilesform.lfm +++ b/Source/forms/simba.findinfilesform.lfm @@ -1,7 +1,7 @@ object SimbaFindInFilesForm: TSimbaFindInFilesForm - Left = 3171 + Left = -969 Height = 332 - Top = 380 + Top = 623 Width = 750 Caption = 'Find in Files' ClientHeight = 332 @@ -10,6 +10,7 @@ object SimbaFindInFilesForm: TSimbaFindInFilesForm OnClose = FormClose OnCreate = FormCreate OnDestroy = FormDestroy + OnShow = FormShow Position = poMainFormCenter ShowInTaskBar = stAlways LCLVersion = '3.0.0.3' @@ -30,7 +31,7 @@ object SimbaFindInFilesForm: TSimbaFindInFilesForm object MatchesLabel: TLabel Left = 0 Height = 25 - Top = 22 + Top = 7 Width = 726 Align = alTop BorderSpacing.Bottom = 5 @@ -39,11 +40,10 @@ object SimbaFindInFilesForm: TSimbaFindInFilesForm object PanelDivider: TPanel Left = 0 Height = 2 - Top = 10 + Top = 0 Width = 726 Align = alTop - BorderSpacing.Top = 10 - BorderSpacing.Bottom = 10 + BorderSpacing.Bottom = 5 BevelOuter = bvNone TabOrder = 0 end diff --git a/Source/forms/simba.findinfilesform.pas b/Source/forms/simba.findinfilesform.pas index 0e97fc231..5a0f585ba 100644 --- a/Source/forms/simba.findinfilesform.pas +++ b/Source/forms/simba.findinfilesform.pas @@ -53,6 +53,7 @@ TSimbaFindInFilesForm = class(TForm) procedure FormCreate(Sender: TObject); procedure FormDestroy(Sender: TObject); procedure DialogSelectDirClose(Sender: TObject); + procedure FormShow(Sender: TObject); private Searcher: TSynEditSearch; ButtonFind: TSimbaButton; @@ -168,8 +169,7 @@ procedure TSimbaFindInFilesForm.FormCreate(Sender: TObject); ButtonFind.Parent := PanelSearchButton; ButtonFind.Caption := 'Find'; ButtonFind.BorderSpacing.Around := 5; - ButtonFind.XPadding := Scale96ToScreen(15); - ButtonFind.YPadding := Scale96ToScreen(2); + ButtonFind.XPadding := 20; ButtonFind.OnClick := @DoButtonFindClick; CheckboxOptions := TSimbaCheckButtonGroup.Create(Self); @@ -190,7 +190,7 @@ procedure TSimbaFindInFilesForm.FormCreate(Sender: TObject); ButtonSelectDir.Parent := PanelSelectLocation; ButtonSelectDir.BorderSpacing.Around := 5; ButtonSelectDir.Align := alClient; - ButtonSelectDir.SetImage(ESimbaButtonImage.SELECT_DIR); + ButtonSelectDir.Image := ESimbaButtonImage.SELECT_DIR; ButtonSelectDir.OnClick := @DoSelectDirButtonClick; ButtonOpenAllFiles := TSimbaButton.Create(Self); @@ -208,6 +208,7 @@ procedure TSimbaFindInFilesForm.FormCreate(Sender: TObject); EditSearch.Edit.ColorBorder := SimbaTheme.ColorScrollBarActive; MemoResults := TResultsMemo.Create(Self, False); + MemoResults.ReadOnly := True; MemoResults.OnSpecialLineMarkup := @DoLineMarkup; MemoResults.OnMouseLink := @DoAllowMouseLink; MemoResults.OnClickLink := @DoMouseLinkClick; @@ -261,6 +262,13 @@ procedure TSimbaFindInFilesForm.DialogSelectDirClose(Sender: TObject); EditLocation.Edit.Text := DialogSelectDir.FileName; end; +procedure TSimbaFindInFilesForm.FormShow(Sender: TObject); +begin + ActiveControl := EditSearch; + if EditSearch.CanSetFocus() then + EditSearch.SetFocus(); +end; + procedure TSimbaFindInFilesForm.DoSearching; var Total: Integer; diff --git a/Source/forms/simba.main.pas b/Source/forms/simba.main.pas index 5cb4541c4..d11e41a3d 100644 --- a/Source/forms/simba.main.pas +++ b/Source/forms/simba.main.pas @@ -61,6 +61,7 @@ interface IMG_CLOSE_ALL = 52; IMG_ARROW_UP = 53; IMG_ARROW_DOWN = 54; + IMG_TICK = 62; type TSimbaForm = class(TForm) diff --git a/Source/forms/simba.scripttabsform.pas b/Source/forms/simba.scripttabsform.pas index d407e00f9..60ae04d70 100644 --- a/Source/forms/simba.scripttabsform.pas +++ b/Source/forms/simba.scripttabsform.pas @@ -401,10 +401,9 @@ constructor TSimbaScriptTabsForm.Create(AOwner: TComponent); FFindButtonDown := TSimbaButton.Create(Self); with FFindButtonDown do begin - Images := SimbaForm.Images; Parent := FindButtonPanel; Align := alLeft; - ImageINdex := IMG_ARROW_DOWN; + ImageIndex := IMG_ARROW_DOWN; Hint := 'Find Next'; ShowHint := True; BorderSpacing.Around := 5; @@ -414,7 +413,6 @@ constructor TSimbaScriptTabsForm.Create(AOwner: TComponent); FFindButtonUp := TSimbaButton.Create(Self); with FFindButtonUp do begin - Images := SimbaForm.Images; Parent := FindButtonPanel; Align := alLeft; ImageIndex := IMG_ARROW_UP; @@ -427,11 +425,10 @@ constructor TSimbaScriptTabsForm.Create(AOwner: TComponent); FFindButtonClose := TSimbaTransparentButton.Create(Self); with FFindButtonClose do begin - Images := SimbaForm.Images; Parent := FindPanel; Align := alRight; BorderSpacing.Around := 5; - SetImage(ESimbaButtonImage.CLOSE); + Image := ESimbaButtonImage.CLOSE; OnClick := @FindButtonClick; end;