From ea7af462bb7b8d11455d94cee250ff0d3c2d37c5 Mon Sep 17 00:00:00 2001 From: wp_xxyyzz Date: Fri, 12 Aug 2022 21:52:15 +0000 Subject: [PATCH] tvplanit: Replace TVpMonthView's updown control by 4 speedbuttons for navigation to prev/next month/year, issue #39035. git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@8387 8e941d3f-bd1b-0410-a28a-d453659cc2b4 --- components/tvplanit/source/vpmonthview.pas | 113 ++++++++++-------- .../tvplanit/source/vpmonthviewpainter.pas | 30 ++++- 2 files changed, 88 insertions(+), 55 deletions(-) diff --git a/components/tvplanit/source/vpmonthview.pas b/components/tvplanit/source/vpmonthview.pas index a0892bda2..d76f87b3d 100644 --- a/components/tvplanit/source/vpmonthview.pas +++ b/components/tvplanit/source/vpmonthview.pas @@ -42,7 +42,7 @@ uses {$ELSE} Windows, Messages, {$ENDIF} - Classes, Graphics, Controls, ComCtrls, ExtCtrls, Forms, Menus, + Classes, Graphics, Controls, ComCtrls, ExtCtrls, Buttons, Forms, Menus, VpConst, VpBase, VpBaseDS, VpMisc, VpData, VpSR, VpCanvasUtils; type @@ -179,6 +179,10 @@ type FDefaultPopup: TPopupMenu; FRightClickChangeDate: Boolean; FMouseDate: TDateTime; + FPrevYearBtn: TSpeedButton; + FPrevMonthBtn: TSpeedButton; + FNextMonthBtn: TSpeedButton; + FNextYearBtn: TSpeedButton; { event variables } FOnAddEvent: TVpOnAddNewEvent; @@ -191,7 +195,6 @@ type { internal variables } mvLoaded: Boolean; mvDayHeadHeight: Integer; - mvSpinButtons: TUpDown; mvEventArray: TVpEventArray; mvMonthDayArray: TVpMonthdayArray; mvActiveEvent: TVpEvent; @@ -224,11 +227,11 @@ type function GetDateAtCoord(APoint: TPoint): TDateTime; procedure mvPopulate; procedure mvSpawnEventEditDialog(IsNewEvent: Boolean); - procedure mvSpinButtonClick(Sender: TObject; Button: TUDBtnType); procedure mvSetDateByCoord(APoint: TPoint); procedure mvHookUp; procedure mvPenChanged(Sender: TObject); function SelectEventAtCoord(Point: TPoint): Boolean; + procedure SpinButtonClick(Sender: TObject); { inherited methods } procedure CreateParams(var Params: TCreateParams); override; @@ -450,22 +453,46 @@ begin inherited; ControlStyle := [csCaptureMouse, csOpaque, csDoubleClicks]; HintWindowClass := TVpHintWindow; - + { Create internal classes and stuff } FHeadAttr := TVpMonthViewAttr.Create(self); FDayHeadAttr := TVpMonthViewAttr.Create(self); FHolidayAttr := TVpMvHolidayAttr.Create(self); FWeekendAttr := TVpMvWeekendAttr.Create(self); FTodayAttr := TVpMvTodayAttr.Create(Self); - mvSpinButtons := TUpDown.Create(self); + + FPrevYearBtn := TSpeedButton.Create(self); + FPrevYearBtn.Hint := RSPrevYear; + FPrevYearBtn.OnClick := SpinButtonClick; + FPrevMonthBtn := TSpeedButton.Create(self); + FPrevMonthBtn.Hint := RSPrevMonth; + FPrevMonthBtn.OnClick := SpinButtonClick; + FNextMonthBtn := TSpeedButton.Create(self); + FNextMonthBtn.Hint := RSNextMonth; + FNextMonthBtn.OnClick := SpinButtonClick; + FNextYearBtn := TSpeedButton.Create(self); + FNextYearBtn.Hint := RSNextYear; + FNextYearBtn.OnClick := SpinButtonClick; + + // Speedbutton glyphs + {$IFDEF NEW_ICONS} + LoadGlyphFromRCDATA(FPrevYearBtn.Glyph, 'VpLArrows', 16, 24, 32); + LoadGlyphFromRCDATA(FPrevMonthBtn.Glyph, 'VpLArrow', 16, 24, 32); + LoadGlyphFromRCDATA(FNextMonthBtn.Glyph, 'VpRArrow', 16, 24, 32); + LoadGlyphFromRCDATA(FNextYearBtn.Glyph, 'VpRArrows', 16, 24, 32); + {$ELSE} + FPrevYearBtn.Glyph.LoadFromResourceName(HINSTANCE, 'VPLEFTARROWS'); + FPrevMonthBtn.Glyph.LoadFromResourceName(HINSTANCE, 'VPLEFTARROW'); + FNextMonthBtn.Glyph.LoadFromResourceName(HINSTANCE, 'VPRIGHTARROW'); + FNextYearUpBtn.Glyph.LoadFromResourceName(HINSTANCE, 'VPRIGHTARROWS'); + {$ENDIF} { FHeadAttr := TVpMvHeadAttr.Create(self); FDayHeadAttr := TVpDayHeadAttr.Create(self); FTodayAttr := TVpMvTodayAttr.Create(self); FHolidayAttr := TvpMvHolidayAttr.Create(self); - mvSpinButtons := TUpDown.Create(self); - } + } { Set styles and initialize internal variables } {$IFDEF VERSION4} @@ -476,10 +503,6 @@ begin FShowEventTime := false; FDayNameStyle :=dsShort; FKBNavigate := true; - mvSpinButtons.OnClick := mvSpinButtonClick; - mvSpinButtons.Orientation := udHorizontal; - mvSpinButtons.Min := -32768; - mvSpinButtons.Max := 32767; mvDragging := false; mvMouseDownPoint := Point(0, 0); @@ -544,7 +567,6 @@ begin FWeekendAttr.Free; FDayNumberFont.Free; FEventFont.Free; -// mvSpinButtons.Free; // FDefaultPopup.Free; inherited; end; @@ -746,28 +768,16 @@ begin Invalidate; end; -procedure TVpMonthView.mvSpinButtonClick(Sender: TObject; Button: TUDBtnType); -var - M, D, Y: Word; +procedure TVpMonthView.SpinButtonClick(Sender: TObject); begin - DecodeDate(Date, Y, M, D); - if Button = btNext then begin - if M = 12 then begin - M := 1; - Y := Y + 1; - end else - M := M + 1; - end else begin - if M = 1 then begin - M := 12; - Y := Y - 1; - end else - M := M - 1; - end; - if (D > DaysInAMonth(Y, M)) then - D := DaysInAMonth(Y, M); - - Date := EncodeDate(Y, M, D); + if Sender = FPrevYearBtn then + Date := IncYear(Date, -1) + else if Sender = FNextYearBtn then + Date := IncYear(Date, +1) + else if Sender = FPrevMonthBtn then + Date := IncMonth(Date, -1) + else if Sender = FNextMonthBtn then + Date := IncMonth(Date, +1); end; procedure TVpMonthView.SetApplyCategoryInfos(AValue: Boolean); @@ -935,7 +945,10 @@ end; procedure TVpMonthView.CreateWnd; begin inherited; - mvSpinButtons.Parent := self; + FPrevYearBtn.Parent := self; + FPrevMonthBtn.Parent := self; + FNextMonthBtn.Parent := self; + FNextYearBtn.Parent := self; end; {=====} @@ -1286,28 +1299,30 @@ end; procedure TVpMonthView.PopupNextMonth(Sender: TObject); begin - mvSpinButtonClick(self, btNext); + SpinButtonClick(FNextMonthBtn); end; procedure TVpMonthView.PopupPrevMonth(Sender: TObject); begin - mvSpinButtonClick(self, btPrev); + SpinButtonClick(FPrevMonthBtn); end; procedure TVpMonthView.PopupNextYear(Sender: TObject); -var - M, D, Y: Word; +//var +// M, D, Y: Word; begin - DecodeDate(Date, Y, M, D); - Date := EncodeDate(Y + 1, M, 1); + SpinButtonClick(FNextYearBtn); +// DecodeDate(Date, Y, M, D); +// Date := EncodeDate(Y + 1, M, 1); end; procedure TVpMonthView.PopupPrevYear(Sender: TObject); -var - M, D, Y: Word; +//var +// M, D, Y: Word; begin - DecodeDate(Date, Y, M, D); - Date := EncodeDate(Y - 1, M, 1); + SpinButtonClick(FPrevYearBtn); +// DecodeDate(Date, Y, M, D); +// Date := EncodeDate(Y - 1, M, 1); end; procedure TVpMonthView.PopupCustomDate(Sender: TObject); @@ -1394,24 +1409,24 @@ begin end else Date := Date + 7; VK_NEXT: - mvSpinButtonClick(self, btNext); + SpinButtonClick(FNextMonthBtn); VK_PRIOR: - mvSpinButtonClick(self, btPrev); + SpinButtonClick(FPrevMonthBtn); VK_LEFT: if ssCtrl in Shift then - mvSpinButtonClick(self, btPrev) + SpinButtonClick(FPrevMonthBtn) else Date := Date - 1; VK_RIGHT: if ssCtrl in Shift then - mvSpinButtonClick(self, btNext) + SpinButtonClick(FNextMonthBtn) else Date := Date + 1; VK_HOME: begin DecodeDate(Date, Y, M, D); if D = 1 then - mvSpinButtonClick(self, btPrev) + SpinButtonClick(FPrevMonthBtn) else Date := EncodeDate(Y, M, 1); end; diff --git a/components/tvplanit/source/vpmonthviewpainter.pas b/components/tvplanit/source/vpmonthviewpainter.pas index eb06678ff..f15257680 100644 --- a/components/tvplanit/source/vpmonthviewpainter.pas +++ b/components/tvplanit/source/vpmonthviewpainter.pas @@ -633,6 +633,7 @@ var HeadStrLen : Integer; dayHeadHeight: Integer; R: TRect; + txtstart: Integer; begin RenderCanvas.Brush.Color := HeadAttrColor; dayHeadHeight := TVpMonthViewOpener(FMonthView).mvDayHeadHeight; @@ -659,10 +660,27 @@ begin { Position the spinner } with TVpMonthViewOpener(FMonthView) do begin - mvSpinButtons.Height := dayHeadHeight - 3; - mvSpinButtons.Width := mvSpinButtons.Height * 2; - mvSpinButtons.Left := TextMargin; - mvSpinButtons.Top := HeadRect.Top + (dayHeadHeight - mvSpinButtons.Height) div 2 + 1; + FPrevYearBtn.Height := dayHeadHeight - 3; + FPrevYearBtn.Width := FPrevYearBtn.Height; + FPrevYearBtn.Left := TextMargin; + FPrevYearBtn.Top := HeadRect.Top + (dayHeadHeight - FPrevYearBtn.Height) div 2 + 1; + + FPrevMonthBtn.Height := FPrevYearBtn.Height; + FPrevMonthBtn.Width := FPrevYearBtn.Height; + FPrevMonthBtn.Left := FPrevYearBtn.Left + FPrevYearBtn.Width; + FPrevMonthBtn.Top := FPrevYearBtn.Top; + + FNextMonthBtn.Height := FPrevYearBtn.Height; + FNextMonthBtn.Width := FPrevYearBtn.Height; + FNextMonthBtn.Left := FPrevMonthBtn.Left + FPrevMonthBtn.Width; + FNextMonthBtn.Top := FPrevYearBtn.Top; + + FNextYearBtn.Height := FPrevYearBtn.Height; + FNextYearBtn.Width := FPrevYearBtn.Height; + FNextYearBtn.Left := FNextMonthBtn.Left + FNextMonthBtn.Width; + FNextYearBtn.Top := FPrevYearBtn.Top; + + txtStart := FNextYearBtn.Left + FNextYearBtn.Width + TextMargin; end; { Acquire startdate and end date } @@ -706,8 +724,8 @@ begin TPSTextOut( RenderCanvas, Angle, - RenderIn, - RealLeft + TVpMonthViewOpener(FMonthView).mvSpinButtons.Width + TextMargin * 2, + RenderIn, // Viewport + txtstart, // Horizontal text position, after the spin buttons HeadTextRect.Top, // this vertical position is already centered HeadStr );