]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphinviewactionhandler.cpp
SVN_SILENT made messages (.desktop file)
[dolphin.git] / src / dolphinviewactionhandler.cpp
1 /***************************************************************************
2 * Copyright (C) 2008 by David Faure <faure@kde.org> *
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 "dolphinviewactionhandler.h"
21 #include <kdebug.h>
22
23 #include "dolphinview.h"
24
25 #include <konq_operations.h>
26
27 #include <kaction.h>
28 #include <kactioncollection.h>
29 #include <klocale.h>
30 #include <ktoggleaction.h>
31
32 DolphinViewActionHandler::DolphinViewActionHandler(KActionCollection* collection, QObject* parent)
33 : QObject(parent),
34 m_actionCollection(collection),
35 m_currentView(0)
36 {
37 Q_ASSERT(m_actionCollection);
38 createActions();
39 }
40
41 void DolphinViewActionHandler::setCurrentView(DolphinView* view)
42 {
43 Q_ASSERT(view);
44
45 if (m_currentView)
46 disconnect(m_currentView, 0, this, 0);
47
48 m_currentView = view;
49
50 connect(view, SIGNAL(modeChanged()),
51 this, SLOT(updateViewActions()));
52 connect(view, SIGNAL(showPreviewChanged()),
53 this, SLOT(slotShowPreviewChanged()));
54 connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder)),
55 this, SLOT(slotSortOrderChanged(Qt::SortOrder)));
56 connect(view, SIGNAL(additionalInfoChanged()),
57 this, SLOT(slotAdditionalInfoChanged()));
58 connect(view, SIGNAL(categorizedSortingChanged()),
59 this, SLOT(slotCategorizedSortingChanged()));
60 connect(view, SIGNAL(showHiddenFilesChanged()),
61 this, SLOT(slotShowHiddenFilesChanged()));
62 connect(view, SIGNAL(sortingChanged(DolphinView::Sorting)),
63 this, SLOT(slotSortingChanged(DolphinView::Sorting)));
64 }
65
66 void DolphinViewActionHandler::createActions()
67 {
68 // This action doesn't appear in the GUI, it's for the shortcut only.
69 // KNewMenu takes care of the GUI stuff.
70 KAction* newDirAction = m_actionCollection->addAction("create_dir");
71 newDirAction->setText(i18n("Create Folder..."));
72 newDirAction->setShortcut(Qt::Key_F10);
73 connect(newDirAction, SIGNAL(triggered()), SLOT(slotCreateDir()));
74
75 // Edit menu
76
77 KAction* rename = m_actionCollection->addAction("rename");
78 rename->setText(i18nc("@action:inmenu File", "Rename..."));
79 rename->setShortcut(Qt::Key_F2);
80 connect(rename, SIGNAL(triggered()), this, SLOT(slotRename()));
81
82 KAction* moveToTrash = m_actionCollection->addAction("move_to_trash");
83 moveToTrash->setText(i18nc("@action:inmenu File", "Move to Trash"));
84 moveToTrash->setIcon(KIcon("user-trash"));
85 moveToTrash->setShortcut(QKeySequence::Delete);
86 connect(moveToTrash, SIGNAL(triggered(Qt::MouseButtons, Qt::KeyboardModifiers)),
87 this, SLOT(slotTrashActivated(Qt::MouseButtons, Qt::KeyboardModifiers)));
88
89 KAction* deleteAction = m_actionCollection->addAction("delete");
90 deleteAction->setIcon(KIcon("edit-delete"));
91 deleteAction->setText(i18nc("@action:inmenu File", "Delete"));
92 deleteAction->setShortcut(Qt::SHIFT | Qt::Key_Delete);
93 connect(deleteAction, SIGNAL(triggered()), this, SLOT(slotDeleteItems()));
94
95 // View menu
96
97 QActionGroup* viewModeActions = new QActionGroup(this);
98 viewModeActions->addAction(iconsModeAction());
99 viewModeActions->addAction(detailsModeAction());
100 viewModeActions->addAction(columnsModeAction());
101 connect(viewModeActions, SIGNAL(triggered(QAction*)), this, SLOT(slotViewModeActionTriggered(QAction*)));
102
103 KStandardAction::zoomIn(this,
104 SLOT(zoomIn()),
105 m_actionCollection);
106
107 KStandardAction::zoomOut(this,
108 SLOT(zoomOut()),
109 m_actionCollection);
110
111 KToggleAction* showPreview = m_actionCollection->add<KToggleAction>("show_preview");
112 showPreview->setText(i18nc("@action:intoolbar", "Preview"));
113 showPreview->setIcon(KIcon("view-preview"));
114 connect(showPreview, SIGNAL(triggered(bool)), this, SLOT(togglePreview(bool)));
115
116 KToggleAction* sortDescending = m_actionCollection->add<KToggleAction>("descending");
117 sortDescending->setText(i18nc("@action:inmenu Sort", "Descending"));
118 connect(sortDescending, SIGNAL(triggered()), this, SLOT(toggleSortOrder()));
119
120 QActionGroup* sortByActionGroup = createSortByActionGroup();
121 connect(sortByActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotSortTriggered(QAction*)));
122
123 QActionGroup* showInformationActionGroup = createAdditionalInformationActionGroup();
124 connect(showInformationActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(toggleAdditionalInfo(QAction*)));
125
126 KToggleAction* showInGroups = m_actionCollection->add<KToggleAction>("show_in_groups");
127 showInGroups->setText(i18nc("@action:inmenu View", "Show in Groups"));
128 connect(showInGroups, SIGNAL(triggered(bool)), this, SLOT(toggleSortCategorization(bool)));
129
130 KToggleAction* showHiddenFiles = m_actionCollection->add<KToggleAction>("show_hidden_files");
131 showHiddenFiles->setText(i18nc("@action:inmenu View", "Show Hidden Files"));
132 showHiddenFiles->setShortcut(Qt::ALT | Qt::Key_Period);
133 connect(showHiddenFiles, SIGNAL(triggered(bool)), this, SLOT(toggleShowHiddenFiles(bool)));
134
135 }
136
137 QActionGroup* DolphinViewActionHandler::createAdditionalInformationActionGroup()
138 {
139 QActionGroup* showInformationGroup = new QActionGroup(m_actionCollection);
140 showInformationGroup->setExclusive(false);
141
142 KToggleAction* showSizeInfo = m_actionCollection->add<KToggleAction>("show_size_info");
143 showSizeInfo->setText(i18nc("@action:inmenu Additional information", "Size"));
144 showSizeInfo->setData(KFileItemDelegate::Size);
145 showSizeInfo->setActionGroup(showInformationGroup);
146
147 KToggleAction* showDateInfo = m_actionCollection->add<KToggleAction>("show_date_info");
148 showDateInfo->setText(i18nc("@action:inmenu Additional information", "Date"));
149 showDateInfo->setData(KFileItemDelegate::ModificationTime);
150 showDateInfo->setActionGroup(showInformationGroup);
151
152 KToggleAction* showPermissionsInfo = m_actionCollection->add<KToggleAction>("show_permissions_info");
153 showPermissionsInfo->setText(i18nc("@action:inmenu Additional information", "Permissions"));
154 showPermissionsInfo->setData(KFileItemDelegate::Permissions);
155 showPermissionsInfo->setActionGroup(showInformationGroup);
156
157 KToggleAction* showOwnerInfo = m_actionCollection->add<KToggleAction>("show_owner_info");
158 showOwnerInfo->setText(i18nc("@action:inmenu Additional information", "Owner"));
159 showOwnerInfo->setData(KFileItemDelegate::Owner);
160 showOwnerInfo->setActionGroup(showInformationGroup);
161
162 KToggleAction* showGroupInfo = m_actionCollection->add<KToggleAction>("show_group_info");
163 showGroupInfo->setText(i18nc("@action:inmenu Additional information", "Group"));
164 showGroupInfo->setData(KFileItemDelegate::OwnerAndGroup);
165 showGroupInfo->setActionGroup(showInformationGroup);
166
167 KToggleAction* showMimeInfo = m_actionCollection->add<KToggleAction>("show_mime_info");
168 showMimeInfo->setText(i18nc("@action:inmenu Additional information", "Type"));
169 showMimeInfo->setData(KFileItemDelegate::FriendlyMimeType);
170 showMimeInfo->setActionGroup(showInformationGroup);
171
172 return showInformationGroup;
173 }
174
175 Q_DECLARE_METATYPE(DolphinView::Sorting)
176
177 QActionGroup* DolphinViewActionHandler::createSortByActionGroup()
178 {
179 QActionGroup* sortByActionGroup = new QActionGroup(m_actionCollection);
180 sortByActionGroup->setExclusive(true);
181
182 KToggleAction* sortByName = m_actionCollection->add<KToggleAction>("sort_by_name");
183 sortByName->setText(i18nc("@action:inmenu Sort By", "Name"));
184 sortByName->setData(QVariant::fromValue(DolphinView::SortByName));
185 sortByActionGroup->addAction(sortByName);
186
187 KToggleAction* sortBySize = m_actionCollection->add<KToggleAction>("sort_by_size");
188 sortBySize->setText(i18nc("@action:inmenu Sort By", "Size"));
189 sortBySize->setData(QVariant::fromValue(DolphinView::SortBySize));
190 sortByActionGroup->addAction(sortBySize);
191
192 KToggleAction* sortByDate = m_actionCollection->add<KToggleAction>("sort_by_date");
193 sortByDate->setText(i18nc("@action:inmenu Sort By", "Date"));
194 sortByDate->setData(QVariant::fromValue(DolphinView::SortByDate));
195 sortByActionGroup->addAction(sortByDate);
196
197 KToggleAction* sortByPermissions = m_actionCollection->add<KToggleAction>("sort_by_permissions");
198 sortByPermissions->setText(i18nc("@action:inmenu Sort By", "Permissions"));
199 sortByPermissions->setData(QVariant::fromValue(DolphinView::SortByPermissions));
200 sortByActionGroup->addAction(sortByPermissions);
201
202 KToggleAction* sortByOwner = m_actionCollection->add<KToggleAction>("sort_by_owner");
203 sortByOwner->setText(i18nc("@action:inmenu Sort By", "Owner"));
204 sortByOwner->setData(QVariant::fromValue(DolphinView::SortByOwner));
205 sortByActionGroup->addAction(sortByOwner);
206
207 KToggleAction* sortByGroup = m_actionCollection->add<KToggleAction>("sort_by_group");
208 sortByGroup->setText(i18nc("@action:inmenu Sort By", "Group"));
209 sortByGroup->setData(QVariant::fromValue(DolphinView::SortByGroup));
210 sortByActionGroup->addAction(sortByGroup);
211
212 KToggleAction* sortByType = m_actionCollection->add<KToggleAction>("sort_by_type");
213 sortByType->setText(i18nc("@action:inmenu Sort By", "Type"));
214 sortByType->setData(QVariant::fromValue(DolphinView::SortByType));
215 sortByActionGroup->addAction(sortByType);
216
217 // TODO: Hid "sort by rating" and "sort by tags" as without caching the performance
218 // is too slow currently (Nepomuk will support caching in future releases).
219 //
220 // KToggleAction* sortByRating = m_actionCollection->add<KToggleAction>("sort_by_rating");
221 // sortByRating->setData(QVariant::fromValue(DolphinView::SortByRating));
222 // sortByRating->setText(i18nc("@action:inmenu Sort By", "Rating"));
223 // sortByActionGroup->addAction(sortByRating);
224 //
225 // KToggleAction* sortByTags = m_actionCollection->add<KToggleAction>("sort_by_tags");
226 // sortByTags->setData(QVariant::fromValue(DolphinView::SortByTags));
227 // sortByTags->setText(i18nc("@action:inmenu Sort By", "Tags"));
228 // sortByActionGroup->addAction(sortByTags);
229 //
230 #ifdef HAVE_NEPOMUK
231 // if (!MetaDataWidget::metaDataAvailable()) {
232 // sortByRating->setEnabled(false);
233 // sortByTags->setEnabled(false);
234 // }
235 #else
236 // sortByRating->setEnabled(false);
237 // sortByTags->setEnabled(false);
238 #endif
239
240
241
242 return sortByActionGroup;
243 }
244
245 void DolphinViewActionHandler::slotCreateDir()
246 {
247 Q_ASSERT(m_currentView);
248 KonqOperations::newDir(m_currentView, m_currentView->url());
249 }
250
251 void DolphinViewActionHandler::slotViewModeActionTriggered(QAction* action)
252 {
253 const DolphinView::Mode mode = action->data().value<DolphinView::Mode>();
254 m_currentView->setMode(mode);
255 }
256
257 void DolphinViewActionHandler::slotRename()
258 {
259 emit actionBeingHandled();
260 m_currentView->renameSelectedItems();
261 }
262
263 void DolphinViewActionHandler::slotTrashActivated(Qt::MouseButtons, Qt::KeyboardModifiers modifiers)
264 {
265 emit actionBeingHandled();
266 // Note: kde3's konq_mainwindow.cpp used to check
267 // reason == KAction::PopupMenuActivation && ...
268 // but this isn't supported anymore
269 if (modifiers & Qt::ShiftModifier)
270 m_currentView->deleteSelectedItems();
271 else
272 m_currentView->trashSelectedItems();
273 }
274
275 void DolphinViewActionHandler::slotDeleteItems()
276 {
277 emit actionBeingHandled();
278 m_currentView->deleteSelectedItems();
279 }
280
281 void DolphinViewActionHandler::togglePreview(bool show)
282 {
283 emit actionBeingHandled();
284 m_currentView->setShowPreview(show);
285 }
286
287 void DolphinViewActionHandler::slotShowPreviewChanged()
288 {
289 // It is not enough to update the 'Show Preview' action, also
290 // the 'Zoom In' and 'Zoom Out' actions must be adapted.
291 updateViewActions();
292 }
293
294 QString DolphinViewActionHandler::currentViewModeActionName() const
295 {
296 switch (m_currentView->mode()) {
297 case DolphinView::IconsView:
298 return "icons";
299 case DolphinView::DetailsView:
300 return "details";
301 case DolphinView::ColumnView:
302 return "columns";
303 }
304 return QString(); // can't happen
305 }
306
307 void DolphinViewActionHandler::updateViewActions()
308 {
309 QAction* viewModeAction = m_actionCollection->action(currentViewModeActionName());
310 if (viewModeAction != 0) {
311 viewModeAction->setChecked(true);
312 }
313
314 QAction* zoomInAction = m_actionCollection->action(KStandardAction::name(KStandardAction::ZoomIn));
315 if (zoomInAction != 0) {
316 zoomInAction->setEnabled(m_currentView->isZoomInPossible());
317 }
318
319 QAction* zoomOutAction = m_actionCollection->action(KStandardAction::name(KStandardAction::ZoomOut));
320 if (zoomOutAction != 0) {
321 zoomOutAction->setEnabled(m_currentView->isZoomOutPossible());
322 }
323
324 QAction* showPreviewAction = m_actionCollection->action("show_preview");
325 showPreviewAction->setChecked(m_currentView->showPreview());
326
327 slotSortOrderChanged(m_currentView->sortOrder());
328 slotAdditionalInfoChanged();
329 slotCategorizedSortingChanged();
330 slotSortingChanged(m_currentView->sorting());
331
332 QAction* showHiddenFilesAction = m_actionCollection->action("show_hidden_files");
333 showHiddenFilesAction->setChecked(m_currentView->showHiddenFiles());
334
335 }
336
337 void DolphinViewActionHandler::zoomIn()
338 {
339 m_currentView->zoomIn();
340 updateViewActions();
341 }
342
343 void DolphinViewActionHandler::zoomOut()
344 {
345 m_currentView->zoomOut();
346 updateViewActions();
347 }
348
349 void DolphinViewActionHandler::toggleSortOrder()
350 {
351 m_currentView->toggleSortOrder();
352 }
353
354 void DolphinViewActionHandler::slotSortOrderChanged(Qt::SortOrder order)
355 {
356 QAction* descending = m_actionCollection->action("descending");
357 const bool sortDescending = (order == Qt::DescendingOrder);
358 descending->setChecked(sortDescending);
359 }
360
361 void DolphinViewActionHandler::toggleAdditionalInfo(QAction* action)
362 {
363 emit actionBeingHandled();
364 m_currentView->toggleAdditionalInfo(action);
365 }
366
367 void DolphinViewActionHandler::slotAdditionalInfoChanged()
368 {
369 m_currentView->updateAdditionalInfoActions(m_actionCollection);
370 }
371
372 void DolphinViewActionHandler::toggleSortCategorization(bool categorizedSorting)
373 {
374 m_currentView->setCategorizedSorting(categorizedSorting);
375 }
376
377 void DolphinViewActionHandler::slotCategorizedSortingChanged()
378 {
379 QAction* showInGroupsAction = m_actionCollection->action("show_in_groups");
380 showInGroupsAction->setChecked(m_currentView->categorizedSorting());
381 showInGroupsAction->setEnabled(m_currentView->supportsCategorizedSorting());
382 }
383
384 void DolphinViewActionHandler::toggleShowHiddenFiles(bool show)
385 {
386 emit actionBeingHandled();
387 m_currentView->setShowHiddenFiles(show);
388 }
389
390 void DolphinViewActionHandler::slotShowHiddenFilesChanged()
391 {
392 QAction* showHiddenFilesAction = m_actionCollection->action("show_hidden_files");
393 showHiddenFilesAction->setChecked(m_currentView->showHiddenFiles());
394 }
395
396
397 KToggleAction* DolphinViewActionHandler::iconsModeAction()
398 {
399 KToggleAction* iconsView = m_actionCollection->add<KToggleAction>("icons");
400 iconsView->setText(i18nc("@action:inmenu View Mode", "Icons"));
401 iconsView->setShortcut(Qt::CTRL | Qt::Key_1);
402 iconsView->setIcon(KIcon("view-list-icons"));
403 iconsView->setData(QVariant::fromValue(DolphinView::IconsView));
404 return iconsView;
405 }
406
407 KToggleAction* DolphinViewActionHandler::detailsModeAction()
408 {
409 KToggleAction* detailsView = m_actionCollection->add<KToggleAction>("details");
410 detailsView->setText(i18nc("@action:inmenu View Mode", "Details"));
411 detailsView->setShortcut(Qt::CTRL | Qt::Key_2);
412 detailsView->setIcon(KIcon("view-list-details"));
413 detailsView->setData(QVariant::fromValue(DolphinView::DetailsView));
414 return detailsView;
415 }
416
417 KToggleAction* DolphinViewActionHandler::columnsModeAction()
418 {
419 KToggleAction* columnView = m_actionCollection->add<KToggleAction>("columns");
420 columnView->setText(i18nc("@action:inmenu View Mode", "Columns"));
421 columnView->setShortcut(Qt::CTRL | Qt::Key_3);
422 columnView->setIcon(KIcon("view-file-columns"));
423 columnView->setData(QVariant::fromValue(DolphinView::ColumnView));
424 return columnView;
425 }
426
427 void DolphinViewActionHandler::slotSortingChanged(DolphinView::Sorting sorting)
428 {
429 QAction* action = 0;
430 switch (sorting) {
431 case DolphinView::SortByName:
432 action = m_actionCollection->action("sort_by_name");
433 break;
434 case DolphinView::SortBySize:
435 action = m_actionCollection->action("sort_by_size");
436 break;
437 case DolphinView::SortByDate:
438 action = m_actionCollection->action("sort_by_date");
439 break;
440 case DolphinView::SortByPermissions:
441 action = m_actionCollection->action("sort_by_permissions");
442 break;
443 case DolphinView::SortByOwner:
444 action = m_actionCollection->action("sort_by_owner");
445 break;
446 case DolphinView::SortByGroup:
447 action = m_actionCollection->action("sort_by_group");
448 break;
449 case DolphinView::SortByType:
450 action = m_actionCollection->action("sort_by_type");
451 break;
452 #ifdef HAVE_NEPOMUK
453 case DolphinView::SortByRating:
454 action = m_actionCollection->action("sort_by_rating");
455 break;
456 case DolphinView::SortByTags:
457 action = m_actionCollection->action("sort_by_tags");
458 break;
459 #endif
460 default:
461 break;
462 }
463
464 if (action != 0) {
465 action->setChecked(true);
466 }
467 }
468
469 void DolphinViewActionHandler::slotSortTriggered(QAction* action)
470 {
471 const DolphinView::Sorting sorting = action->data().value<DolphinView::Sorting>();
472 m_currentView->setSorting(sorting);
473 }