diff options
Diffstat (limited to 'src/kitemviews')
| -rw-r--r-- | src/kitemviews/kitemlistcontroller.cpp | 35 | ||||
| -rw-r--r-- | src/kitemviews/kitemset.h | 93 |
2 files changed, 112 insertions, 16 deletions
diff --git a/src/kitemviews/kitemlistcontroller.cpp b/src/kitemviews/kitemlistcontroller.cpp index 2e7d2f057..74a631d8d 100644 --- a/src/kitemviews/kitemlistcontroller.cpp +++ b/src/kitemviews/kitemlistcontroller.cpp @@ -237,21 +237,34 @@ bool KItemListController::keyPressEvent(QKeyEvent *event) { int index = m_selectionManager->currentItem(); int key = event->key(); + const bool shiftPressed = event->modifiers() & Qt::ShiftModifier; // Handle the expanding/collapsing of items - if (m_view->supportsItemExpanding() && m_model->isExpandable(index)) { - if (key == Qt::Key_Right) { - if (m_model->setExpanded(index, true)) { - return true; + // expand / collapse all selected directories + if (m_view->supportsItemExpanding() && m_model->isExpandable(index) && (key == Qt::Key_Right || key == Qt::Key_Left)) { + const bool expandOrCollapse = key == Qt::Key_Right ? true : false; + bool shouldReturn = m_model->setExpanded(index, expandOrCollapse); + + // edit in reverse to preserve index of the first handled items + const auto selectedItems = m_selectionManager->selectedItems(); + for (auto it = selectedItems.rbegin(); it != selectedItems.rend(); ++it) { + shouldReturn |= m_model->setExpanded(*it, expandOrCollapse); + if (!shiftPressed) { + m_selectionManager->setSelected(*it); } - } else if (key == Qt::Key_Left) { - if (m_model->setExpanded(index, false)) { - return true; + } + if (shouldReturn) { + // update keyboard anchors + if (shiftPressed) { + m_keyboardAnchorIndex = selectedItems.count() > 0 ? qMin(index, selectedItems.last()) : index; + m_keyboardAnchorPos = keyboardAnchorPos(m_keyboardAnchorIndex); } + + event->ignore(); + return true; } } - const bool shiftPressed = event->modifiers() & Qt::ShiftModifier; const bool controlPressed = event->modifiers() & Qt::ControlModifier; const bool shiftOrControlPressed = shiftPressed || controlPressed; const bool navigationPressed = key == Qt::Key_Home || key == Qt::Key_End || key == Qt::Key_PageUp || key == Qt::Key_PageDown || key == Qt::Key_Up @@ -327,11 +340,17 @@ bool KItemListController::keyPressEvent(QKeyEvent *event) case Qt::Key_Up: updateKeyboardAnchor(); + if (shiftPressed && !m_selectionManager->isAnchoredSelectionActive() && m_selectionManager->isSelected(index)) { + m_selectionManager->beginAnchoredSelection(index); + } index = previousRowIndex(index); break; case Qt::Key_Down: updateKeyboardAnchor(); + if (shiftPressed && !m_selectionManager->isAnchoredSelectionActive() && m_selectionManager->isSelected(index)) { + m_selectionManager->beginAnchoredSelection(index); + } index = nextRowIndex(index); break; diff --git a/src/kitemviews/kitemset.h b/src/kitemviews/kitemset.h index fd73c0e02..b8ab6864d 100644 --- a/src/kitemviews/kitemset.h +++ b/src/kitemviews/kitemset.h @@ -50,7 +50,7 @@ public: class iterator { - iterator(const KItemRangeList::iterator &rangeIt, int offset) + iterator(const KItemRangeList::iterator &rangeIt, int offset = 0) : m_rangeIt(rangeIt) , m_offset(offset) { @@ -135,7 +135,7 @@ public: class const_iterator { - const_iterator(KItemRangeList::const_iterator rangeIt, int offset) + const_iterator(KItemRangeList::const_iterator rangeIt, int offset = 0) : m_rangeIt(rangeIt) , m_offset(offset) { @@ -223,6 +223,70 @@ public: friend class KItemSet; }; + class const_reverse_iterator + { + public: + const_reverse_iterator(KItemSet::const_iterator rangeIt) + : m_current(rangeIt) + { + } + + const_reverse_iterator(const KItemSet::const_reverse_iterator &other) + : m_current(other.base()) + { + } + + int operator*() const + { + // analog to std::prev + auto t = const_iterator(m_current); + --t; + return *t; + } + + inline bool operator==(const const_reverse_iterator &other) const + { + return m_current == other.m_current; + } + + bool operator!=(const const_reverse_iterator &other) const + { + return !(*this == other); + } + + const_reverse_iterator &operator++() + { + --m_current; + return *this; + } + const_reverse_iterator operator++(int) + { + auto tmp = *this; + ++(*this); + return tmp; + } + + const_reverse_iterator &operator--() + { + ++m_current; + return *this; + } + const_reverse_iterator operator--(int) + { + auto tmp = *this; + --(*this); + return tmp; + } + + KItemSet::const_iterator base() const + { + return m_current; + } + + private: + KItemSet::const_iterator m_current; + }; + iterator begin(); const_iterator begin() const; const_iterator constBegin() const; @@ -230,6 +294,9 @@ public: const_iterator end() const; const_iterator constEnd() const; + const_reverse_iterator rend() const; + const_reverse_iterator rbegin() const; + int first() const; int last() const; @@ -366,32 +433,32 @@ inline bool KItemSet::remove(int i) inline KItemSet::iterator KItemSet::begin() { - return iterator(m_itemRanges.begin(), 0); + return iterator(m_itemRanges.begin()); } inline KItemSet::const_iterator KItemSet::begin() const { - return const_iterator(m_itemRanges.begin(), 0); + return const_iterator(m_itemRanges.begin()); } inline KItemSet::const_iterator KItemSet::constBegin() const { - return const_iterator(m_itemRanges.constBegin(), 0); + return const_iterator(m_itemRanges.constBegin()); } inline KItemSet::iterator KItemSet::end() { - return iterator(m_itemRanges.end(), 0); + return iterator(m_itemRanges.end()); } inline KItemSet::const_iterator KItemSet::end() const { - return const_iterator(m_itemRanges.end(), 0); + return const_iterator(m_itemRanges.end()); } inline KItemSet::const_iterator KItemSet::constEnd() const { - return const_iterator(m_itemRanges.constEnd(), 0); + return const_iterator(m_itemRanges.constEnd()); } inline int KItemSet::first() const @@ -405,6 +472,16 @@ inline int KItemSet::last() const return lastRange.index + lastRange.count - 1; } +inline KItemSet::const_reverse_iterator KItemSet::rend() const +{ + return KItemSet::const_reverse_iterator(constBegin()); +} + +inline KItemSet::const_reverse_iterator KItemSet::rbegin() const +{ + return KItemSet::const_reverse_iterator(constEnd()); +} + inline KItemSet &KItemSet::operator<<(int i) { insert(i); |
