]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Implement renaming in dolphinpart.
authorDavid Faure <faure@kde.org>
Thu, 15 Nov 2007 14:59:02 +0000 (14:59 +0000)
committerDavid Faure <faure@kde.org>
Thu, 15 Nov 2007 14:59:02 +0000 (14:59 +0000)
No more rename action provided by konqueror, the part provides it now.
Had to move a bit of code around in dolphin, as discussed with Peter.

svn path=/trunk/KDE/kdebase/apps/; revision=737121

src/dolphinmainwindow.cpp
src/dolphinmainwindow.h
src/dolphinpart.cpp
src/dolphinpart.h
src/dolphinpart.rc
src/dolphinview.cpp
src/dolphinview.h
src/dolphinviewcontainer.cpp
src/dolphinviewcontainer.h

index 18476adb51f3cf44abf143f5a4dca7612fe6d3dc..77cb13c0233f8197e12b902db75826762d30da7a 100644 (file)
@@ -53,7 +53,6 @@
 #include <kiconloader.h>
 #include <kio/netaccess.h>
 #include <kio/deletejob.h>
-#include <kio/renamedialog.h>
 #include <kinputdialog.h>
 #include <klocale.h>
 #include <kmenu.h>
@@ -123,10 +122,9 @@ void DolphinMainWindow::toggleViews()
     m_viewContainer[SecondaryView] = container;
 }
 
-void DolphinMainWindow::rename(const KUrl& oldUrl, const KUrl& newUrl)
+void DolphinMainWindow::slotRenaming()
 {
     clearStatusBar();
-    KonqOperations::rename(this, oldUrl, newUrl);
     m_undoCommandTypes.append(KonqFileUndoManager::RENAME);
 }
 
@@ -484,7 +482,7 @@ void DolphinMainWindow::updateNewMenu()
 void DolphinMainWindow::rename()
 {
     clearStatusBar();
-    m_activeViewContainer->renameSelectedItems();
+    m_activeViewContainer->view()->renameSelectedItems();
 }
 
 void DolphinMainWindow::moveToTrash()
@@ -1460,7 +1458,7 @@ void DolphinMainWindow::updateEditActions()
 
         QAction* renameAction = actionCollection()->action("rename");
         if (renameAction != 0) {
-            renameAction->setEnabled(list.count() >= 1);
+            renameAction->setEnabled(true);
         }
 
         bool enableMoveToTrash = true;
@@ -1583,6 +1581,8 @@ void DolphinMainWindow::connectViewSignals(int viewIndex)
             this, SLOT(slotRequestItemInfo(KFileItem)));
     connect(view, SIGNAL(activated()),
             this, SLOT(toggleActiveView()));
