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