X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/4bdbe2b0ac5b931830258ca5b84f81ef55ea0ed2..d64bbc333c5014fad116efc98b77cf3268fc07e0:/src/dolphinviewactionhandler.cpp diff --git a/src/dolphinviewactionhandler.cpp b/src/dolphinviewactionhandler.cpp index ef3c04292..ab28dca26 100644 --- a/src/dolphinviewactionhandler.cpp +++ b/src/dolphinviewactionhandler.cpp @@ -18,16 +18,22 @@ ***************************************************************************/ #include "dolphinviewactionhandler.h" -#include +#include "settings/viewpropertiesdialog.h" #include "dolphinview.h" - +#include "zoomlevelinfo.h" #include #include #include +#include +#include #include +#include #include +#include +#include + DolphinViewActionHandler::DolphinViewActionHandler(KActionCollection* collection, QObject* parent) : QObject(parent), @@ -53,28 +59,41 @@ void DolphinViewActionHandler::setCurrentView(DolphinView* view) this, SLOT(slotShowPreviewChanged())); connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder)), this, SLOT(slotSortOrderChanged(Qt::SortOrder))); + connect(view, SIGNAL(sortFoldersFirstChanged(bool)), + this, SLOT(slotSortFoldersFirstChanged(bool))); connect(view, SIGNAL(additionalInfoChanged()), this, SLOT(slotAdditionalInfoChanged())); connect(view, SIGNAL(categorizedSortingChanged()), this, SLOT(slotCategorizedSortingChanged())); connect(view, SIGNAL(showHiddenFilesChanged()), this, SLOT(slotShowHiddenFilesChanged())); + connect(view, SIGNAL(sortingChanged(DolphinView::Sorting)), + this, SLOT(slotSortingChanged(DolphinView::Sorting))); + connect(view, SIGNAL(zoomLevelChanged(int)), + this, SLOT(slotZoomLevelChanged(int))); +} + +DolphinView* DolphinViewActionHandler::currentView() +{ + return m_currentView; } void DolphinViewActionHandler::createActions() { // This action doesn't appear in the GUI, it's for the shortcut only. - // KNewMenu takes care of the GUI stuff. + // KNewFileMenu takes care of the GUI stuff. KAction* newDirAction = m_actionCollection->addAction("create_dir"); - newDirAction->setText(i18n("Create Folder...")); + newDirAction->setText(i18nc("@action", "Create Folder...")); newDirAction->setShortcut(Qt::Key_F10); - connect(newDirAction, SIGNAL(triggered()), SLOT(slotCreateDir())); + newDirAction->setIcon(KIcon("folder-new")); + connect(newDirAction, SIGNAL(triggered()), this, SIGNAL(createDirectory())); - // Edit menu + // File menu KAction* rename = m_actionCollection->addAction("rename"); rename->setText(i18nc("@action:inmenu File", "Rename...")); rename->setShortcut(Qt::Key_F2); + rename->setIcon(KIcon("edit-rename")); connect(rename, SIGNAL(triggered()), this, SLOT(slotRename())); KAction* moveToTrash = m_actionCollection->addAction("move_to_trash"); @@ -90,12 +109,35 @@ void DolphinViewActionHandler::createActions() deleteAction->setShortcut(Qt::SHIFT | Qt::Key_Delete); connect(deleteAction, SIGNAL(triggered()), this, SLOT(slotDeleteItems())); - // View menu + // This action is useful for being enabled when "move_to_trash" should be + // disabled and "delete" is enabled (e.g. non-local files), so that Key_Del + // can be used for deleting the file (#76016). It needs to be a separate action + // so that the Edit menu isn't affected. + KAction* deleteWithTrashShortcut = m_actionCollection->addAction("delete_shortcut"); + // The descriptive text is just for the shortcuts editor. + deleteWithTrashShortcut->setText(i18nc("@action:inmenu File", "Delete (using shortcut for Trash)")); + deleteWithTrashShortcut->setShortcut(QKeySequence::Delete); + deleteWithTrashShortcut->setEnabled(false); + connect(deleteWithTrashShortcut, SIGNAL(triggered()), this, SLOT(slotDeleteItems())); + + KAction *propertiesAction = m_actionCollection->addAction( "properties" ); + // Well, it's the File menu in dolphinmainwindow and the Edit menu in dolphinpart... :) + propertiesAction->setText( i18nc("@action:inmenu File", "Properties") ); + propertiesAction->setIcon(KIcon("document-properties")); + propertiesAction->setShortcut(Qt::ALT | Qt::Key_Return); + connect(propertiesAction, SIGNAL(triggered()), SLOT(slotProperties())); - QActionGroup* viewModeActions = new QActionGroup(this); - viewModeActions->addAction(iconsModeAction()); - viewModeActions->addAction(detailsModeAction()); - viewModeActions->addAction(columnsModeAction()); + // View menu + KToggleAction* iconsAction = iconsModeAction(); + KToggleAction* detailsAction = detailsModeAction(); + KToggleAction* columnsAction = columnsModeAction(); + + KSelectAction* viewModeActions = m_actionCollection->add("view_mode"); + viewModeActions->setText(i18nc("@action:intoolbar", "View Mode")); + viewModeActions->addAction(iconsAction); + viewModeActions->addAction(detailsAction); + viewModeActions->addAction(columnsAction); + viewModeActions->setToolBarMode(KSelectAction::MenuMode); connect(viewModeActions, SIGNAL(triggered(QAction*)), this, SLOT(slotViewModeActionTriggered(QAction*))); KStandardAction::zoomIn(this, @@ -108,6 +150,7 @@ void DolphinViewActionHandler::createActions() KToggleAction* showPreview = m_actionCollection->add("show_preview"); showPreview->setText(i18nc("@action:intoolbar", "Preview")); + showPreview->setToolTip(i18nc("@info", "Show preview of files and folders")); showPreview->setIcon(KIcon("view-preview")); connect(showPreview, SIGNAL(triggered(bool)), this, SLOT(togglePreview(bool))); @@ -115,8 +158,35 @@ void DolphinViewActionHandler::createActions() sortDescending->setText(i18nc("@action:inmenu Sort", "Descending")); connect(sortDescending, SIGNAL(triggered()), this, SLOT(toggleSortOrder())); - QActionGroup* showInformationActionGroup = createAdditionalInformationActionGroup(); - connect(showInformationActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(toggleAdditionalInfo(QAction*))); + KToggleAction* sortFoldersFirst = m_actionCollection->add("folders_first"); + sortFoldersFirst->setText(i18nc("@action:inmenu Sort", "Folders First")); + connect(sortFoldersFirst, SIGNAL(triggered()), this, SLOT(toggleSortFoldersFirst())); + + // View -> Sort By + QActionGroup* sortByActionGroup = createSortByActionGroup(); + connect(sortByActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(slotSortTriggered(QAction*))); + + KActionMenu* sortByActionMenu = m_actionCollection->add("sort"); + sortByActionMenu->setText(i18nc("@action:inmenu View", "Sort By")); + sortByActionMenu->setDelayed(false); + + foreach (QAction* action, sortByActionGroup->actions()) { + sortByActionMenu->addAction(action); + } + sortByActionMenu->addSeparator(); + sortByActionMenu->addAction(sortDescending); + sortByActionMenu->addAction(sortFoldersFirst); + + // View -> Additional Information + QActionGroup* additionalInfoGroup = createAdditionalInformationActionGroup(); + connect(additionalInfoGroup, SIGNAL(triggered(QAction*)), this, SLOT(toggleAdditionalInfo(QAction*))); + + KActionMenu* additionalInfoMenu = m_actionCollection->add("additional_info"); + additionalInfoMenu->setText(i18nc("@action:inmenu View", "Additional Information")); + additionalInfoMenu->setDelayed(false); + foreach (QAction* action, additionalInfoGroup->actions()) { + additionalInfoMenu->addAction(action); + } KToggleAction* showInGroups = m_actionCollection->add("show_in_groups"); showInGroups->setText(i18nc("@action:inmenu View", "Show in Groups")); @@ -124,59 +194,121 @@ void DolphinViewActionHandler::createActions() KToggleAction* showHiddenFiles = m_actionCollection->add("show_hidden_files"); showHiddenFiles->setText(i18nc("@action:inmenu View", "Show Hidden Files")); - showHiddenFiles->setShortcut(Qt::ALT | Qt::Key_Period); + showHiddenFiles->setShortcuts(QList() << Qt::ALT + Qt::Key_Period << Qt::Key_F8); connect(showHiddenFiles, SIGNAL(triggered(bool)), this, SLOT(toggleShowHiddenFiles(bool))); + KAction* adjustViewProps = m_actionCollection->addAction("view_properties"); + adjustViewProps->setText(i18nc("@action:inmenu View", "Adjust View Properties...")); + connect(adjustViewProps, SIGNAL(triggered()), this, SLOT(slotAdjustViewProperties())); + + // Tools menu + + KAction* findFile = m_actionCollection->addAction("find_file"); + findFile->setText(i18nc("@action:inmenu Tools", "Find File...")); + findFile->setShortcut(Qt::CTRL | Qt::Key_F); + findFile->setIcon(KIcon("edit-find")); + connect(findFile, SIGNAL(triggered()), this, SLOT(slotFindFile())); } QActionGroup* DolphinViewActionHandler::createAdditionalInformationActionGroup() { - QActionGroup* showInformationGroup = new QActionGroup(m_actionCollection); - showInformationGroup->setExclusive(false); + QActionGroup* additionalInfoGroup = new QActionGroup(m_actionCollection); + additionalInfoGroup->setExclusive(false); + + KActionMenu* showInformationMenu = m_actionCollection->add("additional_info"); + showInformationMenu->setText(i18nc("@action:inmenu View", "Additional Information")); + showInformationMenu->setDelayed(false); KToggleAction* showSizeInfo = m_actionCollection->add("show_size_info"); showSizeInfo->setText(i18nc("@action:inmenu Additional information", "Size")); showSizeInfo->setData(KFileItemDelegate::Size); - showSizeInfo->setActionGroup(showInformationGroup); + showSizeInfo->setActionGroup(additionalInfoGroup); KToggleAction* showDateInfo = m_actionCollection->add("show_date_info"); showDateInfo->setText(i18nc("@action:inmenu Additional information", "Date")); showDateInfo->setData(KFileItemDelegate::ModificationTime); - showDateInfo->setActionGroup(showInformationGroup); + showDateInfo->setActionGroup(additionalInfoGroup); KToggleAction* showPermissionsInfo = m_actionCollection->add("show_permissions_info"); showPermissionsInfo->setText(i18nc("@action:inmenu Additional information", "Permissions")); showPermissionsInfo->setData(KFileItemDelegate::Permissions); - showPermissionsInfo->setActionGroup(showInformationGroup); + showPermissionsInfo->setActionGroup(additionalInfoGroup); KToggleAction* showOwnerInfo = m_actionCollection->add("show_owner_info"); showOwnerInfo->setText(i18nc("@action:inmenu Additional information", "Owner")); showOwnerInfo->setData(KFileItemDelegate::Owner); - showOwnerInfo->setActionGroup(showInformationGroup); + showOwnerInfo->setActionGroup(additionalInfoGroup); KToggleAction* showGroupInfo = m_actionCollection->add("show_group_info"); showGroupInfo->setText(i18nc("@action:inmenu Additional information", "Group")); showGroupInfo->setData(KFileItemDelegate::OwnerAndGroup); - showGroupInfo->setActionGroup(showInformationGroup); + showGroupInfo->setActionGroup(additionalInfoGroup); KToggleAction* showMimeInfo = m_actionCollection->add("show_mime_info"); showMimeInfo->setText(i18nc("@action:inmenu Additional information", "Type")); showMimeInfo->setData(KFileItemDelegate::FriendlyMimeType); - showMimeInfo->setActionGroup(showInformationGroup); + showMimeInfo->setActionGroup(additionalInfoGroup); - return showInformationGroup; + KToggleAction* showPathOrUrlInfo = m_actionCollection->add("show_path_or_url_info"); + showPathOrUrlInfo->setText(i18nc("@action:inmenu Additional information", "Path")); + showPathOrUrlInfo->setData(KFileItemDelegate::LocalPathOrUrl); + showPathOrUrlInfo->setActionGroup(additionalInfoGroup); + + return additionalInfoGroup; } -void DolphinViewActionHandler::slotCreateDir() +Q_DECLARE_METATYPE(DolphinView::Sorting) + +QActionGroup* DolphinViewActionHandler::createSortByActionGroup() { - Q_ASSERT(m_currentView); - KonqOperations::newDir(m_currentView, m_currentView->url()); + QActionGroup* sortByActionGroup = new QActionGroup(m_actionCollection); + sortByActionGroup->setExclusive(true); + + KToggleAction* sortByName = m_actionCollection->add("sort_by_name"); + sortByName->setText(i18nc("@action:inmenu Sort By", "Name")); + sortByName->setData(QVariant::fromValue(DolphinView::SortByName)); + sortByActionGroup->addAction(sortByName); + + KToggleAction* sortBySize = m_actionCollection->add("sort_by_size"); + sortBySize->setText(i18nc("@action:inmenu Sort By", "Size")); + sortBySize->setData(QVariant::fromValue(DolphinView::SortBySize)); + sortByActionGroup->addAction(sortBySize); + + KToggleAction* sortByDate = m_actionCollection->add("sort_by_date"); + sortByDate->setText(i18nc("@action:inmenu Sort By", "Date")); + sortByDate->setData(QVariant::fromValue(DolphinView::SortByDate)); + sortByActionGroup->addAction(sortByDate); + + KToggleAction* sortByPermissions = m_actionCollection->add("sort_by_permissions"); + sortByPermissions->setText(i18nc("@action:inmenu Sort By", "Permissions")); + sortByPermissions->setData(QVariant::fromValue(DolphinView::SortByPermissions)); + sortByActionGroup->addAction(sortByPermissions); + + KToggleAction* sortByOwner = m_actionCollection->add("sort_by_owner"); + sortByOwner->setText(i18nc("@action:inmenu Sort By", "Owner")); + sortByOwner->setData(QVariant::fromValue(DolphinView::SortByOwner)); + sortByActionGroup->addAction(sortByOwner); + + KToggleAction* sortByGroup = m_actionCollection->add("sort_by_group"); + sortByGroup->setText(i18nc("@action:inmenu Sort By", "Group")); + sortByGroup->setData(QVariant::fromValue(DolphinView::SortByGroup)); + sortByActionGroup->addAction(sortByGroup); + + KToggleAction* sortByType = m_actionCollection->add("sort_by_type"); + sortByType->setText(i18nc("@action:inmenu Sort By", "Type")); + sortByType->setData(QVariant::fromValue(DolphinView::SortByType)); + sortByActionGroup->addAction(sortByType); + + return sortByActionGroup; } void DolphinViewActionHandler::slotViewModeActionTriggered(QAction* action) { const DolphinView::Mode mode = action->data().value(); m_currentView->setMode(mode); + + QAction* viewModeMenu = m_actionCollection->action("view_mode"); + viewModeMenu->setIcon(KIcon(action->icon())); } void DolphinViewActionHandler::slotRename() @@ -229,44 +361,46 @@ QString DolphinViewActionHandler::currentViewModeActionName() const return QString(); // can't happen } +KActionCollection* DolphinViewActionHandler::actionCollection() +{ + return m_actionCollection; +} + void DolphinViewActionHandler::updateViewActions() { QAction* viewModeAction = m_actionCollection->action(currentViewModeActionName()); if (viewModeAction != 0) { viewModeAction->setChecked(true); - } - QAction* zoomInAction = m_actionCollection->action(KStandardAction::name(KStandardAction::ZoomIn)); - if (zoomInAction != 0) { - zoomInAction->setEnabled(m_currentView->isZoomInPossible()); - } - - QAction* zoomOutAction = m_actionCollection->action(KStandardAction::name(KStandardAction::ZoomOut)); - if (zoomOutAction != 0) { - zoomOutAction->setEnabled(m_currentView->isZoomOutPossible()); + QAction* viewModeMenu = m_actionCollection->action("view_mode"); + viewModeMenu->setIcon(KIcon(viewModeAction->icon())); } QAction* showPreviewAction = m_actionCollection->action("show_preview"); showPreviewAction->setChecked(m_currentView->showPreview()); slotSortOrderChanged(m_currentView->sortOrder()); + slotSortFoldersFirstChanged(m_currentView->sortFoldersFirst()); slotAdditionalInfoChanged(); slotCategorizedSortingChanged(); + slotSortingChanged(m_currentView->sorting()); + slotZoomLevelChanged(m_currentView->zoomLevel()); QAction* showHiddenFilesAction = m_actionCollection->action("show_hidden_files"); showHiddenFilesAction->setChecked(m_currentView->showHiddenFiles()); - } void DolphinViewActionHandler::zoomIn() { - m_currentView->zoomIn(); + const int level = m_currentView->zoomLevel(); + m_currentView->setZoomLevel(level + 1); updateViewActions(); } void DolphinViewActionHandler::zoomOut() { - m_currentView->zoomOut(); + const int level = m_currentView->zoomLevel(); + m_currentView->setZoomLevel(level - 1); updateViewActions(); } @@ -275,6 +409,11 @@ void DolphinViewActionHandler::toggleSortOrder() m_currentView->toggleSortOrder(); } +void DolphinViewActionHandler::toggleSortFoldersFirst() +{ + m_currentView->toggleSortFoldersFirst(); +} + void DolphinViewActionHandler::slotSortOrderChanged(Qt::SortOrder order) { QAction* descending = m_actionCollection->action("descending"); @@ -282,6 +421,11 @@ void DolphinViewActionHandler::slotSortOrderChanged(Qt::SortOrder order) descending->setChecked(sortDescending); } +void DolphinViewActionHandler::slotSortFoldersFirstChanged(bool foldersFirst) +{ + m_actionCollection->action("folders_first")->setChecked(foldersFirst); +} + void DolphinViewActionHandler::toggleAdditionalInfo(QAction* action) { emit actionBeingHandled(); @@ -322,6 +466,7 @@ KToggleAction* DolphinViewActionHandler::iconsModeAction() { KToggleAction* iconsView = m_actionCollection->add("icons"); iconsView->setText(i18nc("@action:inmenu View Mode", "Icons")); + iconsView->setToolTip(i18nc("@info", "Icons view mode")); iconsView->setShortcut(Qt::CTRL | Qt::Key_1); iconsView->setIcon(KIcon("view-list-icons")); iconsView->setData(QVariant::fromValue(DolphinView::IconsView)); @@ -332,6 +477,7 @@ KToggleAction* DolphinViewActionHandler::detailsModeAction() { KToggleAction* detailsView = m_actionCollection->add("details"); detailsView->setText(i18nc("@action:inmenu View Mode", "Details")); + detailsView->setToolTip(i18nc("@info", "Details view mode")); detailsView->setShortcut(Qt::CTRL | Qt::Key_2); detailsView->setIcon(KIcon("view-list-details")); detailsView->setData(QVariant::fromValue(DolphinView::DetailsView)); @@ -342,8 +488,95 @@ KToggleAction* DolphinViewActionHandler::columnsModeAction() { KToggleAction* columnView = m_actionCollection->add("columns"); columnView->setText(i18nc("@action:inmenu View Mode", "Columns")); + columnView->setToolTip(i18nc("@info", "Columns view mode")); columnView->setShortcut(Qt::CTRL | Qt::Key_3); columnView->setIcon(KIcon("view-file-columns")); columnView->setData(QVariant::fromValue(DolphinView::ColumnView)); return columnView; } + +void DolphinViewActionHandler::slotSortingChanged(DolphinView::Sorting sorting) +{ + QAction* action = 0; + switch (sorting) { + case DolphinView::SortByName: + action = m_actionCollection->action("sort_by_name"); + break; + case DolphinView::SortBySize: + action = m_actionCollection->action("sort_by_size"); + break; + case DolphinView::SortByDate: + action = m_actionCollection->action("sort_by_date"); + break; + case DolphinView::SortByPermissions: + action = m_actionCollection->action("sort_by_permissions"); + break; + case DolphinView::SortByOwner: + action = m_actionCollection->action("sort_by_owner"); + break; + case DolphinView::SortByGroup: + action = m_actionCollection->action("sort_by_group"); + break; + case DolphinView::SortByType: + action = m_actionCollection->action("sort_by_type"); + break; + default: + break; + } + + if (action != 0) { + action->setChecked(true); + + QAction* sortByMenu = m_actionCollection->action("sort"); + sortByMenu->setIcon(KIcon(action->icon())); + } +} + +void DolphinViewActionHandler::slotZoomLevelChanged(int level) +{ + QAction* zoomInAction = m_actionCollection->action(KStandardAction::name(KStandardAction::ZoomIn)); + if (zoomInAction != 0) { + zoomInAction->setEnabled(level < ZoomLevelInfo::maximumLevel()); + } + + QAction* zoomOutAction = m_actionCollection->action(KStandardAction::name(KStandardAction::ZoomOut)); + if (zoomOutAction != 0) { + zoomOutAction->setEnabled(level > ZoomLevelInfo::minimumLevel()); + } +} + +void DolphinViewActionHandler::slotSortTriggered(QAction* action) +{ + const DolphinView::Sorting sorting = action->data().value(); + m_currentView->setSorting(sorting); +} + +void DolphinViewActionHandler::slotAdjustViewProperties() +{ + emit actionBeingHandled(); + QPointer dialog = new ViewPropertiesDialog(m_currentView); + dialog->exec(); + delete dialog; +} + +void DolphinViewActionHandler::slotFindFile() +{ + KRun::run("kfind %u", m_currentView->url(), m_currentView->window()); +} + +void DolphinViewActionHandler::slotProperties() +{ + KPropertiesDialog* dialog = 0; + const KFileItemList list = m_currentView->selectedItems(); + if (list.isEmpty()) { + const KUrl url = m_currentView->url(); + dialog = new KPropertiesDialog(url, m_currentView); + } else { + dialog = new KPropertiesDialog(list, m_currentView); + } + + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->show(); + dialog->raise(); + dialog->activateWindow(); +}