From 53d65e6392d3b03d7709385df5006d5d34c22852 Mon Sep 17 00:00:00 2001 From: David Faure Date: Thu, 15 Nov 2007 14:59:02 +0000 Subject: [PATCH] Implement renaming in dolphinpart. 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 | 10 ++--- src/dolphinmainwindow.h | 3 ++ src/dolphinpart.cpp | 45 +++++++++++++++++++--- src/dolphinpart.h | 15 ++++++-- src/dolphinpart.rc | 24 +++++++++++- src/dolphinview.cpp | 70 ++++++++++++++++++++++++++++++++++- src/dolphinview.h | 11 ++++++ src/dolphinviewcontainer.cpp | 72 ------------------------------------ src/dolphinviewcontainer.h | 6 --- 9 files changed, 163 insertions(+), 93 deletions(-) diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index 18476adb51..77cb13c023 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -53,7 +53,6 @@ #include #include #include -#include #include #include #include @@ -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&)), diff --git a/src/dolphinmainwindow.h b/src/dolphinmainwindow.h index e33de4ef63..29ec377445 100644 --- a/src/dolphinmainwindow.h +++ b/src/dolphinmainwindow.h @@ -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(); diff --git a/src/dolphinpart.cpp b/src/dolphinpart.cpp index 2f52447ec2..27000eae67 100644 --- a/src/dolphinpart.cpp +++ b/src/dolphinpart.cpp @@ -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 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) diff --git a/src/dolphinpart.h b/src/dolphinpart.h index 432b55bd38..eb1e009ec7 100644 --- a/src/dolphinpart.h +++ b/src/dolphinpart.h @@ -21,6 +21,7 @@ #define DOLPHINPART_H #include +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 */ - diff --git a/src/dolphinpart.rc b/src/dolphinpart.rc index 0f9dd276fb..e5a9ff63dc 100644 --- a/src/dolphinpart.rc +++ b/src/dolphinpart.rc @@ -1,7 +1,10 @@ - + + + + @@ -46,4 +49,23 @@ + + + + + + + + + + + + + + + + + + + diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index fabda169e2..590a813a87 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -36,7 +36,6 @@ #include #include #include -#include #include #include #include @@ -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" diff --git a/src/dolphinview.h b/src/dolphinview.h index abb82527e7..ff72bbaa76 100644 --- a/src/dolphinview.h +++ b/src/dolphinview.h @@ -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); diff --git a/src/dolphinviewcontainer.cpp b/src/dolphinviewcontainer.cpp index 0a7516c452..7e28a30fe3 100644 --- a/src/dolphinviewcontainer.cpp +++ b/src/dolphinviewcontainer.cpp @@ -33,7 +33,6 @@ #include #include #include -#include #include #include #include @@ -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(); diff --git a/src/dolphinviewcontainer.h b/src/dolphinviewcontainer.h index abaf2e34e1..5e252dcdad 100644 --- a/src/dolphinviewcontainer.h +++ b/src/dolphinviewcontainer.h @@ -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;