+    connect(view, SIGNAL(renaming()),
+            this, SLOT(slotRenaming()));
 
     const KUrlNavigator* navigator = container->urlNavigator();
     connect(navigator, SIGNAL(urlChanged(const KUrl&)),
index e33de4ef63410daf374aa480bdda13b8fd3243fb..29ec377445c1248241363da4e3e5a21bcd1e02b4 100644 (file)
@@ -422,6 +422,9 @@ private slots:
     /** Toggles the active view if two views are shown within the main window. */
     void toggleActiveView();
 
+    /** Called when the view is renaming a file. */
+    void slotRenaming();
+
 private:
     DolphinMainWindow(int id);
     void init();
index 2f52447ec2a3eafe09f9c6d4a9f716dfc9cd0918..27000eae67b733e9af28392e3cac4ede24449ec3 100644 (file)
@@ -78,14 +78,18 @@ DolphinPart::DolphinPart(QWidget* parentWidget, QObject* parent, const QStringLi
             this, SLOT(slotErrorMessage(QString)));
     connect(m_view, SIGNAL(itemTriggered(KFileItem)),
             this, SLOT(slotItemTriggered(KFileItem)));
-    connect(m_view, SIGNAL(requestContextMenu(KFileItem, const KUrl&)),
-            this, SLOT(slotOpenContextMenu(KFileItem, const KUrl&)));
+    connect(m_view, SIGNAL(requestContextMenu(KFileItem,KUrl)),
+            this, SLOT(slotOpenContextMenu(KFileItem,KUrl)));
     connect(m_view, SIGNAL(selectionChanged(KFileItemList)),
             m_extension, SIGNAL(selectionInfo(KFileItemList)));
+    connect(m_view, SIGNAL(selectionChanged(KFileItemList)),
+            this, SLOT(slotSelectionChanged(KFileItemList)));
     connect(m_view, SIGNAL(requestItemInfo(KFileItem)),
             this, SLOT(slotRequestItemInfo(KFileItem)));
-    connect(m_view, SIGNAL(urlChanged(const KUrl&)),
-            this, SLOT(slotUrlChanged(const KUrl&)));
+    connect(m_view, SIGNAL(urlChanged(KUrl)),
+            this, SLOT(slotUrlChanged(KUrl)));
+    connect(m_view, SIGNAL(modeChanged()),
+            this, SLOT(updateViewActions()));
 
     createActions();
     updateViewActions();
@@ -122,6 +126,27 @@ void DolphinPart::createActions()
     viewModeActions->addAction(DolphinView::detailsModeAction(actionCollection()));
     viewModeActions->addAction(DolphinView::columnsModeAction(actionCollection()));
     connect(viewModeActions, SIGNAL(triggered(QAction*)), this, SLOT(slotViewModeActionTriggered(QAction*)));
+
+    KAction* renameAction = new KAction(i18nc("@action:inmenu", "Rename..."), this);
+    connect(renameAction, SIGNAL(triggered()), m_view, SLOT(renameSelectedItems()));
+    renameAction->setShortcut(Qt::Key_F2);
+    actionCollection()->addAction("rename", renameAction);
+}
+
+void DolphinPart::slotSelectionChanged(const KFileItemList& selection)
+{
+    // Yes, DolphinMainWindow has very similar code :/
+    if (selection.isEmpty()) {
+        stateChanged("has_no_selection");
+    } else {
+        stateChanged("has_selection");
+
+        QAction* renameAction = actionCollection()->action("rename");
+        Q_ASSERT(renameAction);
+        if (renameAction) {
+            renameAction->setEnabled(true);
+        }
+    }
 }
 
 void DolphinPart::updateViewActions()
@@ -218,8 +243,18 @@ void DolphinPart::slotOpenContextMenu(const KFileItem& _item, const KUrl&)
         item = KFileItem( S_IFDIR, (mode_t)-1, url() );
     }
 
+    KParts::BrowserExtension::ActionGroupMap actionGroups;
+    QList<QAction *> editActions;
+    editActions.append(actionCollection()->action("rename"));
+    actionGroups.insert("editactions", editActions);
+
     KFileItemList items; items.append(item);
-    emit m_extension->popupMenu( QCursor::pos(), items, KParts::OpenUrlArguments(), KParts::BrowserArguments(), popupFlags );
+    emit m_extension->popupMenu(QCursor::pos(),
+                                items,
+                                KParts::OpenUrlArguments(),
+                                KParts::BrowserArguments(),
+                                popupFlags,
+                                actionGroups);
 }
 
 void DolphinPart::slotViewModeActionTriggered(QAction* action)
index 432b55bd384ae0ffed9494d867d8b7b873a198bd..eb1e009ec70c19a3043611dd287a671898eb13ed 100644 (file)
@@ -21,6 +21,7 @@
 #define DOLPHINPART_H
 
 #include <kparts/part.h>
+class KFileItemList;
 class KFileItem;
 class DolphinPartBrowserExtension;
 class DolphinSortFilterProxyModel;
@@ -77,9 +78,19 @@ private Q_SLOTS:
      */
     void slotUrlChanged(const KUrl& url);
 
+    /**
+     * Updates the state of the 'Edit' menu actions and emits
+     * the signal selectionChanged().
+     */
+    void slotSelectionChanged(const KFileItemList& selection);
+
+    /**
+     * Same as in DolphinMainWindow: updates the view menu actions
+     */
+    void updateViewActions();
+
 private:
     void createActions();
-    void updateViewActions();
 
 private:
     DolphinView* m_view;
@@ -90,6 +101,4 @@ private:
     Q_DISABLE_COPY(DolphinPart)
 };
 
-
 #endif /* DOLPHINPART_H */
-
index 0f9dd276fbe3a248063f96c2c0bbe818a0beea3c..e5a9ff63dc398490b1a31c541b8b4e885d339f06 100644 (file)
@@ -1,7 +1,10 @@
 <!DOCTYPE kpartgui SYSTEM "kpartgui.dtd">
-<kpartgui version="3" name="dolphinpart" >
+<kpartgui name="dolphinpart" version="4" >
  <MenuBar>
    <Menu name="edit">
