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 (
it >= m_alwaysOnTopWindowsBegin)
70 else if (
it >= m_regularWindowsBegin)
76 m_windowStack.insert(
it + 1,
window);
78 }
else if (
position == PositionPreference::StayOnTop) {
79 if (insertAtRegionBegin)
80 m_windowStack.insert(m_alwaysOnTopWindowsBegin,
window);
82 m_windowStack.insert(m_windowStack.end(),
window);
84 }
else if (
position == PositionPreference::Regular) {
86 if (insertAtRegionBegin)
87 m_windowStack.insert(m_regularWindowsBegin,
window);
89 m_windowStack.insert(m_alwaysOnTopWindowsBegin,
window);
96 if (insertAtRegionBegin)
97 m_windowStack.insert(m_windowStack.begin(),
window);
99 m_windowStack.insert(m_regularWindowsBegin,
window);
102 m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
103 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance;
106 m_windowOrderChangedCallback();
112template <
typename Window>
118 auto regularDistance = std::distance(m_windowStack.begin(), m_regularWindowsBegin);
119 auto stayOnTopDistance = std::distance(m_windowStack.begin(), m_alwaysOnTopWindowsBegin);
121 auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
125 if (
it < m_regularWindowsBegin)
127 if (
it < m_alwaysOnTopWindowsBegin)
130 m_windowStack.erase(
it);
132 m_regularWindowsBegin = m_windowStack.begin() + regularDistance;
133 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance;
136 m_windowOrderChangedCallback();
142template <
typename Window>
146 m_windowOrderChangedCallback();
149template <
typename Window>
156 const auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
157 const auto itEnd = ([
this,
it]() {
158 if (
it < m_regularWindowsBegin)
159 return m_regularWindowsBegin;
160 if (
it < m_alwaysOnTopWindowsBegin)
161 return m_alwaysOnTopWindowsBegin;
162 return m_windowStack.end();
168 std::rotate(
it,
it + 1, itEnd);
171 std::vector<Window *> windowsToRaise;
173 for (
auto trit = m_windowStack.begin(); trit != m_windowStack.end(); ++trit) {
174 const auto w = *trit;
176 (getWindowPositionPreference(trit) == PositionPreference::StayAboveTransientParent) &&
177 (
w->transientParent() ==
window)) {
178 windowsToRaise.push_back(
w);
183 for (
const auto w : windowsToRaise)
191template <
typename Window>
195 m_windowOrderChangedCallback();
198template <
typename Window>
205 const auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
206 const auto itBegin = ([
this,
it]() {
207 if (
it >= m_alwaysOnTopWindowsBegin)
208 return m_alwaysOnTopWindowsBegin;
209 if (
it >= m_regularWindowsBegin)
210 return m_regularWindowsBegin;
211 return m_windowStack.begin();
217 std::rotate(itBegin,
it,
it + 1);
220 std::vector<Window *> windowsToLower;
222 for (
auto trit = m_windowStack.begin(); trit != m_windowStack.end(); ++trit) {
223 const auto w = *trit;
225 (getWindowPositionPreference(trit) == PositionPreference::StayAboveTransientParent) &&
226 (
w->transientParent() ==
window)) {
227 windowsToLower.push_back(
w);
232 for (
const auto w : windowsToLower)
240template <
typename Window>
246 auto it = std::find(m_windowStack.begin(), m_windowStack.end(),
window);
247 const auto currentPosition = getWindowPositionPreference(
it);
251 }
else if (currentPosition == PositionPreference::StayAboveTransientParent) {
253 const bool isStayOnBottom (
it < m_regularWindowsBegin);
254 const bool isRegular( !isStayOnBottom && (
it < m_alwaysOnTopWindowsBegin));
255 const bool isStayOnTop(!isStayOnBottom && !isRegular);
257 if (isStayOnBottom && (
position == PositionPreference::StayOnBottom))
259 else if (isRegular && (
position == PositionPreference::Regular))
261 else if (isStayOnTop && (
position == PositionPreference::StayOnTop))
265 removeWindow(current,
false);
266 pushWindow(current,
position,
false,
false);
267 m_windowOrderChangedCallback();
270 const bool insertAtRegionBegin = (
271 (currentPosition != PositionPreference::StayAboveTransientParent) &&
272 (
position != PositionPreference::StayAboveTransientParent) &&
273 ((currentPosition == PositionPreference::StayOnBottom) ||
274 (
position == PositionPreference::StayOnTop)));
277 removeWindow(current,
false);
278 pushWindow(current,
position, insertAtRegionBegin,
false);
279 m_windowOrderChangedCallback();
284template <
typename Window>
287 return m_windowStack.rbegin();
290template <
typename Window>
293 return m_windowStack.rend();
296template <
typename Window>
299 return m_windowStack.rbegin();
302template <
typename Window>
305 return m_windowStack.rend();
308template <
typename Window>
312 return m_windowStack.begin();
315template <
typename Window>
319 return m_windowStack.end();
322template <
typename Window>
325 return m_windowStack.empty();
328template <
typename Window>
331 return m_windowStack.size();
334template <
typename Window>
337 return m_windowStack.empty() ?
nullptr : m_windowStack.last();
340template <
typename Window>
341bool QWasmWindowStack<Window>::shouldBeAboveTransientParentFlags(Qt::WindowFlags
flags)
const
354template <
typename Window>
355bool QWasmWindowStack<Window>::shouldBeAboveTransientParent(
const Window *
window)
const
357 if (!
window->transientParent())
363 if (shouldBeAboveTransientParentFlags(
window->windowFlags()))
369template <
typename Window>
372 typename StorageType::const_iterator windowIt,
bool testStayAbove)
const
375 if (testStayAbove && shouldBeAboveTransientParent(
window))
376 return PositionPreference::StayAboveTransientParent;
377 if (windowIt >= m_alwaysOnTopWindowsBegin)
378 return PositionPreference::StayOnTop;
379 if (windowIt >= m_regularWindowsBegin)
380 return PositionPreference::Regular;
381 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)