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