Qt
Internal/Contributor docs for the Qt SDK. Note: These are NOT official API docs; those are found at https://doc.qt.io/
Toggle main menu visibility
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
// Qt-Security score:significant reason:default
4
5
#
include
"qdbusplatformmenu_p.h"
6
7
#
include
<
QDateTime
>
8
#
include
<
QDebug
>
9
#
include
<
QWindow
>
10
11
QT_BEGIN_NAMESPACE
12
13
Q_LOGGING_CATEGORY(qLcMenu,
"qt.qpa.menu"
)
14
15
static
int
nextDBusID = 1;
16
QHash
<
int
,
QDBusPlatformMenuItem
*>
menuItemsByID
;
17
18
QDBusPlatformMenuItem
::QDBusPlatformMenuItem()
19
: m_subMenu(
nullptr
)
20
, m_role(NoRole)
21
, m_isEnabled(
true
)
22
, m_isVisible(
true
)
23
, m_isSeparator(
false
)
24
, m_isCheckable(
false
)
25
, m_isChecked(
false
)
26
, m_hasExclusiveGroup(
false
)
27
, m_dbusID(nextDBusID++)
28
{
29
menuItemsByID
.insert(m_dbusID,
this
);
30
}
31
32
QDBusPlatformMenuItem
::~
QDBusPlatformMenuItem
()
33
{
34
menuItemsByID
.remove(m_dbusID);
35
if
(m_subMenu)
36
static_cast
<QDBusPlatformMenu *>(m_subMenu)->setContainingMenuItem(
nullptr
);
37
}
38
39
void
QDBusPlatformMenuItem
::
setText
(
const
QString &text)
40
{
41
qCDebug(qLcMenu) << m_dbusID << text;
42
m_text = text;
43
}
44
45
void
QDBusPlatformMenuItem
::
setIcon
(
const
QIcon &icon)
46
{
47
m_icon = icon;
48
}
49
50
/*!
51
\internal
52
Set a submenu under this menu item.
53
*/
54
void
QDBusPlatformMenuItem
::
setMenu
(QPlatformMenu *menu)
55
{
56
if
(m_subMenu)
57
static_cast
<QDBusPlatformMenu *>(m_subMenu)->setContainingMenuItem(
nullptr
);
58
m_subMenu = menu;
59
if
(menu)
60
static_cast
<
QDBusPlatformMenu
*>(menu)
->
setContainingMenuItem
(
this
)
;
61
}
62
63
void
QDBusPlatformMenuItem
::
setEnabled
(
bool
enabled)
64
{
65
m_isEnabled = enabled;
66
}
67
68
void
QDBusPlatformMenuItem
::
setVisible
(
bool
isVisible)
69
{
70
m_isVisible = isVisible;
71
}
72
73
void
QDBusPlatformMenuItem
::
setIsSeparator
(
bool
isSeparator)
74
{
75
m_isSeparator = isSeparator;
76
}
77
78
void
QDBusPlatformMenuItem
::
setRole
(QPlatformMenuItem::MenuRole role)
79
{
80
m_role = role;
81
}
82
83
void
QDBusPlatformMenuItem
::
setCheckable
(
bool
checkable)
84
{
85
m_isCheckable = checkable;
86
}
87
88
void
QDBusPlatformMenuItem
::
setChecked
(
bool
isChecked)
89
{
90
m_isChecked = isChecked;
91
}
92
93
void
QDBusPlatformMenuItem
::
setHasExclusiveGroup
(
bool
hasExclusiveGroup)
94
{
95
m_hasExclusiveGroup = hasExclusiveGroup;
96
}
97
98
#
ifndef
QT_NO_SHORTCUT
99
void
QDBusPlatformMenuItem
::setShortcut(
const
QKeySequence &shortcut)
100
{
101
m_shortcut = shortcut;
102
}
103
#
endif
104
105
void
QDBusPlatformMenuItem
::
trigger
()
106
{
107
emit activated();
108
}
109
110
QDBusPlatformMenuItem
*
QDBusPlatformMenuItem
::
byId
(
int
id)
111
{
112
// We need to check contains because otherwise QHash would insert
113
// a default-constructed nullptr value into menuItemsByID
114
if
(
menuItemsByID
.contains(id))
115
return
menuItemsByID[id];
116
return
nullptr
;
117
}
118
119
QList<
const
QDBusPlatformMenuItem *>
QDBusPlatformMenuItem
::byIds(
const
QList<
int
> &ids)
120
{
121
QList<
const
QDBusPlatformMenuItem *> ret;
122
for
(
int
id : ids) {
123
if
(menuItemsByID.contains(id))
124
ret << menuItemsByID[id];
125
}
126
return
ret;
127
}
128
129
130
QDBusPlatformMenu
::QDBusPlatformMenu()
131
: m_isEnabled(
true
)
132
, m_isVisible(
true
)
133
, m_revision(1)
134
, m_containingMenuItem(
nullptr
)
135
{
136
}
137
138
QDBusPlatformMenu
::~
QDBusPlatformMenu
()
139
{
140
if
(m_containingMenuItem)
141
m_containingMenuItem->setMenu(
nullptr
);
142
}
143
144
void
QDBusPlatformMenu
::
insertMenuItem
(QPlatformMenuItem *menuItem, QPlatformMenuItem *before)
145
{
146
QDBusPlatformMenuItem
*item =
static_cast
<
QDBusPlatformMenuItem
*>(menuItem);
147
QDBusPlatformMenuItem
*beforeItem =
static_cast
<
QDBusPlatformMenuItem
*>(before);
148
int
idx = m_items.indexOf(beforeItem);
149
qCDebug(qLcMenu) << item
->
dbusID
(
)
<< item->text();
150
if
(idx < 0)
151
m_items.append(item);
152
else
153
m_items.insert(idx, item);
154
m_itemsByTag.insert(item->tag(), item);
155
if
(item->menu())
156
syncSubMenu
(
static_cast
<
const
QDBusPlatformMenu
*>(item->menu())
)
;
157
emitUpdated
(
)
;
158
}
159
160
void
QDBusPlatformMenu
::
removeMenuItem
(QPlatformMenuItem *menuItem)
161
{
162
QDBusPlatformMenuItem
*item =
static_cast
<
QDBusPlatformMenuItem
*>(menuItem);
163
m_items.removeAll(item);
164
m_itemsByTag.remove(menuItem->tag());
165
if
(item->menu()) {
166
// disconnect from the signals we connected to in syncSubMenu()
167
const
QDBusPlatformMenu
*menu =
static_cast
<
const
QDBusPlatformMenu
*>(item->menu());
168
disconnect(menu, &
QDBusPlatformMenu
::
propertiesUpdated
,
169
this
, &
QDBusPlatformMenu
::
propertiesUpdated
);
170
disconnect(menu, &QDBusPlatformMenu::updated,
171
this
, &QDBusPlatformMenu::updated);
172
disconnect(menu, &QDBusPlatformMenu::popupRequested,
173
this
, &QDBusPlatformMenu::popupRequested);
174
}
175
emitUpdated
(
)
;
176
}
177
178
void
QDBusPlatformMenu
::
syncSubMenu
(
const
QDBusPlatformMenu
*menu)
179
{
180
// The adaptor is only connected to the propertiesUpdated signal of the top-level
181
// menu, so the submenus should transfer their signals to their parents.
182
connect(menu, &
QDBusPlatformMenu
::
propertiesUpdated
,
183
this
, &
QDBusPlatformMenu
::
propertiesUpdated
, Qt::UniqueConnection);
184
connect(menu, &QDBusPlatformMenu::updated,
185
this
, &QDBusPlatformMenu::updated, Qt::UniqueConnection);
186
connect(menu, &QDBusPlatformMenu::popupRequested,
187
this
, &QDBusPlatformMenu::popupRequested, Qt::UniqueConnection);
188
}
189
190
void
QDBusPlatformMenu
::
syncMenuItem
(QPlatformMenuItem *menuItem)
191
{
192
QDBusPlatformMenuItem
*item =
static_cast
<
QDBusPlatformMenuItem
*>(menuItem);
193
// if a submenu was added to this item, we need to connect to its signals
194
if
(item->menu())
195
syncSubMenu
(
static_cast
<
const
QDBusPlatformMenu
*>(item->menu())
)
;
196
// TODO keep around copies of the QDBusMenuLayoutItems so they can be updated?
197
// or eliminate them by putting dbus streaming operators in this class instead?
198
// or somehow tell the dbusmenu client that something has changed, so it will ask for properties again
199
QDBusMenuItemList
updated;
200
QDBusMenuItemKeysList
removed;
201
updated <<
QDBusMenuItem
(
item
)
;
202
qCDebug(qLcMenu) << updated;
203
emit propertiesUpdated(updated, removed);
204
}
205
206
void
QDBusPlatformMenu
::
emitUpdated
()
207
{
208
if
(m_containingMenuItem)
209
emit updated(++m_revision, m_containingMenuItem->dbusID());
210
else
211
emit updated(++m_revision, 0);
212
}
213
214
void
QDBusPlatformMenu
::
setText
(
const
QString &text)
215
{
216
m_text = text;
217
}
218
219
void
QDBusPlatformMenu
::
setIcon
(
const
QIcon &icon)
220
{
221
m_icon = icon;
222
}
223
224
void
QDBusPlatformMenu
::
setEnabled
(
bool
enabled)
225
{
226
m_isEnabled = enabled;
227
}
228
229
void
QDBusPlatformMenu
::
setVisible
(
bool
isVisible)
230
{
231
m_isVisible = isVisible;
232
}
233
234
void
QDBusPlatformMenu
::
setContainingMenuItem
(
QDBusPlatformMenuItem
*item)
235
{
236
m_containingMenuItem = item;
237
}
238
239
void
QDBusPlatformMenu
::
showPopup
(
const
QWindow *parentWindow,
const
QRect &targetRect,
const
QPlatformMenuItem *item)
240
{
241
Q_UNUSED(parentWindow);
242
Q_UNUSED(targetRect);
243
Q_UNUSED(item);
244
setVisible
(
true
)
;
245
emit popupRequested(m_containingMenuItem->dbusID(), QDateTime::currentMSecsSinceEpoch());
246
}
247
248
QPlatformMenuItem
*
QDBusPlatformMenu
::
menuItemAt
(
int
position)
const
249
{
250
return
m_items.value(position);
251
}
252
253
QPlatformMenuItem
*
QDBusPlatformMenu
::
menuItemForTag
(quintptr tag)
const
254
{
255
return
m_itemsByTag[tag];
256
}
257
258
const
QList
<
QDBusPlatformMenuItem
*>
QDBusPlatformMenu
::
items
()
const
259
{
260
return
m_items;
261
}
262
263
QPlatformMenuItem
*
QDBusPlatformMenu
::
createMenuItem
()
const
264
{
265
QDBusPlatformMenuItem
*ret =
new
QDBusPlatformMenuItem
();
266
return
ret;
267
}
268
269
QPlatformMenu
*
QDBusPlatformMenu
::
createSubMenu
()
const
270
{
271
return
new
QDBusPlatformMenu
;
272
}
273
274
QT_END_NAMESPACE
275
276
#
include
"moc_qdbusplatformmenu_p.cpp"
QDBusMenuItem
Definition
qdbusmenutypes_p.h:36
QDBusMenuItem::QDBusMenuItem
QDBusMenuItem(const QDBusPlatformMenuItem *item)
Definition
qdbusmenutypes.cpp:158
QDBusPlatformMenuItem
Definition
qdbusplatformmenu_p.h:37
QDBusPlatformMenuItem::setText
void setText(const QString &text) override
Definition
qdbusplatformmenu.cpp:39
QDBusPlatformMenuItem::trigger
void trigger()
Definition
qdbusplatformmenu.cpp:105
QDBusPlatformMenuItem::setIsSeparator
void setIsSeparator(bool isSeparator) override
Definition
qdbusplatformmenu.cpp:73
QDBusPlatformMenuItem::dbusID
int dbusID() const
Definition
qdbusplatformmenu_p.h:71
QDBusPlatformMenuItem::byId
static QDBusPlatformMenuItem * byId(int id)
Definition
qdbusplatformmenu.cpp:110
QDBusPlatformMenuItem::setHasExclusiveGroup
void setHasExclusiveGroup(bool hasExclusiveGroup) override
Definition
qdbusplatformmenu.cpp:93
QDBusPlatformMenuItem::setRole
void setRole(MenuRole role) override
Definition
qdbusplatformmenu.cpp:78
QDBusPlatformMenuItem::setEnabled
void setEnabled(bool enabled) override
Definition
qdbusplatformmenu.cpp:63
QDBusPlatformMenuItem::setChecked
void setChecked(bool isChecked) override
Definition
qdbusplatformmenu.cpp:88
QDBusPlatformMenuItem::setVisible
void setVisible(bool isVisible) override
Definition
qdbusplatformmenu.cpp:68
QDBusPlatformMenuItem::~QDBusPlatformMenuItem
~QDBusPlatformMenuItem()
Definition
qdbusplatformmenu.cpp:32
QDBusPlatformMenuItem::setCheckable
void setCheckable(bool checkable) override
Definition
qdbusplatformmenu.cpp:83
QDBusPlatformMenuItem::setIcon
void setIcon(const QIcon &icon) override
Definition
qdbusplatformmenu.cpp:45
QDBusPlatformMenuItem::setMenu
void setMenu(QPlatformMenu *menu) override
Definition
qdbusplatformmenu.cpp:54
QDBusPlatformMenu
Definition
qdbusplatformmenu_p.h:97
QDBusPlatformMenu::setIcon
void setIcon(const QIcon &icon) override
Definition
qdbusplatformmenu.cpp:219
QDBusPlatformMenu::showPopup
void showPopup(const QWindow *parentWindow, const QRect &targetRect, const QPlatformMenuItem *item) override
Definition
qdbusplatformmenu.cpp:239
QDBusPlatformMenu::menuItemForTag
QPlatformMenuItem * menuItemForTag(quintptr tag) const override
Definition
qdbusplatformmenu.cpp:253
QDBusPlatformMenu::createSubMenu
QPlatformMenu * createSubMenu() const override
Definition
qdbusplatformmenu.cpp:269
QDBusPlatformMenu::setEnabled
void setEnabled(bool enabled) override
Definition
qdbusplatformmenu.cpp:224
QDBusPlatformMenu::removeMenuItem
void removeMenuItem(QPlatformMenuItem *menuItem) override
Definition
qdbusplatformmenu.cpp:160
QDBusPlatformMenu::setText
void setText(const QString &text) override
Definition
qdbusplatformmenu.cpp:214
QDBusPlatformMenu::emitUpdated
void emitUpdated()
Definition
qdbusplatformmenu.cpp:206
QDBusPlatformMenu::~QDBusPlatformMenu
~QDBusPlatformMenu()
Definition
qdbusplatformmenu.cpp:138
QDBusPlatformMenu::items
const QList< QDBusPlatformMenuItem * > items() const
Definition
qdbusplatformmenu.cpp:258
QDBusPlatformMenu::insertMenuItem
void insertMenuItem(QPlatformMenuItem *menuItem, QPlatformMenuItem *before) override
Definition
qdbusplatformmenu.cpp:144
QDBusPlatformMenu::setContainingMenuItem
void setContainingMenuItem(QDBusPlatformMenuItem *item)
Definition
qdbusplatformmenu.cpp:234
QDBusPlatformMenu::menuItemAt
QPlatformMenuItem * menuItemAt(int position) const override
Definition
qdbusplatformmenu.cpp:248
QDBusPlatformMenu::setVisible
void setVisible(bool visible) override
Definition
qdbusplatformmenu.cpp:229
QDBusPlatformMenu::propertiesUpdated
void propertiesUpdated(QDBusMenuItemList updatedProps, QDBusMenuItemKeysList removedProps)
QDBusPlatformMenu::syncSubMenu
void syncSubMenu(const QDBusPlatformMenu *menu)
Definition
qdbusplatformmenu.cpp:178
QDBusPlatformMenu::syncMenuItem
void syncMenuItem(QPlatformMenuItem *menuItem) override
Definition
qdbusplatformmenu.cpp:190
QDBusPlatformMenu::createMenuItem
QPlatformMenuItem * createMenuItem() const override
Definition
qdbusplatformmenu.cpp:263
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qsequentialanimationgroup.cpp:47
QDBusMenuItemKeysList
QList< QDBusMenuItemKeys > QDBusMenuItemKeysList
Definition
qdbusmenutypes_p.h:68
QDBusMenuItemList
QList< QDBusMenuItem > QDBusMenuItemList
Definition
qdbusmenutypes_p.h:32
menuItemsByID
QHash< int, QDBusPlatformMenuItem * > menuItemsByID
Definition
qdbusplatformmenu.cpp:16
qtbase
src
gui
platform
unix
dbusmenu
qdbusplatformmenu.cpp
Generated on
for Qt by
1.18.0