]> cloud.milkyroute.net Git - dolphin.git/blob - src/views/dolphinitemlistcontainer.cpp
Merged very early alpha-version of Dolphin 2.0
[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_iconsmodesettings.h"
23 #include "dolphin_detailsmodesettings.h"
24 #include "dolphin_compactmodesettings.h"
25
26 #include <kitemviews/kitemliststyleoption.h>
27 #include <kitemviews/kfileitemlistview.h>
28 #include <kitemviews/kfileitemmodel.h>
29 #include <kitemviews/kitemlistcontroller.h>
30 #include <kitemviews/kitemliststyleoption.h>
31
32 #include <KDirLister>
33 #include <KGlobalSettings>
34
35 #include <views/viewmodecontroller.h>
36
37 #include "zoomlevelinfo.h"
38
39
40 DolphinItemListContainer::DolphinItemListContainer(KDirLister* dirLister,
41 QWidget* parent) :
42 KItemListContainer(parent),
43 m_zoomLevel(0),
44 m_fileItemListView(0)
45 {
46 controller()->setModel(new KFileItemModel(dirLister, this));
47
48 m_fileItemListView = new KFileItemListView();
49 controller()->setView(m_fileItemListView);
50
51 KItemListStyleOption option;
52
53 // TODO:
54 option.font = parent->font();
55 option.fontMetrics = QFontMetrics(parent->font());
56
57 updateGridSize();
58 /*
59 connect(this, SIGNAL(clicked(const QModelIndex&)),
60 dolphinViewController, SLOT(requestTab(const QModelIndex&)));*/
61 /*
62 connect(this, SIGNAL(entered(const QModelIndex&)),
63 dolphinViewController, SLOT(emitItemEntered(const QModelIndex&)));
64 connect(this, SIGNAL(viewportEntered()),
65 dolphinViewController, SLOT(emitViewportEntered()));*/
66
67 // apply the icons mode settings to the widget
68 //const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
69 //Q_ASSERT(settings);
70
71 /*if (settings->useSystemFont()) {
72 m_font = KGlobalSettings::generalFont();
73 } else {
74 m_font = QFont(settings->fontFamily(),
75 qRound(settings->fontSize()),
76 settings->fontWeight(),
77 settings->italicFont());
78 m_font.setPointSizeF(settings->fontSize());
79 }
80
81 setWordWrap(settings->numberOfTextlines() > 1);
82
83 if (settings->arrangement() == QListView::TopToBottom) {
84 setFlow(QListView::LeftToRight);
85 m_decorationPosition = QStyleOptionViewItem::Top;
86 m_displayAlignment = Qt::AlignHCenter;
87 } else {
88 setFlow(QListView::TopToBottom);
89 m_decorationPosition = QStyleOptionViewItem::Left;
90 m_displayAlignment = Qt::AlignLeft | Qt::AlignVCenter;
91 }
92
93 connect(m_categoryDrawer, SIGNAL(actionRequested(int,QModelIndex)), this, SLOT(categoryDrawerActionRequested(int,QModelIndex)));
94 setCategoryDrawer(m_categoryDrawer);
95
96 connect(KGlobalSettings::self(), SIGNAL(settingsChanged(int)),
97 this, SLOT(slotGlobalSettingsChanged(int)));*/
98
99 //updateGridSize(dolphinView->showPreview(), 0);
100 /*m_extensionsFactory = new ViewExtensionsFactory(this, dolphinViewController, viewModeController);*/
101 }
102
103 DolphinItemListContainer::~DolphinItemListContainer()
104 {
105 IconsModeSettings::self()->writeConfig();
106 CompactModeSettings::self()->writeConfig();
107 DetailsModeSettings::self()->writeConfig();
108
109 KItemListView* view = controller()->view();
110 controller()->setView(0);
111 delete view;
112 }
113
114 void DolphinItemListContainer::setPreviewsShown(bool show)
115 {
116 beginTransaction();
117 m_fileItemListView->setPreviewsShown(show);
118 updateGridSize();
119 endTransaction();
120 }
121
122 bool DolphinItemListContainer::previewsShown() const
123 {
124 return m_fileItemListView->previewsShown();
125 }
126
127 void DolphinItemListContainer::setVisibleRoles(const QHash<QByteArray, int>& roles)
128 {
129 m_fileItemListView->setVisibleRoles(roles);
130 updateGridSize();
131 }
132
133 QHash<QByteArray, int> DolphinItemListContainer::visibleRoles() const
134 {
135 return m_fileItemListView->visibleRoles();
136 }
137
138 void DolphinItemListContainer::setZoomLevel(int level)
139 {
140 if (level < ZoomLevelInfo::minimumLevel()) {
141 level = ZoomLevelInfo::minimumLevel();
142 } else if (level > ZoomLevelInfo::maximumLevel()) {
143 level = ZoomLevelInfo::maximumLevel();
144 }
145
146 if (level == m_zoomLevel) {
147 return;
148 }
149
150 m_zoomLevel = level;
151
152 if (previewsShown()) {
153 const int previewSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
154
155 switch (itemLayout()) {
156 case KFileItemListView::IconsLayout: IconsModeSettings::setPreviewSize(previewSize); break;
157 case KFileItemListView::CompactLayout: CompactModeSettings::setPreviewSize(previewSize); break;
158 case KFileItemListView::DetailsLayout: DetailsModeSettings::setPreviewSize(previewSize); break;
159 default: Q_ASSERT(false); break;
160 }
161 } else {
162 const int iconSize = ZoomLevelInfo::iconSizeForZoomLevel(level);
163 switch (itemLayout()) {
164 case KFileItemListView::IconsLayout: IconsModeSettings::setIconSize(iconSize); break;
165 case KFileItemListView::CompactLayout: CompactModeSettings::setIconSize(iconSize); break;
166 case KFileItemListView::DetailsLayout: DetailsModeSettings::setIconSize(iconSize); break;
167 default: Q_ASSERT(false); break;
168 }
169 }
170
171 updateGridSize();
172 }
173
174 int DolphinItemListContainer::zoomLevel() const
175 {
176 return m_zoomLevel;
177 }
178
179 void DolphinItemListContainer::setItemLayout(KFileItemListView::Layout layout)
180 {
181 if (layout == itemLayout()) {
182 return;
183 }
184
185 beginTransaction();
186 m_fileItemListView->setItemLayout(layout);
187
188 switch (layout) {
189 case KFileItemListView::IconsLayout:
190 case KFileItemListView::DetailsLayout:
191 m_fileItemListView->setScrollOrientation(Qt::Vertical);
192 break;
193 case KFileItemListView::CompactLayout:
194 m_fileItemListView->setScrollOrientation(Qt::Horizontal);
195 break;
196 default:
197 Q_ASSERT(false);
198 break;
199 }
200
201 updateGridSize();
202 endTransaction();
203 }
204
205 KFileItemListView::Layout DolphinItemListContainer::itemLayout() const
206 {
207 return m_fileItemListView->itemLayout();
208 }
209
210 void DolphinItemListContainer::beginTransaction()
211 {
212 m_fileItemListView->beginTransaction();
213 }
214
215 void DolphinItemListContainer::endTransaction()
216 {
217 m_fileItemListView->endTransaction();
218 }
219
220 void DolphinItemListContainer::updateGridSize()
221 {
222 // Calculate the size of the icon
223 int iconSize;
224 if (previewsShown()) {
225 switch (itemLayout()) {
226 case KFileItemListView::IconsLayout: iconSize = IconsModeSettings::previewSize(); break;
227 case KFileItemListView::CompactLayout: iconSize = CompactModeSettings::previewSize(); break;
228 case KFileItemListView::DetailsLayout: iconSize = DetailsModeSettings::previewSize(); break;
229 default: Q_ASSERT(false); break;
230 }
231 } else {
232 switch (itemLayout()) {
233 case KFileItemListView::IconsLayout: iconSize = IconsModeSettings::iconSize(); break;
234 case KFileItemListView::CompactLayout: iconSize = CompactModeSettings::iconSize(); break;
235 case KFileItemListView::DetailsLayout: iconSize = DetailsModeSettings::iconSize(); break;
236 default: Q_ASSERT(false); break;
237 }
238 }
239
240 m_zoomLevel = ZoomLevelInfo::zoomLevelForIconSize(QSize(iconSize, iconSize));
241 KItemListStyleOption styleOption = m_fileItemListView->styleOption();
242
243 const int innerMargin = (iconSize >= KIconLoader::SizeSmallMedium) ? 4 : 2;
244
245 // Calculate the item-width and item-height
246 int itemWidth;
247 int itemHeight;
248 switch (itemLayout()) {
249 case KFileItemListView::IconsLayout: {
250 const int minItemWidth = 64;
251 itemWidth = minItemWidth + IconsModeSettings::textWidthIndex() * 64; // TODO:
252 if (itemWidth < iconSize + innerMargin * 2) {
253 itemWidth = iconSize + innerMargin * 2;
254 }
255 itemHeight = innerMargin * 2 + iconSize + styleOption.fontMetrics.height();
256 break;
257 }
258 case KFileItemListView::CompactLayout: {
259 itemWidth = innerMargin * 2;
260 const int textLinesCount = m_fileItemListView->visibleRoles().count();
261 itemHeight = innerMargin * 2 + qMax(iconSize, textLinesCount * styleOption.fontMetrics.height());
262 break;
263 }
264 case KFileItemListView::DetailsLayout: {
265 itemWidth = -1;
266 itemHeight = innerMargin * 2 + qMax(iconSize, styleOption.fontMetrics.height());
267 break;
268 }
269 default: Q_ASSERT(false); break;
270 }
271
272 // Apply the calculated values
273 styleOption.margin = innerMargin;
274 styleOption.iconSize = iconSize;
275 m_fileItemListView->setStyleOption(styleOption);
276 m_fileItemListView->setItemSize(QSizeF(itemWidth, itemHeight));
277 }
278
279 #include "dolphinitemlistcontainer.moc"