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
This commit is contained in:
David Faure 2007-11-15 14:59:02 +00:00
parent 205bf2035d
commit 53d65e6392
9 changed files with 163 additions and 93 deletions

View 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&)),

View 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();

View 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)

View 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 */

View 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>
@ -46,4 +49,23 @@
<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>

View 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"

View 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);

View 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();

View 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;