]> cloud.milkyroute.net Git - dolphin.git/blob - src/dolphinviewactionhandler.cpp
It is hard to understand which is the actual selected item here: m_selection, m_fileI...
[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
22 #include "viewpropertiesdialog.h"
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(i18nc("@action", "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 // This action is useful for being enabled when "move_to_trash" should be
96 // disabled and "delete" is enabled (e.g. non-local files), so that Key_Del
97 // can be used for deleting the file (#76016). It needs to be a separate action
98 // so that the Edit menu isn't affected.
99 KAction* deleteWithTrashShortcut = m_actionCollection->addAction("delete_shortcut");
100 // TODO after message freeze, a more descriptive text, for the shortcuts editor.
101 deleteWithTrashShortcut->setText(i18nc("@action:inmenu File", "Delete"));
102 deleteWithTrashShortcut->setShortcut(QKeySequence::Delete);
103 deleteWithTrashShortcut->setEnabled(false);
104 connect(deleteWithTrashShortcut, SIGNAL(triggered()), this, SLOT(slotDeleteItems()));
105
106 // View menu
107
108 QActionGroup* viewModeActions = new QActionGroup(this);
109 viewModeActions->addAction(iconsModeAction());
110 viewModeActions->addAction(detailsModeAction());
111 viewModeActions->addAction(columnsModeAction());
112 connect(viewModeActions, SIGNAL(triggered(QAction*)), this, SLOT(slotViewModeActionTriggered(QAction*)));
113
114 KStandardAction::zoomIn(this,
115 SLOT(zoomIn()),
116 m_actionCollection);
117
118 KStandardAction::zoomOut(this,
119 SLOT(zoomOut()),
120 m_actionCollection);
121
122 KToggleAction* showPreview = m_actionCollection->add<KToggleAction>("show_preview");
123 showPreview->setText(i18nc("@action:intoolbar", "Preview"));
124 showPreview->setIcon(KIcon("view-preview"));
125 connect(showPreview, SIGNAL(triggered(bool)), this, SLOT(togglePreview(bool)));
126
127 KToggleAction* sortDescending = m_actionCollection->add<KToggleAction>("descending");
128 sortDescending->setText(i18nc("@action:inmenu Sort", "Descending"));
129 connect(sortDescending, SIGNAL(triggered()), this, SLOT(toggleSortOrder()));
130
131 QActionGroup* sortByActionGroup = createSortByActionGroup();
132 connect(sortByActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotSortTriggered(QAction*)));
133
134 QActionGroup* showInformationActionGroup = createAdditionalInformationActionGroup();
135 connect(showInformationActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(toggleAdditionalInfo(QAction*)));
136
137 KToggleAction* showInGroups = m_actionCollection->add<KToggleAction>("show_in_groups");
138 showInGroups->setText(i18nc("@action:inmenu View", "Show in Groups"));
139 connect(showInGroups, SIGNAL(triggered(bool)), this, SLOT(toggleSortCategorization(bool)));
140
141 KToggleAction* showHiddenFiles = m_actionCollection->add<KToggleAction>("show_hidden_files");
142 showHiddenFiles->setText(i18nc("@action:inmenu View", "Show Hidden Files"));
143 showHiddenFiles->setShortcut(Qt::ALT | Qt::Key_Period);
144 connect(showHiddenFiles, SIGNAL(triggered(bool)), this, SLOT(toggleShowHiddenFiles(bool)));
145
146 KAction* adjustViewProps = m_actionCollection->addAction("view_properties");
147 adjustViewProps->setText(i18nc("@action:inmenu View", "Adjust View Properties..."));
148 connect(adjustViewProps, SIGNAL(triggered()), this, SLOT(slotAdjustViewProperties()));
149 }
150
151 QActionGroup* DolphinViewActionHandler::createAdditionalInformationActionGroup()
152 {
153 QActionGroup* showInformationGroup = new QActionGroup(m_actionCollection);
154 showInformationGroup->setExclusive(false);
155
156 KToggleAction* showSizeInfo = m_actionCollection->add<KToggleAction>("show_size_info");
157 showSizeInfo->setText(i18nc("@action:inmenu Additional information", "Size"));
158 showSizeInfo->setData(KFileItemDelegate::Size);
159 showSizeInfo->setActionGroup(showInformationGroup);
160
161 KToggleAction* showDateInfo = m_actionCollection->add<KToggleAction>("show_date_info");
162 showDateInfo->setText(i18nc("@action:inmenu Additional information", "Date"));
163 showDateInfo->setData(KFileItemDelegate::ModificationTime);
164 showDateInfo->setActionGroup(showInformationGroup);
165
166 KToggleAction* showPermissionsInfo = m_actionCollection->add<KToggleAction>("show_permissions_info");
167 showPermissionsInfo->setText(i18nc("@action:inmenu Additional information", "Permissions"));
168 showPermissionsInfo->setData(KFileItemDelegate::Permissions);
169 showPermissionsInfo->setActionGroup(showInformationGroup);
170
171 KToggleAction* showOwnerInfo = m_actionCollection->add<KToggleAction>("show_owner_info");
172 showOwnerInfo->setText(i18nc("@action:inmenu Additional information", "Owner"));
173 showOwnerInfo->setData(KFileItemDelegate::Owner);
174 showOwnerInfo->setActionGroup(showInformationGroup);
175
176 KToggleAction* showGroupInfo = m_actionCollection->add<KToggleAction>("show_group_info");
177 showGroupInfo->setText(i18nc("@action:inmenu Additional information", "Group"));
178 showGroupInfo->setData(KFileItemDelegate::OwnerAndGroup);
179 showGroupInfo->setActionGroup(showInformationGroup);
180
181 KToggleAction* showMimeInfo = m_actionCollection->add<KToggleAction>("show_mime_info");
182 showMimeInfo->setText(i18nc("@action:inmenu Additional information", "Type"));
183 showMimeInfo->setData(KFileItemDelegate::FriendlyMimeType);
184 showMimeInfo->setActionGroup(showInformationGroup);
185
186 return showInformationGroup;
187 }
188
189 Q_DECLARE_METATYPE(DolphinView::Sorting)
190
191 QActionGroup* DolphinViewActionHandler::createSortByActionGroup()
192 {
193 QActionGroup* sortByActionGroup = new QActionGroup(m_actionCollection);
194 sortByActionGroup->setExclusive(true);
195
196 KToggleAction* sortByName = m_actionCollection->add<KToggleAction>("sort_by_name");
197 sortByName->setText(i18nc("@action:inmenu Sort By", "Name"));
198 sortByName->setData(QVariant::fromValue(DolphinView::SortByName));
199 sortByActionGroup->addAction(sortByName);
200
201 KToggleAction* sortBySize = m_actionCollection->add<KToggleAction>("sort_by_size");
202 sortBySize->setText(i18nc("@action:inmenu Sort By", "Size"));
203 sortBySize->setData(QVariant::fromValue(DolphinView::SortBySize));
204 sortByActionGroup->addAction(sortBySize);
205
206 KToggleAction* sortByDate = m_actionCollection->add<KToggleAction>("sort_by_date");
207 sortByDate->setText(i18nc("@action:inmenu Sort By", "Date"));
208 sortByDate->setData(QVariant::fromValue(DolphinView::SortByDate));
209 sortByActionGroup->addAction(sortByDate);
210
211 KToggleAction* sortByPermissions = m_actionCollection->add<KToggleAction>("sort_by_permissions");
212 sortByPermissions->setText(i18nc("@action:inmenu Sort By", "Permissions"));
213 sortByPermissions->setData(QVariant::fromValue(DolphinView::SortByPermissions));
214 sortByActionGroup->addAction(sortByPermissions);
215
216 KToggleAction* sortByOwner = m_actionCollection->add<KToggleAction>("sort_by_owner");
217 sortByOwner->setText(i18nc("@action:inmenu Sort By", "Owner"));
218 sortByOwner->setData(QVariant::fromValue(DolphinView::SortByOwner));
219 sortByActionGroup->addAction(sortByOwner);
220
221 KToggleAction* sortByGroup = m_actionCollection->add<KToggleAction>("sort_by_group");
222 sortByGroup->setText(i18nc("@action:inmenu Sort By", "Group"));
223 sortByGroup->setData(QVariant::fromValue(DolphinView::SortByGroup));
224 sortByActionGroup->addAction(sortByGroup);
225
226 KToggleAction* sortByType = m_actionCollection->add<KToggleAction>("sort_by_type");
227 sortByType->setText(i18nc("@action:inmenu Sort By", "Type"));
228 sortByType->setData(QVariant::fromValue(DolphinView::SortByType));
229 sortByActionGroup->addAction(sortByType);
230
231 // TODO: Hid "sort by rating" and "sort by tags" as without caching the performance
232 // is too slow currently (Nepomuk will support caching in future releases).
233 //
234 // KToggleAction* sortByRating = m_actionCollection->add<KToggleAction>("sort_by_rating");
235 // sortByRating->setData(QVariant::fromValue(DolphinView::SortByRating));
236 // sortByRating->setText(i18nc("@action:inmenu Sort By", "Rating"));
237 // sortByActionGroup->addAction(sortByRating);
238 //
239 // KToggleAction* sortByTags = m_actionCollection->add<KToggleAction>("sort_by_tags");
240 // sortByTags->setData(QVariant::fromValue(DolphinView::SortByTags));
241 // sortByTags->setText(i18nc("@action:inmenu Sort By", "Tags"));
242 // sortByActionGroup->addAction(sortByTags);
243 //
244 #ifdef HAVE_NEPOMUK
245 // if (!MetaDataWidget::metaDataAvailable()) {
246 // sortByRating->setEnabled(false);
247 // sortByTags->setEnabled(false);
248 // }
249 #else
250 // sortByRating->setEnabled(false);
251 // sortByTags->setEnabled(false);
252 #endif
253
254
255
256 return sortByActionGroup;
257 }
258
259 void DolphinViewActionHandler::slotCreateDir()
260 {
261 Q_ASSERT(m_currentView);
262 KonqOperations::newDir(m_currentView, m_currentView->url());
263 }
264
265 void DolphinViewActionHandler::slotViewModeActionTriggered(QAction* action)
266 {
267 const DolphinView::Mode mode = action->data().value<DolphinView::Mode>();
268 m_currentView->setMode(mode);
269 }
270
271 void DolphinViewActionHandler::slotRename()
272 {
273 emit actionBeingHandled();
274 m_currentView->renameSelectedItems();
275 }
276
277 void DolphinViewActionHandler::slotTrashActivated(Qt::MouseButtons, Qt::KeyboardModifiers modifiers)
278 {
279 emit actionBeingHandled();
280 // Note: kde3's konq_mainwindow.cpp used to check
281 // reason == KAction::PopupMenuActivation && ...
282 // but this isn't supported anymore
283 if (modifiers & Qt::ShiftModifier)
284 m_currentView->deleteSelectedItems();
285 else
286 m_currentView->trashSelectedItems();
287 }
288
289 void DolphinViewActionHandler::slotDeleteItems()
290 {
291 emit actionBeingHandled();
292 m_currentView->deleteSelectedItems();
293 }
294
295 void DolphinViewActionHandler::togglePreview(bool show)
296 {
297 emit actionBeingHandled();
298 m_currentView->setShowPreview(show);
299 }
300
301 void DolphinViewActionHandler::slotShowPreviewChanged()
302 {
303 // It is not enough to update the 'Show Preview' action, also
304 // the 'Zoom In' and 'Zoom Out' actions must be adapted.
305 updateViewActions();
306 }
307
308 QString DolphinViewActionHandler::currentViewModeActionName() const
309 {
310 switch (m_currentView->mode()) {
311 case DolphinView::IconsView:
312 return "icons";
313 case DolphinView::DetailsView:
314 return "details";
315 case DolphinView::ColumnView:
316 return "columns";
317 }
318 return QString(); // can't happen
319 }
320
321 void DolphinViewActionHandler::updateViewActions()
322 {
323 QAction* viewModeAction = m_actionCollection->action(currentViewModeActionName());
324 if (viewModeAction != 0) {
325 viewModeAction->setChecked(true);
326 }
327
328 QAction* zoomInAction = m_actionCollection->action(KStandardAction::name(KStandardAction::ZoomIn));
329 if (zoomInAction != 0) {
330 zoomInAction->setEnabled(m_currentView->isZoomInPossible());
331 }
332
333 QAction* zoomOutAction = m_actionCollection->action(KStandardAction::name(KStandardAction::ZoomOut));
334 if (zoomOutAction != 0) {
335 zoomOutAction->setEnabled(m_currentView->isZoomOutPossible());
336 }
337
338 QAction* showPreviewAction = m_actionCollection->action("show_preview");
339 showPreviewAction->setChecked(m_currentView->showPreview());
340
341 slotSortOrderChanged(m_currentView->sortOrder());
342 slotAdditionalInfoChanged();
343 slotCategorizedSortingChanged();
344 slotSortingChanged(m_currentView->sorting());
345
346 QAction* showHiddenFilesAction = m_actionCollection->action("show_hidden_files");
347 showHiddenFilesAction->setChecked(m_currentView->showHiddenFiles());
348
349 }
350
351 void DolphinViewActionHandler::zoomIn()
352 {
353 m_currentView->zoomIn();
354 updateViewActions();
355 }
356
357 void DolphinViewActionHandler::zoomOut()
358 {
359 m_currentView->zoomOut();
360 updateViewActions();
361 }
362
363 void DolphinViewActionHandler::toggleSortOrder()
364 {
365 m_currentView->toggleSortOrder();
366 }
367
368 void DolphinViewActionHandler::slotSortOrderChanged(Qt::SortOrder order)
369 {
370 QAction* descending = m_actionCollection->action("descending");
371 const bool sortDescending = (order == Qt::DescendingOrder);
372 descending->setChecked(sortDescending);
373 }
374
375 void DolphinViewActionHandler::toggleAdditionalInfo(QAction* action)
376 {
377 emit actionBeingHandled();
378 m_currentView->toggleAdditionalInfo(action);
379 }
380
381 void DolphinViewActionHandler::slotAdditionalInfoChanged()
382 {
383 m_currentView->updateAdditionalInfoActions(m_actionCollection);
384 }
385
386 void DolphinViewActionHandler::toggleSortCategorization(bool categorizedSorting)
387 {
388 m_currentView->setCategorizedSorting(categorizedSorting);
389 }
390
391 void DolphinViewActionHandler::slotCategorizedSortingChanged()
392 {
393 QAction* showInGroupsAction = m_actionCollection->action("show_in_groups");
394 showInGroupsAction->setChecked(m_currentView->categorizedSorting());
395 showInGroupsAction->setEnabled(m_currentView->supportsCategorizedSorting());
396 }
397
398 void DolphinViewActionHandler::toggleShowHiddenFiles(bool show)
399 {
400 emit actionBeingHandled();
401 m_currentView->setShowHiddenFiles(show);
402 }
403
404 void DolphinViewActionHandler::slotShowHiddenFilesChanged()
405 {
406 QAction* showHiddenFilesAction = m_actionCollection->action("show_hidden_files");
407 showHiddenFilesAction->setChecked(m_currentView->showHiddenFiles());
408 }
409
410
411 KToggleAction* DolphinViewActionHandler::iconsModeAction()
412 {
413 KToggleAction* iconsView = m_actionCollection->add<KToggleAction>("icons");
414 iconsView->setText(i18nc("@action:inmenu View Mode", "Icons"));
415 iconsView->setShortcut(Qt::CTRL | Qt::Key_1);
416 iconsView->setIcon(KIcon("view-list-icons"));
417 iconsView->setData(QVariant::fromValue(DolphinView::IconsView));
418 return iconsView;
419 }
420
421 KToggleAction* DolphinViewActionHandler::detailsModeAction()
422 {
423 KToggleAction* detailsView = m_actionCollection->add<KToggleAction>("details");
424 detailsView->setText(i18nc("@action:inmenu View Mode", "Details"));
425 detailsView->setShortcut(Qt::CTRL | Qt::Key_2);
426 detailsView->setIcon(KIcon("view-list-details"));
427 detailsView->setData(QVariant::fromValue(DolphinView::DetailsView));
428 return detailsView;
429 }
430
431 KToggleAction* DolphinViewActionHandler::columnsModeAction()
432 {
433 KToggleAction* columnView = m_actionCollection->add<KToggleAction>("columns");
434 columnView->setText(i18nc("@action:inmenu View Mode", "Columns"));
435 columnView->setShortcut(Qt::CTRL | Qt::Key_3);
436 columnView->setIcon(KIcon("view-file-columns"));
437 columnView->setData(QVariant::fromValue(DolphinView::ColumnView));
438 return columnView;
439 }
440
441 void DolphinViewActionHandler::slotSortingChanged(DolphinView::Sorting sorting)
442 {
443 QAction* action = 0;
444 switch (sorting) {
445 case DolphinView::SortByName:
446 action = m_actionCollection->action("sort_by_name");
447 break;
448 case DolphinView::SortBySize:
449 action = m_actionCollection->action("sort_by_size");
450 break;
451 case DolphinView::SortByDate:
452 action = m_actionCollection->action("sort_by_date");
453 break;
454 case DolphinView::SortByPermissions:
455 action = m_actionCollection->action("sort_by_permissions");
456 break;
457 case DolphinView::SortByOwner:
458 action = m_actionCollection->action("sort_by_owner");
459 break;
460 case DolphinView::SortByGroup:
461 action = m_actionCollection->action("sort_by_group");
462 break;
463 case DolphinView::SortByType:
464 action = m_actionCollection->action("sort_by_type");
465 break;
466 #ifdef HAVE_NEPOMUK
467 case DolphinView::SortByRating:
468 action = m_actionCollection->action("sort_by_rating");
469 break;
470 case DolphinView::SortByTags:
471 action = m_actionCollection->action("sort_by_tags");
472 break;
473 #endif
474 default:
475 break;
476 }
477
478 if (action != 0) {
479 action->setChecked(true);
480 }
481 }
482
483 void DolphinViewActionHandler::slotSortTriggered(QAction* action)
484 {
485 const DolphinView::Sorting sorting = action->data().value<DolphinView::Sorting>();
486 m_currentView->setSorting(sorting);
487 }
488
489 void DolphinViewActionHandler::slotAdjustViewProperties()
490 {
491 emit actionBeingHandled();
492 ViewPropertiesDialog dlg(m_currentView);
493 dlg.exec();
494 }