Rewrite the Mac native toolbar classes.
[qt:qtmacextras.git] / src / macextras / qmactoolbaritem.mm
1 /****************************************************************************
2 **
3 ** Copyright (C) 2014 Digia Plc and/or its subsidiary(-ies).
4 ** Contact: http://www.qt-project.org/legal
5 **
6 ** This file is part of the QtMacExtras module of the Qt Toolkit.
7 **
8 ** $QT_BEGIN_LICENSE:LGPL$
9 ** Commercial License Usage
10 ** Licensees holding valid commercial Qt licenses may use this file in
11 ** accordance with the commercial license agreement provided with the
12 ** Software or, alternatively, in accordance with the terms contained in
13 ** a written agreement between you and Digia.  For licensing terms and
14 ** conditions see http://qt.digia.com/licensing.  For further information
15 ** use the contact form at http://qt.digia.com/contact-us.
16 **
17 ** GNU Lesser General Public License Usage
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Digia gives you certain additional
26 ** rights.  These rights are described in the Digia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** GNU General Public License Usage
30 ** Alternatively, this file may be used under the terms of the GNU
31 ** General Public License version 3.0 as published by the Free Software
32 ** Foundation and appearing in the file LICENSE.GPL included in the
33 ** packaging of this file.  Please review the following information to
34 ** ensure the GNU General Public License version 3.0 requirements will be
35 ** met: http://www.gnu.org/copyleft/gpl.html.
36 **
37 **
38 ** $QT_END_LICENSE$
39 **
40 ****************************************************************************/
41
42 #include "qmactoolbaritem.h"
43 #include "qmactoolbaritem_p.h"
44 #include "qmacfunctions.h"
45 #include "qmacfunctions_p.h"
46 #include "qmactoolbar_p.h"
47
48 QT_BEGIN_NAMESPACE
49
50 /*!
51   \class QMacToolBarItem
52   \inmodule QtMacExtras
53   \since 5.3
54   \brief The QMacToolBarItem class provides an item for QMacToolBar.
55
56   All items should have the text and icon properites set, or have the
57   standardItem property set to something else than NoStandardItem.
58
59   \sa QMacToolBar
60 */
61
62 /*!
63     \enum QMacToolBarItem::StandardItem
64     \value NoStandardItem Don't use a standard item
65     \value Space A spacing item
66     \value FlexibleSpace A spacing item which grows to fill available space
67 */
68
69
70 /*!
71     Constructs a QMacToolBarItem with \a parent.
72 */
73 QMacToolBarItem::QMacToolBarItem(QObject *parent)
74     :QObject(*new QMacToolBarItemPrivate, parent)
75 {
76     Q_D(QMacToolBarItem);
77     d->initNativeToolbarItem();
78 }
79
80 /*!
81     Destroys a QMacToolBarItem
82 */
83 QMacToolBarItem::~QMacToolBarItem()
84 {
85
86 }
87
88 /*!
89     \property QMacToolBarItem::selectable
90     \brief Whether the item is selecatble
91
92     This property's default is false.
93 */
94 bool QMacToolBarItem::selectable() const
95 {
96     Q_D(const QMacToolBarItem);
97     return d->selectable;
98 }
99
100 void QMacToolBarItem::setSelectable(bool selectable)
101 {
102     Q_D(QMacToolBarItem);
103     d->selectable = selectable;
104 }
105
106 /*!
107     \property QMacToolBarItem::standardItem
108     \brief Whether the item is a standard item.
109
110     This property's default is NoStandardItem, in which case the icon and text
111     property determines the item contents.
112
113     Setting this property to somthing else than NoStandardItem takes precendense
114     over icon and text.
115 */
116 QMacToolBarItem::StandardItem QMacToolBarItem::standardItem() const
117 {
118     Q_D(const QMacToolBarItem);
119     return d->standardItem;
120 }
121
122 void QMacToolBarItem::setStandardItem(StandardItem standardItem)
123 {
124     Q_D(QMacToolBarItem);
125
126     if (d->standardItem == standardItem)
127         return;
128
129     d->standardItem = standardItem;
130     d->initNativeToolbarItem();
131 }
132
133 /*!
134     \property QMacToolBarItem::text
135     \brief The item's text.
136 */
137 QString QMacToolBarItem::text() const
138 {
139     Q_D(const QMacToolBarItem);
140     return d->text;
141 }
142
143 void QMacToolBarItem::setText(const QString &text)
144 {
145     Q_D(QMacToolBarItem);
146     d->text = text;
147
148     if (d->standardItem != QMacToolBarItem::NoStandardItem)
149         return;
150
151     [d->toolbarItem setLabel:text.toNSString()];
152 }
153
154 /*!
155     \property QMacToolBarItem::icon
156     \brief The item's icon.
157 */
158 QIcon QMacToolBarItem::icon() const
159 {
160     Q_D(const QMacToolBarItem);
161     return d->icon;
162 }
163
164 void QMacToolBarItem::setIcon(const QIcon &icon)
165 {
166     Q_D(QMacToolBarItem);
167     d->icon = icon;
168     QPixmap pixmap = icon.pixmap(64, 64);
169
170     if (d->standardItem != QMacToolBarItem::NoStandardItem)
171         return;
172
173     if (pixmap.isNull() == false) {
174         [d->toolbarItem setImage: QtMac::toNSImage(pixmap)];
175     }
176 }
177
178 /*!
179     Returns the native NSToolbarItem.
180 */
181 NSToolbarItem *QMacToolBarItem::nativeToolBarItem() const
182 {
183     Q_D(const QMacToolBarItem);
184     return d->toolbarItem;
185 }
186
187 /*!
188     \fn void QMacToolBarItem::activated();
189
190     This signal is emitted when the toolbar item is clicked or otherwise activated.
191 */
192
193 QMacToolBarItemPrivate::QMacToolBarItemPrivate()
194 {
195     standardItem = QMacToolBarItem::NoStandardItem;
196     selectable = false;
197     toolbarItem = 0;
198 }
199
200 QMacToolBarItemPrivate::~QMacToolBarItemPrivate()
201 {
202     [toolbarItem release];
203 }
204
205 NSString *QMacToolBarItemPrivate::toNSStandardItem(QMacToolBarItem::StandardItem standardItem)
206 {
207     /*
208         ### not supported yet; Qt does not handle the action
209         messages these send.
210
211     if (standardItem == QMacToolBarItem::ShowColors)
212         return NSToolbarShowColorsItemIdentifier;
213     else if (standardItem == QMacToolBarItem::ShowFonts)
214         return NSToolbarShowFontsItemIdentifier;
215     else if (standardItem == QMacToolBarItem::PrintItem)
216         return NSToolbarPrintItemIdentifier;
217     else
218 */
219     if (standardItem == QMacToolBarItem::Space)
220         return NSToolbarSpaceItemIdentifier;
221     else if (standardItem == QMacToolBarItem::FlexibleSpace)
222         return NSToolbarFlexibleSpaceItemIdentifier;
223     return @"";
224 }
225
226 NSString *QMacToolBarItemPrivate::itemIdentifier() const
227 {
228     if (standardItem == QMacToolBarItem::NoStandardItem)
229         return QString::number(qulonglong(q_func())).toNSString();
230
231     return toNSStandardItem(standardItem);
232 }
233
234 // Initializes the NSToolBarItem based on QMacToolBarItem properties.
235 void QMacToolBarItemPrivate::initNativeToolbarItem()
236 {
237     NSString  *identifier = itemIdentifier();
238     toolbarItem = [[NSToolbarItem alloc] initWithItemIdentifier:identifier];
239 }
240
241 QT_END_NAMESPACE