lcl: fix the calendar dialog layout for macOS, due to the specifics of button sizing and drawing as well as calendar widget sizes. Patch by Alexey Tor. #35336

git-svn-id: trunk@61353 -
This commit is contained in:
dmitry 2019-06-10 20:09:34 +00:00
parent 0eb446e94a
commit deb2cde704

View File

@ -22,6 +22,7 @@ interface
uses uses
Types, Classes, SysUtils, LCLProc, LResources, LCLType, LCLStrConsts, Types, Classes, SysUtils, LCLProc, LResources, LCLType, LCLStrConsts,
InterfaceBase, LCLPlatformDef,
FileUtil, LazFileUtils, Controls, Dialogs, GraphType, Graphics, ExtCtrls, FileUtil, LazFileUtils, Controls, Dialogs, GraphType, Graphics, ExtCtrls,
StdCtrls, Forms, Calendar, Buttons, Masks, CalcForm; StdCtrls, Forms, Calendar, Buttons, Masks, CalcForm;
@ -194,6 +195,9 @@ type
FOKCaption: TCaption; FOKCaption: TCaption;
FCancelCaption: TCaption; FCancelCaption: TCaption;
FCalendar: TCalendar; FCalendar: TCalendar;
okButton: TButton;
cancelButton: TButton;
panel: TPanel;
procedure OnDialogClose(Sender: TObject; var CloseAction: TCloseAction); procedure OnDialogClose(Sender: TObject; var CloseAction: TCloseAction);
procedure OnDialogCloseQuery(Sender : TObject; var CanClose : boolean); procedure OnDialogCloseQuery(Sender : TObject; var CanClose : boolean);
procedure OnDialogShow(Sender: TObject); procedure OnDialogShow(Sender: TObject);
@ -731,7 +735,44 @@ begin
end; end;
procedure TCalendarDialog.OnDialogShow(Sender: TObject); procedure TCalendarDialog.OnDialogShow(Sender: TObject);
var
frm: TForm;
NBtnSize, NSpace, NCalSize: integer;
const
cSpace = 16; // space between 2 buttons
begin begin
// Calendar form size for Cocoa cannot be fixed on WS level
// see issue 35336
if WidgetSet.LCLPlatform = lpCocoa then begin
frm := TForm(Sender);
okButton.Constraints.MinWidth := 0;
okButton.Constraints.MaxWidth := 0;
cancelButton.Constraints.MinWidth := 0;
cancelButton.Constraints.MaxWidth := 0;
okButton.AutoSize := true;
cancelButton.AutoSize := true;
FCalendar.AutoSize := true;
NBtnSize := Max(okButton.Width, cancelButton.Width);
NCalSize := FCalendar.Width;
NSpace := NBtnSize * 2 + cSpace;
NSpace := Max(NCalSize, NSpace);
frm.AutoSize := false;
okButton.AutoSize := false;
cancelButton.AutoSize := false;
frm.ClientWidth := NSpace;
panel.Anchors := [];
FCalendar.Align := alNone;
FCalendar.Left := (NSpace-NCalSize) div 2;
okButton.Width := NBtnSize;
cancelButton.Width := NBtnSize;
cancelButton.Left := 0;
okButton.Left := frm.ClientWidth - okButton.Width;
end;
DoShow; DoShow;
end; end;
@ -770,9 +811,6 @@ function TCalendarDialog.Execute:boolean;
const const
dw=8; dw=8;
bbs=2; bbs=2;
var
okButton,cancelButton: TButton;
panel: TPanel;
begin begin
DlgForm:=TForm.CreateNew(Application, 0); DlgForm:=TForm.CreateNew(Application, 0);
try try