Qt
Internal/Contributor docs for the Qt SDK. <b>Note:</b> These are NOT official API docs; those are found <a href='https://doc.qt.io/'>here</a>.
Loading...
Searching...
No Matches
qdbusplatformmenu.cpp
Go to the documentation of this file.
1// Copyright (C) 2016 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
5
6#include <QDateTime>
7#include <QDebug>
8#include <QWindow>
9
11
12Q_LOGGING_CATEGORY(qLcMenu, "qt.qpa.menu")
13
14static int nextDBusID = 1;
16
18 : m_subMenu(nullptr)
19 , m_role(NoRole)
20 , m_isEnabled(true)
21 , m_isVisible(true)
22 , m_isSeparator(false)
23 , m_isCheckable(false)
24 , m_isChecked(false)
25 , m_hasExclusiveGroup(false)
26 , m_dbusID(nextDBusID++)
27{
28 menuItemsByID.insert(m_dbusID, this);
29}
30
32{
33 menuItemsByID.remove(m_dbusID);
34 if (m_subMenu)
35 static_cast<QDBusPlatformMenu *>(m_subMenu)->setContainingMenuItem(nullptr);
36}
37
39{
40 qCDebug(qLcMenu) << m_dbusID << text;
41 m_text = text;
42}
43
45{
46 m_icon = icon;
47}
48
53{
54 if (m_subMenu)
55 static_cast<QDBusPlatformMenu *>(m_subMenu)->setContainingMenuItem(nullptr);
56 m_subMenu = menu;
57 if (menu)
58 static_cast<QDBusPlatformMenu *>(menu)->setContainingMenuItem(this);
59}
60
62{
63 m_isEnabled = enabled;
64}
65
67{
68 m_isVisible = isVisible;
69}
70
72{
73 m_isSeparator = isSeparator;
74}
75
80
82{
83 m_isCheckable = checkable;
84}
85
87{
88 m_isChecked = isChecked;
89}
90
92{
93 m_hasExclusiveGroup = hasExclusiveGroup;
94}
95
96#ifndef QT_NO_SHORTCUT
97void QDBusPlatformMenuItem::setShortcut(const QKeySequence &shortcut)
98{
99 m_shortcut = shortcut;
100}
101#endif
102
107
109{
110 // We need to check contains because otherwise QHash would insert
111 // a default-constructed nullptr value into menuItemsByID
112 if (menuItemsByID.contains(id))
113 return menuItemsByID[id];
114 return nullptr;
115}
116
117QList<const QDBusPlatformMenuItem *> QDBusPlatformMenuItem::byIds(const QList<int> &ids)
118{
119 QList<const QDBusPlatformMenuItem *> ret;
120 for (int id : ids) {
121 if (menuItemsByID.contains(id))
122 ret << menuItemsByID[id];
123 }
124 return ret;
125}
126
127
129 : m_isEnabled(true)
130 , m_isVisible(true)
131 , m_revision(1)
132 , m_containingMenuItem(nullptr)
133{
134}
135
137{
138 if (m_containingMenuItem)
139 m_containingMenuItem->setMenu(nullptr);
140}
141
143{
144 QDBusPlatformMenuItem *item = static_cast<QDBusPlatformMenuItem *>(menuItem);
145 QDBusPlatformMenuItem *beforeItem = static_cast<QDBusPlatformMenuItem *>(before);
146 int idx = m_items.indexOf(beforeItem);
147 qCDebug(qLcMenu) << item->dbusID() << item->text();
148 if (idx < 0)
149 m_items.append(item);
150 else
151 m_items.insert(idx, item);
152 m_itemsByTag.insert(item->tag(), item);
153 if (item->menu())
154 syncSubMenu(static_cast<const QDBusPlatformMenu *>(item->menu()));
155 emitUpdated();
156}
157
159{
160 QDBusPlatformMenuItem *item = static_cast<QDBusPlatformMenuItem *>(menuItem);
161 m_items.removeAll(item);
162 m_itemsByTag.remove(menuItem->tag());
163 if (item->menu()) {
164 // disconnect from the signals we connected to in syncSubMenu()
165 const QDBusPlatformMenu *menu = static_cast<const QDBusPlatformMenu *>(item->menu());
172 }
173 emitUpdated();
174}
175
177{
178 // The adaptor is only connected to the propertiesUpdated signal of the top-level
179 // menu, so the submenus should transfer their signals to their parents.
186}
187
189{
190 QDBusPlatformMenuItem *item = static_cast<QDBusPlatformMenuItem *>(menuItem);
191 // if a submenu was added to this item, we need to connect to its signals
192 if (item->menu())
193 syncSubMenu(static_cast<const QDBusPlatformMenu *>(item->menu()));
194 // TODO keep around copies of the QDBusMenuLayoutItems so they can be updated?
195 // or eliminate them by putting dbus streaming operators in this class instead?
196 // or somehow tell the dbusmenu client that something has changed, so it will ask for properties again
198 QDBusMenuItemKeysList removed;
200 qCDebug(qLcMenu) << updated;
202}
203
205{
206 if (m_containingMenuItem)
207 emit updated(++m_revision, m_containingMenuItem->dbusID());
208 else
209 emit updated(++m_revision, 0);
210}
211
213{
214 m_text = text;
215}
216
218{
219 m_icon = icon;
220}
221
223{
224 m_isEnabled = enabled;
225}
226
228{
229 m_isVisible = isVisible;
230}
231
233{
234 m_containingMenuItem = item;
235}
236
237void QDBusPlatformMenu::showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item)
238{
239 Q_UNUSED(parentWindow);
240 Q_UNUSED(targetRect);
241 Q_UNUSED(item);
242 setVisible(true);
244}
245
247{
248 return m_items.value(position);
249}
250
252{
253 return m_itemsByTag[tag];
254}
255
256const QList<QDBusPlatformMenuItem *> QDBusPlatformMenu::items() const
257{
258 return m_items;
259}
260
266
271
273
274#include "moc_qdbusplatformmenu_p.cpp"
void setText(const QString &text) override
void setIsSeparator(bool isSeparator) override
const QString text() const
static QDBusPlatformMenuItem * byId(int id)
void setHasExclusiveGroup(bool hasExclusiveGroup) override
void setRole(MenuRole role) override
void setEnabled(bool enabled) override
void setChecked(bool isChecked) override
void setVisible(bool isVisible) override
const QPlatformMenu * menu() const
void setCheckable(bool checkable) override
static QList< const QDBusPlatformMenuItem * > byIds(const QList< int > &ids)
void setIcon(const QIcon &icon) override
void setMenu(QPlatformMenu *menu) override
Set a submenu under this menu item.
void setIcon(const QIcon &icon) override
void showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item) override
QPlatformMenuItem * menuItemForTag(quintptr tag) const override
void popupRequested(int id, uint timestamp)
QPlatformMenu * createSubMenu() const override
void setEnabled(bool enabled) override
void removeMenuItem(QPlatformMenuItem *menuItem) override
void setText(const QString &text) override
void updated(uint revision, int dbusId)
const QList< QDBusPlatformMenuItem * > items() const
void insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before) override
void setContainingMenuItem(QDBusPlatformMenuItem *item)
QPlatformMenuItem * menuItemAt(int position) const override
void setVisible(bool visible) override
void propertiesUpdated(QDBusMenuItemList updatedProps, QDBusMenuItemKeysList removedProps)
void syncSubMenu(const QDBusPlatformMenu *menu)
void syncMenuItem(QPlatformMenuItem *menuItem) override
const QString text() const
QPlatformMenuItem * createMenuItem() const override
static qint64 currentMSecsSinceEpoch() noexcept
\inmodule QtCore
Definition qhash.h:820
bool remove(const Key &key)
Removes the item that has the key from the hash.
Definition qhash.h:958
iterator insert(const Key &key, const T &value)
Inserts a new item with the key and a value of value.
Definition qhash.h:1303
The QIcon class provides scalable icons in different modes and states.
Definition qicon.h:20
The QKeySequence class encapsulates a key sequence as used by shortcuts.
iterator insert(qsizetype i, parameter_type t)
Definition qlist.h:488
T value(qsizetype i) const
Definition qlist.h:664
qsizetype removeAll(const AT &t)
Definition qlist.h:592
void append(parameter_type t)
Definition qlist.h:458
static QMetaObject::Connection connect(const QObject *sender, const char *signal, const QObject *receiver, const char *member, Qt::ConnectionType=Qt::AutoConnection)
\threadsafe
Definition qobject.cpp:2960
virtual quintptr tag() const
virtual quintptr tag() const
\inmodule QtCore\reentrant
Definition qrect.h:30
\macro QT_RESTRICTED_CAST_FROM_ASCII
Definition qstring.h:129
\inmodule QtGui
Definition qwindow.h:63
QString text
Combined button and popup list for selecting options.
@ UniqueConnection
AudioChannelLayoutTag tag
QList< QDBusMenuItemKeys > QDBusMenuItemKeysList
QList< QDBusMenuItem > QDBusMenuItemList
QHash< int, QDBusPlatformMenuItem * > menuItemsByID
static QT_BEGIN_NAMESPACE int nextDBusID
static bool isSeparator(char c)
Definition qhsts.cpp:280
#define Q_LOGGING_CATEGORY(name,...)
#define qCDebug(category,...)
return ret
GLenum GLenum GLsizei const GLuint * ids
GLenum GLuint id
[7]
GLenum GLenum GLsizei const GLuint GLboolean enabled
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define emit
#define Q_UNUSED(x)
size_t quintptr
Definition qtypes.h:167
#define enabled
QObject::connect nullptr
myObject disconnect()
[26]
QGraphicsItem * item
edit isVisible()
QMenu menu
[5]
qsizetype indexOf(const AT &t, qsizetype from=0) const noexcept
Definition qlist.h:962