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());
55template <
typename Window>
57 bool insertAtRegionBegin,
bool callCallbacks)
62 auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
63 auto stayOnTopDistance = std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
65 if (
position == PositionPreference::StayAboveTransientParent) {
68 std::find(m_windowStack.begin(), m_windowStack.end(),
window->transientParent());
69 if (
it == m_windowStack.end()) {
70 qWarning() <<
"QWasmWindowStack<Window>::pushWindow - missing parent"
71 <<
window->transientParent();
72 pushWindow(
window, PositionPreference::Regular, insertAtRegionBegin, callCallbacks);
75 if (insertAtRegionBegin) {
76 if (
it >= m_alwaysOnTopWindowsBegin) {
78 }
else if (
it >= m_regularWindowsBegin) {
86 if (
it >= m_alwaysOnTopWindowsBegin) {
87 it = m_windowStack.end();
88 }
else if (
it >= m_regularWindowsBegin) {
89 it = m_alwaysOnTopWindowsBegin;
92 it = m_regularWindowsBegin;
100 }
else if (
position == PositionPreference::StayOnTop) {
101 if (insertAtRegionBegin)
102 m_windowStack.insert(m_alwaysOnTopWindowsBegin,
window);
104 m_windowStack.insert(m_windowStack.end(),
window);
106 }
else if (
position == PositionPreference::Regular) {
108 if (insertAtRegionBegin)
109 m_windowStack.insert(m_regularWindowsBegin,
window);
111 m_windowStack.insert(m_alwaysOnTopWindowsBegin,
window);
118 if (insertAtRegionBegin)
119 m_windowStack.insert(m_windowStack.begin(),
window);
121 m_windowStack.insert(m_regularWindowsBegin,
window);
124 m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
125 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance;
128 m_windowOrderChangedCallback();
134template <
typename Window>
140 auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
141 auto stayOnTopDistance = std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
143 auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
147 if (
it < m_regularWindowsBegin)
149 if (
it < m_alwaysOnTopWindowsBegin)
152 m_windowStack.erase(
it);
154 m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
155 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance;
158 m_windowOrderChangedCallback();
164template <
typename Window>
168 m_windowOrderChangedCallback();
171template <
typename Window>
178 const auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
179 const auto itEnd = ([
this,
it]() {
180 if (
it < m_regularWindowsBegin)
181 return m_regularWindowsBegin;
182 if (
it < m_alwaysOnTopWindowsBegin)
183 return m_alwaysOnTopWindowsBegin;
184 return m_windowStack.end();
190 std::rotate(
it,
it + 1, itEnd);
193 std::vector<Window *> windowsToRaise;
195 for (
auto trit = m_windowStack.begin(); trit != m_windowStack.end(); ++trit) {
196 const auto w = *trit;
198 (getWindowPositionPreference(trit) == PositionPreference::StayAboveTransientParent) &&
199 (
w->transientParent() ==
window)) {
200 windowsToRaise.push_back(
w);
205 for (
const auto w : windowsToRaise)
214template <
typename Window>
218 m_windowOrderChangedCallback();
221template <
typename Window>
228 const auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
229 const auto itBegin = ([
this,
it]() {
230 if (
it >= m_alwaysOnTopWindowsBegin)
231 return m_alwaysOnTopWindowsBegin;
232 if (
it >= m_regularWindowsBegin)
233 return m_regularWindowsBegin;
234 return m_windowStack.begin();
240 std::rotate(itBegin,
it,
it + 1);
243 std::vector<Window *> windowsToLower;
245 for (
auto trit = m_windowStack.begin(); trit != m_windowStack.end(); ++trit) {
246 const auto w = *trit;
248 (getWindowPositionPreference(trit) == PositionPreference::StayAboveTransientParent) &&
249 (
w->transientParent() ==
window)) {
250 windowsToLower.push_back(
w);
255 for (
const auto w : windowsToLower)
264template <
typename Window>
271 auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
272 const auto currentPosition = getWindowPositionPreference(
it);
276 }
else if (currentPosition == PositionPreference::StayAboveTransientParent) {
278 const bool isStayOnBottom (
it < m_regularWindowsBegin);
279 const bool isRegular( !isStayOnBottom && (
it < m_alwaysOnTopWindowsBegin));
280 const bool isStayOnTop(!isStayOnBottom && !isRegular);
282 if (isStayOnBottom && (
position == PositionPreference::StayOnBottom))
284 else if (isRegular && (
position == PositionPreference::Regular))
286 else if (isStayOnTop && (
position == PositionPreference::StayOnTop))
290 removeWindow(current,
false);
291 pushWindow(current,
position,
false,
false);
292 m_windowOrderChangedCallback();
295 const bool insertAtRegionBegin = (
296 (currentPosition != PositionPreference::StayAboveTransientParent) &&
297 (
position != PositionPreference::StayAboveTransientParent) &&
298 ((currentPosition == PositionPreference::StayOnBottom) ||
299 (
position == PositionPreference::StayOnTop)));
302 removeWindow(current,
false);
303 pushWindow(current,
position, insertAtRegionBegin,
false);
304 m_windowOrderChangedCallback();
310template <
typename Window>
313 return m_windowStack.rbegin();
316template <
typename Window>
319 return m_windowStack.rend();
322template <
typename Window>
325 return m_windowStack.rbegin();
328template <
typename Window>
331 return m_windowStack.rend();
334template <
typename Window>
338 return m_windowStack.begin();
341template <
typename Window>
345 return m_windowStack.end();
348template <
typename Window>
351 return m_windowStack.empty();
354template <
typename Window>
357 return m_windowStack.size();
360template <
typename Window>
363 return m_windowStack.empty() ?
nullptr : m_windowStack.last();
366template <
typename Window>
367bool QWasmWindowStack<Window>::shouldBeAboveTransientParentFlags(Qt::WindowFlags
flags)
const
380template <
typename Window>
381bool QWasmWindowStack<Window>::shouldBeAboveTransientParent(
const Window *
window)
const
383 if (!
window->transientParent())
389 if (shouldBeAboveTransientParentFlags(
window->windowFlags()))
395template <
typename Window>
398 typename StorageType::const_iterator windowIt,
bool testStayAbove)
const
400 Q_ASSERT(windowIt != m_windowStack.end());
401 Q_ASSERT(m_windowStack.contains(*windowIt));
403 if (testStayAbove && shouldBeAboveTransientParent(
window))
404 return PositionPreference::StayAboveTransientParent;
405 if (windowIt >= m_alwaysOnTopWindowsBegin)
406 return PositionPreference::StayOnTop;
407 if (windowIt >= m_regularWindowsBegin)
408 return PositionPreference::Regular;
409 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)