mirror of
https://invent.kde.org/system/dolphin
synced 2024-09-17 15:31:20 +00:00
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:
parent
205bf2035d
commit
53d65e6392
|
@ -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&)),
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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)
|
||||
|
|
|
@ -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 */
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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"
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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();
|
||||
|
|
|
@ -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;
|
||||
|
|
Loading…
Reference in a new issue