]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinitemlistcontainer.cpp
Details view: Optionally remember user changed column-widths
[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 m_fileItemListView->setWidgetCreator(new KItemListWidgetCreator<DolphinFileItemListWidget>());
52 m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
53 controller()->setView(m_fileItemListView);
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 break;
144 case KFileItemListView::CompactLayout:
145 m_fileItemListView->setScrollOrientation(Qt::Horizontal);
146 m_fileItemListView->setHeaderVisible(false);
147 m_fileItemListView->setSupportsItemExpanding(false);
148 break;
149 default:
150 Q_ASSERT(false);
151 break;
152 }
153
154 updateFont();
155 updateGridSize();
156 endTransaction();
157 }
158
159 KFileItemListView::Layout DolphinItemListContainer::itemLayout() const
160 {
161 return m_fileItemListView->itemLayout();
162 }
163
164 void DolphinItemListContainer::beginTransaction()
165 {
166 m_fileItemListView->beginTransaction();
167 }
168
169 void DolphinItemListContainer::endTransaction()
170 {
171 m_fileItemListView->endTransaction();
172 }
173
174 void DolphinItemListContainer::readSettings()
175 {
176 ViewModeSettings settings(viewMode());
177 settings.readConfig();
178
179 beginTransaction();
180
181 m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
182
183 const bool expandableFolders = (itemLayout() && KFileItemListView::DetailsLayout) &&
184 DetailsModeSettings::expandableFolders();
185 m_fileItemListView->setSupportsItemExpanding(expandableFolders);
186
187 updateAutoActivationDelay();
188 updateFont();
189 updateGridSize();
190
191 const KConfigGroup globalConfig(KGlobal::config(), "PreviewSettings");
192 const QStringList plugins = globalConfig.readEntry("Plugins", QStringList()
193 << "directorythumbnail"
194 << "imagethumbnail"
195 << "jpegthumbnail");
196 m_fileItemListView->setEnabledPlugins(plugins);
197
198 endTransaction();
199 }
200
201 void DolphinItemListContainer::writeSettings()
202 {
203 IconsModeSettings::self()->writeConfig();
204 CompactModeSettings::self()->writeConfig();
205 DetailsModeSettings::self()->writeConfig();
206 }
207
208 void DolphinItemListContainer::updateGridSize()
209 {
210 const ViewModeSettings settings(viewMode());
211
212 // Calculate the size of the icon
213 const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize();
214 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
215 KItemListStyleOption styleOption = m_fileItemListView->styleOption();
216
217 const int padding = 2;
218 int horizontalMargin = 0;
219 int verticalMargin = 0;
220
221 // Calculate the item-width and item-height
222 int itemWidth;
223 int itemHeight;
224 switch (itemLayout()) {
225 case KFileItemListView::IconsLayout: {
226 const int minItemWidth = 48;
227 itemWidth = minItemWidth + IconsModeSettings::textWidthIndex() * 64;
228
229 if (previewsShown()) {
230 // Optimize the width for previews with a 3:2 aspect ratio instead
231 // of a 1:1 ratio to avoid wasting too much vertical space when
232 // photos.
233 const int minWidth = iconSize * 3 / 2;
234 itemWidth = qMax(itemWidth, minWidth);
235 }
236
237 if (itemWidth < iconSize + padding * 2) {
238 itemWidth = iconSize + padding * 2;
239 }
240 itemHeight = padding * 3 + iconSize + styleOption.fontMetrics.height();
241
242 horizontalMargin = 4;
243 verticalMargin = 8;
244 break;
245 }
246 case KFileItemListView::CompactLayout: {
247 itemWidth = padding * 4 + iconSize + styleOption.fontMetrics.height() * 5;
248 const int textLinesCount = m_fileItemListView->visibleRoles().count();
249 itemHeight = padding * 2 + qMax(iconSize, textLinesCount * styleOption.fontMetrics.height());
250
251 horizontalMargin = 8;
252 break;
253 }
254 case KFileItemListView::DetailsLayout: {
255 itemWidth = -1;
256 itemHeight = padding * 2 + qMax(iconSize, styleOption.fontMetrics.height());
257 break;
258 }
259 default:
260 itemWidth = -1;
261 itemHeight = -1;
262 Q_ASSERT(false);
263 break;
264 }
265
266 // Apply the calculated values
267 styleOption.padding = padding;
268 styleOption.horizontalMargin = horizontalMargin;
269 styleOption.verticalMargin = verticalMargin;
270 styleOption.iconSize = iconSize;
271 m_fileItemListView->beginTransaction();
272 m_fileItemListView->setStyleOption(styleOption);
273 m_fileItemListView->setItemSize(QSizeF(itemWidth, itemHeight));
274 m_fileItemListView->endTransaction();
275 }
276
277 void DolphinItemListContainer::updateFont()
278 {
279 KItemListStyleOption styleOption = m_fileItemListView->styleOption();
280
281 const ViewModeSettings settings(viewMode());
282
283 QFont font(settings.fontFamily(), qRound(settings.fontSize()));
284 font.setItalic(settings.italicFont());
285 font.setWeight(settings.fontWeight());
286 font.setPointSizeF(settings.fontSize());
287
288 styleOption.font = font;
289 styleOption.fontMetrics = QFontMetrics(font);
290
291 m_fileItemListView->setStyleOption(styleOption);
292 }
293
294 void DolphinItemListContainer::updateAutoActivationDelay()
295 {
296 const int delay = GeneralSettings::autoExpandFolders() ? 750 : -1;
297 controller()->setAutoActivationDelay(delay);
298 }
299
300 ViewModeSettings::ViewMode DolphinItemListContainer::viewMode() const
301 {
302 ViewModeSettings::ViewMode mode;
303
304 switch (itemLayout()) {
305 case KFileItemListView::IconsLayout: mode = ViewModeSettings::IconsMode; break;
306 case KFileItemListView::CompactLayout: mode = ViewModeSettings::CompactMode; break;
307 case KFileItemListView::DetailsLayout: mode = ViewModeSettings::DetailsMode; break;
308 default: mode = ViewModeSettings::IconsMode;
309 Q_ASSERT(false);
310 break;
311 }
312
313 return mode;
314 }
315
316 #include "dolphinitemlistcontainer.moc"