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
This commit is contained in:
wp_xxyyzz
2022-08-12 21:52:15 +00:00
parent 6a2e34537d
commit ea7af462bb
2 changed files with 88 additions and 55 deletions

View File

@ -42,7 +42,7 @@ uses
{$ELSE} {$ELSE}
Windows, Messages, Windows, Messages,
{$ENDIF} {$ENDIF}
Classes, Graphics, Controls, ComCtrls, ExtCtrls, Forms, Menus, Classes, Graphics, Controls, ComCtrls, ExtCtrls, Buttons, Forms, Menus,
VpConst, VpBase, VpBaseDS, VpMisc, VpData, VpSR, VpCanvasUtils; VpConst, VpBase, VpBaseDS, VpMisc, VpData, VpSR, VpCanvasUtils;
type type
@ -179,6 +179,10 @@ type
FDefaultPopup: TPopupMenu; FDefaultPopup: TPopupMenu;
FRightClickChangeDate: Boolean; FRightClickChangeDate: Boolean;
FMouseDate: TDateTime; FMouseDate: TDateTime;
FPrevYearBtn: TSpeedButton;
FPrevMonthBtn: TSpeedButton;
FNextMonthBtn: TSpeedButton;
FNextYearBtn: TSpeedButton;
{ event variables } { event variables }
FOnAddEvent: TVpOnAddNewEvent; FOnAddEvent: TVpOnAddNewEvent;
@ -191,7 +195,6 @@ type
{ internal variables } { internal variables }
mvLoaded: Boolean; mvLoaded: Boolean;
mvDayHeadHeight: Integer; mvDayHeadHeight: Integer;
mvSpinButtons: TUpDown;
mvEventArray: TVpEventArray; mvEventArray: TVpEventArray;
mvMonthDayArray: TVpMonthdayArray; mvMonthDayArray: TVpMonthdayArray;
mvActiveEvent: TVpEvent; mvActiveEvent: TVpEvent;
@ -224,11 +227,11 @@ type
function GetDateAtCoord(APoint: TPoint): TDateTime; function GetDateAtCoord(APoint: TPoint): TDateTime;
procedure mvPopulate; procedure mvPopulate;
procedure mvSpawnEventEditDialog(IsNewEvent: Boolean); procedure mvSpawnEventEditDialog(IsNewEvent: Boolean);
procedure mvSpinButtonClick(Sender: TObject; Button: TUDBtnType);
procedure mvSetDateByCoord(APoint: TPoint); procedure mvSetDateByCoord(APoint: TPoint);
procedure mvHookUp; procedure mvHookUp;
procedure mvPenChanged(Sender: TObject); procedure mvPenChanged(Sender: TObject);
function SelectEventAtCoord(Point: TPoint): Boolean; function SelectEventAtCoord(Point: TPoint): Boolean;
procedure SpinButtonClick(Sender: TObject);
{ inherited methods } { inherited methods }
procedure CreateParams(var Params: TCreateParams); override; procedure CreateParams(var Params: TCreateParams); override;
@ -457,15 +460,39 @@ begin
FHolidayAttr := TVpMvHolidayAttr.Create(self); FHolidayAttr := TVpMvHolidayAttr.Create(self);
FWeekendAttr := TVpMvWeekendAttr.Create(self); FWeekendAttr := TVpMvWeekendAttr.Create(self);
FTodayAttr := TVpMvTodayAttr.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); FHeadAttr := TVpMvHeadAttr.Create(self);
FDayHeadAttr := TVpDayHeadAttr.Create(self); FDayHeadAttr := TVpDayHeadAttr.Create(self);
FTodayAttr := TVpMvTodayAttr.Create(self); FTodayAttr := TVpMvTodayAttr.Create(self);
FHolidayAttr := TvpMvHolidayAttr.Create(self); FHolidayAttr := TvpMvHolidayAttr.Create(self);
mvSpinButtons := TUpDown.Create(self); }
}
{ Set styles and initialize internal variables } { Set styles and initialize internal variables }
{$IFDEF VERSION4} {$IFDEF VERSION4}
@ -476,10 +503,6 @@ begin
FShowEventTime := false; FShowEventTime := false;
FDayNameStyle :=dsShort; FDayNameStyle :=dsShort;
FKBNavigate := true; FKBNavigate := true;
mvSpinButtons.OnClick := mvSpinButtonClick;
mvSpinButtons.Orientation := udHorizontal;
mvSpinButtons.Min := -32768;
mvSpinButtons.Max := 32767;
mvDragging := false; mvDragging := false;
mvMouseDownPoint := Point(0, 0); mvMouseDownPoint := Point(0, 0);
@ -544,7 +567,6 @@ begin
FWeekendAttr.Free; FWeekendAttr.Free;
FDayNumberFont.Free; FDayNumberFont.Free;
FEventFont.Free; FEventFont.Free;
// mvSpinButtons.Free;
// FDefaultPopup.Free; // FDefaultPopup.Free;
inherited; inherited;
end; end;
@ -746,28 +768,16 @@ begin
Invalidate; Invalidate;
end; end;
procedure TVpMonthView.mvSpinButtonClick(Sender: TObject; Button: TUDBtnType); procedure TVpMonthView.SpinButtonClick(Sender: TObject);
var
M, D, Y: Word;
begin begin
DecodeDate(Date, Y, M, D); if Sender = FPrevYearBtn then
if Button = btNext then begin Date := IncYear(Date, -1)
if M = 12 then begin else if Sender = FNextYearBtn then
M := 1; Date := IncYear(Date, +1)
Y := Y + 1; else if Sender = FPrevMonthBtn then
end else Date := IncMonth(Date, -1)
M := M + 1; else if Sender = FNextMonthBtn then
end else begin Date := IncMonth(Date, +1);
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);
end; end;
procedure TVpMonthView.SetApplyCategoryInfos(AValue: Boolean); procedure TVpMonthView.SetApplyCategoryInfos(AValue: Boolean);
@ -935,7 +945,10 @@ end;
procedure TVpMonthView.CreateWnd; procedure TVpMonthView.CreateWnd;
begin begin
inherited; inherited;
mvSpinButtons.Parent := self; FPrevYearBtn.Parent := self;
FPrevMonthBtn.Parent := self;
FNextMonthBtn.Parent := self;
FNextYearBtn.Parent := self;
end; end;
{=====} {=====}
@ -1286,28 +1299,30 @@ end;
procedure TVpMonthView.PopupNextMonth(Sender: TObject); procedure TVpMonthView.PopupNextMonth(Sender: TObject);
begin begin
mvSpinButtonClick(self, btNext); SpinButtonClick(FNextMonthBtn);
end; end;
procedure TVpMonthView.PopupPrevMonth(Sender: TObject); procedure TVpMonthView.PopupPrevMonth(Sender: TObject);
begin begin
mvSpinButtonClick(self, btPrev); SpinButtonClick(FPrevMonthBtn);
end; end;
procedure TVpMonthView.PopupNextYear(Sender: TObject); procedure TVpMonthView.PopupNextYear(Sender: TObject);
var //var
M, D, Y: Word; // M, D, Y: Word;
begin begin
DecodeDate(Date, Y, M, D); SpinButtonClick(FNextYearBtn);
Date := EncodeDate(Y + 1, M, 1); // DecodeDate(Date, Y, M, D);
// Date := EncodeDate(Y + 1, M, 1);
end; end;
procedure TVpMonthView.PopupPrevYear(Sender: TObject); procedure TVpMonthView.PopupPrevYear(Sender: TObject);
var //var
M, D, Y: Word; // M, D, Y: Word;
begin begin
DecodeDate(Date, Y, M, D); SpinButtonClick(FPrevYearBtn);
Date := EncodeDate(Y - 1, M, 1); // DecodeDate(Date, Y, M, D);
// Date := EncodeDate(Y - 1, M, 1);
end; end;
procedure TVpMonthView.PopupCustomDate(Sender: TObject); procedure TVpMonthView.PopupCustomDate(Sender: TObject);
@ -1394,24 +1409,24 @@ begin
end else end else
Date := Date + 7; Date := Date + 7;
VK_NEXT: VK_NEXT:
mvSpinButtonClick(self, btNext); SpinButtonClick(FNextMonthBtn);
VK_PRIOR: VK_PRIOR:
mvSpinButtonClick(self, btPrev); SpinButtonClick(FPrevMonthBtn);
VK_LEFT: VK_LEFT:
if ssCtrl in Shift then if ssCtrl in Shift then
mvSpinButtonClick(self, btPrev) SpinButtonClick(FPrevMonthBtn)
else else
Date := Date - 1; Date := Date - 1;
VK_RIGHT: VK_RIGHT:
if ssCtrl in Shift then if ssCtrl in Shift then
mvSpinButtonClick(self, btNext) SpinButtonClick(FNextMonthBtn)
else else
Date := Date + 1; Date := Date + 1;
VK_HOME: VK_HOME:
begin begin
DecodeDate(Date, Y, M, D); DecodeDate(Date, Y, M, D);
if D = 1 then if D = 1 then
mvSpinButtonClick(self, btPrev) SpinButtonClick(FPrevMonthBtn)
else else
Date := EncodeDate(Y, M, 1); Date := EncodeDate(Y, M, 1);
end; end;

