X-Git-Url: https://cloud.milkyroute.net/gitweb/dolphin.git/blobdiff_plain/ab464bc6849dd000b2d0258ececb78ef1eb1a685..11289b4fc3efbc074b668d4516cd896f8ade9761:/src/selectionmanager.cpp diff --git a/src/selectionmanager.cpp b/src/selectionmanager.cpp index 31ad70b74..26ea3626a 100644 --- a/src/selectionmanager.cpp +++ b/src/selectionmanager.cpp @@ -31,21 +31,22 @@ #include #include #include +#include SelectionManager::SelectionManager(QAbstractItemView* parent) : QObject(parent), m_view(parent), - m_button(0), - m_item() + m_toggle(0), + m_connected(false) { connect(parent, SIGNAL(entered(const QModelIndex&)), this, SLOT(slotEntered(const QModelIndex&))); connect(parent, SIGNAL(viewportEntered()), this, SLOT(slotViewportEntered())); - m_button = new SelectionToggle(m_view->viewport()); - m_button->setCheckable(true); - m_button->hide(); - connect(m_button, SIGNAL(clicked(bool)), + m_toggle = new SelectionToggle(m_view->viewport()); + m_toggle->setCheckable(true); + m_toggle->hide(); + connect(m_toggle, SIGNAL(clicked(bool)), this, SLOT(setItemSelected(bool))); } @@ -55,49 +56,57 @@ SelectionManager::~SelectionManager() void SelectionManager::reset() { - m_button->hide(); - m_item = KFileItem(); + m_toggle->reset(); } void SelectionManager::slotEntered(const QModelIndex& index) { - m_button->hide(); + m_toggle->hide(); if (index.isValid() && (index.column() == DolphinModel::Name)) { - m_item = itemForIndex(index); + m_toggle->setUrl(urlForIndex(index)); + + if (!m_connected) { + connect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)), + this, SLOT(slotRowsRemoved(const QModelIndex&, int, int))); + connect(m_view->selectionModel(), + SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), + this, + SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&))); + m_connected = true; + } const QRect rect = m_view->visualRect(index); - const int gap = 2; - const int x = rect.right() - m_button->width() - gap; - int y = rect.top(); - if (rect.height() <= m_button->height() * 2) { - // center the button vertically - y += (rect.height() - m_button->height()) / 2; - } else { - y += gap; - } - m_button->move(QPoint(x, y)); + const int gap = 2; + const int x = rect.left() + gap; + const int y = rect.top() + gap; + m_toggle->move(QPoint(x, y)); QItemSelectionModel* selModel = m_view->selectionModel(); - m_button->setChecked(selModel->isSelected(index)); - m_button->show(); + m_toggle->setChecked(selModel->isSelected(index)); + m_toggle->show(); } else { - m_item = KFileItem(); + m_toggle->setUrl(KUrl()); + disconnect(m_view->model(), SIGNAL(rowsRemoved(const QModelIndex&, int, int)), + this, SLOT(slotRowsRemoved(const QModelIndex&, int, int))); + disconnect(m_view->selectionModel(), + SIGNAL(selectionChanged(const QItemSelection&, const QItemSelection&)), + this, + SLOT(slotSelectionChanged(const QItemSelection&, const QItemSelection&))); + m_connected = false; } } void SelectionManager::slotViewportEntered() { - m_button->hide(); - m_item = KFileItem(); + m_toggle->hide(); } void SelectionManager::setItemSelected(bool selected) { emit selectionChanged(); - Q_ASSERT(!m_item.isNull()); - const QModelIndex index = indexForItem(m_item); + const QModelIndex index = indexForUrl(m_toggle->url()); if (index.isValid()) { QItemSelectionModel* selModel = m_view->selectionModel(); if (selected) { @@ -105,22 +114,49 @@ void SelectionManager::setItemSelected(bool selected) } else { selModel->select(index, QItemSelectionModel::Deselect); } + selModel->setCurrentIndex(index, QItemSelectionModel::Current); + } +} + +void SelectionManager::slotRowsRemoved(const QModelIndex& parent, int start, int end) +{ + Q_UNUSED(parent); + Q_UNUSED(start); + Q_UNUSED(end); + m_toggle->hide(); +} + +void SelectionManager::slotSelectionChanged(const QItemSelection& selected, + const QItemSelection& deselected) +{ + // The selection has been changed outside the scope of the selection manager + // (e. g. by the rubberband or the "Select All" action). Take care updating + // the state of the toggle button. + const QModelIndex index = indexForUrl(m_toggle->url()); + if (index.isValid()) { + if (selected.contains(index)) { + m_toggle->setChecked(true); + } + + if (deselected.contains(index)) { + m_toggle->setChecked(false); + } } } -KFileItem SelectionManager::itemForIndex(const QModelIndex& index) const +KUrl SelectionManager::urlForIndex(const QModelIndex& index) const { QAbstractProxyModel* proxyModel = static_cast(m_view->model()); KDirModel* dirModel = static_cast(proxyModel->sourceModel()); const QModelIndex dirIndex = proxyModel->mapToSource(index); - return dirModel->itemForIndex(dirIndex); + return dirModel->itemForIndex(dirIndex).url(); } -const QModelIndex SelectionManager::indexForItem(const KFileItem& item) const +const QModelIndex SelectionManager::indexForUrl(const KUrl& url) const { QAbstractProxyModel* proxyModel = static_cast(m_view->model()); KDirModel* dirModel = static_cast(proxyModel->sourceModel()); - const QModelIndex dirIndex = dirModel->indexForItem(item); + const QModelIndex dirIndex = dirModel->indexForUrl(url); return proxyModel->mapFromSource(dirIndex); }