cocoa: restoring the actual menu state once the system dialog is closed. bug #38182

git-svn-id: trunk@64180 -
This commit is contained in:
dmitry 2020-12-08 05:37:38 +00:00
parent b167267112
commit 24f5f9b1d9
3 changed files with 38 additions and 13 deletions

View File

@ -239,6 +239,7 @@ var
Str: string;
cancelAccessory: TCocoaAlertCancelAccessoryView;
needsCancel: Boolean;
isMenuOn: Boolean;
begin
{Str := 'TCocoaWidgetSet.PromptUser DialogCaption: ' + DialogCaption +
' DialogMessage: ' + DialogMessage + ' DialogType: ' + DbgS(DialogType) +
@ -328,11 +329,14 @@ begin
end
else
begin
ToggleAppMenu(false);
Result := AnAlert.runModal;
if Result = NSCancelButton then
Result := EscapeResult;
ToggleAppMenu(true); // modal menu doesn't have a window, disabling it
isMenuOn := ToggleAppMenu(false);
try
Result := AnAlert.runModal;
if Result = NSCancelButton then
Result := EscapeResult;
finally
ToggleAppMenu(isMenuOn); // modal menu doesn't have a window, disabling it
end;
end;
finally
if Assigned(cancelAccessory) then cancelAccessory.release;

View File

@ -269,6 +269,8 @@ var
lFilter: TCocoaFilterComboBox;
callback: TOpenSaveDelegate;
isMenuOn: Boolean;
// setup panel and its accessory view
procedure CreateAccessoryView(AOpenOwner: NSOpenPanel; ASaveOwner: NSSavePanel);
const
@ -440,7 +442,7 @@ begin
saveDlg.setDirectoryURL(NSURL.fileURLWithPath(NSStringUtf8(InitDir)));
UpdateOptions(FileDialog, saveDlg);
ToggleAppMenu(false);
isMenuOn := ToggleAppMenu(false);
try
if saveDlg.runModal = NSOKButton then
begin
@ -463,7 +465,7 @@ begin
saveDlg.release;
LocalPool.Release;
finally
ToggleAppMenu(true);
ToggleAppMenu(isMenuOn);
end;
end; {TCocoaWSFileDialog.ShowModal}
@ -485,6 +487,8 @@ var
accessoryView: NSView;
lRect: NSRect;
okButton, cancelButton: NSButton;
isMenuOn: Boolean;
begin
{$IFDEF VerboseWSClass}
DebugLn('TCocoaWSColorDialog.ShowModal for ' + ACommonDialog.Name);
@ -539,8 +543,13 @@ begin
*)
// show panel
colorPanel.makeKeyAndOrderFront(colorDelegate);
NSApp.runModalForWindow(colorPanel);
isMenuOn := ToggleAppMenu(false);
try
colorPanel.makeKeyAndOrderFront(colorDelegate);
NSApp.runModalForWindow(colorPanel);
finally
ToggleAppMenu(isMenuOn);
end;
end;
{ TCocoaWSFontDialog }
@ -562,6 +571,7 @@ var
lRect: NSRect;
okButton, cancelButton: NSButton;
fn : NSFont;
isMenuOn: Boolean;
begin
{$IFDEF VerboseWSClass}
DebugLn('TCocoaWSFontDialog.ShowModal for ' + ACommonDialog.Name);
@ -624,8 +634,13 @@ begin
*)
// show panel
FontPanel.makeKeyAndOrderFront(FontDelegate);
NSApp.runModalForWindow(FontPanel);
isMenuOn := ToggleAppMenu(false);
try
FontPanel.makeKeyAndOrderFront(FontDelegate);
NSApp.runModalForWindow(FontPanel);
finally
ToggleAppMenu(isMenuOn);
end;
end;
{ TColorPanelDelegate }

View File

@ -161,7 +161,8 @@ procedure NSMenuItemSetBitmap(mn: NSMenuItem; bmp: TBitmap);
// the returned "Key" should not be released, as it's not memory owned
procedure ShortcutToKeyEquivalent(const AShortCut: TShortcut; out Key: NSString; out shiftKeyMask: NSUInteger);
procedure ToggleAppMenu(ALogicalEnabled: Boolean);
// returns the last state the menu was at
function ToggleAppMenu(ALogicalEnabled: Boolean): Boolean;
function AllocCocoaMenu(const atitle: string = ''): TCocoaMenu;
function LCLMenuItemInit(item: NSMenuItem; const atitle: string; ashortCut: TShortCut): id;
@ -937,9 +938,14 @@ begin
end;
end;
procedure ToggleAppMenu(ALogicalEnabled: Boolean);
var
isMenuEnabled : Boolean = true;
function ToggleAppMenu(ALogicalEnabled: Boolean): Boolean;
begin
Result := isMenuEnabled;
ToggleAppNSMenu( NSApplication(NSApp).mainMenu, ALogicalEnabled );
isMenuEnabled := ALogicalEnabled;
end;
end.