]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphiniconsview.cpp
although the wrapping is enabled, eliding the text might be required -> don't specify...
[dolphin.git] / src / dolphiniconsview.cpp
1 /***************************************************************************
2 * Copyright (C) 2006 by Peter Penz (peter.penz@gmx.at) *
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 "dolphiniconsview.h"
21
22 #include "dolphincontroller.h"
23 #include "dolphinsettings.h"
24 #include "dolphinitemcategorizer.h"
25
26 #include "dolphin_iconsmodesettings.h"
27
28 #include <kdirmodel.h>
29 #include <kfileitem.h>
30 #include <kfileitemdelegate.h>
31
32 #include <QtGui/QAbstractProxyModel>
33 #include <QtCore/QPoint>
34
35 DolphinIconsView::DolphinIconsView(QWidget* parent, DolphinController* controller) :
36 KListView(parent),
37 m_controller(controller)
38 {
39 Q_ASSERT(controller != 0);
40 setViewMode(QListView::IconMode);
41 setResizeMode(QListView::Adjust);
42
43 setMouseTracking(true);
44 viewport()->setAttribute(Qt::WA_Hover);
45
46 if (KGlobalSettings::singleClick()) {
47 connect(this, SIGNAL(clicked(const QModelIndex&)),
48 controller, SLOT(triggerItem(const QModelIndex&)));
49 } else {
50 connect(this, SIGNAL(doubleClicked(const QModelIndex&)),
51 controller, SLOT(triggerItem(const QModelIndex&)));
52 }
53 connect(this, SIGNAL(activated(const QModelIndex&)),
54 controller, SLOT(triggerItem(const QModelIndex&)));
55 connect(this, SIGNAL(entered(const QModelIndex&)),
56 controller, SLOT(emitItemEntered(const QModelIndex&)));
57 connect(this, SIGNAL(viewportEntered()),
58 controller, SLOT(emitViewportEntered()));
59 connect(controller, SIGNAL(showPreviewChanged(bool)),
60 this, SLOT(slotShowPreviewChanged(bool)));
61 connect(controller, SIGNAL(showAdditionalInfoChanged(bool)),
62 this, SLOT(slotShowAdditionalInfoChanged(bool)));
63 connect(controller, SIGNAL(zoomIn()),
64 this, SLOT(zoomIn()));
65 connect(controller, SIGNAL(zoomOut()),
66 this, SLOT(zoomOut()));
67
68 // apply the icons mode settings to the widget
69 const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
70 Q_ASSERT(settings != 0);
71
72 m_viewOptions = KListView::viewOptions();
73 m_viewOptions.showDecorationSelected = true;
74
75 QFont font(settings->fontFamily(), settings->fontSize());
76 font.setItalic(settings->italicFont());
77 font.setBold(settings->boldFont());
78 m_viewOptions.font = font;
79 if (settings->numberOfTextlines() > 1) {
80 m_viewOptions.features = QStyleOptionViewItemV2::WrapText;
81 }
82
83 updateGridSize(controller->showPreview(), controller->showAdditionalInfo());
84
85 if (settings->arrangement() == QListView::TopToBottom) {
86 setFlow(QListView::LeftToRight);
87 m_viewOptions.decorationPosition = QStyleOptionViewItem::Top;
88 } else {
89 setFlow(QListView::TopToBottom);
90 m_viewOptions.decorationPosition = QStyleOptionViewItem::Left;
91 }
92 }
93
94 DolphinIconsView::~DolphinIconsView()
95 {
96 }
97
98 QStyleOptionViewItem DolphinIconsView::viewOptions() const
99 {
100 return m_viewOptions;
101 }
102
103 void DolphinIconsView::contextMenuEvent(QContextMenuEvent* event)
104 {
105 KListView::contextMenuEvent(event);
106 m_controller->triggerContextMenuRequest(event->pos());
107 }
108
109 void DolphinIconsView::mouseReleaseEvent(QMouseEvent* event)
110 {
111 KListView::mouseReleaseEvent(event);
112 m_controller->triggerActivation();
113 }
114
115 void DolphinIconsView::dragEnterEvent(QDragEnterEvent* event)
116 {
117 if (event->mimeData()->hasUrls()) {
118 event->acceptProposedAction();
119 }
120 }
121
122 void DolphinIconsView::dropEvent(QDropEvent* event)
123 {
124 const KUrl::List urls = KUrl::List::fromMimeData(event->mimeData());
125 if (!urls.isEmpty()) {
126 m_controller->indicateDroppedUrls(urls,
127 indexAt(event->pos()),
128 event->source());
129 event->acceptProposedAction();
130 }
131 KListView::dropEvent(event);
132 }
133
134 void DolphinIconsView::slotShowPreviewChanged(bool showPreview)
135 {
136 updateGridSize(showPreview, m_controller->showAdditionalInfo());
137 }
138
139 void DolphinIconsView::slotShowAdditionalInfoChanged(bool showAdditionalInfo)
140 {
141 updateGridSize(m_controller->showPreview(), showAdditionalInfo);
142 }
143
144 void DolphinIconsView::zoomIn()
145 {
146 if (isZoomInPossible()) {
147 IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
148
149 const int oldIconSize = settings->iconSize();
150 int newIconSize = oldIconSize;
151
152 const bool showPreview = m_controller->showPreview();
153 if (showPreview) {
154 const int previewSize = increasedIconSize(settings->previewSize());
155 settings->setPreviewSize(previewSize);
156 } else {
157 newIconSize = increasedIconSize(oldIconSize);
158 settings->setIconSize(newIconSize);
159 if (settings->previewSize() < newIconSize) {
160 // assure that the preview size is always >= the icon size
161 settings->setPreviewSize(newIconSize);
162 }
163 }
164
165 // increase also the grid size
166 const int diff = newIconSize - oldIconSize;
167 settings->setGridWidth(settings->gridWidth() + diff);
168 settings->setGridHeight(settings->gridHeight() + diff);
169
170 updateGridSize(showPreview, m_controller->showAdditionalInfo());
171 }
172 }
173
174 void DolphinIconsView::zoomOut()
175 {
176 if (isZoomOutPossible()) {
177 IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
178
179 const int oldIconSize = settings->iconSize();
180 int newIconSize = oldIconSize;
181
182 const bool showPreview = m_controller->showPreview();
183 if (showPreview) {
184 const int previewSize = decreasedIconSize(settings->previewSize());
185 settings->setPreviewSize(previewSize);
186 if (settings->iconSize() > previewSize) {
187 // assure that the icon size is always <= the preview size
188 newIconSize = previewSize;
189 settings->setIconSize(newIconSize);
190 }
191 } else {
192 newIconSize = decreasedIconSize(settings->iconSize());
193 settings->setIconSize(newIconSize);
194 }
195
196 // decrease also the grid size
197 const int diff = oldIconSize - newIconSize;
198 settings->setGridWidth(settings->gridWidth() - diff);
199 settings->setGridHeight(settings->gridHeight() - diff);
200
201 updateGridSize(showPreview, m_controller->showAdditionalInfo());
202 }
203 }
204
205 bool DolphinIconsView::isZoomInPossible() const
206 {
207 IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
208 const int size = m_controller->showPreview() ? settings->previewSize() : settings->iconSize();
209 return size < K3Icon::SizeEnormous;
210 }
211
212 bool DolphinIconsView::isZoomOutPossible() const
213 {
214 IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
215 const int size = m_controller->showPreview() ? settings->previewSize() : settings->iconSize();
216 return size > K3Icon::SizeSmall;
217 }
218
219 int DolphinIconsView::increasedIconSize(int size) const
220 {
221 // TODO: get rid of K3Icon sizes
222 int incSize = 0;
223 switch (size) {
224 case K3Icon::SizeSmall: incSize = K3Icon::SizeSmallMedium; break;
225 case K3Icon::SizeSmallMedium: incSize = K3Icon::SizeMedium; break;
226 case K3Icon::SizeMedium: incSize = K3Icon::SizeLarge; break;
227 case K3Icon::SizeLarge: incSize = K3Icon::SizeHuge; break;
228 case K3Icon::SizeHuge: incSize = K3Icon::SizeEnormous; break;
229 default: Q_ASSERT(false); break;
230 }
231 return incSize;
232 }
233
234 int DolphinIconsView::decreasedIconSize(int size) const
235 {
236 // TODO: get rid of K3Icon sizes
237 int decSize = 0;
238 switch (size) {
239 case K3Icon::SizeSmallMedium: decSize = K3Icon::SizeSmall; break;
240 case K3Icon::SizeMedium: decSize = K3Icon::SizeSmallMedium; break;
241 case K3Icon::SizeLarge: decSize = K3Icon::SizeMedium; break;
242 case K3Icon::SizeHuge: decSize = K3Icon::SizeLarge; break;
243 case K3Icon::SizeEnormous: decSize = K3Icon::SizeHuge; break;
244 default: Q_ASSERT(false); break;
245 }
246 return decSize;
247 }
248
249 void DolphinIconsView::updateGridSize(bool showPreview, bool showAdditionalInfo)
250 {
251 const IconsModeSettings* settings = DolphinSettings::instance().iconsModeSettings();
252 Q_ASSERT(settings != 0);
253
254 int gridWidth = settings->gridWidth();
255 int gridHeight = settings->gridHeight();
256 int size = settings->iconSize();
257
258 if (showPreview) {
259 const int previewSize = settings->previewSize();
260 const int diff = previewSize - size;
261 Q_ASSERT(diff >= 0);
262 gridWidth += diff;
263 gridHeight += diff;
264
265 size = previewSize;
266 }
267
268 if (showAdditionalInfo) {
269 gridHeight += m_viewOptions.font.pointSize() * 2;
270 }
271
272 m_viewOptions.decorationSize = QSize(size, size);
273 setGridSize(QSize(gridWidth, gridHeight));
274
275 m_controller->setZoomInPossible(isZoomInPossible());
276 m_controller->setZoomOutPossible(isZoomOutPossible());
277 }
278
279 #include "dolphiniconsview.moc"