Avoid emitting twice twice selectionChanged when keyboard changes the selection, fix slotChangeCurrentItem

Summary:
In KItemListController::slotChangeCurrentItem searchFromNextItem use was bugged :

The two branches of `if (searchFromNextItem)` both looked for the next keyboard with indexForKeyboardSearch(text, currentIndex (the first one with just a +1 modulo).
But when searchFromNextItem is false, we are supposed to start to look for the next indexKeyboard from the start of the list `0`, not from the `currentIndex`

Reviewers: elvisangelaccio, #dolphin

Reviewed By: elvisangelaccio, #dolphin

Subscribers: kfm-devel

Tags: #dolphin

Differential Revision: https://phabricator.kde.org/D24505
This commit is contained in:
Méven Car 2019-10-20 12:35:52 +02:00
parent e3f1d50b73
commit 56a38da57a
3 changed files with 20 additions and 4 deletions

View file

@ -472,19 +472,18 @@ void KItemListController::slotChangeCurrentItem(const QString& text, bool search
if (!m_model || m_model->count() == 0) {
return;
}
const int currentIndex = m_selectionManager->currentItem();
int index;
if (searchFromNextItem) {
const int currentIndex = m_selectionManager->currentItem();
index = m_model->indexForKeyboardSearch(text, (currentIndex + 1) % m_model->count());
} else {
index = m_model->indexForKeyboardSearch(text, currentIndex);
index = m_model->indexForKeyboardSearch(text, 0);
}
if (index >= 0) {
m_selectionManager->setCurrentItem(index);
if (m_selectionBehavior != NoSelection) {
m_selectionManager->clearSelection();
m_selectionManager->setSelected(index, 1);
m_selectionManager->replaceSelection(index);
m_selectionManager->beginAnchoredSelection(index);
}

View file

@ -173,6 +173,16 @@ void KItemListSelectionManager::clearSelection()
}
}
void KItemListSelectionManager::replaceSelection(int index, int count)
{
const KItemSet previous = selectedItems();
if (!previous.isEmpty()) {
m_selectedItems.clear();
m_isAnchoredSelectionActive = false;
}
setSelected(index, count);
}
void KItemListSelectionManager::beginAnchoredSelection(int anchor)
{
if (anchor >= 0 && m_model && anchor < m_model->count()) {

View file

@ -62,6 +62,13 @@ public:
bool hasSelection() const;
void setSelected(int index, int count = 1, SelectionMode mode = Select);
/**
* Equivalent to:
* clearSelection();
* setSelected(index, count);
* but emitting once only selectionChanged signal
*/
void replaceSelection(int index, int count = 1);
void clearSelection();
void beginAnchoredSelection(int anchor);