+   <!-- TODO cut, copy, paste -->
+   <Action name="rename"/>
+   <!-- TODO trash, del -->
    <Action name="select_all" />
    <Action name="invert_selection" />
   </Menu>
   <Action name="details" />
   <Action name="columns" />
 </ToolBar>
+<State name="has_selection" >
+  <enable>
+   <Action name="edit_cut" />
+   <Action name="edit_copy" />
+   <Action name="move_to_trash" />
+   <Action name="delete" />
+   <Action name="properties" />
+  </enable>
+ </State>
+ <State name="has_no_selection" >
+  <disable>
+   <Action name="edit_cut" />
+   <Action name="edit_copy" />
+   <Action name="rename" />
+   <Action name="move_to_trash" />
+   <Action name="delete" />
+   <Action name="properties" />
+  </disable>
+</State>
 </kpartgui>
index fabda169e252f7b8a283426102d5dbcb93ba7c7c..590a813a87d0e3ff7d111e08ca66204cf52b4085 100644 (file)
@@ -36,7 +36,6 @@
 #include <klocale.h>
 #include <kiconeffect.h>
 #include <kio/netaccess.h>
-#include <kio/renamedialog.h>
 #include <kio/previewjob.h>
 #include <kmimetyperesolver.h>
 #include <konqmimedata.h>
@@ -998,4 +997,73 @@ QString DolphinView::currentViewModeActionName() const
     return QString(); // can't happen
 }
 
+void DolphinView::renameSelectedItems()
+{
+    const KFileItemList items = selectedItems();
+    if (items.count() > 1) {
+        // More than one item has been selected for renaming. Open
+        // a rename dialog and rename all items afterwards.
+        RenameDialog dialog(this, items);
+        if (dialog.exec() == QDialog::Rejected) {
+            return;
+        }
+
+        const QString newName = dialog.newName();
+        if (newName.isEmpty()) {
+            emit errorMessage(dialog.errorString());
+        } else {
+            // TODO: check how this can be integrated into KonqFileUndoManager/KonqOperations
+            // as one operation instead of n rename operations like it is done now...
+            Q_ASSERT(newName.contains('#'));
+
+            // iterate through all selected items and rename them...
+            const int replaceIndex = newName.indexOf('#');
+            Q_ASSERT(replaceIndex >= 0);
+            int index = 1;
+
+            KFileItemList::const_iterator it = items.begin();
+            const KFileItemList::const_iterator end = items.end();
+            while (it != end) {
+                const KUrl& oldUrl = (*it).url();
+                QString number;
+                number.setNum(index++);
+
+                QString name(newName);
+                name.replace(replaceIndex, 1, number);
+
+                if (oldUrl.fileName() != name) {
+                    KUrl newUrl = oldUrl;
+                    newUrl.setFileName(name);
+                    KonqOperations::rename(this, oldUrl, newUrl);
+                    emit renaming();
+                }
+                ++it;
+            }
+        }
+    } else {
+        // Only one item has been selected for renaming. Use the custom
+        // renaming mechanism from the views.
+        Q_ASSERT(items.count() == 1);
+
+        // TODO: Think about using KFileItemDelegate as soon as it supports editing.
+        // Currently the RenameDialog is used, but I'm not sure whether inline renaming
+        // is a benefit for the user at all -> let's wait for some input first...
+        RenameDialog dialog(this, items);
+        if (dialog.exec() == QDialog::Rejected) {
+            return;
+        }
+
+        const QString& newName = dialog.newName();
+        if (newName.isEmpty()) {
+            emit errorMessage(dialog.errorString());
+        } else {
+            const KUrl& oldUrl = items.first().url();
+            KUrl newUrl = oldUrl;
+            newUrl.setFileName(newName);
+            KonqOperations::rename(this, oldUrl, newUrl);
+            emit renaming();
+        }
+    }
+}
+
 #include "dolphinview.moc"
index abb82527e7f6b107aac6dd73435776aea0ff0318..ff72bbaa76d482f17760ed98c5de6297cf98c254 100644 (file)
@@ -358,6 +358,11 @@ public slots:
      */
     void changeSelection(const KFileItemList& selection);
 
+    /**
+     * Triggers the renaming of the currently selected items, where
+     * the user must input a new name for the items.
+     */
+    void renameSelectedItems();
 
 signals:
     /**
@@ -446,6 +451,12 @@ signals:
      */
     void startedPathLoading(const KUrl& url);
 
