1 /***************************************************************************
2 * Copyright (C) 2014 by Emmanuel Pescosta <emmanuelpescosta099@gmail.com> *
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. *
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. *
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 ***************************************************************************/
20 #include "dolphintabpage.h"
22 #include "dolphinviewcontainer.h"
23 #include "dolphin_generalsettings.h"
26 #include <QVBoxLayout>
28 DolphinTabPage::DolphinTabPage(const QUrl
&primaryUrl
, const QUrl
&secondaryUrl
, QWidget
* parent
) :
30 m_primaryViewActive(true),
31 m_splitViewEnabled(false)
33 QVBoxLayout
* layout
= new QVBoxLayout(this);
34 layout
->setSpacing(0);
37 m_splitter
= new QSplitter(Qt::Horizontal
, this);
38 m_splitter
->setChildrenCollapsible(false);
39 layout
->addWidget(m_splitter
);
41 // Create a new primary view
42 m_primaryViewContainer
= createViewContainer(primaryUrl
);
43 connect(m_primaryViewContainer
->view(), &DolphinView::urlChanged
,
44 this, &DolphinTabPage::activeViewUrlChanged
);
45 connect(m_primaryViewContainer
->view(), &DolphinView::redirection
,
46 this, &DolphinTabPage::slotViewUrlRedirection
);
48 m_splitter
->addWidget(m_primaryViewContainer
);
49 m_primaryViewContainer
->show();
51 if (secondaryUrl
.isValid() || GeneralSettings::splitView()) {
52 // Provide a secondary view, if the given secondary url is valid or if the
53 // startup settings are set this way (use the url of the primary view).
54 m_splitViewEnabled
= true;
55 const QUrl
& url
= secondaryUrl
.isValid() ? secondaryUrl
: primaryUrl
;
56 m_secondaryViewContainer
= createViewContainer(url
);
57 m_splitter
->addWidget(m_secondaryViewContainer
);
58 m_secondaryViewContainer
->show();
61 m_primaryViewContainer
->setActive(true);
64 bool DolphinTabPage::primaryViewActive() const
66 return m_primaryViewActive
;
69 bool DolphinTabPage::splitViewEnabled() const
71 return m_splitViewEnabled
;
74 void DolphinTabPage::setSplitViewEnabled(bool enabled
, bool stash
/*= false*/)
76 if (m_splitViewEnabled
!= enabled
) {
77 m_splitViewEnabled
= enabled
;
81 url
= QUrl("stash:/");
83 url
= m_primaryViewContainer
->url();
85 m_secondaryViewContainer
= createViewContainer(url
);
87 const bool placesSelectorVisible
= m_primaryViewContainer
->urlNavigator()->isPlacesSelectorVisible();
88 m_secondaryViewContainer
->urlNavigator()->setPlacesSelectorVisible(placesSelectorVisible
);
90 m_splitter
->addWidget(m_secondaryViewContainer
);
91 m_secondaryViewContainer
->show();
92 m_secondaryViewContainer
->setActive(true);
94 // Close the view which is active.
95 DolphinViewContainer
* view
= activeViewContainer();
96 if (m_primaryViewActive
) {
97 // If the primary view is active, we have to swap the pointers
98 // because the secondary view will be the new primary view.
99 qSwap(m_primaryViewContainer
, m_secondaryViewContainer
);
101 m_primaryViewContainer
->setActive(true);
108 DolphinViewContainer
* DolphinTabPage::primaryViewContainer() const
110 return m_primaryViewContainer
;
113 DolphinViewContainer
* DolphinTabPage::secondaryViewContainer() const
115 return m_secondaryViewContainer
;
118 DolphinViewContainer
* DolphinTabPage::activeViewContainer() const
120 return m_primaryViewActive
? m_primaryViewContainer
:
121 m_secondaryViewContainer
;
124 KFileItemList
DolphinTabPage::selectedItems() const
126 KFileItemList items
= m_primaryViewContainer
->view()->selectedItems();
127 if (m_splitViewEnabled
) {
128 items
+= m_secondaryViewContainer
->view()->selectedItems();
133 int DolphinTabPage::selectedItemsCount() const
135 int selectedItemsCount
= m_primaryViewContainer
->view()->selectedItemsCount();
136 if (m_splitViewEnabled
) {
137 selectedItemsCount
+= m_secondaryViewContainer
->view()->selectedItemsCount();
139 return selectedItemsCount
;
142 void DolphinTabPage::markUrlsAsSelected(const QList
<QUrl
>& urls
)
144 m_primaryViewContainer
->view()->markUrlsAsSelected(urls
);
145 if (m_splitViewEnabled
) {
146 m_secondaryViewContainer
->view()->markUrlsAsSelected(urls
);
150 void DolphinTabPage::markUrlAsCurrent(const QUrl
& url
)
152 m_primaryViewContainer
->view()->markUrlAsCurrent(url
);
153 if (m_splitViewEnabled
) {
154 m_secondaryViewContainer
->view()->markUrlAsCurrent(url
);
158 void DolphinTabPage::setPlacesSelectorVisible(bool visible
)
160 m_primaryViewContainer
->urlNavigator()->setPlacesSelectorVisible(visible
);
161 if (m_splitViewEnabled
) {
162 m_secondaryViewContainer
->urlNavigator()->setPlacesSelectorVisible(visible
);
166 void DolphinTabPage::refreshViews()
168 m_primaryViewContainer
->readSettings();
169 if (m_splitViewEnabled
) {
170 m_secondaryViewContainer
->readSettings();
174 QByteArray
DolphinTabPage::saveState() const
177 QDataStream
stream(&state
, QIODevice::WriteOnly
);
179 stream
<< quint32(2); // Tab state version
181 stream
<< m_splitViewEnabled
;
183 stream
<< m_primaryViewContainer
->url();
184 stream
<< m_primaryViewContainer
->urlNavigator()->isUrlEditable();
185 m_primaryViewContainer
->view()->saveState(stream
);
187 if (m_splitViewEnabled
) {
188 stream
<< m_secondaryViewContainer
->url();
189 stream
<< m_secondaryViewContainer
->urlNavigator()->isUrlEditable();
190 m_secondaryViewContainer
->view()->saveState(stream
);
193 stream
<< m_primaryViewActive
;
194 stream
<< m_splitter
->saveState();
199 void DolphinTabPage::restoreState(const QByteArray
& state
)
201 if (state
.isEmpty()) {
205 QByteArray sd
= state
;
206 QDataStream
stream(&sd
, QIODevice::ReadOnly
);
208 // Read the version number of the tab state and check if the version is supported.
212 // The version of the tab state isn't supported, we can't restore it.
216 bool isSplitViewEnabled
= false;
217 stream
>> isSplitViewEnabled
;
218 setSplitViewEnabled(isSplitViewEnabled
);
221 stream
>> primaryUrl
;
222 m_primaryViewContainer
->setUrl(primaryUrl
);
223 bool primaryUrlEditable
;
224 stream
>> primaryUrlEditable
;
225 m_primaryViewContainer
->urlNavigator()->setUrlEditable(primaryUrlEditable
);
226 m_primaryViewContainer
->view()->restoreState(stream
);
228 if (isSplitViewEnabled
) {
230 stream
>> secondaryUrl
;
231 m_secondaryViewContainer
->setUrl(secondaryUrl
);
232 bool secondaryUrlEditable
;
233 stream
>> secondaryUrlEditable
;
234 m_secondaryViewContainer
->urlNavigator()->setUrlEditable(secondaryUrlEditable
);
235 m_secondaryViewContainer
->view()->restoreState(stream
);
238 stream
>> m_primaryViewActive
;
239 if (m_primaryViewActive
) {
240 m_primaryViewContainer
->setActive(true);
242 Q_ASSERT(m_splitViewEnabled
);
243 m_secondaryViewContainer
->setActive(true);
246 QByteArray splitterState
;
247 stream
>> splitterState
;
248 m_splitter
->restoreState(splitterState
);
251 void DolphinTabPage::restoreStateV1(const QByteArray
& state
)
253 if (state
.isEmpty()) {
257 QByteArray sd
= state
;
258 QDataStream
stream(&sd
, QIODevice::ReadOnly
);
260 bool isSplitViewEnabled
= false;
261 stream
>> isSplitViewEnabled
;
262 setSplitViewEnabled(isSplitViewEnabled
);
265 stream
>> primaryUrl
;
266 m_primaryViewContainer
->setUrl(primaryUrl
);
267 bool primaryUrlEditable
;
268 stream
>> primaryUrlEditable
;
269 m_primaryViewContainer
->urlNavigator()->setUrlEditable(primaryUrlEditable
);
271 if (isSplitViewEnabled
) {
273 stream
>> secondaryUrl
;
274 m_secondaryViewContainer
->setUrl(secondaryUrl
);
275 bool secondaryUrlEditable
;
276 stream
>> secondaryUrlEditable
;
277 m_secondaryViewContainer
->urlNavigator()->setUrlEditable(secondaryUrlEditable
);
280 stream
>> m_primaryViewActive
;
281 if (m_primaryViewActive
) {
282 m_primaryViewContainer
->setActive(true);
284 Q_ASSERT(m_splitViewEnabled
);
285 m_secondaryViewContainer
->setActive(true);
288 QByteArray splitterState
;
289 stream
>> splitterState
;
290 m_splitter
->restoreState(splitterState
);
293 void DolphinTabPage::slotViewActivated()
295 const DolphinView
* oldActiveView
= activeViewContainer()->view();
297 // Set the view, which was active before, to inactive
298 // and update the active view type.
299 if (m_splitViewEnabled
) {
300 activeViewContainer()->setActive(false);
301 m_primaryViewActive
= !m_primaryViewActive
;
303 m_primaryViewActive
= true;
306 const DolphinView
* newActiveView
= activeViewContainer()->view();
308 if (newActiveView
!= oldActiveView
) {
309 disconnect(oldActiveView
, &DolphinView::urlChanged
,
310 this, &DolphinTabPage::activeViewUrlChanged
);
311 disconnect(oldActiveView
, &DolphinView::redirection
,
312 this, &DolphinTabPage::slotViewUrlRedirection
);
313 connect(newActiveView
, &DolphinView::urlChanged
,
314 this, &DolphinTabPage::activeViewUrlChanged
);
315 connect(newActiveView
, &DolphinView::redirection
,
316 this, &DolphinTabPage::slotViewUrlRedirection
);
319 emit
activeViewUrlChanged(activeViewContainer()->url());
320 emit
activeViewChanged(activeViewContainer());
323 void DolphinTabPage::slotViewUrlRedirection(const QUrl
& oldUrl
, const QUrl
& newUrl
)
327 emit
activeViewUrlChanged(newUrl
);
330 void DolphinTabPage::switchActiveView()
332 if (!m_splitViewEnabled
) {
335 if (m_primaryViewActive
) {
336 m_secondaryViewContainer
->setActive(true);
338 m_primaryViewContainer
->setActive(true);
342 DolphinViewContainer
* DolphinTabPage::createViewContainer(const QUrl
& url
) const
344 DolphinViewContainer
* container
= new DolphinViewContainer(url
, m_splitter
);
345 container
->setActive(false);
347 const DolphinView
* view
= container
->view();
348 connect(view
, &DolphinView::activated
,
349 this, &DolphinTabPage::slotViewActivated
);
351 connect(view
, &DolphinView::toggleActiveViewRequested
,
352 this, &DolphinTabPage::switchActiveView
);