]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphintabpage.cpp
Remove unused #include
[dolphin.git] / src / dolphintabpage.cpp
1 /***************************************************************************
2 * Copyright (C) 2014 by Emmanuel Pescosta <emmanuelpescosta099@gmail.com> *
3 * *
4 * This program is free software; you can redistribute it and/or modify *
5 * it under the terms of the GNU General Public License as published by *
6 * the Free Software Foundation; either version 2 of the License, or *
7 * (at your option) any later version. *
8 * *
9 * This program is distributed in the hope that it will be useful, *
10 * but WITHOUT ANY WARRANTY; without even the implied warranty of *
11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
12 * GNU General Public License for more details. *
13 * *
14 * You should have received a copy of the GNU General Public License *
15 * along with this program; if not, write to the *
16 * Free Software Foundation, Inc., *
17 * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA *
18 ***************************************************************************/
19
20 #include "dolphintabpage.h"
21
22 #include "dolphin_generalsettings.h"
23 #include "dolphinviewcontainer.h"
24
25 #include <QSplitter>
26 #include <QVBoxLayout>
27
28 DolphinTabPage::DolphinTabPage(const QUrl &primaryUrl, const QUrl &secondaryUrl, QWidget* parent) :
29 QWidget(parent),
30 m_primaryViewActive(true),
31 m_splitViewEnabled(false),
32 m_active(true)
33 {
34 QVBoxLayout* layout = new QVBoxLayout(this);
35 layout->setSpacing(0);
36 layout->setMargin(0);
37
38 m_splitter = new QSplitter(Qt::Horizontal, this);
39 m_splitter->setChildrenCollapsible(false);
40 layout->addWidget(m_splitter);
41
42 // Create a new primary view
43 m_primaryViewContainer = createViewContainer(primaryUrl);
44 connect(m_primaryViewContainer->view(), &DolphinView::urlChanged,
45 this, &DolphinTabPage::activeViewUrlChanged);
46 connect(m_primaryViewContainer->view(), &DolphinView::redirection,
47 this, &DolphinTabPage::slotViewUrlRedirection);
48
49 m_splitter->addWidget(m_primaryViewContainer);
50 m_primaryViewContainer->show();
51
52 if (secondaryUrl.isValid() || GeneralSettings::splitView()) {
53 // Provide a secondary view, if the given secondary url is valid or if the
54 // startup settings are set this way (use the url of the primary view).
55 m_splitViewEnabled = true;
56 const QUrl& url = secondaryUrl.isValid() ? secondaryUrl : primaryUrl;
57 m_secondaryViewContainer = createViewContainer(url);
58 m_splitter->addWidget(m_secondaryViewContainer);
59 m_secondaryViewContainer->show();
60 }
61
62 m_primaryViewContainer->setActive(true);
63 }
64
65 bool DolphinTabPage::primaryViewActive() const
66 {
67 return m_primaryViewActive;
68 }
69
70 bool DolphinTabPage::splitViewEnabled() const
71 {
72 return m_splitViewEnabled;
73 }
74
75 void DolphinTabPage::setSplitViewEnabled(bool enabled, const QUrl &secondaryUrl)
76 {
77 if (m_splitViewEnabled != enabled) {
78 m_splitViewEnabled = enabled;
79
80 if (enabled) {
81 const QUrl& url = (secondaryUrl.isEmpty()) ? m_primaryViewContainer->url() : secondaryUrl;
82 m_secondaryViewContainer = createViewContainer(url);
83
84 const bool placesSelectorVisible = m_primaryViewContainer->urlNavigator()->isPlacesSelectorVisible();
85 m_secondaryViewContainer->urlNavigator()->setPlacesSelectorVisible(placesSelectorVisible);
86
87 m_splitter->addWidget(m_secondaryViewContainer);
88 m_secondaryViewContainer->show();
89 m_secondaryViewContainer->setActive(true);
90 } else {
91 // Close the view which is active.
92 DolphinViewContainer* view = activeViewContainer();
93 if (m_primaryViewActive) {
94 // If the primary view is active, we have to swap the pointers
95 // because the secondary view will be the new primary view.
96 qSwap(m_primaryViewContainer, m_secondaryViewContainer);
97 }
98 m_primaryViewContainer->setActive(true);
99 view->close();
100 view->deleteLater();
101 }
102 }
103 }
104
105 DolphinViewContainer* DolphinTabPage::primaryViewContainer() const
106 {
107 return m_primaryViewContainer;
108 }
109
110 DolphinViewContainer* DolphinTabPage::secondaryViewContainer() const
111 {
112 return m_secondaryViewContainer;
113 }
114
115 DolphinViewContainer* DolphinTabPage::activeViewContainer() const
116 {
117 return m_primaryViewActive ? m_primaryViewContainer :
118 m_secondaryViewContainer;
119 }
120
121 KFileItemList DolphinTabPage::selectedItems() const
122 {
123 KFileItemList items = m_primaryViewContainer->view()->selectedItems();
124 if (m_splitViewEnabled) {
125 items += m_secondaryViewContainer->view()->selectedItems();
126 }
127 return items;
128 }
129
130 int DolphinTabPage::selectedItemsCount() const
131 {
132 int selectedItemsCount = m_primaryViewContainer->view()->selectedItemsCount();
133 if (m_splitViewEnabled) {
134 selectedItemsCount += m_secondaryViewContainer->view()->selectedItemsCount();
135 }
136 return selectedItemsCount;
137 }
138
139 void DolphinTabPage::markUrlsAsSelected(const QList<QUrl>& urls)
140 {
141 m_primaryViewContainer->view()->markUrlsAsSelected(urls);
142 if (m_splitViewEnabled) {
143 m_secondaryViewContainer->view()->markUrlsAsSelected(urls);
144 }
145 }
146
147 void DolphinTabPage::markUrlAsCurrent(const QUrl& url)
148 {
149 m_primaryViewContainer->view()->markUrlAsCurrent(url);
150 if (m_splitViewEnabled) {
151 m_secondaryViewContainer->view()->markUrlAsCurrent(url);
152 }
153 }
154
155 void DolphinTabPage::setPlacesSelectorVisible(bool visible)
156 {
157 m_primaryViewContainer->urlNavigator()->setPlacesSelectorVisible(visible);
158 if (m_splitViewEnabled) {
159 m_secondaryViewContainer->urlNavigator()->setPlacesSelectorVisible(visible);
160 }
161 }
162
163 void DolphinTabPage::refreshViews()
164 {
165 m_primaryViewContainer->readSettings();
166 if (m_splitViewEnabled) {
167 m_secondaryViewContainer->readSettings();
168 }
169 }
170
171 QByteArray DolphinTabPage::saveState() const
172 {
173 QByteArray state;
174 QDataStream stream(&state, QIODevice::WriteOnly);
175
176 stream << quint32(2); // Tab state version
177
178 stream << m_splitViewEnabled;
179
180 stream << m_primaryViewContainer->url();
181 stream << m_primaryViewContainer->urlNavigator()->isUrlEditable();
182 m_primaryViewContainer->view()->saveState(stream);
183
184 if (m_splitViewEnabled) {
185 stream << m_secondaryViewContainer->url();
186 stream << m_secondaryViewContainer->urlNavigator()->isUrlEditable();
187 m_secondaryViewContainer->view()->saveState(stream);
188 }
189
190 stream << m_primaryViewActive;
191 stream << m_splitter->saveState();
192
193 return state;
194 }
195
196 void DolphinTabPage::restoreState(const QByteArray& state)
197 {
198 if (state.isEmpty()) {
199 return;
200 }
201
202 QByteArray sd = state;
203 QDataStream stream(&sd, QIODevice::ReadOnly);
204
205 // Read the version number of the tab state and check if the version is supported.
206 quint32 version = 0;
207 stream >> version;
208 if (version != 2) {
209 // The version of the tab state isn't supported, we can't restore it.
210 return;
211 }
212
213 bool isSplitViewEnabled = false;
214 stream >> isSplitViewEnabled;
215 setSplitViewEnabled(isSplitViewEnabled);
216
217 QUrl primaryUrl;
218 stream >> primaryUrl;
219 m_primaryViewContainer->setUrl(primaryUrl);
220 bool primaryUrlEditable;
221 stream >> primaryUrlEditable;
222 m_primaryViewContainer->urlNavigator()->setUrlEditable(primaryUrlEditable);
223 m_primaryViewContainer->view()->restoreState(stream);
224
225 if (isSplitViewEnabled) {
226 QUrl secondaryUrl;
227 stream >> secondaryUrl;
228 m_secondaryViewContainer->setUrl(secondaryUrl);
229 bool secondaryUrlEditable;
230 stream >> secondaryUrlEditable;
231 m_secondaryViewContainer->urlNavigator()->setUrlEditable(secondaryUrlEditable);
232 m_secondaryViewContainer->view()->restoreState(stream);
233 }
234
235 stream >> m_primaryViewActive;
236 if (m_primaryViewActive) {
237 m_primaryViewContainer->setActive(true);
238 } else {
239 Q_ASSERT(m_splitViewEnabled);
240 m_secondaryViewContainer->setActive(true);
241 }
242
243 QByteArray splitterState;
244 stream >> splitterState;
245 m_splitter->restoreState(splitterState);
246 }
247
248 void DolphinTabPage::restoreStateV1(const QByteArray& state)
249 {
250 if (state.isEmpty()) {
251 return;
252 }
253
254 QByteArray sd = state;
255 QDataStream stream(&sd, QIODevice::ReadOnly);
256
257 bool isSplitViewEnabled = false;
258 stream >> isSplitViewEnabled;
259 setSplitViewEnabled(isSplitViewEnabled);
260
261 QUrl primaryUrl;
262 stream >> primaryUrl;
263 m_primaryViewContainer->setUrl(primaryUrl);
264 bool primaryUrlEditable;
265 stream >> primaryUrlEditable;
266 m_primaryViewContainer->urlNavigator()->setUrlEditable(primaryUrlEditable);
267
268 if (isSplitViewEnabled) {
269 QUrl secondaryUrl;
270 stream >> secondaryUrl;
271 m_secondaryViewContainer->setUrl(secondaryUrl);
272 bool secondaryUrlEditable;
273 stream >> secondaryUrlEditable;
274 m_secondaryViewContainer->urlNavigator()->setUrlEditable(secondaryUrlEditable);
275 }
276
277 stream >> m_primaryViewActive;
278 if (m_primaryViewActive) {
279 m_primaryViewContainer->setActive(true);
280 } else {
281 Q_ASSERT(m_splitViewEnabled);
282 m_secondaryViewContainer->setActive(true);
283 }
284
285 QByteArray splitterState;
286 stream >> splitterState;
287 m_splitter->restoreState(splitterState);
288 }
289
290 void DolphinTabPage::setActive(bool active)
291 {
292 if (active) {
293 m_active = active;
294 } else {
295 // we should bypass changing active view in split mode
296 m_active = !m_splitViewEnabled;
297 }
298 // we want view to fire activated when goes from false to true
299 activeViewContainer()->setActive(active);
300 }
301
302 void DolphinTabPage::slotViewActivated()
303 {
304 const DolphinView* oldActiveView = activeViewContainer()->view();
305
306 // Set the view, which was active before, to inactive
307 // and update the active view type, if tab is active
308 if (m_active) {
309 if (m_splitViewEnabled) {
310 activeViewContainer()->setActive(false);
311 m_primaryViewActive = !m_primaryViewActive;
312 } else {
313 m_primaryViewActive = true;
314 }
315 }
316
317 const DolphinView* newActiveView = activeViewContainer()->view();
318
319 if (newActiveView != oldActiveView) {
320 disconnect(oldActiveView, &DolphinView::urlChanged,
321 this, &DolphinTabPage::activeViewUrlChanged);
322 disconnect(oldActiveView, &DolphinView::redirection,
323 this, &DolphinTabPage::slotViewUrlRedirection);
324 connect(newActiveView, &DolphinView::urlChanged,
325 this, &DolphinTabPage::activeViewUrlChanged);
326 connect(newActiveView, &DolphinView::redirection,
327 this, &DolphinTabPage::slotViewUrlRedirection);
328 }
329
330 emit activeViewUrlChanged(activeViewContainer()->url());
331 emit activeViewChanged(activeViewContainer());
332 }
333
334 void DolphinTabPage::slotViewUrlRedirection(const QUrl& oldUrl, const QUrl& newUrl)
335 {
336 Q_UNUSED(oldUrl);
337
338 emit activeViewUrlChanged(newUrl);
339 }
340
341 void DolphinTabPage::switchActiveView()
342 {
343 if (!m_splitViewEnabled) {
344 return;
345 }
346 if (m_primaryViewActive) {
347 m_secondaryViewContainer->setActive(true);
348 } else {
349 m_primaryViewContainer->setActive(true);
350 }
351 }
352
353 DolphinViewContainer* DolphinTabPage::createViewContainer(const QUrl& url) const
354 {
355 DolphinViewContainer* container = new DolphinViewContainer(url, m_splitter);
356 container->setActive(false);
357
358 const DolphinView* view = container->view();
359 connect(view, &DolphinView::activated,
360 this, &DolphinTabPage::slotViewActivated);
361
362 connect(view, &DolphinView::toggleActiveViewRequested,
363 this, &DolphinTabPage::switchActiveView);
364
365 return container;
366 }