]>
cloud.milkyroute.net Git - dolphin.git/blob - src/dolphintabpage.cpp
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"
27 DolphinTabPage::DolphinTabPage(const KUrl
& primaryUrl
, const KUrl
& secondaryUrl
, QWidget
* parent
) :
29 m_primaryViewActive(true),
30 m_splitViewEnabled(false)
32 QVBoxLayout
* layout
= new QVBoxLayout(this);
33 layout
->setSpacing(0);
36 m_splitter
= new QSplitter(Qt::Horizontal
, this);
37 m_splitter
->setChildrenCollapsible(false);
38 layout
->addWidget(m_splitter
);
40 // Create a new primary view
41 m_primaryViewContainer
= createViewContainer(primaryUrl
);
42 connect(m_primaryViewContainer
->view(), SIGNAL(urlChanged(KUrl
)),
43 this, SIGNAL(activeViewUrlChanged(KUrl
)));
44 connect(m_primaryViewContainer
->view(), SIGNAL(redirection(KUrl
,KUrl
)),
45 this, SLOT(slotViewUrlRedirection(KUrl
,KUrl
)));
47 m_splitter
->addWidget(m_primaryViewContainer
);
48 m_primaryViewContainer
->show();
50 if (secondaryUrl
.isValid() || GeneralSettings::splitView()) {
51 // Provide a secondary view, if the given secondary url is valid or if the
52 // startup settings are set this way (use the url of the primary view).
53 m_splitViewEnabled
= true;
54 const KUrl
& url
= secondaryUrl
.isValid() ? secondaryUrl
: primaryUrl
;
55 m_secondaryViewContainer
= createViewContainer(url
);
56 m_splitter
->addWidget(m_secondaryViewContainer
);
57 m_secondaryViewContainer
->show();
60 m_primaryViewContainer
->setActive(true);
63 bool DolphinTabPage::primaryViewActive() const
65 return m_primaryViewActive
;
68 bool DolphinTabPage::splitViewEnabled() const
70 return m_splitViewEnabled
;
73 void DolphinTabPage::setSplitViewEnabled(bool enabled
)
75 if (m_splitViewEnabled
!= enabled
) {
76 m_splitViewEnabled
= enabled
;
79 const KUrl
& url
= m_primaryViewContainer
->url();
80 m_secondaryViewContainer
= createViewContainer(url
);
82 const bool placesSelectorVisible
= m_primaryViewContainer
->urlNavigator()->isPlacesSelectorVisible();
83 m_secondaryViewContainer
->urlNavigator()->setPlacesSelectorVisible(placesSelectorVisible
);
85 m_splitter
->addWidget(m_secondaryViewContainer
);
86 m_secondaryViewContainer
->show();
87 m_secondaryViewContainer
->setActive(true);
89 // Close the view which is active.
90 DolphinViewContainer
* view
= activeViewContainer();
91 if (m_primaryViewActive
) {
92 // If the primary view is active, we have to swap the pointers
93 // because the secondary view will be the new primary view.
94 qSwap(m_primaryViewContainer
, m_secondaryViewContainer
);
96 m_primaryViewContainer
->setActive(true);
103 DolphinViewContainer
* DolphinTabPage::primaryViewContainer() const
105 return m_primaryViewContainer
;
108 DolphinViewContainer
* DolphinTabPage::secondaryViewContainer() const
110 return m_secondaryViewContainer
;
113 DolphinViewContainer
* DolphinTabPage::activeViewContainer() const
115 return m_primaryViewActive
? m_primaryViewContainer
:
116 m_secondaryViewContainer
;
119 KFileItemList
DolphinTabPage::selectedItems() const
121 KFileItemList items
= m_primaryViewContainer
->view()->selectedItems();
122 if (m_splitViewEnabled
) {
123 items
+= m_secondaryViewContainer
->view()->selectedItems();
128 int DolphinTabPage::selectedItemsCount() const
130 int selectedItemsCount
= m_primaryViewContainer
->view()->selectedItemsCount();
131 if (m_splitViewEnabled
) {
132 selectedItemsCount
+= m_secondaryViewContainer
->view()->selectedItemsCount();
134 return selectedItemsCount
;
137 void DolphinTabPage::markUrlsAsSelected(const QList
<KUrl
>& urls
)
139 m_primaryViewContainer
->view()->markUrlsAsSelected(urls
);
140 if (m_splitViewEnabled
) {
141 m_secondaryViewContainer
->view()->markUrlsAsSelected(urls
);
145 void DolphinTabPage::markUrlAsCurrent(const KUrl
& url
)
147 m_primaryViewContainer
->view()->markUrlAsCurrent(url
);
148 if (m_splitViewEnabled
) {
149 m_secondaryViewContainer
->view()->markUrlAsCurrent(url
);
153 void DolphinTabPage::setPlacesSelectorVisible(bool visible
)
155 m_primaryViewContainer
->urlNavigator()->setPlacesSelectorVisible(visible
);
156 if (m_splitViewEnabled
) {
157 m_secondaryViewContainer
->urlNavigator()->setPlacesSelectorVisible(visible
);
161 void DolphinTabPage::refreshViews()
163 m_primaryViewContainer
->readSettings();
164 if (m_splitViewEnabled
) {
165 m_secondaryViewContainer
->readSettings();
169 QByteArray
DolphinTabPage::saveState() const
172 QDataStream
stream(&state
, QIODevice::WriteOnly
);
174 stream
<< m_splitViewEnabled
;
176 stream
<< m_primaryViewContainer
->url();
177 stream
<< m_primaryViewContainer
->urlNavigator()->isUrlEditable();
179 if (m_splitViewEnabled
) {
180 stream
<< m_secondaryViewContainer
->url();
181 stream
<< m_secondaryViewContainer
->urlNavigator()->isUrlEditable();
184 stream
<< m_primaryViewActive
;
185 stream
<< m_splitter
->saveState();
190 void DolphinTabPage::restoreState(const QByteArray
& state
)
192 if (state
.isEmpty()) {
196 QByteArray sd
= state
;
197 QDataStream
stream(&sd
, QIODevice::ReadOnly
);
199 bool isSplitViewEnabled
= false;
200 stream
>> isSplitViewEnabled
;
201 setSplitViewEnabled(isSplitViewEnabled
);
204 stream
>> primaryUrl
;
205 m_primaryViewContainer
->setUrl(primaryUrl
);
206 bool primaryUrlEditable
;
207 stream
>> primaryUrlEditable
;
208 m_primaryViewContainer
->urlNavigator()->setUrlEditable(primaryUrlEditable
);
210 if (isSplitViewEnabled
) {
212 stream
>> secondaryUrl
;
213 m_secondaryViewContainer
->setUrl(secondaryUrl
);
214 bool secondaryUrlEditable
;
215 stream
>> secondaryUrlEditable
;
216 m_secondaryViewContainer
->urlNavigator()->setUrlEditable(secondaryUrlEditable
);
219 stream
>> m_primaryViewActive
;
220 if (m_primaryViewActive
) {
221 m_primaryViewContainer
->setActive(true);
223 Q_ASSERT(m_splitViewEnabled
);
224 m_secondaryViewContainer
->setActive(true);
227 QByteArray splitterState
;
228 stream
>> splitterState
;
229 m_splitter
->restoreState(splitterState
);
232 void DolphinTabPage::slotViewActivated()
234 const DolphinView
* oldActiveView
= activeViewContainer()->view();
236 // Set the view, which was active before, to inactive
237 // and update the active view type.
238 if (m_splitViewEnabled
) {
239 activeViewContainer()->setActive(false);
240 m_primaryViewActive
= !m_primaryViewActive
;
242 m_primaryViewActive
= true;
245 const DolphinView
* newActiveView
= activeViewContainer()->view();
247 if (newActiveView
!= oldActiveView
) {
248 disconnect(oldActiveView
, SIGNAL(urlChanged(KUrl
)),
249 this, SIGNAL(activeViewUrlChanged(KUrl
)));
250 disconnect(oldActiveView
, SIGNAL(redirection(KUrl
,KUrl
)),
251 this, SLOT(slotViewUrlRedirection(KUrl
,KUrl
)));
252 connect(newActiveView
, SIGNAL(urlChanged(KUrl
)),
253 this, SIGNAL(activeViewUrlChanged(KUrl
)));
254 connect(newActiveView
, SIGNAL(redirection(KUrl
,KUrl
)),
255 this, SLOT(slotViewUrlRedirection(KUrl
,KUrl
)));
258 emit
activeViewUrlChanged(activeViewContainer()->url());
259 emit
activeViewChanged(activeViewContainer());
262 void DolphinTabPage::slotViewUrlRedirection(const KUrl
& oldUrl
, const KUrl
& newUrl
)
266 emit
activeViewUrlChanged(newUrl
);
269 DolphinViewContainer
* DolphinTabPage::createViewContainer(const KUrl
& url
) const
271 DolphinViewContainer
* container
= new DolphinViewContainer(url
, m_splitter
);
272 container
->setActive(false);
274 const DolphinView
* view
= container
->view();
275 connect(view
, SIGNAL(activated()),
276 this, SLOT(slotViewActivated()));