From 804a1967002b8d0714a865296fa2360c957284e6 Mon Sep 17 00:00:00 2001 From: David Faure Date: Wed, 13 Feb 2008 18:45:20 +0000 Subject: [PATCH] Provide the dolphinpart view modes (Icons, Details, Columns) in konqueror's View Modes menu. (this is done using a Q_PROPERTY in the dolphin part and a signal; the available view modes for creating the menu in the first place are listed in dolphinpart.desktop) Konqueror: cleaned up the old (complex) handling of view modes as N toolbar buttons from M services grouped by library (240 lines less!). Dolphin: moved view mode handling to DolphinViewActionHandler, removes duplication between part and mainwindow. svn path=/trunk/KDE/kdebase/apps/; revision=774646 --- src/dolphinmainwindow.cpp | 31 +--------------- src/dolphinmainwindow.h | 7 +--- src/dolphinpart.cpp | 40 +++++++------------- src/dolphinpart.desktop | 23 ++++++++++++ src/dolphinpart.h | 36 +++++++++++++----- src/dolphinview.cpp | 43 ---------------------- src/dolphinview.h | 24 ------------ src/dolphinviewactionhandler.cpp | 63 ++++++++++++++++++++++++++++++++ src/dolphinviewactionhandler.h | 33 ++++++++++++++++- 9 files changed, 160 insertions(+), 140 deletions(-) diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 160c423ec..556473471 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -177,11 +177,6 @@ void DolphinMainWindow::changeSelection(const KFileItemList& selection) activeViewContainer()->view()->changeSelection(selection); } -void DolphinMainWindow::slotViewModeChanged() -{ - updateViewActions(); -} - void DolphinMainWindow::slotSortingChanged(DolphinView::Sorting sorting) { QAction* action = 0; @@ -482,12 +477,6 @@ void DolphinMainWindow::invertSelection() m_activeViewContainer->view()->invertSelection(); } -void DolphinMainWindow::setViewMode(QAction* action) -{ - const DolphinView::Mode mode = action->data().value(); - m_activeViewContainer->view()->setMode(mode); -} - void DolphinMainWindow::sortByName() { m_activeViewContainer->view()->setSorting(DolphinView::SortByName); @@ -843,21 +832,10 @@ void DolphinMainWindow::setupActions() // setup 'View' menu - KToggleAction* iconsView = DolphinView::iconsModeAction(actionCollection()); - KToggleAction* detailsView = DolphinView::detailsModeAction(actionCollection()); - KToggleAction* columnView = DolphinView::columnsModeAction(actionCollection()); - - QActionGroup* viewModeGroup = new QActionGroup(this); - viewModeGroup->addAction(iconsView); - viewModeGroup->addAction(detailsView); - viewModeGroup->addAction(columnView); - connect(viewModeGroup, SIGNAL(triggered(QAction*)), this, SLOT(setViewMode(QAction*))); - + //TODO //QActionGroup* sortActionGroup = DolphinView::createSortActionGroup(actionCollection()); //connect(sortActionGroup, SIGNAL(triggered(QAction*)), this, SLOT(sortActionGroupTriggered(QAction*))); - // TODO use a QActionGroup - KToggleAction* sortByName = actionCollection()->add("sort_by_name"); sortByName->setText(i18nc("@action:inmenu Sort By", "Name")); connect(sortByName, SIGNAL(triggered()), this, SLOT(sortByName())); @@ -1126,11 +1104,6 @@ void DolphinMainWindow::updateViewActions() m_actionHandler->updateViewActions(); const DolphinView* view = m_activeViewContainer->view(); - QAction* action = actionCollection()->action(view->currentViewModeActionName()); - if (action != 0) { - action->setChecked(true); - } - slotSortingChanged(view->sorting()); QAction* showFilterBarAction = actionCollection()->action("show_filter_bar"); @@ -1162,8 +1135,6 @@ void DolphinMainWindow::connectViewSignals(int viewIndex) this, SLOT(updateFilterBarAction(bool))); DolphinView* view = container->view(); - connect(view, SIGNAL(modeChanged()), - this, SLOT(slotViewModeChanged())); connect(view, SIGNAL(sortingChanged(DolphinView::Sorting)), this, SLOT(slotSortingChanged(DolphinView::Sorting))); connect(view, SIGNAL(selectionChanged(KFileItemList)), diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index bddeba7b1..4f4e765a8 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -34,6 +34,7 @@ #include +class KAction; class DolphinViewActionHandler; class DolphinApplication; class DolphinViewContainer; @@ -222,9 +223,6 @@ private slots: */ void invertSelection(); - /** The current active view is switched to a new view mode. */ - void setViewMode(QAction *); - /** The sorting of the current view should be done by the name. */ void sortByName(); @@ -314,9 +312,6 @@ private slots: /** Opens the settings dialog for Dolphin. */ void editSettings(); - /** Updates the state of all 'View' menu actions. */ - void slotViewModeChanged(); - /** Updates the state of the 'Sort by' actions. */ void slotSortingChanged(DolphinView::Sorting sorting); diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp index b6f2698c3..1cd336c8c 100644 --- a/src/dolphinpart.cpp +++ b/src/dolphinpart.cpp @@ -93,7 +93,7 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QStringLi connect(m_view, SIGNAL(urlChanged(KUrl)), this, SLOT(slotUrlChanged(KUrl))); connect(m_view, SIGNAL(modeChanged()), - this, SLOT(updateViewActions())); + this, SIGNAL(viewModeChanged())); // relay signal // TODO slotSortingChanged m_actionHandler = new DolphinViewActionHandler(actionCollection(), this); @@ -104,12 +104,9 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QStringLi this, SLOT(updatePasteAction())); createActions(); - updateViewActions(); + m_actionHandler->updateViewActions(); slotSelectionChanged(KFileItemList()); // initially disable selection-dependent actions - // TODO provide the viewmode actions in the menu, merged with the existing view-mode-actions somehow - // [Q_PROPERTY introspection?] - // TODO sort_by_* actions // TODO there was a "always open a new window" (when clicking on a directory) setting in konqueror @@ -123,12 +120,6 @@ DolphinPart::~DolphinPart() void DolphinPart::createActions() { - QActionGroup* viewModeActions = new QActionGroup(this); - viewModeActions->addAction(DolphinView::iconsModeAction(actionCollection())); - viewModeActions->addAction(DolphinView::detailsModeAction(actionCollection())); - viewModeActions->addAction(DolphinView::columnsModeAction(actionCollection())); - connect(viewModeActions, SIGNAL(triggered(QAction*)), this, SLOT(slotViewModeActionTriggered(QAction*))); - KAction *editMimeTypeAction = actionCollection()->addAction( "editMimeType" ); editMimeTypeAction->setText( i18nc("@action:inmenu Edit", "&Edit File Type..." ) ); connect(editMimeTypeAction, SIGNAL(triggered()), SLOT(slotEditMimeType())); @@ -210,15 +201,6 @@ void DolphinPart::updatePasteAction() emit m_extension->setActionText( "paste", pasteInfo.second ); } -void DolphinPart::updateViewActions() -{ - m_actionHandler->updateViewActions(); - QAction* action = actionCollection()->action(m_view->currentViewModeActionName()); - if (action != 0) { - action->setChecked(true); - } -} - KAboutData* DolphinPart::createAboutData() { return new KAboutData("dolphinpart", "dolphin", ki18nc("@title", "Dolphin Part"), "0.1"); @@ -356,12 +338,6 @@ void DolphinPart::slotOpenContextMenu(const KFileItem& _item, const KUrl&) } } -void DolphinPart::slotViewModeActionTriggered(QAction* action) -{ - const DolphinView::Mode mode = action->data().value(); - m_view->setMode(mode); -} - void DolphinPart::slotUrlChanged(const KUrl& url) { if (m_view->url() != url) { @@ -408,4 +384,16 @@ void DolphinPart::slotProperties() } } +void DolphinPart::setCurrentViewMode(const QString& viewModeName) +{ + QAction* action = actionCollection()->action(viewModeName); + Q_ASSERT(action); + action->trigger(); +} + +QString DolphinPart::currentViewMode() const +{ + return m_actionHandler->currentViewModeActionName(); +} + #include "dolphinpart.moc" diff --git a/src/dolphinpart.desktop b/src/dolphinpart.desktop index dc2ead040..6a7bfd72b 100644 --- a/src/dolphinpart.desktop +++ b/src/dolphinpart.desktop @@ -9,3 +9,26 @@ X-KDE-BrowserView-HideFromMenus=true X-KDE-BrowserView-Built-Into=konqueror Icon=view_icon InitialPreference=7 + +# Provide info about the view modes using the Actions mechanism so that KService parses it. +# Konqueror then queries KService to get hold of the translated texts for the view modes +Actions=icons;details;columns; + +[Desktop Action icons] +Name=Icons +Icon=view-list-icons +# Dummy +Exec=dolphin + +[Desktop Action details] +Name=Details +Icon=view-list-details +# Dummy +Exec=dolphin + +[Desktop Action columns] +Name=Columns +Icon=view-file-columns +# Dummy +Exec=dolphin + diff --git a/src/dolphinpart.h b/src/dolphinpart.h index 795a7b194..75d7ee951 100644 --- a/src/dolphinpart.h +++ b/src/dolphinpart.h @@ -43,17 +43,38 @@ class DolphinPart : public KParts::ReadOnlyPart // Even though it's konqueror doing the undo... Q_PROPERTY( bool supportsUndo READ supportsUndo ) + Q_PROPERTY( QString currentViewMode READ currentViewMode WRITE setCurrentViewMode ) + public: explicit DolphinPart(QWidget* parentWidget, QObject* parent, const QStringList& args); ~DolphinPart(); static KAboutData* createAboutData(); + /** + * Standard KParts::ReadOnlyPart openUrl method. + * Called by Konqueror to view a directory in DolphinPart. + */ virtual bool openUrl(const KUrl& url); /// see the supportsUndo property bool supportsUndo() const { return true; } + /** + * Used by konqueror for setting the view mode + * @param viewModeName internal name for the view mode, like "icons" + * Those names come from the Actions line in dolphinpart.desktop, + * and have to match the name of the KActions. + */ + void setCurrentViewMode(const QString& viewModeName); + + /** + * Used by konqueror for displaying the current view mode. + * @see setCurrentViewMode + */ + QString currentViewMode() const; + + /// Returns the view owned by this part; used by DolphinPartBrowserExtension DolphinView* view() { return m_view; } protected: @@ -62,6 +83,12 @@ protected: */ virtual bool openFile() { return true; } +Q_SIGNALS: + /** + * Emitted when the view mode changes. Used by konqueror. + */ + void viewModeChanged(); + private Q_SLOTS: void slotCompleted(const KUrl& url); void slotCanceled(const KUrl& url); @@ -83,10 +110,6 @@ private Q_SLOTS: * @url URL which contains \a item. */ void slotOpenContextMenu(const KFileItem& item, const KUrl& url); - /** - * Emitted when the user requested a change of view mode - */ - void slotViewModeActionTriggered(QAction*); /** * Asks the host to open the URL \a url if the current view has @@ -100,11 +123,6 @@ private Q_SLOTS: */ void slotSelectionChanged(const KFileItemList& selection); - /** - * Same as in DolphinMainWindow: updates the view menu actions - */ - void updateViewActions(); - /** * Updates the text of the paste action dependent from * the number of items which are in the clipboard. diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 3fec8fdfb..4b221a0e3 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -976,49 +976,6 @@ bool DolphinView::isCutItem(const KFileItem& item) const return false; } -KToggleAction* DolphinView::iconsModeAction(KActionCollection* actionCollection) -{ - KToggleAction* iconsView = actionCollection->add("icons"); - iconsView->setText(i18nc("@action:inmenu View Mode", "Icons")); - iconsView->setShortcut(Qt::CTRL | Qt::Key_1); - iconsView->setIcon(KIcon("view-list-icons")); - iconsView->setData(QVariant::fromValue(IconsView)); - return iconsView; -} - -KToggleAction* DolphinView::detailsModeAction(KActionCollection* actionCollection) -{ - KToggleAction* detailsView = actionCollection->add("details"); - detailsView->setText(i18nc("@action:inmenu View Mode", "Details")); - detailsView->setShortcut(Qt::CTRL | Qt::Key_2); - detailsView->setIcon(KIcon("view-list-details")); - detailsView->setData(QVariant::fromValue(DetailsView)); - return detailsView; -} - -KToggleAction* DolphinView::columnsModeAction(KActionCollection* actionCollection) -{ - KToggleAction* columnView = actionCollection->add("columns"); - columnView->setText(i18nc("@action:inmenu View Mode", "Columns")); - columnView->setShortcut(Qt::CTRL | Qt::Key_3); - columnView->setIcon(KIcon("view-file-columns")); - columnView->setData(QVariant::fromValue(ColumnView)); - return columnView; -} - -QString DolphinView::currentViewModeActionName() const -{ - switch (m_mode) { - case DolphinView::IconsView: - return "icons"; - case DolphinView::DetailsView: - return "details"; - case DolphinView::ColumnView: - return "columns"; - } - return QString(); // can't happen -} - void DolphinView::renameSelectedItems() { const KFileItemList items = selectedItems(); diff --git a/src/dolphinview.h b/src/dolphinview.h index f1500429b..af0dd62a2 100644 --- a/src/dolphinview.h +++ b/src/dolphinview.h @@ -38,7 +38,6 @@ #include #include -class QActionGroup; class DolphinController; class DolphinColumnView; class DolphinDetailsView; @@ -304,34 +303,11 @@ public: */ void calculateItemCount(int& fileCount, int& folderCount); - /** - * Returns the "switch to icons mode" action. - * This code is here to share it between the mainwindow and the part - */ - static KToggleAction* iconsModeAction(KActionCollection* collection); - - /** - * Returns the "switch to details mode" action. - * This code is here to share it between the mainwindow and the part - */ - static KToggleAction* detailsModeAction(KActionCollection* collection); - - /** - * Returns the "switch to columns mode" action. - * This code is here to share it between the mainwindow and the part - */ - static KToggleAction* columnsModeAction(KActionCollection* collection); - /** * Updates the state of the 'Additional Information' actions in \a collection. */ void updateAdditionalInfoActions(KActionCollection* collection); - /** - * Returns the action name corresponding to the current view mode - */ - QString currentViewModeActionName() const; - /** * Returns the state of the paste action: * first is whether the action should be enabled diff --git a/src/dolphinviewactionhandler.cpp b/src/dolphinviewactionhandler.cpp index 6cd539d36..81f990270 100644 --- a/src/dolphinviewactionhandler.cpp +++ b/src/dolphinviewactionhandler.cpp @@ -18,6 +18,7 @@ ***************************************************************************/ #include "dolphinviewactionhandler.h" +#include #include "dolphinview.h" @@ -46,6 +47,8 @@ void DolphinViewActionHandler::setCurrentView(DolphinView* view) m_currentView = view; + connect(view, SIGNAL(modeChanged()), + this, SLOT(updateViewActions())); connect(view, SIGNAL(showPreviewChanged()), this, SLOT(slotShowPreviewChanged())); connect(view, SIGNAL(sortOrderChanged(Qt::SortOrder)), @@ -89,6 +92,12 @@ void DolphinViewActionHandler::createActions() // View menu + QActionGroup* viewModeActions = new QActionGroup(this); + viewModeActions->addAction(iconsModeAction()); + viewModeActions->addAction(detailsModeAction()); + viewModeActions->addAction(columnsModeAction()); + connect(viewModeActions, SIGNAL(triggered(QAction*)), this, SLOT(slotViewModeActionTriggered(QAction*))); + KStandardAction::zoomIn(this, SLOT(zoomIn()), m_actionCollection); @@ -164,6 +173,12 @@ void DolphinViewActionHandler::slotCreateDir() KonqOperations::newDir(m_currentView, m_currentView->url()); } +void DolphinViewActionHandler::slotViewModeActionTriggered(QAction* action) +{ + const DolphinView::Mode mode = action->data().value(); + m_currentView->setMode(mode); +} + void DolphinViewActionHandler::slotRename() { emit actionBeingHandled(); @@ -201,8 +216,26 @@ void DolphinViewActionHandler::slotShowPreviewChanged() updateViewActions(); } +QString DolphinViewActionHandler::currentViewModeActionName() const +{ + switch (m_currentView->mode()) { + case DolphinView::IconsView: + return "icons"; + case DolphinView::DetailsView: + return "details"; + case DolphinView::ColumnView: + return "columns"; + } + return QString(); // can't happen +} + void DolphinViewActionHandler::updateViewActions() { + QAction* viewModeAction = m_actionCollection->action(currentViewModeActionName()); + if (viewModeAction != 0) { + viewModeAction->setChecked(true); + } + QAction* zoomInAction = m_actionCollection->action(KStandardAction::stdName(KStandardAction::ZoomIn)); if (zoomInAction != 0) { zoomInAction->setEnabled(m_currentView->isZoomInPossible()); @@ -284,3 +317,33 @@ void DolphinViewActionHandler::slotShowHiddenFilesChanged() showHiddenFilesAction->setChecked(m_currentView->showHiddenFiles()); } + +KToggleAction* DolphinViewActionHandler::iconsModeAction() +{ + KToggleAction* iconsView = m_actionCollection->add("icons"); + iconsView->setText(i18nc("@action:inmenu View Mode", "Icons")); + iconsView->setShortcut(Qt::CTRL | Qt::Key_1); + iconsView->setIcon(KIcon("view-list-icons")); + iconsView->setData(QVariant::fromValue(DolphinView::IconsView)); + return iconsView; +} + +KToggleAction* DolphinViewActionHandler::detailsModeAction() +{ + KToggleAction* detailsView = m_actionCollection->add("details"); + detailsView->setText(i18nc("@action:inmenu View Mode", "Details")); + detailsView->setShortcut(Qt::CTRL | Qt::Key_2); + detailsView->setIcon(KIcon("view-list-details")); + detailsView->setData(QVariant::fromValue(DolphinView::DetailsView)); + return detailsView; +} + +KToggleAction* DolphinViewActionHandler::columnsModeAction() +{ + KToggleAction* columnView = m_actionCollection->add("columns"); + columnView->setText(i18nc("@action:inmenu View Mode", "Columns")); + columnView->setShortcut(Qt::CTRL | Qt::Key_3); + columnView->setIcon(KIcon("view-file-columns")); + columnView->setData(QVariant::fromValue(DolphinView::ColumnView)); + return columnView; +} diff --git a/src/dolphinviewactionhandler.h b/src/dolphinviewactionhandler.h index a11d19bb1..d4790a38d 100644 --- a/src/dolphinviewactionhandler.h +++ b/src/dolphinviewactionhandler.h @@ -23,6 +23,7 @@ #include "libdolphin_export.h" #include +class KToggleAction; class QAction; class QActionGroup; class DolphinView; @@ -54,6 +55,12 @@ public: */ void setCurrentView(DolphinView* view); + /** + * Returns the name of the action for the current viewmode + */ + QString currentViewModeActionName() const; + +public Q_SLOTS: /** * Update all actions in the 'View' menu, i.e. those that depend on the * settings in the current view. @@ -74,6 +81,11 @@ private Q_SLOTS: */ void slotCreateDir(); + /** + * Emitted when the user requested a change of view mode + */ + void slotViewModeActionTriggered(QAction*); + /** * Let the user input a name for the selected item(s) and trigger * a renaming afterwards. @@ -156,10 +168,27 @@ private: */ QActionGroup* createAdditionalInformationActionGroup(); + /** + * Returns the "switch to icons mode" action. + * Helper method for createActions(); + */ + KToggleAction* iconsModeAction(); + + /** + * Returns the "switch to details mode" action. + * Helper method for createActions(); + */ + KToggleAction* detailsModeAction(); + + /** + * Returns the "switch to columns mode" action. + * Helper method for createActions(); + */ + KToggleAction* columnsModeAction(); + + KActionCollection* m_actionCollection; DolphinView* m_currentView; }; - #endif /* DOLPHINVIEWACTIONHANDLER_H */ - -- 2.47.3