[osx] Fix shortcuts for Edit actions when a native file dialog is displayed

Fixes #2719, related to #3615
This commit is contained in:
David Capello 2022-12-09 13:55:44 -03:00
parent c68fcb7da5
commit c25649d865
5 changed files with 19 additions and 4 deletions

View File

@ -697,7 +697,7 @@
<separator group="file_app" /> <separator group="file_app" />
<item command="Exit" text="@.file_exit" /> <item command="Exit" text="@.file_exit" />
</menu> </menu>
<menu text="@.edit" id="edit_menu"> <menu text="@.edit" id="edit_menu" standard="edit">
<item command="Undo" text="@.edit_undo" /> <item command="Undo" text="@.edit_undo" />
<item command="Redo" text="@.edit_redo" /> <item command="Redo" text="@.edit_redo" />
<item command="UndoHistory" text="@.edit_undo_history" group="edit_undo" /> <item command="UndoHistory" text="@.edit_undo_history" group="edit_undo" />

2
laf

@ -1 +1 @@
Subproject commit 1b057f8f19be19ffc5aaa87d32312d3c0bcba86e Subproject commit 63aa609864108d12dad979a2701c19bee58d4283

View File

@ -696,6 +696,7 @@ Widget* AppMenus::convertXmlelemToMenuitem(TiXmlElement* elem)
{ {
const char* id = elem->Attribute("id"); const char* id = elem->Attribute("id");
const char* group = elem->Attribute("group"); const char* group = elem->Attribute("group");
const char* standard = elem->Attribute("standard");
// is it a <separator>? // is it a <separator>?
if (strcmp(elem->Value(), "separator") == 0) { if (strcmp(elem->Value(), "separator") == 0) {
@ -745,6 +746,9 @@ Widget* AppMenus::convertXmlelemToMenuitem(TiXmlElement* elem)
if (group) if (group)
m_groups[group].end = menuitem; m_groups[group].end = menuitem;
if (standard && strcmp(standard, "edit") == 0)
menuitem->setStandardEditMenu();
// Has it a ID? // Has it a ID?
if (id) { if (id) {
if (std::strcmp(id, "help_menu") == 0) { if (std::strcmp(id, "help_menu") == 0) {
@ -985,6 +989,10 @@ void AppMenus::createNativeSubmenus(os::Menu* osMenu,
if (appMenuItem) { if (appMenuItem) {
native.menuItem = osItem; native.menuItem = osItem;
appMenuItem->setNative(native); appMenuItem->setNative(native);
// Set this menu item as the standard "Edit" item for macOS
if (appMenuItem->isStandardEditMenu())
osItem->setAsStandardEditMenuItem();
} }
if (child->type() == ui::kMenuItemWidget && if (child->type() == ui::kMenuItemWidget &&

View File

@ -42,7 +42,6 @@ AppMenuItem::AppMenuItem(const std::string& text,
, m_key(nullptr) , m_key(nullptr)
, m_commandId(commandId) , m_commandId(commandId)
, m_params(params) , m_params(params)
, m_isRecentFileItem(false)
, m_native(nullptr) , m_native(nullptr)
{ {
} }

View File

@ -52,6 +52,13 @@ namespace app {
void disposeNative(); void disposeNative();
void syncNativeMenuItemKeyShortcut(); void syncNativeMenuItemKeyShortcut();
// Indicates if this is the standard "Edit" menu, used for macOS
// which requires a standard "Edit" menu when the native file
// dialog is displayed, so Command+C/X/V/A, etc. shortcuts start
// working as expected.
bool isStandardEditMenu() const { return m_isStandardEditMenu; }
void setStandardEditMenu() { m_isStandardEditMenu = true; }
static void setContextParams(const Params& params); static void setContextParams(const Params& params);
protected: protected:
@ -64,7 +71,8 @@ namespace app {
KeyPtr m_key; KeyPtr m_key;
std::string m_commandId; std::string m_commandId;
Params m_params; Params m_params;
bool m_isRecentFileItem; bool m_isRecentFileItem = false;
bool m_isStandardEditMenu = false;
std::unique_ptr<Native> m_native; std::unique_ptr<Native> m_native;
static Params s_contextParams; static Params s_contextParams;