From b8a4e0fac2820ec8fc442c2abeea700ae4947e01 Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Wed, 18 Jun 2008 19:34:03 +0000 Subject: [PATCH] Assure that when requesting the context menu for the column-view, that the correct items are used. TODO for 4.2: get rid of those 'if (isColumnViewActive())' special cases and provide a generic model which also works with the way the column view is implemented BUG: 164146 svn path=/trunk/KDE/kdebase/apps/; revision=821903 --- src/dolphincolumnview.cpp | 27 ++++++++++++++++++++++++--- src/dolphincolumnview.h | 22 ++++++++++++++++++++++ src/dolphincolumnwidget.cpp | 34 ++++++++++++++++++++++++++++++++-- src/dolphincolumnwidget.h | 8 ++++++++ src/dolphincontextmenu.cpp | 3 ++- src/dolphinview.cpp | 22 ++++++++++++---------- src/dolphinview.h | 5 ----- 7 files changed, 100 insertions(+), 21 deletions(-) diff --git a/src/dolphincolumnview.cpp b/src/dolphincolumnview.cpp index 1ed8b6b82..957b2064f 100644 --- a/src/dolphincolumnview.cpp +++ b/src/dolphincolumnview.cpp @@ -92,9 +92,7 @@ DolphinColumnView::~DolphinColumnView() QModelIndex DolphinColumnView::indexAt(const QPoint& point) const { foreach (DolphinColumnWidget* column, m_columns) { - const QPoint topLeft = column->frameGeometry().topLeft(); - const QPoint adjustedPoint(point.x() - topLeft.x(), point.y() - topLeft.y()); - const QModelIndex index = column->indexAt(adjustedPoint); + const QModelIndex index = column->indexAt(columnPosition(column, point)); if (index.isValid()) { return index; } @@ -103,6 +101,18 @@ QModelIndex DolphinColumnView::indexAt(const QPoint& point) const return QModelIndex(); } +KFileItem DolphinColumnView::itemAt(const QPoint& point) const +{ + foreach (DolphinColumnWidget* column, m_columns) { + KFileItem item = column->itemAt(columnPosition(column, point)); + if (!item.isNull()) { + return item; + } + } + + return KFileItem(); +} + void DolphinColumnView::scrollTo(const QModelIndex& index, ScrollHint hint) { activeColumn()->scrollTo(index, hint); @@ -254,6 +264,11 @@ void DolphinColumnView::editItem(const KFileItem& item) activeColumn()->editItem(item); } +KFileItemList DolphinColumnView::selectedItems() const +{ + return activeColumn()->selectedItems(); +} + void DolphinColumnView::selectAll() { activeColumn()->selectAll(); @@ -587,4 +602,10 @@ void DolphinColumnView::removeAllColumns() assureVisibleActiveColumn(); } +QPoint DolphinColumnView::columnPosition(DolphinColumnWidget* column, const QPoint& point) const +{ + const QPoint topLeft = column->frameGeometry().topLeft(); + return QPoint(point.x() - topLeft.x(), point.y() - topLeft.y()); +} + #include "dolphincolumnview.moc" diff --git a/src/dolphincolumnview.h b/src/dolphincolumnview.h index 2ab4d2d5d..62569a082 100644 --- a/src/dolphincolumnview.h +++ b/src/dolphincolumnview.h @@ -50,8 +50,19 @@ public: explicit DolphinColumnView(QWidget* parent, DolphinController* controller); virtual ~DolphinColumnView(); + /** @see QAbstractItemView::indexAt() */ virtual QModelIndex indexAt(const QPoint& point) const; + + /** + * Returns the item on the position \a pos. The KFileItem instance + * is null if no item is below the position. + */ + KFileItem itemAt(const QPoint& point) const; + + /** @see QAbstractItemView::scrollTo() */ virtual void scrollTo(const QModelIndex& index, ScrollHint hint = EnsureVisible); + + /** @see QAbstractItemView::visualRect() */ virtual QRect visualRect(const QModelIndex& index) const; /** Inverts the selection of the currently active column. */ @@ -97,6 +108,11 @@ public: */ void editItem(const KFileItem& item); + /** + * Returns the selected items of the active column. + */ + KFileItemList selectedItems() const; + public slots: /** @see QAbstractItemView::selectAll() */ virtual void selectAll(); @@ -175,6 +191,12 @@ private: /** Removes all columns except of the root column. */ void removeAllColumns(); + /** + * Returns the position of the point \a point relative to the column + * \a column. + */ + QPoint columnPosition(DolphinColumnWidget* column, const QPoint& point) const; + private: DolphinController* m_controller; bool m_active; diff --git a/src/dolphincolumnwidget.cpp b/src/dolphincolumnwidget.cpp index 8f3b253aa..6d983f71f 100644 --- a/src/dolphincolumnwidget.cpp +++ b/src/dolphincolumnwidget.cpp @@ -28,6 +28,7 @@ #include "dolphin_columnmodesettings.h" #include "dolphin_generalsettings.h" #include "draganddrophelper.h" +#include "iconmanager.h" #include "selectionmanager.h" #include "tooltipmanager.h" @@ -39,8 +40,6 @@ #include #include -#include "iconmanager.h" - #include #include #include @@ -246,6 +245,33 @@ void DolphinColumnWidget::editItem(const KFileItem& item) } } +KFileItem DolphinColumnWidget::itemAt(const QPoint& pos) const +{ + KFileItem item; + const QModelIndex index = indexAt(pos); + if (index.isValid() && (index.column() == DolphinModel::Name)) { + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); + item = m_dolphinModel->itemForIndex(dolphinModelIndex); + } + return item; +} + +KFileItemList DolphinColumnWidget::selectedItems() const +{ + const QItemSelection selection = m_proxyModel->mapSelectionToSource(selectionModel()->selection()); + KFileItemList itemList; + + const QModelIndexList indexList = selection.indexes(); + foreach (const QModelIndex &index, indexList) { + KFileItem item = m_dolphinModel->itemForIndex(index); + if (!item.isNull()) { + itemList.append(item); + } + } + + return itemList; +} + QStyleOptionViewItem DolphinColumnWidget::viewOptions() const { QStyleOptionViewItem viewOptions = QListView::viewOptions(); @@ -364,6 +390,10 @@ void DolphinColumnWidget::contextMenuEvent(QContextMenuEvent* event) QListView::contextMenuEvent(event); const QModelIndex index = indexAt(event->pos()); + if (!index.isValid()) { + clearSelection(); + } + if (index.isValid() || m_active) { // Only open a context menu above an item or if the mouse is above // the active column. diff --git a/src/dolphincolumnwidget.h b/src/dolphincolumnwidget.h index ada7d637a..72028da7c 100644 --- a/src/dolphincolumnwidget.h +++ b/src/dolphincolumnwidget.h @@ -104,6 +104,14 @@ public: */ void editItem(const KFileItem& item); + /** + * Returns the item on the position \a pos. The KFileItem instance + * is null if no item is below the position. + */ + KFileItem itemAt(const QPoint& pos) const; + + KFileItemList selectedItems() const; + protected: virtual QStyleOptionViewItem viewOptions() const; virtual void startDrag(Qt::DropActions supportedActions); diff --git a/src/dolphincontextmenu.cpp b/src/dolphincontextmenu.cpp index b2ec59e15..1af74b2e3 100644 --- a/src/dolphincontextmenu.cpp +++ b/src/dolphincontextmenu.cpp @@ -337,7 +337,8 @@ QString DolphinContextMenu::placesName(const KUrl& url) const QAction* DolphinContextMenu::createPasteAction() { QAction* action = 0; - if ((m_selectedItems.count() == 1) && m_fileInfo.isDir()) { + const bool isDir = !m_fileInfo.isNull() && m_fileInfo.isDir(); + if (isDir && (m_selectedItems.count() == 1)) { action = new QAction(KIcon("edit-paste"), i18nc("@action:inmenu", "Paste Into Folder"), this); const QMimeData* mimeData = QApplication::clipboard()->mimeData(); const KUrl::List pasteData = KUrl::List::fromMimeData(mimeData); diff --git a/src/dolphinview.cpp b/src/dolphinview.cpp index 573abf85a..221d20376 100644 --- a/src/dolphinview.cpp +++ b/src/dolphinview.cpp @@ -295,6 +295,10 @@ void DolphinView::clearSelection() KFileItemList DolphinView::selectedItems() const { + if (isColumnViewActive()) { + return m_columnView->selectedItems(); + } + const QAbstractItemView* view = itemView(); // Our view has a selection, we will map them back to the DolphinModel @@ -325,12 +329,6 @@ KUrl::List DolphinView::selectedUrls() const return urls; } -KFileItem DolphinView::fileItem(const QModelIndex& index) const -{ - const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); - return m_dolphinModel->itemForIndex(dolphinModelIndex); -} - void DolphinView::setContentsPosition(int x, int y) { QAbstractItemView* view = itemView(); @@ -774,10 +772,14 @@ void DolphinView::emitSelectionChangedSignal() void DolphinView::openContextMenu(const QPoint& pos) { KFileItem item; - - const QModelIndex index = itemView()->indexAt(pos); - if (index.isValid() && (index.column() == DolphinModel::Name)) { - item = fileItem(index); + if (isColumnViewActive()) { + item = m_columnView->itemAt(pos); + } else { + const QModelIndex index = itemView()->indexAt(pos); + if (index.isValid() && (index.column() == DolphinModel::Name)) { + const QModelIndex dolphinModelIndex = m_proxyModel->mapToSource(index); + item = m_dolphinModel->itemForIndex(dolphinModelIndex); + } } if (m_toolTipManager != 0) { diff --git a/src/dolphinview.h b/src/dolphinview.h index 0936b06a3..d9c273d38 100644 --- a/src/dolphinview.h +++ b/src/dolphinview.h @@ -218,11 +218,6 @@ public: */ KUrl::List selectedUrls() const; - /** - * Returns the file item for the given model index \a index. - */ - KFileItem fileItem(const QModelIndex& index) const; - /** * Sets the upper left position of the view content * to (x,y). The content of the view might be larger than the visible area -- 2.47.3