diff --git a/src/macextras/qmacfunctions.h b/src/macextras/qmacfunctions.h index ccdbd6e..ab431f7 100644 --- a/src/macextras/qmacfunctions.h +++ b/src/macextras/qmacfunctions.h @@ -79,6 +79,7 @@ Q_MACEXTRAS_EXPORT void setBadgeLabelText(const QString &text); Q_MACEXTRAS_EXPORT QString badgeLabelText(); Q_MACEXTRAS_EXPORT NSImage *toNSImage(const QPixmap &pixmap); +Q_MACEXTRAS_EXPORT NSImage *iconToNSImage(const QIcon &icon, QIcon::Mode mode = QIcon::Normal, QIcon::State state = QIcon::Off); #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) Q_MACEXTRAS_EXPORT bool isMainWindow(QWindow *window); diff --git a/src/macextras/qmacfunctions_mac.mm b/src/macextras/qmacfunctions_mac.mm index 076f269..794a181 100644 --- a/src/macextras/qmacfunctions_mac.mm +++ b/src/macextras/qmacfunctions_mac.mm @@ -78,6 +78,29 @@ return image; } +/*! + \fn NSImage* QtMac::iconToNSImage(const QIcon &icon, QIcon::Mode mode, QIcon::State state) + + Creates an \c NSImage equivalent to the QIcon \a icon. Returns the \c NSImage handle. + + It is the caller's responsibility to release the \c NSImage data + after use. +*/ +NSImage* iconToNSImage(const QIcon &icon, QIcon::Mode mode, QIcon::State state) +{ + NSImage *image = [[NSImage alloc] init]; + foreach (const QSize &size, icon.availableSizes()) { + QPixmap pixmap = icon.pixmap(size, mode, state); + CGImageRef cgimage = QtMac::toCGImageRef(pixmap); + NSBitmapImageRep *bitmapRep = [[NSBitmapImageRep alloc] initWithCGImage:cgimage]; + [bitmapRep setSize: NSMakeSize(size.width(), size.height())]; + [image addRepresentation:bitmapRep]; + [bitmapRep release]; + CFRelease(cgimage); + } + return image; +} + #if QT_VERSION >= QT_VERSION_CHECK(5, 0, 0) /*! \fn bool QtMac::isMainWindow(QWindow *window) diff --git a/src/macextras/qmactoolbar.h b/src/macextras/qmactoolbar.h index 2706089..b0af991 100644 --- a/src/macextras/qmactoolbar.h +++ b/src/macextras/qmactoolbar.h @@ -67,6 +67,7 @@ public: QMacToolBarItem *addAllowedItem(const QIcon &icon, const QString &text); QMacToolBarItem *addStandardItem(QMacToolBarItem::StandardItem standardItem); QMacToolBarItem *addAllowedStandardItem(QMacToolBarItem::StandardItem standardItem); + QMacToolBarItem *addView(NSView *view); void addSeparator(); void setItems(QList &items); diff --git a/src/macextras/qmactoolbar.mm b/src/macextras/qmactoolbar.mm index 1881c4f..183dc50 100644 --- a/src/macextras/qmactoolbar.mm +++ b/src/macextras/qmactoolbar.mm @@ -181,6 +181,16 @@ Add items by calling addItem(). The toolbar has a customization menu which return item; } +QMacToolBarItem *QMacToolBar::addView(NSView *view) +{ + Q_D(QMacToolBar); + QMacToolBarItem *item = new QMacToolBarItem(this); + item->setView(view); + d->items.append(item); + d->allowedItems.append(item); + return item; +} + /*! Sets the list of the default toolbar \a items. */ diff --git a/src/macextras/qmactoolbardelegate.mm b/src/macextras/qmactoolbardelegate.mm index 23e5150..8310118 100644 --- a/src/macextras/qmactoolbardelegate.mm +++ b/src/macextras/qmactoolbardelegate.mm @@ -98,8 +98,10 @@ - (NSArray *)toolbarSelectableItemIdentifiers: (NSToolbar *)toolbar - (IBAction)itemClicked:(id)sender { - NSToolbarItem *item = reinterpret_cast(sender); - toolbarPrivate->itemClicked(item); + if ([sender isKindOfClass:[NSToolbarItem class]]) { + NSToolbarItem *item = reinterpret_cast(sender); + toolbarPrivate->itemClicked(item); + } } - (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier: (NSString *) itemIdentifier willBeInsertedIntoToolbar:(BOOL) willBeInserted @@ -110,10 +112,17 @@ - (NSToolbarItem *) toolbar: (NSToolbar *)toolbar itemForItemIdentifier: (NSStri QMacToolBarItem *toolButton = reinterpret_cast(identifier.toULongLong()); // string -> unisgned long long -> pointer NSToolbarItem *toolbarItem = toolButton->nativeToolBarItem(); - [toolbarItem setTarget:self]; - [toolbarItem setAction:@selector(itemClicked:)]; + if (![toolbarItem view]) { + [toolbarItem setTarget:self]; + [toolbarItem setAction:@selector(itemClicked:)]; + } return toolbarItem; } +- (BOOL)validateToolbarItem:(NSToolbarItem *)toolbarItem +{ + return [toolbarItem isEnabled]; +} + @end diff --git a/src/macextras/qmactoolbaritem.h b/src/macextras/qmactoolbaritem.h index eb0bd71..bd21b2c 100644 --- a/src/macextras/qmactoolbaritem.h +++ b/src/macextras/qmactoolbaritem.h @@ -47,6 +47,7 @@ #include Q_FORWARD_DECLARE_OBJC_CLASS(NSToolbarItem); +Q_FORWARD_DECLARE_OBJC_CLASS(NSView); QT_BEGIN_NAMESPACE @@ -71,6 +72,9 @@ public: explicit QMacToolBarItem(QObject *parent = nullptr); virtual ~QMacToolBarItem(); + bool enabled() const; + void setEnabled(bool enabled); + bool selectable() const; void setSelectable(bool selectable); @@ -81,7 +85,10 @@ public: void setText(const QString &text); QIcon icon() const; - void setIcon(const QIcon &icon); + void setIcon(const QIcon &icon, QIcon::State state = QIcon::Off); + + NSView *view() const; + void setView(NSView *view); NSToolbarItem *nativeToolBarItem() const; diff --git a/src/macextras/qmactoolbaritem.mm b/src/macextras/qmactoolbaritem.mm index b215bd8..df0efdc 100644 --- a/src/macextras/qmactoolbaritem.mm +++ b/src/macextras/qmactoolbaritem.mm @@ -83,6 +83,24 @@ } +/*! + \property QMacToolBarItem::enabled + \brief Whether the item is enabled + + This property's default is true. +*/ +bool QMacToolBarItem::enabled() const +{ + Q_D(const QMacToolBarItem); + return [d->toolbarItem enabled]; +} + +void QMacToolBarItem::setEnabled(bool enabled) +{ + Q_D(QMacToolBarItem); + [d->toolbarItem setEnabled:enabled]; +} + /*! \property QMacToolBarItem::selectable \brief Whether the item is selecatble @@ -101,6 +119,26 @@ d->selectable = selectable; } +/*! + \property QMacToolBarItem::view + \brief The item's view, if any. +*/ +NSView *QMacToolBarItem::view() const +{ + Q_D(const QMacToolBarItem); + return [d->toolbarItem view]; +} + +void QMacToolBarItem::setView(NSView *view) +{ + Q_D(QMacToolBarItem); + + if (d->standardItem != QMacToolBarItem::NoStandardItem) + return; + + [d->toolbarItem setView:view]; +} + /*! \property QMacToolBarItem::standardItem \brief Whether the item is a standard item. @@ -159,18 +197,15 @@ return d->icon; } -void QMacToolBarItem::setIcon(const QIcon &icon) +void QMacToolBarItem::setIcon(const QIcon &icon, QIcon::State state) { Q_D(QMacToolBarItem); d->icon = icon; - QPixmap pixmap = icon.pixmap(64, 64); if (d->standardItem != QMacToolBarItem::NoStandardItem) return; - if (pixmap.isNull() == false) { - [d->toolbarItem setImage: QtMac::toNSImage(pixmap)]; - } + [d->toolbarItem setImage: QtMac::iconToNSImage(icon, QIcon::Normal, state)]; } /*!