8QWasmWindowStack::QWasmWindowStack(WindowOrderChangedCallbackType windowOrderChangedCallback)
9 : m_windowOrderChangedCallback(std::move(windowOrderChangedCallback)),
10 m_regularWindowsBegin(m_windowStack.begin()),
11 m_alwaysOnTopWindowsBegin(m_windowStack.begin())
17void QWasmWindowStack::pushWindow(QWasmWindow *window, PositionPreference position)
19 Q_ASSERT(m_windowStack.count(window) == 0);
21 if (position == PositionPreference::StayOnTop) {
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;
28 }
else if (position == PositionPreference::Regular) {
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;
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;
39 m_windowOrderChangedCallback();
42void QWasmWindowStack::removeWindow(QWasmWindow *window)
44 Q_ASSERT(m_windowStack.count(window) == 1);
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);
51 m_windowStack.erase(it);
53 m_alwaysOnTopWindowsBegin = m_windowStack.begin() + stayOnTopDistance
54 - (position != PositionPreference::StayOnTop ? 1 : 0);
55 m_regularWindowsBegin = m_windowStack.begin() + regularDistance
56 - (position == PositionPreference::StayOnBottom ? 1 : 0);
58 m_windowOrderChangedCallback();
61void QWasmWindowStack::raise(QWasmWindow *window)
63 Q_ASSERT(m_windowStack.count(window) == 1);
65 if (window == topWindow())
68 auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
69 auto itEnd = ([
this, position = getWindowPositionPreference(it)]() {
71 case PositionPreference::StayOnTop:
72 return m_windowStack.end();
73 case PositionPreference::Regular:
74 return m_alwaysOnTopWindowsBegin;
75 case PositionPreference::StayOnBottom:
76 return m_regularWindowsBegin;
79 std::rotate(it, it + 1, itEnd);
80 m_windowOrderChangedCallback();
83void QWasmWindowStack::lower(QWasmWindow *window)
85 Q_ASSERT(m_windowStack.count(window) == 1);
87 if (window == *m_windowStack.begin())
90 auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
91 auto itBegin = ([
this, position = getWindowPositionPreference(it)]() {
93 case PositionPreference::StayOnTop:
94 return m_alwaysOnTopWindowsBegin;
95 case PositionPreference::Regular:
96 return m_regularWindowsBegin;
97 case PositionPreference::StayOnBottom:
98 return m_windowStack.begin();
102 std::rotate(itBegin, it, it + 1);
103 m_windowOrderChangedCallback();
106void QWasmWindowStack::windowPositionPreferenceChanged(QWasmWindow *window,
107 PositionPreference position)
109 auto it = std::find(m_windowStack.begin(), m_windowStack.end(), window);
110 const auto currentPosition = getWindowPositionPreference(it);
112 const auto zones =
static_cast<
int>(position) -
static_cast<
int>(currentPosition);
113 Q_ASSERT(zones != 0);
117 const auto begin = std::make_reverse_iterator(it + 1);
118 const auto end = position == PositionPreference::Regular
119 ? std::make_reverse_iterator(m_alwaysOnTopWindowsBegin)
120 : std::make_reverse_iterator(m_regularWindowsBegin);
121 std::rotate(begin, begin + 1, end);
123 ++m_alwaysOnTopWindowsBegin;
124 ++m_regularWindowsBegin;
125 }
else if (position == PositionPreference::Regular) {
126 ++m_alwaysOnTopWindowsBegin;
128 ++m_regularWindowsBegin;
132 const auto begin = it;
133 const auto end = position == PositionPreference::Regular ? m_regularWindowsBegin
134 : m_alwaysOnTopWindowsBegin;
135 std::rotate(begin, begin + 1, end);
137 --m_alwaysOnTopWindowsBegin;
138 --m_regularWindowsBegin;
139 }
else if (position == PositionPreference::Regular) {
140 --m_regularWindowsBegin;
142 --m_alwaysOnTopWindowsBegin;
145 m_windowOrderChangedCallback();