]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinitemlistcontainer.cpp
KItemViews: Internal directory restructuration
[dolphin.git] / src / views / dolphinitemlistcontainer.cpp
1 /***************************************************************************
2 * Copyright (C) 2011 by Peter Penz <peter.penz19@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 "dolphinitemlistcontainer.h"
21
22 #include "dolphin_generalsettings.h"
23 #include "dolphin_iconsmodesettings.h"
24 #include "dolphin_detailsmodesettings.h"
25 #include "dolphin_compactmodesettings.h"
26
27 #include "dolphinfileitemlistwidget.h"
28
29 #include <kitemviews/kfileitemlistview.h>
30 #include <kitemviews/kfileitemmodel.h>
31 #include <kitemviews/kitemlistcontroller.h>
32 #include <kitemviews/kitemliststyleoption.h>
33
34 #include <KGlobalSettings>
35
36 #include <views/viewmodecontroller.h>
37
38 #include "zoomlevelinfo.h"
39
40
41 DolphinItemListContainer::DolphinItemListContainer(QWidget* parent) :
42 KItemListContainer(parent),
43 m_zoomLevel(0),
44 m_fileItemListView(0)
45 {
46 controller()->setModel(new KFileItemModel(this));
47
48 m_fileItemListView = new KFileItemListView();
49 controller()->setView(m_fileItemListView);
50
51 m_fileItemListView->setWidgetCreator(new KItemListWidgetCreator<DolphinFileItemListWidget>());
52 m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
53 m_fileItemListView->setEnlargeSmallPreviews(GeneralSettings::enlargeSmallPreviews());
54
55 updateAutoActivationDelay();
56 updateFont();
57 updateGridSize();
58 }
59
60 DolphinItemListContainer::~DolphinItemListContainer()
61 {
62 writeSettings();
63
64 controller()->setView(0);
65 delete m_fileItemListView;
66 m_fileItemListView = 0;
67 }
68
69 void DolphinItemListContainer::setPreviewsShown(bool show)
70 {
71 beginTransaction();
72 m_fileItemListView->setPreviewsShown(show);
73 updateGridSize();
74 endTransaction();
75 }
76
77 bool DolphinItemListContainer::previewsShown() const
78 {
79 return m_fileItemListView->previewsShown();
80 }
81
82 void DolphinItemListContainer::setVisibleRoles(const QList<QByteArray>& roles)
83 {
84 m_fileItemListView->setVisibleRoles(roles);
85 updateGridSize();
86 }
87
88 QList<QByteArray> DolphinItemListContainer::visibleRoles() const
89 {
90 return m_fileItemListView->visibleRoles();
91 }
92
93 void DolphinItemListContainer::setZoomLevel(int level)
94 {
95 if (level < ZoomLevelInfo::minimumLevel()) {
96 level = ZoomLevelInfo::minimumLevel();
97 } else if (level > ZoomLevelInfo::maximumLevel()) {
98 level = ZoomLevelInfo::maximumLevel();
99 }
100
101 if (level == m_zoomLevel) {
102 return;
103 }
104
105 m_zoomLevel = level;
106
107 ViewModeSettings settings(viewMode());
108 if (previewsShown()) {
109 const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
110 settings.setPreviewSize(previewSize);
111 } else {
112 const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
113 settings.setIconSize(iconSize);
114 }
115
116 updateGridSize();
117 }
118
119 int DolphinItemListContainer::zoomLevel() const
120 {
121 return m_zoomLevel;
122 }
123
124 void DolphinItemListContainer::setItemLayout(KFileItemListView::Layout layout)
125 {
126 if (layout == itemLayout()) {
127 return;
128 }
129
130 beginTransaction();
131 m_fileItemListView->setItemLayout(layout);
132
133 switch (layout) {
134 case KFileItemListView::IconsLayout:
135 m_fileItemListView->setScrollOrientation(Qt::Vertical);
136 m_fileItemListView->setHeaderVisible(false);
137 m_fileItemListView->setSupportsItemExpanding(false);
138 break;
139 case KFileItemListView::DetailsLayout:
140 m_fileItemListView->setScrollOrientation(Qt::Vertical);
141 m_fileItemListView->setHeaderVisible(true);
142 m_fileItemListView->setSupportsItemExpanding(DetailsModeSettings::expandableFolders());
143
144 break;
145 case KFileItemListView::CompactLayout:
146 m_fileItemListView->setScrollOrientation(Qt::Horizontal);
147 m_fileItemListView->setHeaderVisible(false);
148 m_fileItemListView->setSupportsItemExpanding(false);
149 break;
150 default:
151 Q_ASSERT(false);
152 break;
153 }
154
155 updateFont();
156 updateGridSize();
157 endTransaction();
158 }
159
160 KFileItemListView::Layout DolphinItemListContainer::itemLayout() const
161 {
162 return m_fileItemListView->itemLayout();
163 }
164
165 void DolphinItemListContainer::beginTransaction()
166 {
167 m_fileItemListView->beginTransaction();
168 }
169
170 void DolphinItemListContainer::endTransaction()
171 {
172 m_fileItemListView->endTransaction();
173 }
174
175 void DolphinItemListContainer::readSettings()
176 {
177 ViewModeSettings settings(viewMode());
178 settings.readConfig();
179
180 beginTransaction();
181
182 m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
183
184 const bool expandableFolders = (itemLayout() && KFileItemListView::DetailsLayout) &&
185 DetailsModeSettings::expandableFolders();
186 m_fileItemListView->setSupportsItemExpanding(expandableFolders);
187
188 updateAutoActivationDelay();
189 updateFont();
190 updateGridSize();
191
192 const KConfigGroup globalConfig(KGlobal::config(), "PreviewSettings");
193 const QStringList plugins = globalConfig.readEntry("Plugins", QStringList()
194 << "directorythumbnail"
195 << "imagethumbnail"
196 << "jpegthumbnail");
197 m_fileItemListView->setEnabledPlugins(plugins);
198
199 endTransaction();
200 }
201
202 void DolphinItemListContainer::writeSettings()
203 {
204 IconsModeSettings::self()->writeConfig();
205 CompactModeSettings::self()->writeConfig();
206 DetailsModeSettings::self()->writeConfig();
207 }
208
209 void DolphinItemListContainer::updateGridSize()
210 {
211 const ViewModeSettings settings(viewMode());
212
213 // Calculate the size of the icon
214 const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize();
215 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
216 KItemListStyleOption styleOption = m_fileItemListView->styleOption();
217
218 const int padding = 2;
219 int horizontalMargin = 0;
220 int verticalMargin = 0;
221
222 // Calculate the item-width and item-height
223 int itemWidth;
224 int itemHeight;
225 switch (itemLayout()) {
226 case KFileItemListView::IconsLayout: {
227 const int minItemWidth = 48;
228 itemWidth = minItemWidth + IconsModeSettings::textWidthIndex() * 64;
229
230 if (previewsShown()) {
231 // Optimize the width for previews with a 3:2 aspect ratio instead
232 // of a 1:1 ratio to avoid wasting too much vertical space when
233 // photos.
234 const int minWidth = iconSize * 3 / 2;
235 itemWidth = qMax(itemWidth, minWidth);
236 }
237
238 if (itemWidth < iconSize + padding * 2) {
239 itemWidth = iconSize + padding * 2;
240 }
241 itemHeight = padding * 3 + iconSize + styleOption.fontMetrics.height();
242
243 horizontalMargin = 4;
244 verticalMargin = 8;
245 break;
246 }
247 case KFileItemListView::CompactLayout: {
248 itemWidth = padding * 4 + iconSize + styleOption.fontMetrics.height() * 5;
249 const int textLinesCount = m_fileItemListView->visibleRoles().count();
250 itemHeight = padding * 2 + qMax(iconSize, textLinesCount * styleOption.fontMetrics.height());
251
252 horizontalMargin = 8;
253 break;
254 }
255 case KFileItemListView::DetailsLayout: {
256 itemWidth = -1;
257 itemHeight = padding * 2 + qMax(iconSize, styleOption.fontMetrics.height());
258 break;
259 }
260 default:
261 itemWidth = -1;
262 itemHeight = -1;
263 Q_ASSERT(false);
264 break;
265 }
266
267 // Apply the calculated values
268 styleOption.padding = padding;
269 styleOption.horizontalMargin = horizontalMargin;
270 styleOption.verticalMargin = verticalMargin;
271 styleOption.iconSize = iconSize;
272 m_fileItemListView->beginTransaction();
273 m_fileItemListView->setStyleOption(styleOption);
274 m_fileItemListView->setItemSize(QSizeF(itemWidth, itemHeight));
275 m_fileItemListView->endTransaction();
276 }
277
278 void DolphinItemListContainer::updateFont()
279 {
280 KItemListStyleOption styleOption = m_fileItemListView->styleOption();
281
282 const ViewModeSettings settings(viewMode());
283
284 QFont font(settings.fontFamily(), qRound(settings.fontSize()));
285 font.setItalic(settings.italicFont());
286 font.setWeight(settings.fontWeight());
287 font.setPointSizeF(settings.fontSize());
288
289 styleOption.font = font;
290 styleOption.fontMetrics = QFontMetrics(font);
291
292 m_fileItemListView->setStyleOption(styleOption);
293 }
294
295 void DolphinItemListContainer::updateAutoActivationDelay()
296 {
297 const int delay = GeneralSettings::autoExpandFolders() ? 750 : -1;
298 controller()->setAutoActivationDelay(delay);
299 }
300
301 ViewModeSettings::ViewMode DolphinItemListContainer::viewMode() const
302 {
303 ViewModeSettings::ViewMode mode;
304
305 switch (itemLayout()) {
306 case KFileItemListView::IconsLayout: mode = ViewModeSettings::IconsMode; break;
307 case KFileItemListView::CompactLayout: mode = ViewModeSettings::CompactMode; break;
308 case KFileItemListView::DetailsLayout: mode = ViewModeSettings::DetailsMode; break;
309 default: mode = ViewModeSettings::IconsMode;
310 Q_ASSERT(false);
311 break;
312 }
313
314 return mode;
315 }
316
317 #include "dolphinitemlistcontainer.moc"