diff options
| author | Peter Penz <[email protected]> | 2007-08-03 18:46:49 +0000 |
|---|---|---|
| committer | Peter Penz <[email protected]> | 2007-08-03 18:46:49 +0000 |
| commit | b5a12004172e2a84fd4b2765e70546baa063e184 (patch) | |
| tree | 7757a707840531beee6402c27071d93ac4b85f65 /src/dolphincolumnview.cpp | |
| parent | c6187eb633054176688e814fba9e80da3949a5f4 (diff) | |
further selection model fixes
svn path=/trunk/KDE/kdebase/apps/; revision=696076
Diffstat (limited to 'src/dolphincolumnview.cpp')
| -rw-r--r-- | src/dolphincolumnview.cpp | 74 |
1 files changed, 70 insertions, 4 deletions
diff --git a/src/dolphincolumnview.cpp b/src/dolphincolumnview.cpp index 3389e15bf..59a36d9f6 100644 --- a/src/dolphincolumnview.cpp +++ b/src/dolphincolumnview.cpp @@ -30,6 +30,7 @@ #include <kdirmodel.h> #include <QAbstractProxyModel> +#include <QApplication> #include <QPoint> /** @@ -57,6 +58,9 @@ public: inline const KUrl& url() const; + void obtainSelectionModel(); + void releaseSelectionModel(); + protected: virtual QStyleOptionViewItem viewOptions() const; virtual void dragEnterEvent(QDragEnterEvent* event); @@ -135,6 +139,12 @@ void ColumnWidget::setDecorationSize(const QSize& size) void ColumnWidget::setActive(bool active) { + if (active) { + obtainSelectionModel(); + } else { + releaseSelectionModel(); + } + if (m_active == active) { return; } @@ -158,6 +168,22 @@ const KUrl& ColumnWidget::url() const return m_url; } +void ColumnWidget::obtainSelectionModel() +{ + if (selectionModel() != m_view->selectionModel()) { + selectionModel()->deleteLater(); + setSelectionModel(m_view->selectionModel()); + } +} + +void ColumnWidget::releaseSelectionModel() +{ + if (selectionModel() == m_view->selectionModel()) { + QItemSelectionModel* replacementModel = new QItemSelectionModel(model()); + setSelectionModel(replacementModel); + } +} + QStyleOptionViewItem ColumnWidget::viewOptions() const { return m_viewOptions; @@ -207,6 +233,9 @@ void ColumnWidget::dropEvent(QDropEvent* event) void ColumnWidget::mousePressEvent(QMouseEvent* event) { + m_view->requestSelectionModel(this); + + bool swallowMousePressEvent = false; const QModelIndex index = indexAt(event->pos()); if (index.isValid()) { // A click on an item has been done. Only request an activation @@ -216,12 +245,31 @@ void ColumnWidget::mousePressEvent(QMouseEvent* event) const QModelIndex dirIndex = proxyModel->mapToSource(index); KFileItem* item = dirModel->itemForIndex(dirIndex); if (item != 0) { - if (item->isDir()) { + QItemSelectionModel* selModel = selectionModel(); + + const Qt::KeyboardModifiers modifier = QApplication::keyboardModifiers(); + if (modifier & Qt::ControlModifier) { + m_view->requestActivation(this); + selModel->select(index, QItemSelectionModel::Select); + swallowMousePressEvent = true; + } else if (item->isDir()) { m_childUrl = item->url(); viewport()->update(); - } else { + } else { m_view->requestActivation(this); } + + // TODO: check behavior with ShiftModifier + //if (modifier & Qt::ShiftModifier) + + // TODO: is the assumption OK that Qt::RightButton always represents the context menu button? + if (event->button() == Qt::RightButton) { + swallowMousePressEvent = true; + if (!selModel->isSelected(index)) { + clearSelection(); + } + selModel->select(index, QItemSelectionModel::Select); + } } } else { // a click on the viewport has been done @@ -230,9 +278,12 @@ void ColumnWidget::mousePressEvent(QMouseEvent* event) // Swallow mouse move events if a click is done on the viewport. Otherwise the QColumnView // triggers an unwanted loading of directories on hovering folder items. m_swallowMouseMoveEvents = true; + clearSelection(); } - QListView::mousePressEvent(event); + if (!swallowMousePressEvent) { + QListView::mousePressEvent(event); + } } void ColumnWidget::mouseMoveEvent(QMouseEvent* event) @@ -342,6 +393,7 @@ DolphinColumnView::DolphinColumnView(QWidget* parent, DolphinController* control setAcceptDrops(true); setDragDropMode(QAbstractItemView::DragDrop); setDropIndicatorShown(false); + setSelectionMode(ExtendedSelection); if (KGlobalSettings::singleClick()) { connect(this, SIGNAL(clicked(const QModelIndex&)), @@ -540,7 +592,21 @@ void DolphinColumnView::requestActivation(QWidget* column) if (isActive) { m_controller->setUrl(widget->url()); } - } + } + } +} + +void DolphinColumnView::requestSelectionModel(QAbstractItemView* view) +{ + foreach (QObject* object, viewport()->children()) { + if (object->inherits("QListView")) { + ColumnWidget* widget = static_cast<ColumnWidget*>(object); + if (widget == view) { + widget->obtainSelectionModel(); + } else { + widget->releaseSelectionModel(); + } + } } } |