View File

@ -633,6 +633,7 @@ var
HeadStrLen : Integer; HeadStrLen : Integer;
dayHeadHeight: Integer; dayHeadHeight: Integer;
R: TRect; R: TRect;
txtstart: Integer;
begin begin
RenderCanvas.Brush.Color := HeadAttrColor; RenderCanvas.Brush.Color := HeadAttrColor;
dayHeadHeight := TVpMonthViewOpener(FMonthView).mvDayHeadHeight; dayHeadHeight := TVpMonthViewOpener(FMonthView).mvDayHeadHeight;
@ -659,10 +660,27 @@ begin
{ Position the spinner } { Position the spinner }
with TVpMonthViewOpener(FMonthView) do begin with TVpMonthViewOpener(FMonthView) do begin
mvSpinButtons.Height := dayHeadHeight - 3; FPrevYearBtn.Height := dayHeadHeight - 3;
mvSpinButtons.Width := mvSpinButtons.Height * 2; FPrevYearBtn.Width := FPrevYearBtn.Height;
mvSpinButtons.Left := TextMargin; FPrevYearBtn.Left := TextMargin;
mvSpinButtons.Top := HeadRect.Top + (dayHeadHeight - mvSpinButtons.Height) div 2 + 1; 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; end;
{ Acquire startdate and end date } { Acquire startdate and end date }
@ -706,8 +724,8 @@ begin
TPSTextOut( TPSTextOut(
RenderCanvas, RenderCanvas,
Angle, Angle,
RenderIn, RenderIn, // Viewport
RealLeft + TVpMonthViewOpener(FMonthView).mvSpinButtons.Width + TextMargin * 2, txtstart, // Horizontal text position, after the spin buttons
HeadTextRect.Top, // this vertical position is already centered HeadTextRect.Top, // this vertical position is already centered
HeadStr HeadStr
); );