From: Peter Penz Date: Tue, 17 Apr 2012 16:13:31 +0000 (+0200) Subject: Implement inline-renaming for the new view-engine X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/commitdiff_plain/b2e54c3a316b502ab4f7a95250f8316dc591c057 Implement inline-renaming for the new view-engine BUG: 286893 FIXED-IN: 4.9.0 --- diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index e9079569a..97a307b5d 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -38,6 +38,7 @@ set(dolphinprivate_LIB_SRCS kitemviews/private/kfileitemmodelfilter.cpp kitemviews/private/kitemlistheaderwidget.cpp kitemviews/private/kitemlistkeyboardsearchmanager.cpp + kitemviews/private/kitemlistroleeditor.cpp kitemviews/private/kitemlistrubberband.cpp kitemviews/private/kitemlistselectiontoggle.cpp kitemviews/private/kitemlistsizehintresolver.cpp diff --git a/src/dolphinmainwindow.cpp b/src/dolphinmainwindow.cpp index c62d685f6..dc413dcbf 100644 --- a/src/dolphinmainwindow.cpp +++ b/src/dolphinmainwindow.cpp @@ -1288,7 +1288,7 @@ void DolphinMainWindow::handleUrl(const KUrl& url) this, SLOT(slotHandleUrlStatFinished(KJob*))); } else { - new KRun(url, this); + new KRun(url, this); // Automatically deletes itself after being finished } } @@ -1300,7 +1300,7 @@ void DolphinMainWindow::slotHandleUrlStatFinished(KJob* job) if (entry.isDir()) { activeViewContainer()->setUrl(url); } else { - new KRun(url, this); + new KRun(url, this); // Automatically deletes itself after being finished } } diff --git a/src/kitemviews/kfileitemlistview.cpp b/src/kitemviews/kfileitemlistview.cpp index 6464ec38a..c5c444875 100644 --- a/src/kitemviews/kfileitemlistview.cpp +++ b/src/kitemviews/kfileitemlistview.cpp @@ -29,6 +29,7 @@ #include #include +#include #include #include diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp index 5c5690c40..39ed02f07 100644 --- a/src/kitemviews/kfileitemlistwidget.cpp +++ b/src/kitemviews/kfileitemlistwidget.cpp @@ -31,10 +31,13 @@ #include #include "private/kfileitemclipboard.h" +#include "private/kitemlistroleeditor.h" #include "private/kpixmapmodifier.h" #include +#include #include +#include #include #include #include @@ -64,7 +67,8 @@ KFileItemListWidget::KFileItemListWidget(QGraphicsItem* parent) : m_customTextColor(), m_additionalInfoTextColor(), m_overlay(), - m_rating() + m_rating(), + m_roleEditor(0) { } @@ -72,6 +76,8 @@ KFileItemListWidget::~KFileItemListWidget() { qDeleteAll(m_textInfo); m_textInfo.clear(); + + delete m_roleEditor; } void KFileItemListWidget::setLayout(Layout layout) @@ -482,10 +488,76 @@ void KFileItemListWidget::siblingsInformationChanged(const QBitArray& current, c m_dirtyLayout = true; } +void KFileItemListWidget::editedRoleChanged(const QByteArray& current, const QByteArray& previous) +{ + Q_UNUSED(previous); + + QGraphicsView* parent = scene()->views()[0]; + if (current.isEmpty() || !parent || current != "name") { + if (m_roleEditor) { + emit roleEditingCanceled(index(), current, data().value(current)); + m_roleEditor->deleteLater(); + m_roleEditor = 0; + } + return; + } + + Q_ASSERT(!m_roleEditor); + + const TextInfo* textInfo = m_textInfo.value("name"); + + m_roleEditor = new KItemListRoleEditor(parent); + m_roleEditor->setIndex(index()); + m_roleEditor->setRole(current); + + const QString text = data().value(current).toString(); + m_roleEditor->setPlainText(text); + + QTextOption textOption = textInfo->staticText.textOption(); + m_roleEditor->document()->setDefaultTextOption(textOption); + + // Select the text without MIME-type extension + int selectionLength = text.length(); + + const QString extension = KMimeType::extractKnownExtension(text); + if (!extension.isEmpty()) { + selectionLength -= extension.length() + 1; + } + + if (selectionLength > 0) { + QTextCursor cursor = m_roleEditor->textCursor(); + cursor.movePosition(QTextCursor::StartOfBlock); + cursor.movePosition(QTextCursor::NextCharacter, QTextCursor::KeepAnchor, selectionLength); + m_roleEditor->setTextCursor(cursor); + } + + connect(m_roleEditor, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); + connect(m_roleEditor, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); + + // Adjust the geometry of the editor + QRectF rect = roleEditingRect(current); + const int frameWidth = m_roleEditor->frameWidth(); + rect.adjust(-frameWidth, -frameWidth, frameWidth, frameWidth); + rect.translate(pos()); + if (rect.right() > parent->width()) { + rect.setWidth(parent->width() - rect.left()); + } + m_roleEditor->setGeometry(rect.toRect()); + m_roleEditor->show(); + m_roleEditor->setFocus(); +} void KFileItemListWidget::resizeEvent(QGraphicsSceneResizeEvent* event) { + if (m_roleEditor) { + setEditedRole(QByteArray()); + Q_ASSERT(!m_roleEditor); + } + KItemListWidget::resizeEvent(event); + m_dirtyLayout = true; } @@ -523,6 +595,26 @@ void KFileItemListWidget::slotCutItemsChanged() } } +void KFileItemListWidget::slotRoleEditingCanceled(int index, + const QByteArray& role, + const QVariant& value) +{ + m_roleEditor->deleteLater(); + m_roleEditor = 0; + emit roleEditingCanceled(index, role, value); + setEditedRole(QByteArray()); +} + +void KFileItemListWidget::slotRoleEditingFinished(int index, + const QByteArray& role, + const QVariant& value) +{ + m_roleEditor->deleteLater(); + m_roleEditor = 0; + emit roleEditingFinished(index, role, value); + setEditedRole(QByteArray()); +} + void KFileItemListWidget::triggerCacheRefreshing() { if ((!m_dirtyContent && !m_dirtyLayout) || index() < 0) { @@ -1043,6 +1135,21 @@ void KFileItemListWidget::drawSiblingsInformation(QPainter* painter) } } +QRectF KFileItemListWidget::roleEditingRect(const QByteArray& role) const +{ + const TextInfo* textInfo = m_textInfo.value(role); + if (!textInfo) { + return QRectF(); + } + + QRectF rect(textInfo->pos, textInfo->staticText.size()); + if (m_layout == DetailsLayout) { + rect.setWidth(columnWidth(role) - rect.x()); + } + + return rect; +} + QPixmap KFileItemListWidget::pixmapForIcon(const QString& name, int size) { const KIcon icon(name); diff --git a/src/kitemviews/kfileitemlistwidget.h b/src/kitemviews/kfileitemlistwidget.h index 551b47fc3..33d348bab 100644 --- a/src/kitemviews/kfileitemlistwidget.h +++ b/src/kitemviews/kfileitemlistwidget.h @@ -28,8 +28,9 @@ #include #include -class KItemListView; +class KItemListRoleEditor; class KItemListStyleOption; +class KItemListView; class LIBDOLPHINPRIVATE_EXPORT KFileItemListWidget : public KItemListWidget { @@ -102,12 +103,15 @@ protected: virtual void hoveredChanged(bool hovered); virtual void selectedChanged(bool selected); virtual void siblingsInformationChanged(const QBitArray& current, const QBitArray& previous); + virtual void editedRoleChanged(const QByteArray& current, const QByteArray& previous); virtual void resizeEvent(QGraphicsSceneResizeEvent* event); virtual void showEvent(QShowEvent* event); virtual void hideEvent(QHideEvent* event); private slots: void slotCutItemsChanged(); + void slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value); + void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); private: /** @@ -137,6 +141,8 @@ private: void drawPixmap(QPainter* painter, const QPixmap& pixmap); void drawSiblingsInformation(QPainter* painter); + QRectF roleEditingRect(const QByteArray &role) const; + static QPixmap pixmapForIcon(const QString& name, int size); static void applyCutEffect(QPixmap& pixmap); static void applyHiddenEffect(QPixmap& pixmap); @@ -196,6 +202,8 @@ private: QPixmap m_overlay; QPixmap m_rating; + + KItemListRoleEditor* m_roleEditor; }; #endif diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index c62523410..d53c24589 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -57,6 +57,7 @@ KItemListView::KItemListView(QGraphicsWidget* parent) : m_enabledSelectionToggles(false), m_grouped(false), m_supportsItemExpanding(false), + m_editingRole(false), m_activeTransactions(0), m_endTransactionAnimationHint(Animation), m_itemSize(), @@ -667,6 +668,23 @@ QPixmap KItemListView::createDragPixmap(const QSet& indexes) const return QPixmap(); } +void KItemListView::editRole(int index, const QByteArray& role) +{ + KItemListWidget* widget = m_visibleItems.value(index); + if (!widget) { + return; + } + + Q_ASSERT(!m_editingRole); + m_editingRole = true; + widget->setEditedRole(role); + + connect(widget, SIGNAL(roleEditingCanceled(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingCanceled(int,QByteArray,QVariant))); + connect(widget, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); +} + void KItemListView::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { QGraphicsWidget::paint(painter, option, widget); @@ -760,7 +778,7 @@ void KItemListView::onTransactionEnd() bool KItemListView::event(QEvent* event) { // Forward all events to the controller and handle them there - if (m_controller && m_controller->processEvent(event, transform())) { + if (!m_editingRole && m_controller && m_controller->processEvent(event, transform())) { event->accept(); return true; } @@ -1331,6 +1349,18 @@ void KItemListView::slotGeometryOfGroupHeaderParentChanged() updateGroupHeaderLayout(widget); } +void KItemListView::slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value) +{ + emit roleEditingCanceled(index, role, value); + m_editingRole = false; +} + +void KItemListView::slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value) +{ + emit roleEditingFinished(index, role, value); + m_editingRole = false; +} + void KItemListView::setController(KItemListController* controller) { if (m_controller != controller) { diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index a3c11a6bf..13f62f89b 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -265,6 +265,11 @@ public: */ virtual QPixmap createDragPixmap(const QSet& indexes) const; + /** + * Lets the user edit the role \a role for item with the index \a index. + */ + void editRole(int index, const QByteArray& role); + /** * @reimp */ @@ -304,7 +309,14 @@ signals: */ void visibleRolesChanged(const QList& current, const QList& previous); + void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value); + void roleEditingFinished(int index, const QByteArray& role, const QVariant& value); + protected: + /** + * Is called when creating a new KItemListWidget instance and allows derived + * classes to do a custom initialization. + */ virtual void initializeItemListWidget(KItemListWidget* item); /** @@ -394,6 +406,9 @@ private slots: */ void slotGeometryOfGroupHeaderParentChanged(); + void slotRoleEditingCanceled(int index, const QByteArray& role, const QVariant& value); + void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); + private: enum LayoutAnimationHint { @@ -633,6 +648,7 @@ private: bool m_enabledSelectionToggles; bool m_grouped; bool m_supportsItemExpanding; + bool m_editingRole; int m_activeTransactions; // Counter for beginTransaction()/endTransaction() LayoutAnimationHint m_endTransactionAnimationHint; diff --git a/src/kitemviews/kitemlistwidget.cpp b/src/kitemviews/kitemlistwidget.cpp index 74b96ca1f..542b781f1 100644 --- a/src/kitemviews/kitemlistwidget.cpp +++ b/src/kitemviews/kitemlistwidget.cpp @@ -51,7 +51,8 @@ KItemListWidget::KItemListWidget(QGraphicsItem* parent) : m_hoverOpacity(0), m_hoverCache(0), m_hoverAnimation(0), - m_selectionToggle(0) + m_selectionToggle(0), + m_editedRole() { } @@ -112,7 +113,7 @@ void KItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* o painter->fillRect(backgroundRect, backgroundColor); } - if (m_selected) { + if (m_selected && m_editedRole.isEmpty()) { const QStyle::State activeState(isActiveWindow() ? QStyle::State_Active : 0); drawItemStyleOption(painter, widget, activeState | QStyle::State_Enabled | @@ -120,7 +121,7 @@ void KItemListWidget::paint(QPainter* painter, const QStyleOptionGraphicsItem* o QStyle::State_Item); } - if (isCurrent()) { + if (m_current && m_editedRole.isEmpty()) { QStyleOptionFocusRect focusRectOption; focusRectOption.initFrom(widget); focusRectOption.rect = textFocusRect().toRect(); @@ -309,6 +310,20 @@ QBitArray KItemListWidget::siblingsInformation() const return m_siblingsInfo; } +void KItemListWidget::setEditedRole(const QByteArray& role) +{ + if (m_editedRole != role) { + const QByteArray previous = m_editedRole; + m_editedRole = role; + editedRoleChanged(role, previous); + } +} + +QByteArray KItemListWidget::editedRole() const +{ + return m_editedRole; +} + bool KItemListWidget::contains(const QPointF& point) const { if (!QGraphicsWidget::contains(point)) { @@ -392,6 +407,12 @@ void KItemListWidget::siblingsInformationChanged(const QBitArray& current, const Q_UNUSED(previous); } +void KItemListWidget::editedRoleChanged(const QByteArray& current, const QByteArray& previous) +{ + Q_UNUSED(current); + Q_UNUSED(previous); +} + void KItemListWidget::resizeEvent(QGraphicsSceneResizeEvent* event) { QGraphicsWidget::resizeEvent(event); diff --git a/src/kitemviews/kitemlistwidget.h b/src/kitemviews/kitemlistwidget.h index 4c8ff1a95..8a28913b6 100644 --- a/src/kitemviews/kitemlistwidget.h +++ b/src/kitemviews/kitemlistwidget.h @@ -102,6 +102,16 @@ public: void setSiblingsInformation(const QBitArray& siblings); QBitArray siblingsInformation() const; + /** + * Allows the user to edit the role \a role. The signals + * roleEditingCanceled() or roleEditingFinished() will be + * emitted after editing. An ongoing editing gets canceled if + * the role is empty. Derived classes must implement + * editedRoleChanged(). + */ + void setEditedRole(const QByteArray& role); + QByteArray editedRole() const; + /** * @return True if \a point is inside KItemListWidget::hoverRect(), * KItemListWidget::textRect(), KItemListWidget::selectionToggleRect() @@ -143,6 +153,10 @@ public: */ virtual QRectF expansionToggleRect() const; +signals: + void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value); + void roleEditingFinished(int index, const QByteArray& role, const QVariant& value); + protected: virtual void dataChanged(const QHash& current, const QSet& roles = QSet()); virtual void visibleRolesChanged(const QList& current, const QList& previous); @@ -153,6 +167,7 @@ protected: virtual void hoveredChanged(bool hovered); virtual void alternateBackgroundChanged(bool enabled); virtual void siblingsInformationChanged(const QBitArray& current, const QBitArray& previous); + virtual void editedRoleChanged(const QByteArray& current, const QByteArray& previous); virtual void resizeEvent(QGraphicsSceneResizeEvent* event); /** @@ -190,6 +205,8 @@ private: QPropertyAnimation* m_hoverAnimation; KItemListSelectionToggle* m_selectionToggle; + + QByteArray m_editedRole; }; #endif diff --git a/src/kitemviews/private/kitemlistroleeditor.cpp b/src/kitemviews/private/kitemlistroleeditor.cpp new file mode 100644 index 000000000..55af6a9c7 --- /dev/null +++ b/src/kitemviews/private/kitemlistroleeditor.cpp @@ -0,0 +1,113 @@ +/*************************************************************************** + * Copyright (C) 2012 by Peter Penz * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#include "kitemlistroleeditor.h" + +#include +#include + +KItemListRoleEditor::KItemListRoleEditor(QWidget *parent) : + KTextEdit(parent), + m_index(0), + m_role() +{ + setHorizontalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + setVerticalScrollBarPolicy(Qt::ScrollBarAlwaysOff); + document()->setDocumentMargin(0); + + if (parent) { + parent->installEventFilter(this); + } +} + +KItemListRoleEditor::~KItemListRoleEditor() +{ +} + +void KItemListRoleEditor::setIndex(int index) +{ + m_index = index; +} + +int KItemListRoleEditor::index() const +{ + return m_index; +} + +void KItemListRoleEditor::setRole(const QByteArray& role) +{ + m_role = role; +} + +QByteArray KItemListRoleEditor::role() const +{ + return m_role; +} + +bool KItemListRoleEditor::eventFilter(QObject* watched, QEvent* event) +{ + if (watched == parentWidget() && event->type() == QEvent::Resize) { + autoAdjustSize(); + } + + return KTextEdit::eventFilter(watched, event); +} + +bool KItemListRoleEditor::event(QEvent* event) +{ + if (event->type() == QEvent::FocusOut) { + emit roleEditingFinished(m_index, m_role, toPlainText()); + } + return KTextEdit::event(event); +} + +void KItemListRoleEditor::keyPressEvent(QKeyEvent* event) +{ + switch (event->key()) { + case Qt::Key_Escape: + emit roleEditingCanceled(m_index, m_role, toPlainText()); + event->accept(); + return; + case Qt::Key_Enter: + case Qt::Key_Return: + emit roleEditingFinished(m_index, m_role, toPlainText()); + event->accept(); + return; + default: + break; + } + + KTextEdit::keyPressEvent(event); + autoAdjustSize(); +} + +void KItemListRoleEditor::autoAdjustSize() +{ + const qreal requiredWidth = document()->size().width(); + const qreal availableWidth = size().width() - 2 * frameWidth(); + if (requiredWidth > availableWidth) { + qreal newWidth = requiredWidth + 2 * frameWidth(); + if (parentWidget() && pos().x() + newWidth > parentWidget()->width()) { + newWidth = parentWidget()->width() - pos().x(); + } + resize(newWidth, size().height()); + } +} + +#include "kitemlistroleeditor.moc" diff --git a/src/kitemviews/private/kitemlistroleeditor.h b/src/kitemviews/private/kitemlistroleeditor.h new file mode 100644 index 000000000..14aa694ce --- /dev/null +++ b/src/kitemviews/private/kitemlistroleeditor.h @@ -0,0 +1,67 @@ +/*************************************************************************** + * Copyright (C) 2012 by Peter Penz * + * * + * This program is free software; you can redistribute it and/or modify * + * it under the terms of the GNU General Public License as published by * + * the Free Software Foundation; either version 2 of the License, or * + * (at your option) any later version. * + * * + * This program is distributed in the hope that it will be useful, * + * but WITHOUT ANY WARRANTY; without even the implied warranty of * + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * + * GNU General Public License for more details. * + * * + * You should have received a copy of the GNU General Public License * + * along with this program; if not, write to the * + * Free Software Foundation, Inc., * + * 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA * + ***************************************************************************/ + +#ifndef KITEMLISTROLEEDITOR_H +#define KITEMLISTROLEEDITOR_H + +#include "libdolphin_export.h" + +#include + +/** + * @brief + */ +class LIBDOLPHINPRIVATE_EXPORT KItemListRoleEditor : public KTextEdit +{ + Q_OBJECT + +public: + explicit KItemListRoleEditor(QWidget* parent); + virtual ~KItemListRoleEditor(); + + void setIndex(int index); + int index() const; + + void setRole(const QByteArray& role); + QByteArray role() const; + + virtual bool eventFilter(QObject* watched, QEvent* event); + +signals: + void roleEditingFinished(int index, const QByteArray& role, const QVariant& value); + void roleEditingCanceled(int index, const QByteArray& role, const QVariant& value); + +protected: + virtual bool event(QEvent* event); + virtual void keyPressEvent(QKeyEvent* event); + +private slots: + /** + * Increases the width of the editor in case if there is not + * enough room for the text. + */ + void autoAdjustSize(); + +private: + int m_index; + QByteArray m_role; + +}; + +#endif diff --git a/src/panels/folders/folderspanel.cpp b/src/panels/folders/folderspanel.cpp index 5f1b4a7e0..40e5eca8d 100644 --- a/src/panels/folders/folderspanel.cpp +++ b/src/panels/folders/folderspanel.cpp @@ -42,7 +42,6 @@ #include #include -#include #include @@ -89,18 +88,8 @@ bool FoldersPanel::autoScrolling() const void FoldersPanel::rename(const KFileItem& item) { - // TODO: Inline renaming is not supported anymore in Dolphin 2.0 - if (false /* GeneralSettings::renameInline() */) { - //const QModelIndex dirIndex = m_dolphinModel->indexForItem(item); - //const QModelIndex proxyIndex = m_proxyModel->mapFromSource(dirIndex); - //m_treeView->edit(proxyIndex); - } else { - RenameDialog* dialog = new RenameDialog(this, KFileItemList() << item); - dialog->setAttribute(Qt::WA_DeleteOnClose); - dialog->show(); - dialog->raise(); - dialog->activateWindow(); - } + const int index = fileItemModel()->index(item); + m_controller->view()->editRole(index, "name"); } bool FoldersPanel::urlChanged() @@ -147,6 +136,9 @@ void FoldersPanel::showEvent(QShowEvent* event) // opening the folders panel. view->setOpacity(0); + connect(view, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); + KFileItemModel* model = new KFileItemModel(this); model->setShowDirectoriesOnly(true); model->setShowHiddenFiles(FoldersPanelSettings::hiddenFilesShown()); @@ -261,6 +253,17 @@ void FoldersPanel::slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* eve } } +void FoldersPanel::slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value) +{ + if (role == "name") { + const KFileItem item = fileItemModel()->fileItem(index); + const QString newName = value.toString(); + if (!newName.isEmpty() && newName != item.text() && newName != QLatin1String(".") && newName != QLatin1String("..")) { + KonqOperations::rename(this, item.url(), newName); + } + } +} + void FoldersPanel::slotLoadingCompleted() { if (m_controller->view()->opacity() == 0) { diff --git a/src/panels/folders/folderspanel.h b/src/panels/folders/folderspanel.h index babcde64a..10a30d1f7 100644 --- a/src/panels/folders/folderspanel.h +++ b/src/panels/folders/folderspanel.h @@ -72,6 +72,7 @@ private slots: void slotItemContextMenuRequested(int index, const QPointF& pos); void slotViewContextMenuRequested(const QPointF& pos); void slotItemDropEvent(int index, QGraphicsSceneDragDropEvent* event); + void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); void slotLoadingCompleted(); diff --git a/src/statusbar/dolphinstatusbar.cpp b/src/statusbar/dolphinstatusbar.cpp index 3ab499743..c19c0fe52 100644 --- a/src/statusbar/dolphinstatusbar.cpp +++ b/src/statusbar/dolphinstatusbar.cpp @@ -301,6 +301,9 @@ void DolphinStatusBar::updateProgressInfo() { if (m_progress < 100) { // Show the progress information and hide the extensions + m_stopButton->show(); + m_progressTextLabel->show(); + m_progressBar->show(); setExtensionsVisible(false); } else { // Hide the progress information and show the extensions diff --git a/src/views/dolphinview.cpp b/src/views/dolphinview.cpp index daf6aca76..3e1ed34ec 100644 --- a/src/views/dolphinview.cpp +++ b/src/views/dolphinview.cpp @@ -156,6 +156,8 @@ DolphinView::DolphinView(const KUrl& url, QWidget* parent) : this, SLOT(slotSortRoleChangedByHeader(QByteArray,QByteArray))); connect(view, SIGNAL(visibleRolesChanged(QList,QList)), this, SLOT(slotVisibleRolesChangedByHeader(QList,QList))); + connect(view, SIGNAL(roleEditingFinished(int,QByteArray,QVariant)), + this, SLOT(slotRoleEditingFinished(int,QByteArray,QVariant))); connect(view->header(), SIGNAL(columnWidthChanged(QByteArray,qreal,qreal)), this, SLOT(slotHeaderColumnWidthChanged(QByteArray,qreal,qreal))); @@ -598,30 +600,26 @@ void DolphinView::clearSelection() void DolphinView::renameSelectedItems() { - KFileItemList items = selectedItems(); - const int itemCount = items.count(); - if (itemCount < 1) { - return; - } - - // TODO: The new view-engine introduced with Dolphin 2.0 does not support inline - // renaming yet. - /*if ((itemCount == 1) && DolphinSettings::instance().generalSettings()->renameInline()) { - const QModelIndex dirIndex = m_viewAccessor.dirModel()->indexForItem(items.first()); - const QModelIndex proxyIndex = m_viewAccessor.proxyModel()->mapFromSource(dirIndex); - m_viewAccessor.itemView()->edit(proxyIndex); - } else {*/ - RenameDialog* dialog = new RenameDialog(this, items); - dialog->setAttribute(Qt::WA_DeleteOnClose); - dialog->show(); - dialog->raise(); - dialog->activateWindow(); - //} - - // Assure that the current index remains visible when KFileItemModel - // will notify the view about changed items (which might result in - // a changed sorting). - m_assureVisibleCurrentIndex = true; + const KFileItemList items = selectedItems(); + if (items.isEmpty()) { + return; + } + + if (items.count() == 1) { + const int index = fileItemModel()->index(items.first()); + m_container->controller()->view()->editRole(index, "name"); + } else { + RenameDialog* dialog = new RenameDialog(this, items); + dialog->setAttribute(Qt::WA_DeleteOnClose); + dialog->show(); + dialog->raise(); + dialog->activateWindow(); + } + + // Assure that the current index remains visible when KFileItemModel + // will notify the view about changed items (which might result in + // a changed sorting). + m_assureVisibleCurrentIndex = true; } void DolphinView::trashSelectedItems() @@ -1291,6 +1289,17 @@ void DolphinView::slotVisibleRolesChangedByHeader(const QList& curre emit visibleRolesChanged(m_visibleRoles, previousVisibleRoles); } +void DolphinView::slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value) +{ + if (role == "name") { + const KFileItem item = fileItemModel()->fileItem(index); + const QString newName = value.toString(); + if (!newName.isEmpty() && newName != item.text() && newName != QLatin1String(".") && newName != QLatin1String("..")) { + KonqOperations::rename(this, item.url(), newName); + } + } +} + KFileItemModel* DolphinView::fileItemModel() const { return static_cast(m_container->controller()->model()); diff --git a/src/views/dolphinview.h b/src/views/dolphinview.h index f95572564..a9cf0ade4 100644 --- a/src/views/dolphinview.h +++ b/src/views/dolphinview.h @@ -617,6 +617,8 @@ private slots: void slotVisibleRolesChangedByHeader(const QList& current, const QList& previous); + void slotRoleEditingFinished(int index, const QByteArray& role, const QVariant& value); + /** * Observes the item with the URL \a url. As soon as the directory * model indicates that the item is available, the item will diff --git a/src/views/dolphinviewactionhandler.cpp b/src/views/dolphinviewactionhandler.cpp index bc8f059a4..e22936740 100644 --- a/src/views/dolphinviewactionhandler.cpp +++ b/src/views/dolphinviewactionhandler.cpp @@ -36,7 +36,6 @@ #include #include #include -#include #include #include