]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphintabpage.cpp
SVN_SILENT made messages (.desktop file)
[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 "dolphinviewcontainer.h"
23 #include "dolphin_generalsettings.h"
24
25 #include <QSplitter>
26
27 DolphinTabPage::DolphinTabPage(const KUrl& primaryUrl, const KUrl& secondaryUrl, QWidget* parent) :
28 QWidget(parent),
29 m_primaryViewActive(true),
30 m_splitViewEnabled(false)
31 {
32 QVBoxLayout* layout = new QVBoxLayout(this);
33 layout->setSpacing(0);
34 layout->setMargin(0);
35
36 m_splitter = new QSplitter(Qt::Horizontal, this);
37 m_splitter->setChildrenCollapsible(false);
38 layout->addWidget(m_splitter);
39
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
45 m_splitter->addWidget(m_primaryViewContainer);
46 m_primaryViewContainer->show();
47
48 if (secondaryUrl.isValid() || GeneralSettings::splitView()) {
49 // Provide a secondary view, if the given secondary url is valid or if the
50 // startup settings are set this way (use the url of the primary view).
51 m_splitViewEnabled = true;
52 const KUrl& url = secondaryUrl.isValid() ? secondaryUrl : primaryUrl;
53 m_secondaryViewContainer = createViewContainer(url);
54 m_splitter->addWidget(m_secondaryViewContainer);
55 m_secondaryViewContainer->show();
56 }
57
58 m_primaryViewContainer->setActive(true);
59 }
60
61 bool DolphinTabPage::primaryViewActive() const
62 {
63 return m_primaryViewActive;
64 }
65
66 bool DolphinTabPage::splitViewEnabled() const
67 {
68 return m_splitViewEnabled;
69 }
70
71 void DolphinTabPage::setSplitViewEnabled(bool enabled)
72 {
73 if (m_splitViewEnabled != enabled) {
74 m_splitViewEnabled = enabled;
75
76 if (enabled) {
77 const KUrl& url = m_primaryViewContainer->url();
78 m_secondaryViewContainer = createViewContainer(url);
79 m_splitter->addWidget(m_secondaryViewContainer);
80 m_secondaryViewContainer->show();
81 m_secondaryViewContainer->setActive(true);
82 } else {
83 // Close the view which is active.
84 DolphinViewContainer* view = activeViewContainer();
85 if (m_primaryViewActive) {
86 // If the primary view is active, we have to swap the pointers
87 // because the secondary view will be the new primary view.
88 qSwap(m_primaryViewContainer, m_secondaryViewContainer);
89 }
90 m_primaryViewContainer->setActive(true);
91 view->close();
92 view->deleteLater();
93 }
94 }
95 }
96
97 DolphinViewContainer* DolphinTabPage::primaryViewContainer() const
98 {
99 return m_primaryViewContainer;
100 }
101
102 DolphinViewContainer* DolphinTabPage::secondaryViewContainer() const
103 {
104 return m_secondaryViewContainer;
105 }
106
107 DolphinViewContainer* DolphinTabPage::activeViewContainer() const
108 {
109 return m_primaryViewActive ? m_primaryViewContainer :
110 m_secondaryViewContainer;
111 }
112
113 KFileItemList DolphinTabPage::selectedItems() const
114 {
115 KFileItemList items = m_primaryViewContainer->view()->selectedItems();
116 if (m_splitViewEnabled) {
117 items += m_secondaryViewContainer->view()->selectedItems();
118 }
119 return items;
120 }
121
122 int DolphinTabPage::selectedItemsCount() const
123 {
124 int selectedItemsCount = m_primaryViewContainer->view()->selectedItemsCount();
125 if (m_splitViewEnabled) {
126 selectedItemsCount += m_secondaryViewContainer->view()->selectedItemsCount();
127 }
128 return selectedItemsCount;
129 }
130
131 void DolphinTabPage::markUrlsAsSelected(const QList<KUrl>& urls)
132 {
133 m_primaryViewContainer->view()->markUrlsAsSelected(urls);
134 if (m_splitViewEnabled) {
135 m_secondaryViewContainer->view()->markUrlsAsSelected(urls);
136 }
137 }
138
139 void DolphinTabPage::markUrlAsCurrent(const KUrl& url)
140 {
141 m_primaryViewContainer->view()->markUrlAsCurrent(url);
142 if (m_splitViewEnabled) {
143 m_secondaryViewContainer->view()->markUrlAsCurrent(url);
144 }
145 }
146
147 void DolphinTabPage::setPlacesSelectorVisible(bool visible)
148 {
149 m_primaryViewContainer->urlNavigator()->setPlacesSelectorVisible(visible);
150 if (m_splitViewEnabled) {
151 m_secondaryViewContainer->urlNavigator()->setPlacesSelectorVisible(visible);
152 }
153 }
154
155 void DolphinTabPage::refreshViews()
156 {
157 m_primaryViewContainer->readSettings();
158 if (m_splitViewEnabled) {
159 m_secondaryViewContainer->readSettings();
160 }
161 }
162
163 QByteArray DolphinTabPage::saveState() const
164 {
165 QByteArray state;
166 QDataStream stream(&state, QIODevice::WriteOnly);
167
168 stream << m_splitViewEnabled;
169
170 stream << m_primaryViewContainer->url();
171 stream << m_primaryViewContainer->urlNavigator()->isUrlEditable();
172
173 if (m_splitViewEnabled) {
174 stream << m_secondaryViewContainer->url();
175 stream << m_secondaryViewContainer->urlNavigator()->isUrlEditable();
176 }
177
178 stream << m_primaryViewActive;
179 stream << m_splitter->saveState();
180
181 return state;
182 }
183
184 void DolphinTabPage::restoreState(const QByteArray& state)
185 {
186 QByteArray sd = state;
187 QDataStream stream(&sd, QIODevice::ReadOnly);
188
189 bool isSplitViewEnabled = false;
190 stream >> isSplitViewEnabled;
191 setSplitViewEnabled(isSplitViewEnabled);
192
193 KUrl primaryUrl;
194 stream >> primaryUrl;
195 m_primaryViewContainer->setUrl(primaryUrl);
196 bool primaryUrlEditable;
197 stream >> primaryUrlEditable;
198 m_primaryViewContainer->urlNavigator()->setUrlEditable(primaryUrlEditable);
199
200 if (isSplitViewEnabled) {
201 KUrl secondaryUrl;
202 stream >> secondaryUrl;
203 m_secondaryViewContainer->setUrl(secondaryUrl);
204 bool secondaryUrlEditable;
205 stream >> secondaryUrlEditable;
206 m_secondaryViewContainer->urlNavigator()->setUrlEditable(secondaryUrlEditable);
207 }
208
209 stream >> m_primaryViewActive;
210 if (m_primaryViewActive) {
211 m_primaryViewContainer->setActive(true);
212 } else {
213 Q_ASSERT(m_splitViewEnabled);
214 m_secondaryViewContainer->setActive(true);
215 }
216
217 QByteArray splitterState;
218 stream >> splitterState;
219 m_splitter->restoreState(splitterState);
220 }
221
222 void DolphinTabPage::slotViewActivated()
223 {
224 const DolphinView* oldActiveView = activeViewContainer()->view();
225
226 // Set the view, which was active before, to inactive
227 // and update the active view type.
228 if (m_splitViewEnabled) {
229 activeViewContainer()->setActive(false);
230 m_primaryViewActive = !m_primaryViewActive;
231 } else {
232 m_primaryViewActive = true;
233 }
234
235 const DolphinView* newActiveView = activeViewContainer()->view();
236
237 if (newActiveView != oldActiveView) {
238 disconnect(oldActiveView, SIGNAL(urlChanged(KUrl)),
239 this, SIGNAL(activeViewUrlChanged(KUrl)));
240 connect(newActiveView, SIGNAL(urlChanged(KUrl)),
241 this, SIGNAL(activeViewUrlChanged(KUrl)));
242 }
243
244 emit activeViewUrlChanged(activeViewContainer()->url());
245 emit activeViewChanged();
246 }
247
248 DolphinViewContainer* DolphinTabPage::createViewContainer(const KUrl& url) const
249 {
250 DolphinViewContainer* container = new DolphinViewContainer(url, m_splitter);
251 container->setActive(false);
252
253 const DolphinView* view = container->view();
254 connect(view, SIGNAL(activated()),
255 this, SLOT(slotViewActivated()));
256
257 return container;
258 }