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