QPA: Adding API to support QWidgetAction on Mac

Includes the Cocoa implementation.

Task-number: QTBUG-19840
Change-Id: Id33bc8053b82116cf76ed591b6df823df3aef9bc
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Reviewed-by: Morten Johan Sørvig <morten.sorvig@digia.com>
This commit is contained in:
Gabriel de Dietrich 2014-04-01 18:26:19 +02:00 committed by The Qt Project
parent 5ad594a061
commit 454dc332b3
5 changed files with 30 additions and 0 deletions

View File

@ -86,6 +86,9 @@ public:
virtual void setChecked(bool isChecked) = 0;
virtual void setShortcut(const QKeySequence& shortcut) = 0;
virtual void setEnabled(bool enabled) = 0;
virtual void setNativeContents(WId item) { Q_UNUSED(item); }
Q_SIGNALS:
void activated();
void hovered();
@ -118,6 +121,8 @@ public:
setVisible(true);
}
virtual void dismiss() { } // Closes this and all its related menu popups
virtual QPlatformMenuItem *menuItemAt(int position) const = 0;
virtual QPlatformMenuItem *menuItemForTag(quintptr tag) const = 0;

View File

@ -68,6 +68,7 @@ public:
void setEnabled(bool enabled);
void setVisible(bool visible);
void showPopup(const QWindow *parentWindow, QPoint pos, const QPlatformMenuItem *item);
void dismiss();
void syncSeparatorsCollapsible(bool enable);

View File

@ -490,6 +490,11 @@ void QCocoaMenu::showPopup(const QWindow *parentWindow, QPoint pos, const QPlatf
[(QNSView *)view resetMouseButtons];
}
void QCocoaMenu::dismiss()
{
[m_nativeMenu cancelTracking];
}
QPlatformMenuItem *QCocoaMenu::menuItemAt(int position) const
{
if (0 <= position && position < m_menuItems.count())

View File

@ -57,6 +57,7 @@
QT_FORWARD_DECLARE_OBJC_CLASS(NSMenuItem);
QT_FORWARD_DECLARE_OBJC_CLASS(NSMenu);
QT_FORWARD_DECLARE_OBJC_CLASS(NSObject);
QT_FORWARD_DECLARE_OBJC_CLASS(NSView);
QT_BEGIN_NAMESPACE
@ -86,6 +87,8 @@ public:
void setChecked(bool isChecked);
void setEnabled(bool isEnabled);
void setNativeContents(WId item);
inline QString text() const { return m_text; }
inline NSMenuItem * nsItem() { return m_native; }
NSMenuItem *sync();
@ -105,6 +108,7 @@ private:
QKeySequence mergeAccel();
NSMenuItem *m_native;
NSView *m_itemView;
QString m_text;
bool m_textSynced;
QIcon m_icon;

View File

@ -91,6 +91,7 @@ NSUInteger keySequenceModifierMask(const QKeySequence &accel)
QCocoaMenuItem::QCocoaMenuItem() :
m_native(NULL),
m_itemView(nil),
m_textSynced(false),
m_menu(NULL),
m_isVisible(true),
@ -110,6 +111,8 @@ QCocoaMenuItem::~QCocoaMenuItem()
} else {
[m_native release];
}
[m_itemView release];
}
void QCocoaMenuItem::setText(const QString &text)
@ -178,6 +181,17 @@ void QCocoaMenuItem::setEnabled(bool enabled)
m_enabled = enabled;
}
void QCocoaMenuItem::setNativeContents(WId item)
{
NSView *itemView = (NSView *)item;
[m_itemView release];
m_itemView = [itemView retain];
[m_itemView setAutoresizesSubviews:YES];
[m_itemView setAutoresizingMask:NSViewWidthSizable];
[m_itemView setHidden:NO];
[m_itemView setNeedsDisplay:YES];
}
NSMenuItem *QCocoaMenuItem::sync()
{
if (m_isSeparator != [m_native isSeparatorItem]) {
@ -281,6 +295,7 @@ NSMenuItem *QCocoaMenuItem::sync()
[m_native setHidden: !m_isVisible];
[m_native setEnabled: m_enabled];
[m_native setView:m_itemView];
QString text = mergeText();
QKeySequence accel = mergeAccel();