summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--src/gui/kernel/kernel.pri2
-rwxr-xr-xsrc/gui/kernel/qplatformmenu.h115
-rwxr-xr-x[-rw-r--r--]src/gui/kernel/qplatformmenu_qpa.cpp (renamed from src/widgets/kernel/qplatformmenu_qpa.cpp)120
-rw-r--r--src/gui/kernel/qplatformtheme.h6
-rw-r--r--src/gui/kernel/qplatformtheme_qpa.cpp27
-rw-r--r--src/plugins/platforms/cocoa/cocoa.pro4
-rw-r--r--src/plugins/platforms/cocoa/qcocoaintegration.mm1
-rw-r--r--src/plugins/platforms/cocoa/qcocoamenuloader.mm9
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.h3
-rw-r--r--src/plugins/platforms/cocoa/qcocoatheme.mm14
-rw-r--r--src/widgets/kernel/kernel.pri9
-rw-r--r--src/widgets/kernel/qaction.h3
-rw-r--r--src/widgets/kernel/qplatformmenu.h94
-rw-r--r--src/widgets/widgets/qmenu.cpp51
-rw-r--r--src/widgets/widgets/qmenubar.cpp78
-rw-r--r--src/widgets/widgets/qmenubar_p.h3
16 files changed, 348 insertions, 191 deletions
diff --git a/src/gui/kernel/kernel.pri b/src/gui/kernel/kernel.pri
index 525871c89b..0f46a8df52 100644
--- a/src/gui/kernel/kernel.pri
+++ b/src/gui/kernel/kernel.pri
@@ -25,6 +25,7 @@ HEADERS += \
kernel/qplatformcursor.h \
kernel/qplatformclipboard.h \
kernel/qplatformnativeinterface.h \
+ kernel/qplatformmenu.h \
kernel/qsurfaceformat.h \
kernel/qguiapplication.h \
kernel/qguiapplication_p.h \
@@ -79,6 +80,7 @@ SOURCES += \
kernel/qplatformcursor_qpa.cpp \
kernel/qplatformclipboard_qpa.cpp \
kernel/qplatformnativeinterface_qpa.cpp \
+ kernel/qplatformmenu_qpa.cpp \
kernel/qsessionmanager_qpa.cpp \
kernel/qsurfaceformat.cpp \
kernel/qguiapplication.cpp \
diff --git a/src/gui/kernel/qplatformmenu.h b/src/gui/kernel/qplatformmenu.h
new file mode 100755
index 0000000000..8779d028e3
--- /dev/null
+++ b/src/gui/kernel/qplatformmenu.h
@@ -0,0 +1,115 @@
+/****************************************************************************
+**
+** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author James Turner <james.turner@kdab.com>
+** Contact: http://www.qt-project.org/
+**
+** This file is part of the QtGui module of the Qt Toolkit.
+**
+** $QT_BEGIN_LICENSE:LGPL$
+** GNU Lesser General Public License Usage
+** This file may be used under the terms of the GNU Lesser General Public
+** License version 2.1 as published by the Free Software Foundation and
+** appearing in the file LICENSE.LGPL included in the packaging of this
+** file. Please review the following information to ensure the GNU Lesser
+** General Public License version 2.1 requirements will be met:
+** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
+**
+** In addition, as a special exception, Nokia gives you certain additional
+** rights. These rights are described in the Nokia Qt LGPL Exception
+** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
+**
+** GNU General Public License Usage
+** Alternatively, this file may be used under the terms of the GNU General
+** Public License version 3.0 as published by the Free Software Foundation
+** and appearing in the file LICENSE.GPL included in the packaging of this
+** file. Please review the following information to ensure the GNU General
+** Public License version 3.0 requirements will be met:
+** http://www.gnu.org/copyleft/gpl.html.
+**
+** Other Usage
+** Alternatively, this file may be used in accordance with the terms and
+** conditions contained in a signed written agreement between you and Nokia.
+**
+**
+**
+**
+**
+**
+** $QT_END_LICENSE$
+**
+****************************************************************************/
+
+#ifndef QPLATFORMMENU_H
+#define QPLATFORMMENU_H
+
+#include <QtCore/qglobal.h>
+#include <QtCore/qpointer.h>
+#include <QtGui/QFont>
+#include <QtGui/QKeySequence>
+
+QT_BEGIN_HEADER
+
+QT_BEGIN_NAMESPACE
+
+class QPlatformMenu;
+class Q_GUI_EXPORT QPlatformMenuItem : public QObject
+{
+Q_OBJECT
+public:
+ // copied from, and must stay in sync with, QAction menu roles.
+ enum MenuRole { NoRole = 0, TextHeuristicRole, ApplicationSpecificRole, AboutQtRole,
+ AboutRole, PreferencesRole, QuitRole };
+
+ virtual void setTag(quintptr tag);
+ virtual quintptr tag() const;
+
+ virtual void setText(const QString &text);
+ virtual void setIcon(const QImage &icon);
+ virtual void setMenu(QPlatformMenu *menu);
+ virtual void setVisible(bool isVisible);
+ virtual void setIsSeparator(bool isSeparator);
+ virtual void setFont(const QFont &font);
+ virtual void setRole(MenuRole role);
+ virtual void setChecked(bool isChecked);
+ virtual void setShortcut(const QKeySequence& shortcut);
+ virtual void setEnabled(bool enabled);
+Q_SIGNALS:
+ void activated();
+ void hovered();
+};
+
+class Q_GUI_EXPORT QPlatformMenu : public QPlatformMenuItem // Some (but not all) of the PlatformMenuItem API applies to QPlatformMenu as well.
+{
+Q_OBJECT
+public:
+ virtual void insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before);
+ virtual void removeMenuItem(QPlatformMenuItem *menuItem);
+ virtual void syncMenuItem(QPlatformMenuItem *menuItem);
+ virtual void syncSeparatorsCollapsible(bool enable);
+
+ virtual QPlatformMenuItem *menuItemAt(int position) const;
+ virtual QPlatformMenuItem *menuItemForTag(quintptr tag) const;
+Q_SIGNALS:
+ void aboutToShow();
+ void aboutToHide();
+};
+
+class Q_GUI_EXPORT QPlatformMenuBar : public QPlatformMenu
+{
+Q_OBJECT
+public:
+ virtual void insertMenu(QPlatformMenu *menu, QPlatformMenu *before);
+ virtual void removeMenu(QPlatformMenu *menu);
+ virtual void syncMenu(QPlatformMenuItem *menuItem);
+ virtual void handleReparent(QWindow *newParentWindow);
+
+ virtual QPlatformMenu *menuForTag(quintptr tag) const;
+};
+
+QT_END_NAMESPACE
+
+QT_END_HEADER
+
+#endif
+
diff --git a/src/widgets/kernel/qplatformmenu_qpa.cpp b/src/gui/kernel/qplatformmenu_qpa.cpp
index f28560e560..050f11ec8d 100644..100755
--- a/src/widgets/kernel/qplatformmenu_qpa.cpp
+++ b/src/gui/kernel/qplatformmenu_qpa.cpp
@@ -1,9 +1,9 @@
/****************************************************************************
**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
+** Copyright (C) 2012 Klarälvdalens Datakonsult AB, a KDAB Group company, info@kdab.com, author James Turner <james.turner@kdab.com>
** Contact: http://www.qt-project.org/
**
-** This file is part of the QtWidgets module of the Qt Toolkit.
+** This file is part of the QtGui module of the Qt Toolkit.
**
** $QT_BEGIN_LICENSE:LGPL$
** GNU Lesser General Public License Usage
@@ -43,71 +43,119 @@
QT_BEGIN_NAMESPACE
-/*!
- \class QPlatformMenuAction
- \since 5.0
- \internal
- \preliminary
- \ingroup qpa
+void QPlatformMenuItem::setText(const QString &text)
+{
+
+}
+
+void QPlatformMenuItem::setIcon(const QImage &icon)
+{
+
+}
+
+void QPlatformMenuItem::setMenu(QPlatformMenu *menu)
+{
+
+}
+
+void QPlatformMenuItem::setVisible(bool isVisible)
+{
+
+}
+
+void QPlatformMenuItem::setIsSeparator(bool isSeparator)
+{
+
+}
+
+void QPlatformMenuItem::setFont(const QFont &font)
+{
- \brief The QPlatformMenuAction class provides an abstraction for menu actions.
- */
+}
-QPlatformMenuAction::~QPlatformMenuAction()
+void QPlatformMenuItem::setRole(QPlatformMenuItem::MenuRole role)
{
}
-/*!
- \class QPlatformMenu
- \since 5.0
- \internal
- \preliminary
- \ingroup qpa
+void QPlatformMenuItem::setChecked(bool isChecked)
+{
+
+}
- \brief The QPlatformMenu class provides an abstraction for menus.
- */
-QPlatformMenu::QPlatformMenu()
+void QPlatformMenuItem::setShortcut(const QKeySequence& shortcut)
{
+
}
-QPlatformMenu::~QPlatformMenu()
+void QPlatformMenuItem::setEnabled(bool enabled)
{
}
-void QPlatformMenu::setMenuEnabled(bool enable)
+void QPlatformMenuItem::setTag(quintptr tag)
{
- Q_UNUSED(enable);
+}
+
+quintptr QPlatformMenuItem::tag() const
+{
+ return 0;
+}
+
+void QPlatformMenu::insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem* before)
+{
+
+}
+
+void QPlatformMenu::removeMenuItem(QPlatformMenuItem *menuItem)
+{
+
+}
+
+void QPlatformMenu::syncMenuItem(QPlatformMenuItem *menuItem)
+{
+
}
void QPlatformMenu::syncSeparatorsCollapsible(bool enable)
{
- Q_UNUSED(enable);
+
}
-/*!
- \class QPlatformMenuBar
- \since 5.0
- \internal
- \preliminary
- \ingroup qpa
+QPlatformMenuItem* QPlatformMenu::menuItemAt(int position) const
+{
+ return 0;
+}
+
+QPlatformMenuItem* QPlatformMenu::menuItemForTag(quintptr tag) const
+{
+ return 0;
+}
+
+void QPlatformMenuBar::insertMenu(QPlatformMenu *menuItem, QPlatformMenu* before)
+{
+
+}
+
+void QPlatformMenuBar::removeMenu(QPlatformMenu *menuItem)
+{
+
+}
- \brief The QPlatformMenuBar class provides an abstraction for menu bars.
- */
-QPlatformMenuBar::QPlatformMenuBar()
+void QPlatformMenuBar::syncMenu(QPlatformMenuItem *menuItem)
{
}
-QPlatformMenuBar::~QPlatformMenuBar()
+void QPlatformMenuBar::handleReparent(QWindow *newParentWindow)
{
}
-void QPlatformMenuBar::handleReparent(QWidget *newParent)
+QPlatformMenu *QPlatformMenuBar::menuForTag(quintptr tag) const
{
- Q_UNUSED(newParent);
+ Q_UNUSED(tag);
+ return 0;
}
QT_END_NAMESPACE
diff --git a/src/gui/kernel/qplatformtheme.h b/src/gui/kernel/qplatformtheme.h
index f4406ffabc..4a30898346 100644
--- a/src/gui/kernel/qplatformtheme.h
+++ b/src/gui/kernel/qplatformtheme.h
@@ -61,6 +61,7 @@ QT_BEGIN_NAMESPACE
class QMenu;
class QMenuBar;
+class QPlatformMenuItem;
class QPlatformMenu;
class QPlatformMenuBar;
class QPlatformDialogHelper;
@@ -163,8 +164,9 @@ public:
virtual ~QPlatformTheme();
- virtual QPlatformMenu *createPlatformMenu(QMenu *menu = 0) const;
- virtual QPlatformMenuBar *createPlatformMenuBar(QMenuBar *menuBar = 0) const;
+ virtual QPlatformMenuItem* createPlatformMenuItem() const;
+ virtual QPlatformMenu* createPlatformMenu() const;
+ virtual QPlatformMenuBar* createPlatformMenuBar() const;
virtual bool usePlatformNativeDialog(DialogType type) const;
virtual QPlatformDialogHelper *createPlatformDialogHelper(DialogType type) const;
diff --git a/src/gui/kernel/qplatformtheme_qpa.cpp b/src/gui/kernel/qplatformtheme_qpa.cpp
index c9ffbe248f..32204e6a26 100644
--- a/src/gui/kernel/qplatformtheme_qpa.cpp
+++ b/src/gui/kernel/qplatformtheme_qpa.cpp
@@ -109,18 +109,6 @@ QPlatformTheme::~QPlatformTheme()
}
-QPlatformMenu *QPlatformTheme::createPlatformMenu(QMenu *menu) const
-{
- Q_UNUSED(menu);
- return 0;
-}
-
-QPlatformMenuBar *QPlatformTheme::createPlatformMenuBar(QMenuBar *menuBar) const
-{
- Q_UNUSED(menuBar);
- return 0;
-}
-
bool QPlatformTheme::usePlatformNativeDialog(DialogType type) const
{
Q_UNUSED(type);
@@ -183,4 +171,19 @@ QVariant QPlatformTheme::themeHint(ThemeHint hint) const
return QVariant();
}
+QPlatformMenuItem *QPlatformTheme::createPlatformMenuItem() const
+{
+ return 0;
+}
+
+QPlatformMenu *QPlatformTheme::createPlatformMenu() const
+{
+ return 0;
+}
+
+QPlatformMenuBar *QPlatformTheme::createPlatformMenuBar() const
+{
+ return 0;
+}
+
QT_END_NAMESPACE
diff --git a/src/plugins/platforms/cocoa/cocoa.pro b/src/plugins/platforms/cocoa/cocoa.pro
index ccd98c5b3c..313b666793 100644
--- a/src/plugins/platforms/cocoa/cocoa.pro
+++ b/src/plugins/platforms/cocoa/cocoa.pro
@@ -17,8 +17,6 @@ OBJECTIVE_SOURCES += main.mm \
qcocoamenuloader.mm \
qcocoaapplicationdelegate.mm \
qcocoaapplication.mm \
- qcocoamenu.mm \
- qmenu_mac.mm \
qcocoahelpers.mm \
qmultitouch_mac.mm \
qcocoaaccessibilityelement.mm \
@@ -51,8 +49,6 @@ HEADERS += qcocoaintegration.h \
qcocoamenuloader.h \
qcocoaapplicationdelegate.h \
qcocoaapplication.h \
- qcocoamenu.h \
- qmenu_mac.h \
qcocoahelpers.h \
qmultitouch_mac_p.h \
qcocoaaccessibilityelement.h \
diff --git a/src/plugins/platforms/cocoa/qcocoaintegration.mm b/src/plugins/platforms/cocoa/qcocoaintegration.mm
index b82519fd97..9b575afbb2 100644
--- a/src/plugins/platforms/cocoa/qcocoaintegration.mm
+++ b/src/plugins/platforms/cocoa/qcocoaintegration.mm
@@ -49,7 +49,6 @@
#include "qcocoahelpers.h"
#include "qcocoaapplication.h"
#include "qcocoaapplicationdelegate.h"
-#include "qmenu_mac.h"
#include "qcocoafiledialoghelper.h"
#include "qcocoatheme.h"
#include "qcocoainputcontext.h"
diff --git a/src/plugins/platforms/cocoa/qcocoamenuloader.mm b/src/plugins/platforms/cocoa/qcocoamenuloader.mm
index 2fdc28de1e..7854a83253 100644
--- a/src/plugins/platforms/cocoa/qcocoamenuloader.mm
+++ b/src/plugins/platforms/cocoa/qcocoamenuloader.mm
@@ -41,7 +41,6 @@
#include "qcocoamenuloader.h"
-#include "qmenu_mac.h"
#include "qcocoahelpers.h"
#include <QtCore/private/qcore_mac_p.h>
@@ -272,15 +271,17 @@ void qt_mac_loadMenuNib(QT_MANGLE_NAMESPACE(QCocoaMenuLoader) *qtMenuLoader)
- (void)qtUpdateMenubar
{
+#if 0
QCocoaMenuBar::macUpdateMenuBarImmediatly();
+#endif
}
- (void)qtTranslateApplicationMenu
{
qDebug() << "qtTranslateApplicationMenu";
-
-#ifndef QT_NO_TRANSLATION
+#if 0
+ //#ifndef QT_NO_TRANSLATION
[servicesItem setTitle: QCFString::toNSString(qt_mac_applicationmenu_string(0))];
[hideItem setTitle: QCFString::toNSString(qt_mac_applicationmenu_string(1).arg(qt_mac_applicationName()))];
[hideAllOthersItem setTitle: QCFString::toNSString(qt_mac_applicationmenu_string(2))];
@@ -293,6 +294,7 @@ void qt_mac_loadMenuNib(QT_MANGLE_NAMESPACE(QCocoaMenuLoader) *qtMenuLoader)
- (IBAction)qtDispatcherToQAction:(id)sender
{
+#if 0
//
//QScopedLoopLevelCounter loopLevelCounter(QApplicationPrivate::instance()->threadData);
NSMenuItem *item = static_cast<NSMenuItem *>(sender);
@@ -304,6 +306,7 @@ void qt_mac_loadMenuNib(QT_MANGLE_NAMESPACE(QCocoaMenuLoader) *qtMenuLoader)
// normal QApplication::quit().
qApp->quit();
}
+#endif
}
- (void)orderFrontCharacterPalette:(id)sender
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.h b/src/plugins/platforms/cocoa/qcocoatheme.h
index 791f1d4a50..d126050f98 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.h
+++ b/src/plugins/platforms/cocoa/qcocoatheme.h
@@ -54,9 +54,6 @@ public:
QCocoaTheme();
~QCocoaTheme();
- QPlatformMenu *createPlatformMenu(QMenu *menu = 0) const;
- QPlatformMenuBar *createPlatformMenuBar(QMenuBar *menuBar = 0) const;
-
bool usePlatformNativeDialog(DialogType dialogType) const;
QPlatformDialogHelper *createPlatformDialogHelper(DialogType dialogType) const;
diff --git a/src/plugins/platforms/cocoa/qcocoatheme.mm b/src/plugins/platforms/cocoa/qcocoatheme.mm
index d17ee30096..cfb146ad45 100644
--- a/src/plugins/platforms/cocoa/qcocoatheme.mm
+++ b/src/plugins/platforms/cocoa/qcocoatheme.mm
@@ -41,7 +41,8 @@
#include "qcocoatheme.h"
-#include "qmenu_mac.h"
+#include <QVariant>
+
#include "qcocoacolordialoghelper.h"
#include "qcocoafiledialoghelper.h"
#include "qcocoafontdialoghelper.h"
@@ -62,17 +63,6 @@ QCocoaTheme::~QCocoaTheme()
delete m_systemPalette;
}
-QPlatformMenu *QCocoaTheme::createPlatformMenu(QMenu *menu) const
-{
- return new QCocoaMenu(menu);
-}
-
-QPlatformMenuBar *QCocoaTheme::createPlatformMenuBar(QMenuBar *menuBar) const
-{
- return new QCocoaMenuBar(menuBar);
-}
-
-
bool QCocoaTheme::usePlatformNativeDialog(DialogType dialogType) const
{
if (dialogType == QPlatformTheme::FileDialog)
diff --git a/src/widgets/kernel/kernel.pri b/src/widgets/kernel/kernel.pri
index c4853bd369..ac363c5f7a 100644
--- a/src/widgets/kernel/kernel.pri
+++ b/src/widgets/kernel/kernel.pri
@@ -36,8 +36,7 @@ HEADERS += \
kernel/qsoftkeymanager_p.h \
kernel/qsoftkeymanager_common_p.h \
kernel/qdesktopwidget_qpa_p.h \
- kernel/qwidgetwindow_qpa_p.h \
- kernel/qplatformmenu.h
+ kernel/qwidgetwindow_qpa_p.h
SOURCES += \
kernel/qaction.cpp \
@@ -66,8 +65,8 @@ SOURCES += \
kernel/qapplication_qpa.cpp \
kernel/qdesktopwidget_qpa.cpp \
kernel/qwidget_qpa.cpp \
- kernel/qwidgetwindow_qpa.cpp \
- kernel/qplatformmenu_qpa.cpp
+ kernel/qwidgetwindow_qpa.cpp
+
# TODO
false:!x11:mac {
@@ -75,7 +74,7 @@ false:!x11:mac {
kernel/qclipboard_mac.cpp \
kernel/qmime_mac.cpp \
kernel/qt_mac.cpp \
- kernel/qkeymapper_mac.cpp
+ kernel/qkeymapper_mac.cpp
OBJECTIVE_HEADERS += \
qcocoawindow_mac_p.h \
diff --git a/src/widgets/kernel/qaction.h b/src/widgets/kernel/qaction.h
index bb7de852c1..ea3138fb23 100644
--- a/src/widgets/kernel/qaction.h
+++ b/src/widgets/kernel/qaction.h
@@ -90,7 +90,8 @@ class Q_WIDGETS_EXPORT QAction : public QObject
Q_PROPERTY(Priority priority READ priority WRITE setPriority)
public:
- enum MenuRole { NoRole, TextHeuristicRole, ApplicationSpecificRole, AboutQtRole,
+ // note this is copied into qplatformmenu.h, which must stay in sync
+ enum MenuRole { NoRole = 0, TextHeuristicRole, ApplicationSpecificRole, AboutQtRole,
AboutRole, PreferencesRole, QuitRole };
enum SoftKeyRole {
NoSoftKey, PositiveSoftKey, NegativeSoftKey, SelectSoftKey };
diff --git a/src/widgets/kernel/qplatformmenu.h b/src/widgets/kernel/qplatformmenu.h
deleted file mode 100644
index cbd7eae6ac..0000000000
--- a/src/widgets/kernel/qplatformmenu.h
+++ /dev/null
@@ -1,94 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2012 Nokia Corporation and/or its subsidiary(-ies).
-** Contact: http://www.qt-project.org/
-**
-** This file is part of the QtGui module of the Qt Toolkit.
-**
-** $QT_BEGIN_LICENSE:LGPL$
-** GNU Lesser General Public License Usage
-** This file may be used under the terms of the GNU Lesser General Public
-** License version 2.1 as published by the Free Software Foundation and
-** appearing in the file LICENSE.LGPL included in the packaging of this
-** file. Please review the following information to ensure the GNU Lesser
-** General Public License version 2.1 requirements will be met:
-** http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
-**
-** In addition, as a special exception, Nokia gives you certain additional
-** rights. These rights are described in the Nokia Qt LGPL Exception
-** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU General
-** Public License version 3.0 as published by the Free Software Foundation
-** and appearing in the file LICENSE.GPL included in the packaging of this
-** file. Please review the following information to ensure the GNU General
-** Public License version 3.0 requirements will be met:
-** http://www.gnu.org/copyleft/gpl.html.
-**
-** Other Usage
-** Alternatively, this file may be used in accordance with the terms and
-** conditions contained in a signed written agreement between you and Nokia.
-**
-**
-**
-**
-**
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#ifndef QPLATFORMMENU_H
-#define QPLATFORMMENU_H
-
-#include <QtCore/qglobal.h>
-#include <QtCore/qpointer.h>
-#include <QtWidgets/qaction.h>
-
-QT_BEGIN_HEADER
-
-QT_BEGIN_NAMESPACE
-
-
-class QMenuPrivate;
-class Q_WIDGETS_EXPORT QPlatformMenuAction
-{
-public:
- virtual ~QPlatformMenuAction();
- QPointer<QAction> action;
-};
-
-class Q_WIDGETS_EXPORT QPlatformMenu {
-public:
- QPlatformMenu();
- virtual ~QPlatformMenu();
-
- virtual bool merged(const QAction *action) const = 0;
-
- virtual void addAction(QAction *action, QAction *before) = 0;
- virtual void removeAction(QAction *action) = 0;
- virtual void syncAction(QAction *action) = 0;
-
- virtual void setMenuEnabled(bool enable);
- virtual void syncSeparatorsCollapsible(bool enable);
-};
-
-class Q_WIDGETS_EXPORT QPlatformMenuBar {
-public:
- QPlatformMenuBar();
- virtual ~QPlatformMenuBar();
-
- virtual void addAction(QAction *action, QAction *before = 0) = 0;
- virtual void syncAction(QAction *action) = 0;
- virtual void removeAction(QAction *action) = 0;
-
- virtual void handleReparent(QWidget *newParent);
-};
-
-QT_END_NAMESPACE
-
-QT_END_HEADER
-
-#endif
-
diff --git a/src/widgets/widgets/qmenu.cpp b/src/widgets/widgets/qmenu.cpp
index 995edcbbbc..8d50b03edb 100644
--- a/src/widgets/widgets/qmenu.cpp
+++ b/src/widgets/widgets/qmenu.cpp
@@ -154,7 +154,11 @@ void QMenuPrivate::init()
scroll->scrollFlags = QMenuPrivate::QMenuScroller::ScrollNone;
}
- platformMenu = QGuiApplicationPrivate::platformTheme()->createPlatformMenu(q);
+ platformMenu = QGuiApplicationPrivate::platformTheme()->createPlatformMenu();
+ if (platformMenu) {
+ QObject::connect(platformMenu, SIGNAL(aboutToShow()), q, SIGNAL(aboutToShow()));
+ QObject::connect(platformMenu, SIGNAL(aboutToHide()), q, SIGNAL(aboutToHide()));
+ }
#ifdef QT_SOFTKEYS_ENABLED
selectAction = QSoftKeyManager::createKeyedAction(QSoftKeyManager::SelectSoftKey, Qt::Key_Select, q);
@@ -2300,7 +2304,7 @@ void QMenu::changeEvent(QEvent *e)
d->tornPopup->setEnabled(isEnabled());
d->menuAction->setEnabled(isEnabled());
if (d->platformMenu)
- d->platformMenu->setMenuEnabled(isEnabled());
+ d->platformMenu->setEnabled(isEnabled());
}
QWidget::changeEvent(e);
}
@@ -2822,6 +2826,25 @@ QMenu::timerEvent(QTimerEvent *e)
}
}
+void copyActionToPlatformItem(const QAction *action, QPlatformMenuItem* item)
+{
+ item->setText(action->text());
+ item->setIsSeparator(action->isSeparator());
+// item->setIcon(action->icon());
+ item->setVisible(action->isVisible());
+ item->setShortcut(action->shortcut());
+ item->setChecked(action->isChecked());
+ item->setFont(action->font());
+ item->setRole((QPlatformMenuItem::MenuRole) action->menuRole());
+ item->setEnabled(action->isEnabled());
+
+ if (action->menu()) {
+ item->setMenu(action->menu()->platformMenu());
+ } else {
+ item->setMenu(0);
+ }
+}
+
/*!
\reimp
*/
@@ -2854,12 +2877,24 @@ void QMenu::actionEvent(QActionEvent *e)
}
if (d->platformMenu) {
- if (e->type() == QEvent::ActionAdded)
- d->platformMenu->addAction(e->action(), e->before());
- else if (e->type() == QEvent::ActionRemoved)
- d->platformMenu->removeAction(e->action());
- else if (e->type() == QEvent::ActionChanged)
- d->platformMenu->syncAction(e->action());
+ if (e->type() == QEvent::ActionAdded) {
+ QPlatformMenuItem *menuItem =
+ QGuiApplicationPrivate::platformTheme()->createPlatformMenuItem();
+ menuItem->setTag(reinterpret_cast<quintptr>(e->action()));
+ QObject::connect(menuItem, SIGNAL(activated()), e->action(), SLOT(trigger()));
+ copyActionToPlatformItem(e->action(), menuItem);
+ QPlatformMenuItem* beforeItem = d->platformMenu->menuItemForTag(reinterpret_cast<quintptr>(e->before()));
+ d->platformMenu->insertMenuItem(menuItem, beforeItem);
+ } else if (e->type() == QEvent::ActionRemoved) {
+ QPlatformMenuItem *menuItem = d->platformMenu->menuItemForTag(reinterpret_cast<quintptr>(e->action()));
+ d->platformMenu->removeMenuItem(menuItem);
+ } else if (e->type() == QEvent::ActionChanged) {
+ QPlatformMenuItem *menuItem = d->platformMenu->menuItemForTag(reinterpret_cast<quintptr>(e->action()));
+ copyActionToPlatformItem(e->action(), menuItem);
+ d->platformMenu->syncMenuItem(menuItem);
+ }
+
+ d->platformMenu->syncSeparatorsCollapsible(d->collapsibleSeparators);
}
#if defined(Q_OS_WINCE) && !defined(QT_NO_MENUBAR)
diff --git a/src/widgets/widgets/qmenubar.cpp b/src/widgets/widgets/qmenubar.cpp
index 7c1e6b9166..fc28cd6d1c 100644
--- a/src/widgets/widgets/qmenubar.cpp
+++ b/src/widgets/widgets/qmenubar.cpp
@@ -57,6 +57,7 @@
#include <qwhatsthis.h>
#include <qpa/qplatformtheme.h>
#include "private/qguiapplication_p.h"
+#include "qplatformintegration_qpa.h"
#ifndef QT_NO_MENUBAR
@@ -719,7 +720,7 @@ void QMenuBarPrivate::init()
q->setSizePolicy(QSizePolicy::MinimumExpanding, QSizePolicy::Minimum);
q->setAttribute(Qt::WA_CustomWhatsThis);
- platformMenuBar = QGuiApplicationPrivate::platformTheme()->createPlatformMenuBar(q);
+ platformMenuBar = QGuiApplicationPrivate::platformTheme()->createPlatformMenuBar();
if (platformMenuBar)
q->hide();
@@ -1238,6 +1239,14 @@ void QMenuBar::leaveEvent(QEvent *)
d->setCurrentAction(0);
}
+QPlatformMenu *getPlatformMenu(QAction *action)
+{
+ if (!action || !action->menu())
+ return 0;
+
+ return action->menu()->platformMenu();
+}
+
/*!
\reimp
*/
@@ -1254,12 +1263,52 @@ void QMenuBar::actionEvent(QActionEvent *e)
#endif
if (!nativeMenuBar)
return;
- if(e->type() == QEvent::ActionAdded)
- nativeMenuBar->addAction(e->action(), e->before());
- else if(e->type() == QEvent::ActionRemoved)
- nativeMenuBar->removeAction(e->action());
- else if(e->type() == QEvent::ActionChanged)
- nativeMenuBar->syncAction(e->action());
+
+ if (e->type() == QEvent::ActionAdded) {
+ QPlatformMenu *menu = getPlatformMenu(e->action());
+ if (menu) {
+ QPlatformMenu* beforeMenu = NULL;
+ for (int beforeIndex = d->indexOf(e->action()) + 1;
+ !beforeMenu && (beforeIndex < actions().size());
+ ++beforeIndex)
+ {
+ beforeMenu = getPlatformMenu(actions().at(beforeIndex));
+ }
+
+ menu->setTag(reinterpret_cast<quintptr>(e->action()));
+ menu->setText(e->action()->text());
+ d->platformMenuBar->insertMenu(menu, beforeMenu);
+ }
+ } else if (e->type() == QEvent::ActionRemoved) {
+ QPlatformMenu *menu = getPlatformMenu(e->action());
+ if (menu)
+ d->platformMenuBar->removeMenu(menu);
+ } else if (e->type() == QEvent::ActionChanged) {
+ QPlatformMenu* cur = d->platformMenuBar->menuForTag(reinterpret_cast<quintptr>(e->action()));
+ QPlatformMenu *menu = getPlatformMenu(e->action());
+
+ // the menu associated with the action can change, need to
+ // remove and/or insert the new platform menu
+ if (menu != cur) {
+ if (cur)
+ d->platformMenuBar->removeMenu(cur);
+ if (menu) {
+ menu->setTag(reinterpret_cast<quintptr>(e->action()));
+
+ QPlatformMenu* beforeMenu = NULL;
+ for (int beforeIndex = d->indexOf(e->action()) + 1;
+ !beforeMenu && (beforeIndex < actions().size());
+ ++beforeIndex)
+ {
+ beforeMenu = getPlatformMenu(actions().at(beforeIndex));
+ }
+ d->platformMenuBar->insertMenu(menu, beforeMenu);
+ }
+ } else if (menu) {
+ menu->setText(e->action()->text());
+ d->platformMenuBar->syncMenu(menu);
+ }
+ }
}
if(e->type() == QEvent::ActionAdded) {
@@ -1339,8 +1388,17 @@ void QMenuBarPrivate::handleReparent()
oldParent = newParent;
oldWindow = newWindow;
- if (platformMenuBar)
- platformMenuBar->handleReparent(newParent);
+ if (platformMenuBar) {
+ if (newWindow) {
+ // force the underlying platform window to be created, since
+ // the platform menubar needs it (and we have no other way to
+ // discover when the platform window is created)
+ newWindow->createWinId();
+ platformMenuBar->handleReparent(newWindow->windowHandle());
+ } else {
+ platformMenuBar->handleReparent(0);
+ }
+ }
#ifdef Q_OS_WINCE
if (qt_wince_is_mobile() && wce_menubar)
@@ -1804,7 +1862,7 @@ void QMenuBar::setNativeMenuBar(bool nativeMenuBar)
d->platformMenuBar = 0;
} else {
if (!d->platformMenuBar)
- d->platformMenuBar = QGuiApplicationPrivate::platformTheme()->createPlatformMenuBar(this);
+ d->platformMenuBar = QGuiApplicationPrivate::platformTheme()->createPlatformMenuBar();
}
updateGeometry();
diff --git a/src/widgets/widgets/qmenubar_p.h b/src/widgets/widgets/qmenubar_p.h
index 139f5703de..b4e178b7d2 100644
--- a/src/widgets/widgets/qmenubar_p.h
+++ b/src/widgets/widgets/qmenubar_p.h
@@ -55,6 +55,7 @@
#include "QtWidgets/qstyleoption.h"
#include <private/qmenu_p.h> // Mac needs what in this file!
+#include <qpa/qplatformmenu.h>
QT_BEGIN_NAMESPACE
@@ -145,6 +146,8 @@ public:
QBasicTimer autoReleaseTimer;
QPlatformMenuBar *platformMenuBar;
+ inline int indexOf(QAction *act) const { return q_func()->actions().indexOf(act); }
+
#ifdef Q_OS_WINCE
void wceCreateMenuBar(QWidget *);
void wceDestroyMenuBar();