+    /**
+     * Is emitted when renaming one or more items.
+     * Used for feedback in the mainwindow.
+     */
+    void renaming();
+
 protected:
     /** @see QWidget::mouseReleaseEvent */
     virtual void mouseReleaseEvent(QMouseEvent* event);
index 0a7516c452a390afdedf1be1939fec6e4a8c9826..7e28a30fe3fe570925f9690af1e9cacfcb5609fd 100644 (file)
@@ -33,7 +33,6 @@
 #include <klocale.h>
 #include <kiconeffect.h>
 #include <kio/netaccess.h>
-#include <kio/renamedialog.h>
 #include <kio/previewjob.h>
 #include <kmimetyperesolver.h>
 #include <konqmimedata.h>
@@ -51,7 +50,6 @@
 #include "dolphiniconsview.h"
 #include "dolphincontextmenu.h"
 #include "filterbar.h"
-#include "renamedialog.h"
 #include "kurlnavigator.h"
 #include "viewproperties.h"
 #include "dolphinsettings.h"
@@ -184,76 +182,6 @@ bool DolphinViewContainer::isActive() const
     return m_view->isActive();
 }
 
-void DolphinViewContainer::renameSelectedItems()
-{
-    DolphinViewContainer* view = m_mainWindow->activeViewContainer();
-    const KFileItemList items = m_view->selectedItems();
-    if (items.count() > 1) {
-        // More than one item has been selected for renaming. Open
-        // a rename dialog and rename all items afterwards.
-        RenameDialog dialog(this, items);
-        if (dialog.exec() == QDialog::Rejected) {
-            return;
-        }
-
-        const QString& newName = dialog.newName();
-        if (newName.isEmpty()) {
-            view->statusBar()->setMessage(dialog.errorString(),
-                                          DolphinStatusBar::Error);
-        } else {
-            // TODO: check how this can be integrated into KonqFileUndoManager/KonqOperations
-            // as one operation instead of n rename operations like it is done now...
-            Q_ASSERT(newName.contains('#'));
-
-            // iterate through all selected items and rename them...
-            const int replaceIndex = newName.indexOf('#');
-            Q_ASSERT(replaceIndex >= 0);
-            int index = 1;
-
-            KFileItemList::const_iterator it = items.begin();
-            KFileItemList::const_iterator end = items.end();
-            while (it != end) {
-                const KUrl& oldUrl = (*it).url();
-                QString number;
-                number.setNum(index++);
-
-                QString name(newName);
-                name.replace(replaceIndex, 1, number);
-
-                if (oldUrl.fileName() != name) {
-                    KUrl newUrl = oldUrl;
-                    newUrl.setFileName(name);
-                    m_mainWindow->rename(oldUrl, newUrl);
-                }
-                ++it;
-            }
-        }
-    } else {
-        // Only one item has been selected for renaming. Use the custom
-        // renaming mechanism from the views.
-        Q_ASSERT(items.count() == 1);
-
-        // TODO: Think about using KFileItemDelegate as soon as it supports editing.
-        // Currently the RenameDialog is used, but I'm not sure whether inline renaming
-        // is a benefit for the user at all -> let's wait for some input first...
-        RenameDialog dialog(this, items);
-        if (dialog.exec() == QDialog::Rejected) {
-            return;
-        }
-
-        const QString& newName = dialog.newName();
-        if (newName.isEmpty()) {
-            view->statusBar()->setMessage(dialog.errorString(),
-                                          DolphinStatusBar::Error);
-        } else {
-            const KUrl& oldUrl = items.first().url();
-            KUrl newUrl = oldUrl;
-            newUrl.setFileName(newName);
-            m_mainWindow->rename(oldUrl, newUrl);
-        }
-    }
-}
-
 bool DolphinViewContainer::isFilterBarVisible() const
 {
     return m_filterBar->isVisible();
index abaf2e34e1e09ef8f5a5ca5567919665efce6a79..5e252dcdad75ad13e2e929d39481087a22a0122b 100644 (file)
@@ -90,12 +90,6 @@ public:
     void setActive(bool active);
     bool isActive() const;
 
-    /**
-     * Triggers the renaming of the currently selected items, where
-     * the user must input a new name for the items.
-     */
-    void renameSelectedItems();
-
     KFileItem fileItem(const QModelIndex& index) const;
 
     const DolphinStatusBar* statusBar() const;