]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinitemlistcontainer.cpp
Fix "general settings" issues
[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 IconsModeSettings::self()->writeConfig();
63 CompactModeSettings::self()->writeConfig();
64 DetailsModeSettings::self()->writeConfig();
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->setHeaderShown(false);
139 break;
140 case KFileItemListView::DetailsLayout:
141 m_fileItemListView->setScrollOrientation(Qt::Vertical);
142 m_fileItemListView->setHeaderShown(true);
143 break;
144 case KFileItemListView::CompactLayout:
145 m_fileItemListView->setScrollOrientation(Qt::Horizontal);
146 m_fileItemListView->setHeaderShown(false);
147 break;
148 default:
149 Q_ASSERT(false);
150 break;
151 }
152
153 updateFont();
154 updateGridSize();
155 endTransaction();
156 }
157
158 KFileItemListView::Layout DolphinItemListContainer::itemLayout() const
159 {
160 return m_fileItemListView->itemLayout();
161 }
162
163 void DolphinItemListContainer::beginTransaction()
164 {
165 m_fileItemListView->beginTransaction();
166 }
167
168 void DolphinItemListContainer::endTransaction()
169 {
170 m_fileItemListView->endTransaction();
171 }
172
173 void DolphinItemListContainer::refresh()
174 {
175 ViewModeSettings settings(viewMode());
176 settings.readConfig();
177
178 beginTransaction();
179
180 m_fileItemListView->setEnabledSelectionToggles(GeneralSettings::showSelectionToggle());
181 updateAutoActivationDelay();
182 updateFont();
183 updateGridSize();
184
185 const KConfigGroup globalConfig(KGlobal::config(), "PreviewSettings");
186 const QStringList plugins = globalConfig.readEntry("Plugins", QStringList()
187 << "directorythumbnail"
188 << "imagethumbnail"
189 << "jpegthumbnail");
190 m_fileItemListView->setEnabledPlugins(plugins);
191
192 endTransaction();
193 }
194
195 void DolphinItemListContainer::updateGridSize()
196 {
197 const ViewModeSettings settings(viewMode());
198
199 // Calculate the size of the icon
200 const int iconSize = previewsShown() ? settings.previewSize() : settings.iconSize();
201 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
202 KItemListStyleOption styleOption = m_fileItemListView->styleOption();
203
204 const int innerMargin = (iconSize >= KIconLoader::SizeSmallMedium) ? 4 : 2;
205
206 // Calculate the item-width and item-height
207 int itemWidth;
208 int itemHeight;
209 switch (itemLayout()) {
210 case KFileItemListView::IconsLayout: {
211 const int minItemWidth = 64;
212 itemWidth = minItemWidth + IconsModeSettings::textWidthIndex() * 64; // TODO:
213 if (itemWidth < iconSize + innerMargin * 2) {
214 itemWidth = iconSize + innerMargin * 2;
215 }
216 itemHeight = innerMargin * 2 + iconSize + styleOption.fontMetrics.height();
217 break;
218 }
219 case KFileItemListView::CompactLayout: {
220 itemWidth = innerMargin * 2;
221 const int textLinesCount = m_fileItemListView->visibleRoles().count();
222 itemHeight = innerMargin * 2 + qMax(iconSize, textLinesCount * styleOption.fontMetrics.height());
223 break;
224 }
225 case KFileItemListView::DetailsLayout: {
226 itemWidth = -1;
227 itemHeight = innerMargin * 2 + qMax(iconSize, styleOption.fontMetrics.height());
228 break;
229 }
230 default: Q_ASSERT(false); break;
231 }
232
233 // Apply the calculated values
234 styleOption.margin = innerMargin;
235 styleOption.iconSize = iconSize;
236 m_fileItemListView->setStyleOption(styleOption);
237 m_fileItemListView->setItemSize(QSizeF(itemWidth, itemHeight));
238 }
239
240 void DolphinItemListContainer::updateFont()
241 {
242 KItemListStyleOption styleOption = m_fileItemListView->styleOption();
243
244 const ViewModeSettings settings(viewMode());
245
246 QFont font(settings.fontFamily(), qRound(settings.fontSize()));
247 font.setItalic(settings.italicFont());
248 font.setWeight(settings.fontWeight());
249 font.setPointSizeF(settings.fontSize());
250
251 styleOption.font = font;
252 styleOption.fontMetrics = QFontMetrics(font);
253
254 m_fileItemListView->setStyleOption(styleOption);
255 }
256
257 void DolphinItemListContainer::updateAutoActivationDelay()
258 {
259 const int delay = GeneralSettings::autoExpandFolders() ? 750 : -1;
260 controller()->setAutoActivationDelay(delay);
261 }
262
263 ViewModeSettings::ViewMode DolphinItemListContainer::viewMode() const
264 {
265 ViewModeSettings::ViewMode mode;
266
267 switch (itemLayout()) {
268 case KFileItemListView::IconsLayout: mode = ViewModeSettings::IconsMode; break;
269 case KFileItemListView::CompactLayout: mode = ViewModeSettings::CompactMode; break;
270 case KFileItemListView::DetailsLayout: mode = ViewModeSettings::DetailsMode; break;
271 default: Q_ASSERT(false); break;
272 }
273
274 return mode;
275 }
276
277 #include "dolphinitemlistcontainer.moc"