1// Copyright (C) 2020 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
3
4#ifndef QQUICKMENU_P_P_H
5#define QQUICKMENU_P_P_H
6
7//
8// W A R N I N G
9// -------------
10//
11// This file is not part of the Qt API. It exists purely as an
12// implementation detail. This header file may change from version to
13// version without notice, or even be removed.
14//
15// We mean it.
16//
17
18#include <QtCore/qlist.h>
19#include <QtCore/qpointer.h>
20
21#include <QtGui/qpa/qplatformmenu.h>
22
23#include <QtQuickTemplates2/private/qquickmenu_p.h>
24#include <QtQuickTemplates2/private/qquickpopup_p_p.h>
25
26QT_BEGIN_NAMESPACE
27
28class QQuickAction;
29class QQmlComponent;
30class QQmlObjectModel;
31class QQuickMenuItem;
32class QQuickNativeMenuItem;
33class QQuickMenuBar;
34
35class Q_QUICKTEMPLATES2_EXPORT QQuickMenuPrivate : public QQuickPopupPrivate
36{
37public:
38 Q_DECLARE_PUBLIC(QQuickMenu)
39
40 QQuickMenuPrivate();
41
42 static QQuickMenuPrivate *get(QQuickMenu *menu)
43 {
44 return menu->d_func();
45 }
46
47 void init();
48
49 QPlatformMenu *nativeHandle();
50 QPlatformMenu *maybeNativeHandle() const;
51 QQuickMenu *rootMenu() const;
52 bool useNativeMenu() const;
53 bool createNativeMenu();
54 void removeNativeMenu();
55 void syncWithNativeMenu();
56 void syncWithUseNativeMenu();
57 void setNativeMenuVisible(bool visible);
58
59 QQuickItem *itemAt(int index) const;
60 void insertItem(int index, QQuickItem *item);
61 void maybeCreateAndInsertNativeItem(int index, QQuickItem *item);
62 void moveItem(int from, int to);
63 enum class DestructionPolicy {
64 Destroy,
65 DoNotDestroy
66 };
67 void removeItem(int index, QQuickItem *item,
68 DestructionPolicy destructionPolicy = DestructionPolicy::DoNotDestroy);
69 enum class SyncPolicy {
70 Sync,
71 DoNotSync
72 };
73 void removeNativeItem(int index, SyncPolicy syncPolicy = SyncPolicy::Sync);
74 void resetNativeData();
75
76 static void recursivelyCreateNativeMenuItems(QQuickMenu *menu);
77
78 void printContentModelItems() const;
79
80 QQuickItem *beginCreateItem();
81 void completeCreateItem();
82
83 QQuickItem *createItem(QQuickMenu *menu);
84 QQuickItem *createItem(QQuickAction *action);
85
86 void resizeItem(QQuickItem *item);
87 void resizeItems();
88
89 void itemChildAdded(QQuickItem *item, QQuickItem *child) override;
90 void itemSiblingOrderChanged(QQuickItem *item) override;
91 void itemParentChanged(QQuickItem *item, QQuickItem *parent) override;
92 void itemDestroyed(QQuickItem *item) override;
93 void itemGeometryChanged(QQuickItem *, QQuickGeometryChange change, const QRectF &diff) override;
94
95 QQuickPopupPositioner *getPositioner() override;
96 bool prepareEnterTransition() override;
97 bool prepareExitTransition() override;
98 bool blockInput(QQuickItem *item, const QPointF &point) const override;
99 bool handlePress(QQuickItem *item, const QPointF &point, ulong timestamp) override;
100 bool handleReleaseWithoutGrab(const QEventPoint &eventPoint) override;
101
102 void onItemHovered();
103 void onItemTriggered();
104 void onItemActiveFocusChanged();
105 void updateTextPadding();
106
107 QQuickMenu *currentSubMenu() const;
108 void setParentMenu(QQuickMenu *parent);
109 void resolveParentItem();
110
111 void popup(QQuickItem *menuItem = nullptr);
112
113 void propagateKeyEvent(QKeyEvent *event);
114
115 void startHoverTimer();
116 void stopHoverTimer();
117
118 void setCurrentIndex(int index, Qt::FocusReason reason);
119 bool activateNextItem();
120 bool activatePreviousItem();
121
122 QQuickMenuItem *firstEnabledMenuItem() const;
123
124 static void contentData_append(QQmlListProperty<QObject> *prop, QObject *obj);
125 static qsizetype contentData_count(QQmlListProperty<QObject> *prop);
126 static QObject *contentData_at(QQmlListProperty<QObject> *prop, qsizetype index);
127 static void contentData_clear(QQmlListProperty<QObject> *prop);
128
129 QPalette defaultPalette() const override;
130 virtual QQuickPopup::PopupType resolvedPopupType() const override;
131
132 void resetContentItem();
133
134 bool cascade = false;
135 bool triedToCreateNativeMenu = false;
136 int hoverTimer = 0;
137 int currentIndex = -1;
138 qreal overlap = 0;
139 qreal textPadding = 0;
140 QPointer<QQuickMenu> parentMenu;
141 QPointer<QQuickMenuItem> currentItem;
142 QPointer<QQuickItem> contentItem;
143 QList<QObject *> contentData;
144 QPointer<QQmlObjectModel> contentModel;
145 QQmlComponent *delegate = nullptr;
146 QString title;
147 QQuickIcon icon;
148
149 // For native menu support.
150 std::unique_ptr<QPlatformMenu> handle = nullptr;
151 QList<QQuickNativeMenuItem *> nativeItems;
152 QPointer<QQuickMenuBar> menuBar;
153 qreal lastDevicePixelRatio = 0;
154};
155
156QT_END_NAMESPACE
157
158#endif // QQUICKMENU_P_P_H
159

source code of qtdeclarative/src/quicktemplates/qquickmenu_p_p.h