1 /*
2  * DQt - D bindings for the Qt Toolkit
3  *
4  * GNU Lesser General Public License Usage
5  * This file may be used under the terms of the GNU Lesser
6  * General Public License version 3 as published by the Free Software
7  * Foundation and appearing in the file LICENSE.LGPL3 included in the
8  * packaging of this file. Please review the following information to
9  * ensure the GNU Lesser General Public License version 3 requirements
10  * will be met: https://www.gnu.org/licenses/lgpl-3.0.html.
11  */
12 module qt.widgets.menu;
13 extern(C++):
14 
15 import qt.config;
16 import qt.core.coreevent;
17 import qt.core.list;
18 import qt.core.object;
19 import qt.core.point;
20 import qt.core.rect;
21 import qt.core.size;
22 import qt.core.string;
23 import qt.gui.action;
24 import qt.gui.event;
25 import qt.gui.icon;
26 import qt.gui.keysequence;
27 import qt.helpers;
28 import qt.widgets.styleoption;
29 import qt.widgets.widget;
30 
31 /+ #if defined(Q_OS_MACOS) || defined(Q_CLANG_QDOC)
32 Q_FORWARD_DECLARE_OBJC_CLASS(NSMenu);
33 #endif
34 
35 QT_REQUIRE_CONFIG(menu); +/
36 
37 
38 extern(C++, class) struct QMenuPrivate;
39 extern(C++, class) struct QPlatformMenu;
40 
41 /// Binding for C++ class [QMenu](https://doc.qt.io/qt-6/qmenu.html).
42 class /+ Q_WIDGETS_EXPORT +/ QMenu : QWidget
43 {
44 private:
45     mixin(Q_OBJECT);
46     /+ Q_DECLARE_PRIVATE(QMenu) +/
47 
48     /+ Q_PROPERTY(bool tearOffEnabled READ isTearOffEnabled WRITE setTearOffEnabled)
49     Q_PROPERTY(QString title READ title WRITE setTitle)
50     Q_PROPERTY(QIcon icon READ icon WRITE setIcon)
51     Q_PROPERTY(bool separatorsCollapsible READ separatorsCollapsible WRITE setSeparatorsCollapsible)
52     Q_PROPERTY(bool toolTipsVisible READ toolTipsVisible WRITE setToolTipsVisible) +/
53 
54 public:
55     /+ explicit +/this(QWidget parent = null);
56     /+ explicit +/this(ref const(QString) title, QWidget parent = null);
57     ~this();
58 
59     /+ using QWidget::addAction; +/
60     alias addAction = QWidget.addAction;
61     final QAction addAction(ref const(QString) text);
62     final QAction addAction(ref const(QIcon) icon, ref const(QString) text);
63 
64     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
65     final QAction addAction(ref const(QString) text, const(QObject) receiver, const(char)* member
66     /+ #if QT_CONFIG(shortcut) +/
67                            , ref const(QKeySequence) shortcut /+ = {}
68     #endif +/
69                            );
70     }));
71     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
72     final QAction addAction(ref const(QIcon) icon, ref const(QString) text, const(QObject) receiver, const(char)* member
73     /+ #if QT_CONFIG(shortcut) +/
74                            , ref const(QKeySequence) shortcut /+ = {}
75     #endif +/
76                            );
77     }));
78 
79 /+ #ifdef Q_CLANG_QDOC
80     template<typename Functor>
81     QAction *addAction(const QString &text, Functor functor, const QKeySequence &shortcut = 0);
82     template<typename Functor>
83     QAction *addAction(const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0);
84     template<typename Functor>
85     QAction *addAction(const QIcon &icon, const QString &text, Functor functor, const QKeySequence &shortcut = 0);
86     template<typename Functor>
87     QAction *addAction(const QIcon &icon, const QString &text, const QObject *context, Functor functor, const QKeySequence &shortcut = 0);
88 #else +/
89     // addAction(QString): Connect to a QObject slot / functor or function pointer (with context)
90     /+ template<class Obj, typename Func1> +/
91     /+ inline typename std::enable_if<!std::is_same<const char*, Func1>::value
92         && QtPrivate::IsPointerToTypeDerivedFromQObject<Obj*>::Value, QAction *>::type
93         addAction(const QString &text, const Obj *object, Func1 slot
94 #if QT_CONFIG(shortcut)
95                   , const QKeySequence &shortcut = {}
96 #endif
97                   )
98     {
99         QAction *result = addAction(text);
100 #if QT_CONFIG(shortcut)
101         result->setShortcut(shortcut);
102 #endif
103         connect(result, &QAction::triggered, object, std::move(slot));
104         return result;
105     } +/
106     // addAction(QString): Connect to a functor or function pointer (without context)
107     /+ template <typename Func1> +/
108     /+ inline QAction *addAction(const QString &text, Func1 slot
109 #if QT_CONFIG(shortcut)
110                               , const QKeySequence &shortcut = {}
111 #endif
112                               )
113     {
114         QAction *result = addAction(text);
115 #if QT_CONFIG(shortcut)
116         result->setShortcut(shortcut);
117 #endif
118         connect(result, &QAction::triggered, std::move(slot));
119         return result;
120     } +/
121     // addAction(QIcon, QString): Connect to a QObject slot / functor or function pointer (with context)
122     /+ template<class Obj, typename Func1> +/
123     /+ inline typename std::enable_if<!std::is_same<const char*, Func1>::value
124         && QtPrivate::IsPointerToTypeDerivedFromQObject<Obj*>::Value, QAction *>::type
125         addAction(const QIcon &actionIcon, const QString &text, const Obj *object, Func1 slot
126 #if QT_CONFIG(shortcut)
127                   , const QKeySequence &shortcut = {}
128 #endif
129                   )
130 
131     {
132         QAction *result = addAction(actionIcon, text);
133 #if QT_CONFIG(shortcut)
134         result->setShortcut(shortcut);
135 #endif
136         connect(result, &QAction::triggered, object, std::move(slot));
137         return result;
138     } +/
139     // addAction(QIcon, QString): Connect to a functor or function pointer (without context)
140     /+ template <typename Func1> +/
141     /+ inline QAction *addAction(const QIcon &actionIcon, const QString &text, Func1 slot
142 #if QT_CONFIG(shortcut)
143                               , const QKeySequence &shortcut = {}
144 #endif
145                               )
146     {
147         QAction *result = addAction(actionIcon, text);
148 #if QT_CONFIG(shortcut)
149         result->setShortcut(shortcut);
150 #endif
151         connect(result, &QAction::triggered, std::move(slot));
152         return result;
153     } +/
154 /+ #endif +/ // !Q_CLANG_QDOC
155 
156     final QAction addMenu(QMenu menu);
157     final QMenu addMenu(ref const(QString) title);
158     final QMenu addMenu(ref const(QIcon) icon, ref const(QString) title);
159 
160     final QAction addSeparator();
161 
162     final QAction addSection(ref const(QString) text);
163     final QAction addSection(ref const(QIcon) icon, ref const(QString) text);
164 
165     final QAction insertMenu(QAction before, QMenu menu);
166     final QAction insertSeparator(QAction before);
167     final QAction insertSection(QAction before, ref const(QString) text);
168     final QAction insertSection(QAction before, ref const(QIcon) icon, ref const(QString) text);
169 
170     final bool isEmpty() const;
171     final void clear();
172 
173     final void setTearOffEnabled(bool);
174     final bool isTearOffEnabled() const;
175 
176     final bool isTearOffMenuVisible() const;
177     final void showTearOffMenu();
178     final void showTearOffMenu(ref const(QPoint) pos);
179     final void hideTearOffMenu();
180 
181     final void setDefaultAction(QAction );
182     final QAction defaultAction() const;
183 
184     final void setActiveAction(QAction act);
185     final QAction activeAction() const;
186 
187     final void popup(ref const(QPoint) pos, QAction at = null);
188     final QAction exec();
189     final QAction exec(ref const(QPoint) pos, QAction at = null);
190 
191     static QAction exec(ref const(QList!(QAction)) actions, ref const(QPoint) pos, QAction at = null, QWidget parent = null);
192 
193     override QSize sizeHint() const;
194 
195     final QRect actionGeometry(QAction ) const;
196     final QAction actionAt(ref const(QPoint) ) const;
197 
198     final QAction menuAction() const;
199 
200     final QString title() const;
201     final void setTitle(ref const(QString) title);
202 
203     final QIcon icon() const;
204     final void setIcon(ref const(QIcon) icon);
205 
206     final void setNoReplayFor(QWidget widget);
207     final QPlatformMenu* platformMenu();
208     final void setPlatformMenu(QPlatformMenu* platformMenu);
209 
210     version(OSX)
211     {
212         /+ NSMenu* toNSMenu(); +/
213         final void setAsDockMenu();
214     }
215 
216     final bool separatorsCollapsible() const;
217     final void setSeparatorsCollapsible(bool collapse);
218 
219     final bool toolTipsVisible() const;
220     final void setToolTipsVisible(bool visible);
221 
222 /+ Q_SIGNALS +/public:
223     @QSignal final void aboutToShow();
224     @QSignal final void aboutToHide();
225     @QSignal final void triggered(QAction action);
226     @QSignal final void hovered(QAction action);
227 
228 protected:
229     final int columnCount() const;
230 
231     override void changeEvent(QEvent );
232     override void keyPressEvent(QKeyEvent );
233     override void mouseReleaseEvent(QMouseEvent );
234     override void mousePressEvent(QMouseEvent );
235     override void mouseMoveEvent(QMouseEvent );
236 /+ #if QT_CONFIG(wheelevent) +/
237     override void wheelEvent(QWheelEvent );
238 /+ #endif +/
239     override void enterEvent(QEnterEvent );
240     override void leaveEvent(QEvent );
241     override void hideEvent(QHideEvent );
242     override void paintEvent(QPaintEvent );
243     override void actionEvent(QActionEvent );
244     override void timerEvent(QTimerEvent );
245     override bool event(QEvent );
246     override bool focusNextPrevChild(bool next);
247     // Workaround for https://issues.dlang.org/show_bug.cgi?id=22620
248     private enum dummyNamespaceQStyleOptionMenuItem = __traits(getCppNamespaces, QStyleOptionMenuItem);
249     mixin(changeWindowsMangling(q{mangleClassesTailConst}, q{
250     /+ virtual +/ void initStyleOption(QStyleOptionMenuItem* option, const(QAction) action) const;
251     }));
252 
253 private /+ Q_SLOTS +/:
254     @QSlot final void internalDelayedPopup();
255 
256 private:
257     /+ Q_PRIVATE_SLOT(d_func(), void _q_actionTriggered())
258     Q_PRIVATE_SLOT(d_func(), void _q_actionHovered())
259     Q_PRIVATE_SLOT(d_func(), void _q_overrideMenuActionDestroyed())
260     Q_PRIVATE_SLOT(d_func(), void _q_platformMenuAboutToShow()) +/
261 
262 protected:
263     this(ref QMenuPrivate dd, QWidget parent = null);
264 
265 private:
266     /+ Q_DISABLE_COPY(QMenu) +/
267 
268     /+ friend class QMenuBar; +/
269     /+ friend class QMenuBarPrivate; +/
270     /+ friend class QTornOffMenu; +/
271     /+ friend class QComboBox; +/
272     /+ friend class QtWidgetsActionPrivate; +/
273     /+ friend class QToolButtonPrivate; +/
274     /+ friend void qt_mac_emit_menuSignals(QMenu *menu, bool show); +/
275     /+ friend void qt_mac_menu_emit_hovered(QMenu *menu, QAction *action); +/
276     mixin(CREATE_CONVENIENCE_WRAPPERS);
277 }
278