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