1/****************************************************************************
2**
3** Copyright (C) 2016 The Qt Company Ltd.
4** Contact: https://www.qt.io/licensing/
5**
6** This file is part of the Qt Designer of the Qt Toolkit.
7**
8** $QT_BEGIN_LICENSE:GPL-EXCEPT$
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 The Qt Company. For licensing terms
14** and conditions see https://www.qt.io/terms-conditions. For further
15** information use the contact form at https://www.qt.io/contact-us.
16**
17** GNU General Public License Usage
18** Alternatively, this file may be used under the terms of the GNU
19** General Public License version 3 as published by the Free Software
20** Foundation with exceptions as appearing in the file LICENSE.GPL3-EXCEPT
21** included in the packaging of this file. Please review the following
22** information to ensure the GNU General Public License requirements will
23** be met: https://www.gnu.org/licenses/gpl-3.0.html.
24**
25** $QT_END_LICENSE$
26**
27****************************************************************************/
28
29//
30// W A R N I N G
31// -------------
32//
33// This file is not part of the Qt API. It exists for the convenience
34// of Qt Designer. This header
35// file may change from version to version without notice, or even be removed.
36//
37// We mean it.
38//
39
40#ifndef QDESIGNER_MENU_H
41#define QDESIGNER_MENU_H
42
43#include "shared_global_p.h"
44
45#include <QtWidgets/qaction.h>
46#include <QtWidgets/qmenu.h>
47#include <QtGui/qpixmap.h>
48#include <QtCore/qhash.h>
49
50QT_BEGIN_NAMESPACE
51
52class QTimer;
53class QLineEdit;
54
55class QDesignerFormWindowInterface;
56class QDesignerActionProviderExtension;
57class QDesignerMenu;
58class QDesignerMenuBar;
59class QPainter;
60class QMimeData;
61
62namespace qdesigner_internal {
63 class CreateSubmenuCommand;
64 class ActionInsertionCommand;
65}
66
67class QDESIGNER_SHARED_EXPORT QDesignerMenu: public QMenu
68{
69 Q_OBJECT
70public:
71 QDesignerMenu(QWidget *parent = nullptr);
72 ~QDesignerMenu() override;
73
74 bool eventFilter(QObject *object, QEvent *event) override;
75
76 QDesignerFormWindowInterface *formWindow() const;
77 QDesignerActionProviderExtension *actionProvider();
78
79 QDesignerMenu *parentMenu() const;
80 QDesignerMenuBar *parentMenuBar() const;
81
82 void setVisible(bool visible) override;
83
84 void adjustSpecialActions();
85
86 void createRealMenuAction(QAction *action);
87 void removeRealMenu(QAction *action);
88
89 static void drawSelection(QPainter *p, const QRect &r);
90
91 bool dragging() const;
92
93 void closeMenuChain();
94
95 void moveLeft();
96 void moveRight();
97 void moveUp(bool ctrl);
98 void moveDown(bool ctrl);
99
100 // Helper for MenuTaskMenu extension
101 void deleteAction(QAction *a);
102
103private slots:
104 void slotAddSeparator();
105 void slotRemoveSelectedAction();
106 void slotShowSubMenuNow();
107 void slotDeactivateNow();
108 void slotAdjustSizeNow();
109
110protected:
111 void actionEvent(QActionEvent *event) override;
112 void dragEnterEvent(QDragEnterEvent *event) override;
113 void dragMoveEvent(QDragMoveEvent *event) override;
114 void dragLeaveEvent(QDragLeaveEvent *event) override;
115 void dropEvent(QDropEvent *event) override;
116 void paintEvent(QPaintEvent *event) override;
117 void keyPressEvent(QKeyEvent *event) override;
118 void keyReleaseEvent(QKeyEvent *event) override;
119 void showEvent(QShowEvent *event) override;
120
121 bool handleEvent(QWidget *widget, QEvent *event);
122 bool handleMouseDoubleClickEvent(QWidget *widget, QMouseEvent *event);
123 bool handleMousePressEvent(QWidget *widget, QMouseEvent *event);
124 bool handleMouseReleaseEvent(QWidget *widget, QMouseEvent *event);
125 bool handleMouseMoveEvent(QWidget *widget, QMouseEvent *event);
126 bool handleContextMenuEvent(QWidget *widget, QContextMenuEvent *event);
127 bool handleKeyPressEvent(QWidget *widget, QKeyEvent *event);
128
129 void startDrag(const QPoint &pos, Qt::KeyboardModifiers modifiers);
130
131 void adjustIndicator(const QPoint &pos);
132 int findAction(const QPoint &pos) const;
133
134 QAction *currentAction() const;
135 int realActionCount() const;
136 enum ActionDragCheck { NoActionDrag, ActionDragOnSubMenu, AcceptActionDrag };
137 ActionDragCheck checkAction(QAction *action) const;
138
139 void showSubMenu(QAction *action);
140
141 enum LeaveEditMode {
142 Default = 0,
143 ForceAccept
144 };
145
146 void enterEditMode();
147 void leaveEditMode(LeaveEditMode mode);
148 void showLineEdit();
149
150 QAction *createAction(const QString &text, bool separator = false);
151 QDesignerMenu *findOrCreateSubMenu(QAction *action);
152
153 QAction *safeActionAt(int index) const;
154 QAction *safeMenuAction(QDesignerMenu *menu) const;
155 bool swap(int a, int b);
156
157 void hideSubMenu();
158 void deleteAction();
159 void deactivateMenu();
160
161 bool canCreateSubMenu(QAction *action) const;
162 QDesignerMenu *findRootMenu() const;
163 QDesignerMenu *findActivatedMenu() const;
164
165 QRect subMenuPixmapRect(QAction *action) const;
166 bool hasSubMenuPixmap(QAction *action) const;
167
168 void selectCurrentAction();
169
170private:
171 bool hideSubMenuOnCursorKey();
172 bool showSubMenuOnCursorKey();
173 const QPixmap m_subMenuPixmap;
174
175 QPoint m_startPosition;
176 int m_currentIndex = 0;
177 QAction *m_addItem;
178 QAction *m_addSeparator;
179 QHash<QAction*, QDesignerMenu*> m_subMenus;
180 QTimer *m_showSubMenuTimer;
181 QTimer *m_deactivateWindowTimer;
182 QTimer *m_adjustSizeTimer;
183 QLineEdit *m_editor;
184 bool m_dragging = false;
185 int m_lastSubMenuIndex = -1;
186
187 friend class qdesigner_internal::CreateSubmenuCommand;
188 friend class qdesigner_internal::ActionInsertionCommand;
189};
190
191QT_END_NAMESPACE
192
193#endif // QDESIGNER_MENU_H
194

source code of qttools/src/designer/src/lib/shared/qdesigner_menu_p.h