Changeset View
Changeset View
Standalone View
Standalone View
src/ViewSplitter.cpp
Show All 22 Lines | |||||
23 | #include "ViewSplitter.h" | 23 | #include "ViewSplitter.h" | ||
24 | 24 | | |||
25 | // Qt | 25 | // Qt | ||
26 | 26 | | |||
27 | // Konsole | 27 | // Konsole | ||
28 | #include "ViewContainer.h" | 28 | #include "ViewContainer.h" | ||
29 | 29 | | |||
30 | using Konsole::ViewSplitter; | 30 | using Konsole::ViewSplitter; | ||
31 | using Konsole::ViewContainer; | 31 | using Konsole::TabbedViewContainer; | ||
32 | 32 | | |||
33 | ViewSplitter::ViewSplitter(QWidget *parent) : | 33 | ViewSplitter::ViewSplitter(QWidget *parent) : | ||
34 | QSplitter(parent), | 34 | QSplitter(parent), | ||
35 | _containers(QList<ViewContainer *>()), | 35 | _containers(QList<TabbedViewContainer *>()), | ||
36 | _recursiveSplitting(true) | 36 | _recursiveSplitting(true) | ||
37 | { | 37 | { | ||
38 | } | 38 | } | ||
39 | 39 | | |||
40 | void ViewSplitter::childEmpty(ViewSplitter *splitter) | 40 | void ViewSplitter::childEmpty(ViewSplitter *splitter) | ||
41 | { | 41 | { | ||
42 | delete splitter; | 42 | delete splitter; | ||
43 | 43 | | |||
44 | if (count() == 0) { | 44 | if (count() == 0) { | ||
45 | emit empty(this); | 45 | emit empty(this); | ||
46 | } | 46 | } | ||
47 | } | 47 | } | ||
48 | 48 | | |||
49 | void ViewSplitter::adjustContainerSize(ViewContainer *container, int percentage) | 49 | void ViewSplitter::adjustContainerSize(TabbedViewContainer *container, int percentage) | ||
50 | { | 50 | { | ||
51 | int containerIndex = indexOf(container->containerWidget()); | 51 | int containerIndex = indexOf(container); | ||
52 | 52 | | |||
53 | Q_ASSERT(containerIndex != -1); | 53 | Q_ASSERT(containerIndex != -1); | ||
54 | 54 | | |||
55 | QList<int> containerSizes = sizes(); | 55 | QList<int> containerSizes = sizes(); | ||
56 | 56 | | |||
57 | const int oldSize = containerSizes[containerIndex]; | 57 | const int oldSize = containerSizes[containerIndex]; | ||
58 | const int newSize = static_cast<int>(oldSize * (1.0 + percentage / 100.0)); | 58 | const int newSize = static_cast<int>(oldSize * (1.0 + percentage / 100.0)); | ||
59 | 59 | | |||
Show All 20 Lines | 79 | while ((splitter == nullptr) && (widget != nullptr)) { | |||
80 | splitter = qobject_cast<ViewSplitter *>(widget); | 80 | splitter = qobject_cast<ViewSplitter *>(widget); | ||
81 | widget = widget->parentWidget(); | 81 | widget = widget->parentWidget(); | ||
82 | } | 82 | } | ||
83 | 83 | | |||
84 | Q_ASSERT(splitter); | 84 | Q_ASSERT(splitter); | ||
85 | return splitter; | 85 | return splitter; | ||
86 | } | 86 | } | ||
87 | 87 | | |||
88 | void ViewSplitter::registerContainer(ViewContainer *container) | 88 | void ViewSplitter::registerContainer(TabbedViewContainer *container) | ||
89 | { | 89 | { | ||
90 | _containers << container; | 90 | _containers << container; | ||
91 | // Connecting to container::destroyed() using the new-style connection | 91 | // Connecting to container::destroyed() using the new-style connection | ||
92 | // syntax causes a crash at exit. I don't know why. Using the old-style | 92 | // syntax causes a crash at exit. I don't know why. Using the old-style | ||
93 | // syntax works. | 93 | // syntax works. | ||
94 | //connect(container , static_cast<void(ViewContainer::*)(ViewContainer*)>(&Konsole::ViewContainer::destroyed) , this , &Konsole::ViewSplitter::containerDestroyed); | 94 | //connect(container , static_cast<void(ViewContainer::*)(ViewContainer*)>(&Konsole::ViewContainer::destroyed) , this , &Konsole::ViewSplitter::containerDestroyed); | ||
95 | //connect(container , &Konsole::ViewContainer::empty , this , &Konsole::ViewSplitter::containerEmpty); | 95 | //connect(container , &Konsole::ViewContainer::empty , this , &Konsole::ViewSplitter::containerEmpty); | ||
96 | connect(container, SIGNAL(destroyed(ViewContainer*)), this, | 96 | connect(container, SIGNAL(destroyed(TabbedViewContainer*)), this, | ||
97 | SLOT(containerDestroyed(ViewContainer*))); | 97 | SLOT(containerDestroyed(TabbedViewContainer*))); | ||
98 | connect(container, SIGNAL(empty(ViewContainer*)), this, SLOT(containerEmpty(ViewContainer*))); | 98 | connect(container, SIGNAL(empty(TabbedViewContainer*)), this, SLOT(containerEmpty(TabbedViewContainer*))); | ||
99 | } | 99 | } | ||
100 | 100 | | |||
101 | void ViewSplitter::unregisterContainer(ViewContainer *container) | 101 | void ViewSplitter::unregisterContainer(TabbedViewContainer *container) | ||
102 | { | 102 | { | ||
103 | _containers.removeAll(container); | 103 | _containers.removeAll(container); | ||
104 | disconnect(container, nullptr, this, nullptr); | 104 | disconnect(container, nullptr, this, nullptr); | ||
105 | } | 105 | } | ||
106 | 106 | | |||
107 | void ViewSplitter::updateSizes() | 107 | void ViewSplitter::updateSizes() | ||
108 | { | 108 | { | ||
109 | int space; | 109 | int space; | ||
Show All 19 Lines | 128 | { | |||
129 | _recursiveSplitting = recursive; | 129 | _recursiveSplitting = recursive; | ||
130 | } | 130 | } | ||
131 | 131 | | |||
132 | bool ViewSplitter::recursiveSplitting() const | 132 | bool ViewSplitter::recursiveSplitting() const | ||
133 | { | 133 | { | ||
134 | return _recursiveSplitting; | 134 | return _recursiveSplitting; | ||
135 | } | 135 | } | ||
136 | 136 | | |||
137 | void ViewSplitter::removeContainer(ViewContainer *container) | 137 | void ViewSplitter::removeContainer(TabbedViewContainer *container) | ||
138 | { | 138 | { | ||
139 | Q_ASSERT(containers().contains(container)); | 139 | Q_ASSERT(containers().contains(container)); | ||
140 | 140 | | |||
141 | unregisterContainer(container); | 141 | unregisterContainer(container); | ||
142 | } | 142 | } | ||
143 | 143 | | |||
144 | void ViewSplitter::addContainer(ViewContainer *container, Qt::Orientation containerOrientation) | 144 | void ViewSplitter::addContainer(TabbedViewContainer *container, Qt::Orientation containerOrientation) | ||
145 | { | 145 | { | ||
146 | ViewSplitter *splitter = activeSplitter(); | 146 | ViewSplitter *splitter = activeSplitter(); | ||
147 | 147 | | |||
148 | if (splitter->count() < 2 | 148 | if (splitter->count() < 2 | ||
149 | || containerOrientation == splitter->orientation() | 149 | || containerOrientation == splitter->orientation() | ||
150 | || !_recursiveSplitting) { | 150 | || !_recursiveSplitting) { | ||
151 | splitter->registerContainer(container); | 151 | splitter->registerContainer(container); | ||
152 | splitter->addWidget(container->containerWidget()); | 152 | splitter->addWidget(container); | ||
153 | 153 | | |||
154 | if (splitter->orientation() != containerOrientation) { | 154 | if (splitter->orientation() != containerOrientation) { | ||
155 | splitter->setOrientation(containerOrientation); | 155 | splitter->setOrientation(containerOrientation); | ||
156 | } | 156 | } | ||
157 | 157 | | |||
158 | splitter->updateSizes(); | 158 | splitter->updateSizes(); | ||
159 | } else { | 159 | } else { | ||
160 | auto newSplitter = new ViewSplitter(this); | 160 | auto newSplitter = new ViewSplitter(this); | ||
161 | connect(newSplitter, &Konsole::ViewSplitter::empty, splitter, | 161 | connect(newSplitter, &Konsole::ViewSplitter::empty, splitter, | ||
162 | &Konsole::ViewSplitter::childEmpty); | 162 | &Konsole::ViewSplitter::childEmpty); | ||
163 | 163 | | |||
164 | ViewContainer *oldContainer = splitter->activeContainer(); | 164 | TabbedViewContainer *oldContainer = splitter->activeContainer(); | ||
165 | const int oldContainerIndex = splitter->indexOf(oldContainer->containerWidget()); | 165 | const int oldContainerIndex = splitter->indexOf(oldContainer); | ||
166 | 166 | | |||
167 | splitter->unregisterContainer(oldContainer); | 167 | splitter->unregisterContainer(oldContainer); | ||
168 | 168 | | |||
169 | newSplitter->registerContainer(oldContainer); | 169 | newSplitter->registerContainer(oldContainer); | ||
170 | newSplitter->registerContainer(container); | 170 | newSplitter->registerContainer(container); | ||
171 | 171 | | |||
172 | newSplitter->addWidget(oldContainer->containerWidget()); | 172 | newSplitter->addWidget(oldContainer); | ||
173 | newSplitter->addWidget(container->containerWidget()); | 173 | newSplitter->addWidget(container); | ||
174 | newSplitter->setOrientation(containerOrientation); | 174 | newSplitter->setOrientation(containerOrientation); | ||
175 | newSplitter->updateSizes(); | 175 | newSplitter->updateSizes(); | ||
176 | newSplitter->show(); | 176 | newSplitter->show(); | ||
177 | 177 | | |||
178 | splitter->insertWidget(oldContainerIndex, newSplitter); | 178 | splitter->insertWidget(oldContainerIndex, newSplitter); | ||
179 | } | 179 | } | ||
180 | } | 180 | } | ||
181 | 181 | | |||
182 | void ViewSplitter::containerEmpty(ViewContainer * /*container*/) | 182 | void ViewSplitter::containerEmpty(TabbedViewContainer * /*container*/) | ||
183 | { | 183 | { | ||
184 | int children = 0; | 184 | int children = 0; | ||
185 | foreach (ViewContainer *container, _containers) { | 185 | foreach (TabbedViewContainer *container, _containers) { | ||
186 | children += container->views().count(); | 186 | children += container->count(); | ||
187 | } | 187 | } | ||
188 | 188 | | |||
189 | if (children == 0) { | 189 | if (children == 0) { | ||
190 | emit allContainersEmpty(); | 190 | emit allContainersEmpty(); | ||
191 | } | 191 | } | ||
192 | } | 192 | } | ||
193 | 193 | | |||
194 | void ViewSplitter::containerDestroyed(ViewContainer *container) | 194 | void ViewSplitter::containerDestroyed(TabbedViewContainer *container) | ||
195 | { | 195 | { | ||
196 | Q_ASSERT(_containers.contains(container)); | 196 | Q_ASSERT(_containers.contains(container)); | ||
197 | 197 | | |||
198 | _containers.removeAll(container); | 198 | _containers.removeAll(container); | ||
199 | 199 | | |||
200 | if (count() == 0) { | 200 | if (count() == 0) { | ||
201 | emit empty(this); | 201 | emit empty(this); | ||
202 | } | 202 | } | ||
203 | } | 203 | } | ||
204 | 204 | | |||
205 | void ViewSplitter::activateNextContainer() | 205 | void ViewSplitter::activateNextContainer() | ||
206 | { | 206 | { | ||
207 | ViewContainer *active = activeContainer(); | 207 | TabbedViewContainer *active = activeContainer(); | ||
208 | 208 | | |||
209 | int index = _containers.indexOf(active); | 209 | int index = _containers.indexOf(active); | ||
210 | 210 | | |||
211 | if (index == -1) { | 211 | if (index == -1) { | ||
212 | return; | 212 | return; | ||
213 | } | 213 | } | ||
214 | 214 | | |||
215 | if (index == _containers.count() - 1) { | 215 | if (index == _containers.count() - 1) { | ||
216 | index = 0; | 216 | index = 0; | ||
217 | } else { | 217 | } else { | ||
218 | index++; | 218 | index++; | ||
219 | } | 219 | } | ||
220 | 220 | | |||
221 | setActiveContainer(_containers.at(index)); | 221 | setActiveContainer(_containers.at(index)); | ||
222 | } | 222 | } | ||
223 | 223 | | |||
224 | void ViewSplitter::activatePreviousContainer() | 224 | void ViewSplitter::activatePreviousContainer() | ||
225 | { | 225 | { | ||
226 | ViewContainer *active = activeContainer(); | 226 | TabbedViewContainer *active = activeContainer(); | ||
227 | 227 | | |||
228 | int index = _containers.indexOf(active); | 228 | int index = _containers.indexOf(active); | ||
229 | 229 | | |||
230 | if (index == 0) { | 230 | if (index == 0) { | ||
231 | index = _containers.count() - 1; | 231 | index = _containers.count() - 1; | ||
232 | } else { | 232 | } else { | ||
233 | index--; | 233 | index--; | ||
234 | } | 234 | } | ||
235 | 235 | | |||
236 | setActiveContainer(_containers.at(index)); | 236 | setActiveContainer(_containers.at(index)); | ||
237 | } | 237 | } | ||
238 | 238 | | |||
239 | void ViewSplitter::setActiveContainer(ViewContainer *container) | 239 | void ViewSplitter::setActiveContainer(TabbedViewContainer *container) | ||
240 | { | 240 | { | ||
241 | QWidget *activeView = container->activeView(); | 241 | QWidget *activeView = container->currentWidget(); | ||
242 | 242 | | |||
243 | if (activeView != nullptr) { | 243 | if (activeView != nullptr) { | ||
244 | activeView->setFocus(Qt::OtherFocusReason); | 244 | activeView->setFocus(Qt::OtherFocusReason); | ||
245 | } | 245 | } | ||
246 | } | 246 | } | ||
247 | 247 | | |||
248 | ViewContainer *ViewSplitter::activeContainer() const | 248 | TabbedViewContainer *ViewSplitter::activeContainer() const | ||
249 | { | 249 | { | ||
250 | if (QWidget *focusW = focusWidget()) { | 250 | if (QWidget *focusW = focusWidget()) { | ||
251 | ViewContainer *focusContainer = nullptr; | 251 | TabbedViewContainer *focusContainer = nullptr; | ||
252 | 252 | | |||
253 | while (focusW != nullptr) { | 253 | while (focusW != nullptr) { | ||
254 | foreach (ViewContainer *container, _containers) { | 254 | foreach (TabbedViewContainer *container, _containers) { | ||
255 | if (container->containerWidget() == focusW) { | 255 | if (container == focusW) { | ||
256 | focusContainer = container; | 256 | focusContainer = container; | ||
257 | break; | 257 | break; | ||
258 | } | 258 | } | ||
259 | } | 259 | } | ||
260 | focusW = focusW->parentWidget(); | 260 | focusW = focusW->parentWidget(); | ||
261 | } | 261 | } | ||
262 | 262 | | |||
263 | if (focusContainer != nullptr) { | 263 | if (focusContainer != nullptr) { | ||
Show All 16 Lines |