4#ifndef QWASMWINDOWSTACK_INC
5#define QWASMWINDOWSTACK_INC
7template <
typename Window>
8QWasmWindowStack<Window>::QWasmWindowStack(
9 WindowOrderChangedCallbackType windowOrderChangedCallback)
10 : m_windowOrderChangedCallback(
std::move(windowOrderChangedCallback)),
11 m_regularWindowsBegin(m_windowStack.
begin()),
12 m_alwaysOnTopWindowsBegin(m_windowStack.
begin())
17template <
typename Window>
23template <
typename Window>
24void QWasmWindowStack<Window>::invariant()
26 Q_ASSERT(m_regularWindowsBegin >= m_windowStack.begin());
27 Q_ASSERT(m_regularWindowsBegin <= m_alwaysOnTopWindowsBegin);
28 Q_ASSERT(m_alwaysOnTopWindowsBegin <= m_windowStack.end());
48template <
typename Window>
50 bool insertAtRegionBegin,
bool callCallbacks)
55 auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
56 auto stayOnTopDistance = std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
58 if (
position == PositionPreference::StayAboveTransientParent) {
61 std::find(m_windowStack.begin(), m_windowStack.end(),
window->transientParent());
62 if (
it == m_windowStack.end()) {
63 qWarning() <<
"QWasmWindowStack<Window>::pushWindow - missing parent"
64 <<
window->transientParent();
65 pushWindow(
window, PositionPreference::Regular, insertAtRegionBegin, callCallbacks);
68 if (insertAtRegionBegin) {
69 if (
it >= m_alwaysOnTopWindowsBegin) {
71 }
else if (
it >= m_regularWindowsBegin) {
79 if (
it >= m_alwaysOnTopWindowsBegin) {
80 it = m_windowStack.end();
81 }
else if (
it >= m_regularWindowsBegin) {
82 it = m_alwaysOnTopWindowsBegin;
85 it = m_regularWindowsBegin;
93 }
else if (
position == PositionPreference::StayOnTop) {
94 if (insertAtRegionBegin)
95 m_windowStack.insert(m_alwaysOnTopWindowsBegin,
window);
97 m_windowStack.insert(m_windowStack.end(),
window);
99 }
else if (
position == PositionPreference::Regular) {
101 if (insertAtRegionBegin)
102 m_windowStack.insert(m_regularWindowsBegin,
window);
104 m_windowStack.insert(m_alwaysOnTopWindowsBegin,
window);
111 if (insertAtRegionBegin)
112 m_windowStack.insert(m_windowStack.begin(),
window);
114 m_windowStack.insert(m_regularWindowsBegin,
window);
117 m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
118 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance;
121 m_windowOrderChangedCallback();
127template <
typename Window>
133 auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
134 auto stayOnTopDistance = std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
136 auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
140 if (
it < m_regularWindowsBegin)
142 if (
it < m_alwaysOnTopWindowsBegin)
145 m_windowStack.erase(
it);
147 m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
148 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance;
151 m_windowOrderChangedCallback();
157template <
typename Window>
161 m_windowOrderChangedCallback();
164template <
typename Window>
171 const auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
172 const auto itEnd = ([
this,
it]() {
173 if (
it < m_regularWindowsBegin)
174 return m_regularWindowsBegin;
175 if (
it < m_alwaysOnTopWindowsBegin)
176 return m_alwaysOnTopWindowsBegin;
177 return m_windowStack.end();
183 std::rotate(
it,
it + 1, itEnd);
186 std::vector<Window *> windowsToRaise;
188 for (
auto trit = m_windowStack.begin(); trit != m_windowStack.end(); ++trit) {
189 const auto w = *trit;
191 (getWindowPositionPreference(trit) == PositionPreference::StayAboveTransientParent) &&
192 (
w->transientParent() ==
window)) {
193 windowsToRaise.push_back(
w);
198 for (
const auto w : windowsToRaise)
206template <
typename Window>
210 m_windowOrderChangedCallback();
213template <
typename Window>
220 const auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
221 const auto itBegin = ([
this,
it]() {
222 if (
it >= m_alwaysOnTopWindowsBegin)
223 return m_alwaysOnTopWindowsBegin;
224 if (
it >= m_regularWindowsBegin)
225 return m_regularWindowsBegin;
226 return m_windowStack.begin();
232 std::rotate(itBegin,
it,
it + 1);
235 std::vector<Window *> windowsToLower;
237 for (
auto trit = m_windowStack.begin(); trit != m_windowStack.end(); ++trit) {
238 const auto w = *trit;
240 (getWindowPositionPreference(trit) == PositionPreference::StayAboveTransientParent) &&
241 (
w->transientParent() ==
window)) {
242 windowsToLower.push_back(
w);
247 for (
const auto w : windowsToLower)
255template <
typename Window>
261 auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
262 const auto currentPosition = getWindowPositionPreference(
it);
266 }
else if (currentPosition == PositionPreference::StayAboveTransientParent) {
268 const bool isStayOnBottom (
it < m_regularWindowsBegin);
269 const bool isRegular( !isStayOnBottom && (
it < m_alwaysOnTopWindowsBegin));
270 const bool isStayOnTop(!isStayOnBottom && !isRegular);
272 if (isStayOnBottom && (
position == PositionPreference::StayOnBottom))
274 else if (isRegular && (
position == PositionPreference::Regular))
276 else if (isStayOnTop && (
position == PositionPreference::StayOnTop))
280 removeWindow(current,
false);
281 pushWindow(current,
position,
false,
false);
282 m_windowOrderChangedCallback();
285 const bool insertAtRegionBegin = (
286 (currentPosition != PositionPreference::StayAboveTransientParent) &&
287 (
position != PositionPreference::StayAboveTransientParent) &&
288 ((currentPosition == PositionPreference::StayOnBottom) ||
289 (
position == PositionPreference::StayOnTop)));
292 removeWindow(current,
false);
293 pushWindow(current,
position, insertAtRegionBegin,
false);
294 m_windowOrderChangedCallback();
299template <
typename Window>
302 return m_windowStack.rbegin();
305template <
typename Window>
308 return m_windowStack.rend();
311template <
typename Window>
314 return m_windowStack.rbegin();
317template <
typename Window>
320 return m_windowStack.rend();
323template <
typename Window>
327 return m_windowStack.begin();
330template <
typename Window>
334 return m_windowStack.end();
337template <
typename Window>
340 return m_windowStack.empty();
343template <
typename Window>
346 return m_windowStack.size();
349template <
typename Window>
352 return m_windowStack.empty() ?
nullptr : m_windowStack.last();
355template <
typename Window>
356bool QWasmWindowStack<Window>::shouldBeAboveTransientParentFlags(Qt::WindowFlags
flags)
const
369template <
typename Window>
370bool QWasmWindowStack<Window>::shouldBeAboveTransientParent(
const Window *
window)
const
372 if (!
window->transientParent())
378 if (shouldBeAboveTransientParentFlags(
window->windowFlags()))
384template <
typename Window>
387 typename StorageType::const_iterator windowIt,
bool testStayAbove)
const
390 if (testStayAbove && shouldBeAboveTransientParent(
window))
391 return PositionPreference::StayAboveTransientParent;
392 if (windowIt >= m_alwaysOnTopWindowsBegin)
393 return PositionPreference::StayOnTop;
394 if (windowIt >= m_regularWindowsBegin)
395 return PositionPreference::Regular;
396 return PositionPreference::StayOnBottom;
void removeWindow(Window *window, bool callCallbacks=true)
void windowPositionPreferenceChanged(Window *window, PositionPreference position)
typename StorageType::const_reverse_iterator const_iterator
const_reverse_iterator rbegin() const
typename StorageType::const_iterator const_reverse_iterator
Window * topWindow() const
typename StorageType::reverse_iterator iterator
const_reverse_iterator rend() const
void lower(Window *window)
void pushWindow(Window *window, PositionPreference position, bool insertAtRegionBegin=false, bool callCallbacks=true)
void raise(Window *window)
PositionPreference getWindowPositionPreference(typename StorageType::const_iterator windowIt, bool testStayAbove=true) const
[Window class with invokable method]
GLfloat GLfloat GLfloat w
[0]
static qreal position(const QQuickItem *item, QQuickAnchors::Anchor anchorLine)
QtPrivate::QRegularExpressionMatchIteratorRangeBasedForIterator begin(const QRegularExpressionMatchIterator &iterator)
QJSValueIterator it(object)