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
if (!m_model || m_model->count() == 0) {
return;
}
if (!m_model || m_model->count() == 0) {
return;
}
- const int currentIndex = m_selectionManager->currentItem();
int index;
if (searchFromNextItem) {
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 + 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) {
}
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);
}
m_selectionManager->beginAnchoredSelection(index);
}
+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()) {
void KItemListSelectionManager::beginAnchoredSelection(int anchor)
{
if (anchor >= 0 && m_model && anchor < m_model->count()) {
bool hasSelection() const;
void setSelected(int index, int count = 1, SelectionMode mode = Select);
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);
void clearSelection();
void beginAnchoredSelection(int anchor);