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
qquickshortcutcontext.cpp
Go to the documentation of this file.
1
// Copyright (C) 2017 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
#include "
qquickshortcutcontext_p_p.h
"
5
#include "
qquickoverlay_p_p.h
"
6
#include "
qquicktooltip_p.h
"
7
#include <QtQmlModels/private/qtqmlmodels-config_p.h>
8
#if QT_CONFIG(qml_object_model)
9
#include "
qquickmenu_p.h
"
10
#include "
qquickmenu_p_p.h
"
11
#endif
12
#include "
qquickpopup_p.h
"
13
14
#include <QtCore/qloggingcategory.h>
15
#include <QtGui/qguiapplication.h>
16
#include <QtQuick/qquickrendercontrol.h>
17
18
QT_BEGIN_NAMESPACE
19
20
Q_LOGGING_CATEGORY
(lcContextMatcher,
"qt.quick.controls.shortcutcontext.matcher"
)
21
22
static
bool
isBlockedByPopup
(
QQuickItem
*
item
)
23
{
24
if
(!
item
|| !
item
->
window
())
25
return
false
;
26
27
QQuickOverlay
*overlay =
QQuickOverlay::overlay
(
item
->
window
());
28
const
auto
popups =
QQuickOverlayPrivate::get
(overlay)->stackingOrderPopups();
29
for
(
QQuickPopup
*popup : popups) {
30
if
(qobject_cast<QQuickToolTip *>(popup))
31
continue
;
// ignore tooltips (QTBUG-60492)
32
if
(popup->isModal() || popup->closePolicy() & QQuickPopup::CloseOnEscape) {
33
qCDebug
(lcContextMatcher) << popup <<
"is modal or has a CloseOnEscape policy;"
34
<<
"if the following are both true,"
<<
item
<<
"will be blocked by it:"
35
<< (
item
!= popup->popupItem()) << !popup->popupItem()->
isAncestorOf
(
item
);
36
return
item
!= popup->popupItem() && !popup->popupItem()->
isAncestorOf
(
item
);
37
}
38
}
39
40
return
false
;
41
}
42
43
bool
QQuickShortcutContext::matcher
(
QObject
*
obj
,
Qt::ShortcutContext
context
)
44
{
45
QQuickItem
*
item
=
nullptr
;
46
switch
(
context
) {
47
case
Qt::ApplicationShortcut
:
48
return
true
;
49
case
Qt::WindowShortcut
:
50
while
(
obj
&& !
obj
->isWindowType()) {
51
item
=
qobject_cast<QQuickItem *>
(
obj
);
52
if
(
item
&&
item
->
window
()) {
53
obj
=
item
->
window
();
54
break
;
55
}
else
if
(
QQuickPopup
*popup = qobject_cast<QQuickPopup *>(
obj
)) {
56
obj
= popup->
window
();
57
item
= popup->popupItem();
58
59
#if QT_CONFIG(qml_object_model)
60
if
(!
obj
) {
61
// The popup has no associated window (yet). However, sub-menus,
62
// unlike top-level menus, will not have an associated window
63
// until their parent menu is opened. So, check if this is a sub-menu
64
// so that actions within it can grab shortcuts.
65
if
(
auto
*
menu
= qobject_cast<QQuickMenu *>(popup)) {
66
auto
parentMenu =
QQuickMenuPrivate::get
(
menu
)->parentMenu;
67
while
(!
obj
&& parentMenu)
68
obj
= parentMenu->window();
69
}
70
}
71
#endif
72
break
;
73
}
74
obj
=
obj
->parent();
75
}
76
if
(
QWindow
*renderWindow =
QQuickRenderControl::renderWindowFor
(qobject_cast<QQuickWindow *>(
obj
)))
77
obj
= renderWindow;
78
qCDebug
(lcContextMatcher) <<
"obj"
<<
obj
<<
"item"
<<
item
<<
"focusWindow"
<<
QGuiApplication::focusWindow
()
79
<<
"!isBlockedByPopup(item)"
<< !
isBlockedByPopup
(
item
);
80
return
obj
&&
qobject_cast<QWindow*>
(
obj
)->isActive() && !
isBlockedByPopup
(
item
);
81
default
:
82
return
false
;
83
}
84
}
85
86
QT_END_NAMESPACE
QGraphicsItem::window
QGraphicsWidget * window() const
Definition
qgraphicsitem.cpp:1729
QGraphicsItem::isAncestorOf
bool isAncestorOf(const QGraphicsItem *child) const
Returns true if this item is an ancestor of child (i.e., if this item is child's parent,...
Definition
qgraphicsitem.cpp:6399
QGuiApplication::focusWindow
static QWindow * focusWindow()
Returns the QWindow that receives events tied to focus, such as key events.
Definition
qguiapplication.cpp:969
QObject
\inmodule QtCore
Definition
qobject.h:103
QQuickItem
The QQuickItem class provides the most basic of all visual items in \l {Qt Quick}.
Definition
qquickitem.h:63
QQuickMenuPrivate::get
static QQuickMenuPrivate * get(QQuickMenu *menu)
Definition
qquickmenu_p_p.h:38
QQuickOverlayPrivate::get
static QQuickOverlayPrivate * get(QQuickOverlay *overlay)
Definition
qquickoverlay_p_p.h:35
QQuickOverlay
Definition
qquickoverlay_p.h:29
QQuickOverlay::overlay
static QQuickOverlay * overlay(QQuickWindow *window)
Definition
qquickoverlay.cpp:343
QQuickPopup
Definition
qquickpopup_p.h:42
QQuickRenderControl::renderWindowFor
static QWindow * renderWindowFor(QQuickWindow *win, QPoint *offset=nullptr)
Returns the real window that win is being rendered to, if any.
Definition
qquickrendercontrol.cpp:546
QWindow
\inmodule QtGui
Definition
qwindow.h:63
QT_BEGIN_NAMESPACE
Combined button and popup list for selecting options.
Definition
qstandardpaths_haiku.cpp:21
QT_END_NAMESPACE
Definition
qsharedpointer.cpp:1590
Qt::ShortcutContext
ShortcutContext
Definition
qnamespace.h:1292
Qt::WindowShortcut
@ WindowShortcut
Definition
qnamespace.h:1294
Qt::ApplicationShortcut
@ ApplicationShortcut
Definition
qnamespace.h:1295
context
static void * context
Definition
qandroidaudiosource.cpp:42
Q_LOGGING_CATEGORY
#define Q_LOGGING_CATEGORY(name,...)
Definition
qloggingcategory.h:112
qCDebug
#define qCDebug(category,...)
Definition
qloggingcategory.h:123
obj
GLhandleARB obj
[2]
Definition
qopenglext.h:4164
qobject_cast< QQuickItem * >
QQuickItem * qobject_cast< QQuickItem * >(QObject *o)
Definition
qquickitem.h:492
qquickmenu_p.h
qquickmenu_p_p.h
qquickoverlay_p_p.h
qquickpopup_p.h
isBlockedByPopup
static QT_BEGIN_NAMESPACE bool isBlockedByPopup(QQuickItem *item)
Definition
qquickshortcutcontext.cpp:22
qquickshortcutcontext_p_p.h
qquicktooltip_p.h
qobject_cast< QWindow * >
QWindow * qobject_cast< QWindow * >(QObject *o)
Definition
qwindow.h:367
item
QGraphicsItem * item
Definition
src_gui_graphicsview_qgraphicsitem.cpp:107
menu
QMenu menu
[5]
Definition
src_gui_widgets_qmenu.cpp:35
QQuickShortcutContext::matcher
static bool matcher(QObject *object, Qt::ShortcutContext context)
Definition
qquickshortcutcontext.cpp:43
qtdeclarative
src
quicktemplates
qquickshortcutcontext.cpp
Generated by
1.10.0