diff options
-rw-r--r-- | src/gui/kernel/kernel.pri | 2 | ||||
-rwxr-xr-x | src/gui/kernel/qplatformmenu.h | 115 | ||||
-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.h | 6 | ||||
-rw-r--r-- | src/gui/kernel/qplatformtheme_qpa.cpp | 27 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/cocoa.pro | 4 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoaintegration.mm | 1 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoamenuloader.mm | 9 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoatheme.h | 3 | ||||
-rw-r--r-- | src/plugins/platforms/cocoa/qcocoatheme.mm | 14 | ||||
-rw-r--r-- | src/widgets/kernel/kernel.pri | 9 | ||||
-rw-r--r-- | src/widgets/kernel/qaction.h | 3 | ||||
-rw-r--r-- | src/widgets/kernel/qplatformmenu.h | 94 | ||||
-rw-r--r-- | src/widgets/widgets/qmenu.cpp | 51 | ||||
-rw-r--r-- | src/widgets/widgets/qmenubar.cpp | 78 | ||||
-rw-r--r-- | src/widgets/widgets/qmenubar_p.h | 3 |
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(); |