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}
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;

View File

@ -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
);