]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinitemlistview.cpp
9e8fda650e37149f1a6d051d1514a2825ebbdb1d
[dolphin.git] / src / views / dolphinitemlistview.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 "dolphinitemlistview.h"
21
22 #include "dolphin_compactmodesettings.h"
23 #include "dolphin_detailsmodesettings.h"
24 #include "dolphin_generalsettings.h"
25 #include "dolphin_iconsmodesettings.h"
26 #include "dolphinfileitemlistwidget.h"
27 #include "kitemviews/kfileitemmodel.h"
28 #include "kitemviews/kitemlistcontroller.h"
29 #include "views/viewmodecontroller.h"
30 #include "zoomlevelinfo.h"
31
32 #include <KIO/PreviewJob>
33
34
35 DolphinItemListView::DolphinItemListView(QGraphicsWidget* parent) :
36 KFileItemListView(parent),
37 m_zoomLevel(0)
38 {
39 updateFont();
40 updateGridSize();
41 }
42
43 DolphinItemListView::~DolphinItemListView()
44 {
45 writeSettings();
46 }
47
48 void DolphinItemListView::setZoomLevel(int level)
49 {
50 if (level < ZoomLevelInfo::minimumLevel()) {
51 level = ZoomLevelInfo::minimumLevel();
52 } else if (level > ZoomLevelInfo::maximumLevel()) {
53 level = ZoomLevelInfo::maximumLevel();
54 }
55
56 if (level == m_zoomLevel) {
57 return;
58 }
59
60 m_zoomLevel = level;
61
62 ViewModeSettings settings(viewMode());
63 if (previewsShown()) {
64 const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
65 settings.setPreviewSize(previewSize);
66 } else {
67 const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
68 settings.setIconSize(iconSize);
69 }
70
71 updateGridSize();
72 }
73
74 int DolphinItemListView::zoomLevel() const
75 {
76 return m_zoomLevel;
77 }
78
79 void DolphinItemListView::readSettings()
80 {
81 ViewModeSettings settings(viewMode());
82 settings.readConfig();
83
84 beginTransaction();
85
86 setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
87 setSupportsItemExpanding(itemLayoutSupportsItemExpanding(itemLayout()));
88
89 updateFont();
90 updateGridSize();
91
92 const KConfigGroup globalConfig(KSharedConfig::openConfig(), "PreviewSettings");
93 setEnabledPlugins(globalConfig.readEntry("Plugins", KIO::PreviewJob::defaultPlugins()));
94 setLocalFileSizePreviewLimit(globalConfig.readEntry("MaximumSize", 0));
95 endTransaction();
96 }
97
98 void DolphinItemListView::writeSettings()
99 {
100 IconsModeSettings::self()->save();
101 CompactModeSettings::self()->save();
102 DetailsModeSettings::self()->save();
103 }
104
105 KItemListWidgetCreatorBase* DolphinItemListView::defaultWidgetCreator() const
106 {
107 return new KItemListWidgetCreator<DolphinFileItemListWidget>();
108 }
109
110 bool DolphinItemListView::itemLayoutSupportsItemExpanding(ItemLayout layout) const
111 {
112 return layout == DetailsLayout && DetailsModeSettings::expandableFolders();
113 }
114
115 void DolphinItemListView::onItemLayoutChanged(ItemLayout current, ItemLayout previous)
116 {
117 setHeaderVisible(current == DetailsLayout);
118
119 updateFont();
120 updateGridSize();
121
122 KFileItemListView::onItemLayoutChanged(current, previous);
123 }
124
125 void DolphinItemListView::onPreviewsShownChanged(bool shown)
126 {
127 Q_UNUSED(shown)
128 updateGridSize();
129 }
130
131 void DolphinItemListView::onVisibleRolesChanged(const QList<QByteArray>& current,
132 const QList<QByteArray>& previous)
133 {
134 KFileItemListView::onVisibleRolesChanged(current, previous);
135 updateGridSize();
136 }
137
138 void DolphinItemListView::updateFont()
139 {
140 const ViewModeSettings settings(viewMode());
141
142 if (settings.useSystemFont()) {
143 KItemListView::updateFont();
144 } else {
145 QFont font(settings.fontFamily(), qRound(settings.fontSize()));
146 font.setItalic(settings.italicFont());
147 font.setWeight(settings.fontWeight());
148 font.setPointSizeF(settings.fontSize());
149
150 KItemListStyleOption option = styleOption();
151 option.font = font;
152 option.fontMetrics = QFontMetrics(font);
153
154 setStyleOption(option);
155 }
156 }
157
158 void DolphinItemListView::updateGridSize()
159 {
160 const ViewModeSettings settings(viewMode());
161
162 // Calculate the size of the icon
163 const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize();
164 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
165 KItemListStyleOption option = styleOption();
166
167 const int padding = 2;
168 int horizontalMargin = 0;
169 int verticalMargin = 0;
170
171 // Calculate the item-width and item-height
172 int itemWidth;
173 int itemHeight;
174 int maxTextLines = 0;
175 int maxTextWidth = 0;
176
177 switch (itemLayout()) {
178 case KFileItemListView::IconsLayout: {
179 const int minItemWidth = 48;
180 itemWidth = minItemWidth + IconsModeSettings::textWidthIndex() * 64;
181
182 if (itemWidth < iconSize + padding * 2) {
183 itemWidth = iconSize + padding * 2;
184 }
185
186 itemHeight = padding * 3 + iconSize + option.fontMetrics.lineSpacing();
187
188 horizontalMargin = 4;
189 verticalMargin = 8;
190 maxTextLines = IconsModeSettings::maximumTextLines();
191 break;
192 }
193 case KFileItemListView::CompactLayout: {
194 itemWidth = padding * 4 + iconSize + option.fontMetrics.height() * 5;
195 const int textLinesCount = visibleRoles().count();
196 itemHeight = padding * 2 + qMax(iconSize, textLinesCount * option.fontMetrics.lineSpacing());
197
198 if (CompactModeSettings::maximumTextWidthIndex() > 0) {
199 // A restriction is given for the maximum width of the text (0 means
200 // having no restriction)
201 maxTextWidth = option.fontMetrics.height() * 10 * CompactModeSettings::maximumTextWidthIndex();
202 }
203
204 horizontalMargin = 8;
205 break;
206 }
207 case KFileItemListView::DetailsLayout: {
208 itemWidth = -1;
209 itemHeight = padding * 2 + qMax(iconSize, option.fontMetrics.lineSpacing());
210 break;
211 }
212 default:
213 itemWidth = -1;
214 itemHeight = -1;
215 Q_ASSERT(false);
216 break;
217 }
218
219 // Apply the calculated values
220 option.padding = padding;
221 option.horizontalMargin = horizontalMargin;
222 option.verticalMargin = verticalMargin;
223 option.iconSize = iconSize;
224 option.maxTextLines = maxTextLines;
225 option.maxTextWidth = maxTextWidth;
226 beginTransaction();
227 setStyleOption(option);
228 setItemSize(QSizeF(itemWidth, itemHeight));
229 endTransaction();
230 }
231
232 ViewModeSettings::ViewMode DolphinItemListView::viewMode() const
233 {
234 ViewModeSettings::ViewMode mode;
235
236 switch (itemLayout()) {
237 case KFileItemListView::IconsLayout: mode = ViewModeSettings::IconsMode; break;
238 case KFileItemListView::CompactLayout: mode = ViewModeSettings::CompactMode; break;
239 case KFileItemListView::DetailsLayout: mode = ViewModeSettings::DetailsMode; break;
240 default: mode = ViewModeSettings::IconsMode;
241 Q_ASSERT(false);
242 break;
243 }
244
245 return mode;
246 }
247