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
qwasmwindowstack.cpp
Go to the documentation of this file.
1// Copyright (C) 2022 The Qt Company Ltd.
2// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR GPL-3.0-only
3
4#include "qwasmwindowstack.h"
5
7
9 : m_windowOrderChangedCallback(std::move(windowOrderChangedCallback)),
10 m_regularWindowsBegin(m_windowStack.begin()),
11 m_alwaysOnTopWindowsBegin(m_windowStack.begin())
12{
13}
14
16
18{
19 Q_ASSERT(m_windowStack.count(window) == 0);
20
22 const auto stayOnTopDistance =
23 std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
24 const auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
25 m_windowStack.push_back(window);
26 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance;
27 m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
29 const auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
30 m_alwaysOnTopWindowsBegin = m_windowStack.insert(m_alwaysOnTopWindowsBegin, window) + 1;
31 m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
32 } else {
33 const auto stayOnTopDistance =
34 std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
35 m_regularWindowsBegin = m_windowStack.insert(m_regularWindowsBegin, window) + 1;
36 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance + 1;
37 }
38
39 m_windowOrderChangedCallback();
40}
41
43{
44 Q_ASSERT(m_windowStack.count(window) == 1);
45
46 auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
47 const auto position = getWindowPositionPreference(it);
48 const auto stayOnTopDistance = std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
49 const auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
50
51 m_windowStack.erase(it);
52
53 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance
55 m_regularWindowsBegin = m_windowStack.begin() + regularDistance
57
58 m_windowOrderChangedCallback();
59}
60
62{
63 Q_ASSERT(m_windowStack.count(window) == 1);
64
65 if (window == topWindow())
66 return;
67
68 auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
69 auto itEnd = ([this, position = getWindowPositionPreference(it)]() {
70 switch (position) {
72 return m_windowStack.end();
74 return m_alwaysOnTopWindowsBegin;
76 return m_regularWindowsBegin;
77 }
78 })();
79 std::rotate(it, it + 1, itEnd);
80 m_windowOrderChangedCallback();
81}
82
84{
85 Q_ASSERT(m_windowStack.count(window) == 1);
86
87 if (window == *m_windowStack.begin())
88 return;
89
90 auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
91 auto itBegin = ([this, position = getWindowPositionPreference(it)]() {
92 switch (position) {
94 return m_alwaysOnTopWindowsBegin;
96 return m_regularWindowsBegin;
98 return m_windowStack.begin();
99 }
100 })();
101
102 std::rotate(itBegin, it, it + 1);
103 m_windowOrderChangedCallback();
104}
105
108{
109 auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
110 const auto currentPosition = getWindowPositionPreference(it);
111
112 const auto zones = static_cast<int>(position) - static_cast<int>(currentPosition);
113 Q_ASSERT(zones != 0);
114
115 if (zones < 0) {
116 // Perform right rotation so that the window lands on top of regular windows
117 const auto begin = std::make_reverse_iterator(it + 1);
119 ? std::make_reverse_iterator(m_alwaysOnTopWindowsBegin)
120 : std::make_reverse_iterator(m_regularWindowsBegin);
121 std::rotate(begin, begin + 1, end);
122 if (zones == -2) {
123 ++m_alwaysOnTopWindowsBegin;
124 ++m_regularWindowsBegin;
126 ++m_alwaysOnTopWindowsBegin;
127 } else {
128 ++m_regularWindowsBegin;
129 }
130 } else {
131 // Perform left rotation so that the window lands at the bottom of always on top windows
132 const auto begin = it;
133 const auto end = position == PositionPreference::Regular ? m_regularWindowsBegin
134 : m_alwaysOnTopWindowsBegin;
135 std::rotate(begin, begin + 1, end);
136 if (zones == 2) {
137 --m_alwaysOnTopWindowsBegin;
138 --m_regularWindowsBegin;
140 --m_regularWindowsBegin;
141 } else {
142 --m_alwaysOnTopWindowsBegin;
143 }
144 }
145 m_windowOrderChangedCallback();
146}
147
149{
150 return m_windowStack.rbegin();
151}
152
154{
155 return m_windowStack.rend();
156}
157
159{
160 return m_windowStack.rbegin();
161}
162
164{
165 return m_windowStack.rend();
166}
167
169{
170 return m_windowStack.begin();
171}
172
174{
175 return m_windowStack.end();
176}
177
179{
180 return m_windowStack.empty();
181}
182
184{
185 return m_windowStack.size();
186}
187
189{
190 return m_windowStack.empty() ? nullptr : m_windowStack.last();
191}
192
194QWasmWindowStack::getWindowPositionPreference(StorageType::iterator windowIt) const
195{
196 if (windowIt >= m_alwaysOnTopWindowsBegin)
198 if (windowIt >= m_regularWindowsBegin)
201}
202
qsizetype size() const noexcept
Definition qlist.h:397
T & last()
Definition qlist.h:648
iterator erase(const_iterator begin, const_iterator end)
Definition qlist.h:889
iterator insert(qsizetype i, parameter_type t)
Definition qlist.h:488
bool empty() const noexcept
Definition qlist.h:685
void push_back(parameter_type t)
Definition qlist.h:675
iterator end()
Definition qlist.h:626
qsizetype count() const noexcept
Definition qlist.h:398
reverse_iterator rend()
Definition qlist.h:635
iterator begin()
Definition qlist.h:625
reverse_iterator rbegin()
Definition qlist.h:634
void lower(QWasmWindow *window)
StorageType::reverse_iterator iterator
QWasmWindowStack(WindowOrderChangedCallbackType topWindowChangedCallback)
StorageType::const_reverse_iterator const_iterator
std::function< void()> WindowOrderChangedCallbackType
QWasmWindow * topWindow() const
const_reverse_iterator rbegin() const
void removeWindow(QWasmWindow *window)
const_reverse_iterator rend() const
void raise(QWasmWindow *window)
void pushWindow(QWasmWindow *window, PositionPreference position)
void windowPositionPreferenceChanged(QWasmWindow *window, PositionPreference position)
QSet< QString >::iterator it
Combined button and popup list for selecting options.
static const char zones[]
GLuint GLuint end
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
#define Q_ASSERT(cond)
Definition qrandom.cpp:47
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
QObject::connect nullptr
aWidget window() -> setWindowTitle("New Window Title")
[2]