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_MENUBAR_H
41#define QDESIGNER_MENUBAR_H
42
43#include "shared_global_p.h"
44
45#include <QtWidgets/qaction.h>
46#include <QtWidgets/qmenubar.h>
47
48#include <QtCore/qpointer.h>
49#include <QtCore/qmimedata.h>
50
51QT_BEGIN_NAMESPACE
52
53class QDesignerFormWindowInterface;
54class QDesignerActionProviderExtension;
55
56class QLineEdit;
57class QMimeData;
58
59namespace qdesigner_internal {
60class PromotionTaskMenu;
61
62class SpecialMenuAction: public QAction
63{
64 Q_OBJECT
65public:
66 SpecialMenuAction(QObject *parent = nullptr);
67 ~SpecialMenuAction() override;
68};
69
70} // namespace qdesigner_internal
71
72class QDESIGNER_SHARED_EXPORT QDesignerMenuBar: public QMenuBar
73{
74 Q_OBJECT
75public:
76 QDesignerMenuBar(QWidget *parent = nullptr);
77 ~QDesignerMenuBar() override;
78
79 bool eventFilter(QObject *object, QEvent *event) override;
80
81 QDesignerFormWindowInterface *formWindow() const;
82 QDesignerActionProviderExtension *actionProvider();
83
84 void adjustSpecialActions();
85 bool dragging() const;
86
87 void moveLeft(bool ctrl = false);
88 void moveRight(bool ctrl = false);
89 void moveUp();
90 void moveDown();
91
92 // Helpers for MenuTaskMenu/MenuBarTaskMenu extensions
93 QList<QAction *> contextMenuActions();
94 void deleteMenuAction(QAction *action);
95
96private slots:
97 void deleteMenu();
98 void slotRemoveMenuBar();
99
100protected:
101 void actionEvent(QActionEvent *event) override;
102 void dragEnterEvent(QDragEnterEvent *event) override;
103 void dragMoveEvent(QDragMoveEvent *event) override;
104 void dragLeaveEvent(QDragLeaveEvent *event) override;
105 void dropEvent(QDropEvent *event) override;
106 void paintEvent(QPaintEvent *event) override;
107 void focusOutEvent(QFocusEvent *event) override;
108 void keyPressEvent(QKeyEvent *event) override;
109 void keyReleaseEvent(QKeyEvent *event) override;
110
111 bool handleEvent(QWidget *widget, QEvent *event);
112 bool handleMouseDoubleClickEvent(QWidget *widget, QMouseEvent *event);
113 bool handleMousePressEvent(QWidget *widget, QMouseEvent *event);
114 bool handleMouseReleaseEvent(QWidget *widget, QMouseEvent *event);
115 bool handleMouseMoveEvent(QWidget *widget, QMouseEvent *event);
116 bool handleContextMenuEvent(QWidget *widget, QContextMenuEvent *event);
117 bool handleKeyPressEvent(QWidget *widget, QKeyEvent *event);
118
119 void startDrag(const QPoint &pos);
120
121 enum ActionDragCheck { NoActionDrag, ActionDragOnSubMenu, AcceptActionDrag };
122 ActionDragCheck checkAction(QAction *action) const;
123
124 void adjustIndicator(const QPoint &pos);
125 int findAction(const QPoint &pos) const;
126
127 QAction *currentAction() const;
128 int realActionCount() const;
129
130 enum LeaveEditMode {
131 Default = 0,
132 ForceAccept
133 };
134
135 void enterEditMode();
136 void leaveEditMode(LeaveEditMode mode);
137 void showLineEdit();
138
139 void showMenu(int index = -1);
140 void hideMenu(int index = -1);
141
142 QAction *safeActionAt(int index) const;
143
144 bool swapActions(int a, int b);
145
146private:
147 void updateCurrentAction(bool selectAction);
148 void movePrevious(bool ctrl);
149 void moveNext(bool ctrl);
150
151 QAction *m_addMenu;
152 QPointer<QMenu> m_activeMenu;
153 QPoint m_startPosition;
154 int m_currentIndex = 0;
155 QLineEdit *m_editor;
156 bool m_dragging = false;
157 int m_lastMenuActionIndex = -1;
158 QPointer<QWidget> m_lastFocusWidget;
159 qdesigner_internal::PromotionTaskMenu* m_promotionTaskMenu;
160};
161
162QT_END_NAMESPACE
163
164#endif // QDESIGNER_MENUBAR_H
165

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