summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy Shaw <andy.shaw@digia.com>2012-09-28 15:58:58 +0200
committerThe Qt Project <gerrit-noreply@qt-project.org>2012-10-26 14:53:09 +0200
commit356f3c89b83704591e3c37cf8c322b52d6840763 (patch)
tree05b381f1d5c4086516fa42947ab7937b422fd34e
parenta3941c2f6ef31986bd315fa41bc4df7330a89109 (diff)
Fix syncing of visibility and enabled for menus on Cocoa
Fixed menu handling on Cocoa so if a menu is enabled/disabled or made visible or not then it will keep this in sync with the appropriate native menu entry. Change-Id: If269185fcf065fb1b2f60d6ef8c27c107eb4509f Reviewed-by: Pasi Matilainen <pasi.matilainen@digia.com> Reviewed-by: James Turner <james.turner@kdab.com> Reviewed-by: Andy Shaw <andy.shaw@digia.com>
-rw-r--r--src/gui/kernel/qplatformmenu.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.h1
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenu.mm6
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuitem.mm2
-rw-r--r--src/widgets/widgets/qmenubar.cpp2
-rw-r--r--tests/manual/cocoa/menus/main.cpp74
6 files changed, 78 insertions, 8 deletions
diff --git a/src/gui/kernel/qplatformmenu.h b/src/gui/kernel/qplatformmenu.h
index 64f738b331..7e7ccdb294 100644
--- a/src/gui/kernel/qplatformmenu.h
+++ b/src/gui/kernel/qplatformmenu.h
@@ -102,6 +102,7 @@ public:
virtual void setText(const QString &text) = 0;
virtual void setEnabled(bool enabled) = 0;
+ virtual void setVisible(bool visible) = 0;
virtual QPlatformMenuItem *menuItemAt(int position) const = 0;
virtual QPlatformMenuItem *menuItemForTag(quintptr tag) const = 0;
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.h b/src/plugins/platforms/cocoa/qcocoamenu.h
index 38952a2e5d..3afe089225 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.h
+++ b/src/plugins/platforms/cocoa/qcocoamenu.h
@@ -70,6 +70,7 @@ public:
void removeMenuItem(QPlatformMenuItem *menuItem);
void syncMenuItem(QPlatformMenuItem *menuItem);
void setEnabled(bool enabled);
+ void setVisible(bool visible);
void syncSeparatorsCollapsible(bool enable);
void syncModalState(bool modal);
diff --git a/src/plugins/platforms/cocoa/qcocoamenu.mm b/src/plugins/platforms/cocoa/qcocoamenu.mm
index 4d35b3202e..36d5c81f34 100644
--- a/src/plugins/platforms/cocoa/qcocoamenu.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenu.mm
@@ -268,6 +268,12 @@ void QCocoaMenu::setParentItem(QCocoaMenuItem *item)
void QCocoaMenu::setEnabled(bool enabled)
{
m_enabled = enabled;
+ syncModalState(!m_enabled);
+}
+
+void QCocoaMenu::setVisible(bool visible)
+{
+ [m_nativeItem setSubmenu:(visible ? m_nativeMenu : nil)];
}
QPlatformMenuItem *QCocoaMenu::menuItemAt(int position) const
diff --git a/src/plugins/platforms/cocoa/qcocoamenuitem.mm b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
index 150d3eef7d..d78ff73bb6 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuitem.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenuitem.mm
@@ -263,7 +263,7 @@ NSMenuItem *QCocoaMenuItem::sync()
// [m_native setHidden:YES];
// [m_native setHidden:NO];
[m_native setHidden: !m_isVisible];
-
+ [m_native setEnabled: m_enabled];
QString text = m_text;
QKeySequence accel = m_shortcut;
diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp
index e53dc2cac2..f6665cba9a 100644
--- a/src/widgets/widgets/qmenubar.cpp
+++ b/src/widgets/widgets/qmenubar.cpp
@@ -1285,6 +1285,8 @@ void QMenuBar::actionEvent(QActionEvent *e)
}
} else if (menu) {
menu->setText(e->action()->text());
+ menu->setVisible(e->action()->isVisible());
+ menu->setEnabled(e->action()->isEnabled());
d->platformMenuBar->syncMenu(menu);
}
}
diff --git a/tests/manual/cocoa/menus/main.cpp b/tests/manual/cocoa/menus/main.cpp
index 736ca134ff..760115ce25 100644
--- a/tests/manual/cocoa/menus/main.cpp
+++ b/tests/manual/cocoa/menus/main.cpp
@@ -39,9 +39,12 @@
**
****************************************************************************/
-#include <QtGui>
-#include <QtWidgets>
-
+#include <QMainWindow>
+#include <QMenu>
+#include <QApplication>
+#include <QMenuBar>
+#include <QMessageBox>
+#include <QDebug>
class Responder : public QObject
{
@@ -49,13 +52,34 @@ class Responder : public QObject
public:
Responder(QObject *pr) :
- QObject(pr)
+ QObject(pr), visibleMenu(0), visibleSubMenu(0), enabledMenu(0), enabledSubMenu(0), visibleAction(0), enabledAction(0)
{
}
-
+ void setVisibleObjects(QMenu *vm, QMenu *vsm, QAction *va)
+ {
+ visibleMenu = vm;
+ visibleSubMenu = vsm;
+ visibleAction = va;
+ }
+ void setEnabledObjects(QMenu *em, QMenu *esm, QAction *ea)
+ {
+ enabledMenu = em;
+ enabledSubMenu = esm;
+ enabledAction = ea;
+ }
public slots:
-
-
+ void toggleVisiblity()
+ {
+ visibleMenu->menuAction()->setVisible(!visibleMenu->menuAction()->isVisible());
+ visibleSubMenu->menuAction()->setVisible(!visibleSubMenu->menuAction()->isVisible());
+ visibleAction->setVisible(!visibleAction->isVisible());
+ }
+ void toggleEnabled()
+ {
+ enabledMenu->menuAction()->setEnabled(!enabledMenu->menuAction()->isEnabled());
+ enabledSubMenu->menuAction()->setEnabled(!enabledSubMenu->menuAction()->isEnabled());
+ enabledAction->setEnabled(!enabledAction->isEnabled());
+ }
void toggleChecked(bool b)
{
QAction *a = qobject_cast<QAction *>(sender());
@@ -82,6 +106,9 @@ public slots:
m->addAction(QString("Recent File %1").arg(i + 1));
}
}
+private:
+ QMenu *visibleMenu, *visibleSubMenu, *enabledMenu, *enabledSubMenu;
+ QAction *visibleAction, *enabledAction;
};
void createWindow1()
@@ -156,6 +183,39 @@ void createWindow1()
menu2->addAction(checkableAction);
+ QMenu *menu4 = new QMenu("Toggle menu", window);
+ QAction *toggleVisiblity = new QAction("Toggle visibility", window);
+ QAction *toggleEnabled = new QAction("Toggle enabled", window);
+ QObject::connect(toggleVisiblity, SIGNAL(triggered()), r, SLOT(toggleVisiblity()));
+ QObject::connect(toggleEnabled, SIGNAL(triggered()), r, SLOT(toggleEnabled()));
+ menu4->addAction(toggleVisiblity);
+ menu4->addAction(toggleEnabled);
+ window->menuBar()->addMenu(menu4);
+
+ QMenu *menu5 = new QMenu("Visible Menu", window);
+ menu5->addAction("Dummy action");
+ window->menuBar()->addMenu(menu5);
+ QMenu *menu6 = new QMenu("Menu with visible action and submenu", window);
+ QAction *visibleAction = new QAction("Visible action", window);
+ menu6->addAction(visibleAction);
+ QMenu *subMenu6 = new QMenu("Submenu");
+ subMenu6->addAction("Dummy action");
+ menu6->addMenu(subMenu6);
+ window->menuBar()->addMenu(menu6);
+
+ QMenu *menu7 = new QMenu("Enabled Menu", window);
+ menu7->addAction("Dummy action");
+ window->menuBar()->addMenu(menu7);
+ QMenu *menu8 = new QMenu("Menu with enabled action and submenu", window);
+ QAction *enabledAction = new QAction("Enabled action", window);
+ menu8->addAction(enabledAction);
+ QMenu *subMenu8 = new QMenu("Submenu");
+ subMenu8->addAction("Dummy action");
+ menu8->addMenu(subMenu8);
+ window->menuBar()->addMenu(menu8);
+
+ r->setVisibleObjects(menu5, subMenu6, visibleAction);
+ r->setEnabledObjects(menu7, subMenu8, enabledAction);
window->show();
}