┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kitemlistselectionmanager.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2011-08-08 23:41:18 +0200
committerPeter Penz <[email protected]>2011-08-09 16:22:36 +0200
commit3957884bf2e44619a4ed35ba0ffead519988885b (patch)
treed8a5bf1a015cc6001adb4afc5f0f1da721908a22 /src/kitemviews/kitemlistselectionmanager.cpp
parent4692eb7c96f57328479862c0d17d7945b4e87188 (diff)
Improvements for selections, smooth scrolling, tooltips and info-panel
Diffstat (limited to 'src/kitemviews/kitemlistselectionmanager.cpp')
-rw-r--r--src/kitemviews/kitemlistselectionmanager.cpp186
1 files changed, 185 insertions, 1 deletions
diff --git a/src/kitemviews/kitemlistselectionmanager.cpp b/src/kitemviews/kitemlistselectionmanager.cpp
index 6fe9ed818..ee8ba929e 100644
--- a/src/kitemviews/kitemlistselectionmanager.cpp
+++ b/src/kitemviews/kitemlistselectionmanager.cpp
@@ -23,11 +23,13 @@
#include "kitemlistselectionmanager.h"
#include "kitemmodelbase.h"
+#include <KDebug>
KItemListSelectionManager::KItemListSelectionManager(QObject* parent) :
QObject(parent),
m_currentItem(-1),
m_anchorItem(-1),
+ m_selectedItems(),
m_model(0)
{
}
@@ -39,7 +41,7 @@ KItemListSelectionManager::~KItemListSelectionManager()
void KItemListSelectionManager::setCurrentItem(int current)
{
const int previous = m_currentItem;
- if (m_model && current < m_model->count()) {
+ if (m_model && current >= 0 && current < m_model->count()) {
m_currentItem = current;
} else {
m_currentItem = -1;
@@ -55,6 +57,88 @@ int KItemListSelectionManager::currentItem() const
return m_currentItem;
}
+void KItemListSelectionManager::setSelectedItems(const QSet<int>& items)
+{
+ if (m_selectedItems != items) {
+ const QSet<int> previous = m_selectedItems;
+ m_selectedItems = items;
+ emit selectionChanged(m_selectedItems, previous);
+ }
+}
+
+QSet<int> KItemListSelectionManager::selectedItems() const
+{
+ return m_selectedItems;
+}
+
+bool KItemListSelectionManager::hasSelection() const
+{
+ return !m_selectedItems.isEmpty();
+}
+
+void KItemListSelectionManager::setSelected(int index, int count, SelectionMode mode)
+{
+ if (index < 0 || count < 1 || !m_model || index >= m_model->count()) {
+ return;
+ }
+
+ const QSet<int> previous = m_selectedItems;
+
+ count = qMin(count, m_model->count() - index);
+
+ const int endIndex = index + count -1;
+ switch (mode) {
+ case Select:
+ for (int i = index; i <= endIndex; ++i) {
+ m_selectedItems.insert(i);
+ }
+ break;
+
+ case Deselect:
+ for (int i = index; i <= endIndex; ++i) {
+ m_selectedItems.remove(i);
+ }
+ break;
+
+ case Toggle:
+ for (int i = index; i <= endIndex; ++i) {
+ if (m_selectedItems.contains(i)) {
+ m_selectedItems.remove(i);
+ } else {
+ m_selectedItems.insert(i);
+ }
+ }
+ break;
+
+ default:
+ Q_ASSERT(false);
+ break;
+ }
+
+ if (m_selectedItems != previous) {
+ emit selectionChanged(m_selectedItems, previous);
+ }
+}
+
+void KItemListSelectionManager::clearSelection()
+{
+ if (!m_selectedItems.isEmpty()) {
+ const QSet<int> previous = m_selectedItems;
+ m_selectedItems.clear();
+ emit selectionChanged(m_selectedItems, previous);
+ }
+}
+
+void KItemListSelectionManager::beginAnchoredSelection(int anchor, SelectionMode mode)
+{
+ Q_UNUSED(anchor);
+ Q_UNUSED(mode);
+}
+
+void KItemListSelectionManager::endAnchoredSelection()
+{
+}
+
void KItemListSelectionManager::setAnchorItem(int anchor)
{
const int previous = m_anchorItem;
@@ -82,6 +166,106 @@ KItemModelBase* KItemListSelectionManager::model() const
void KItemListSelectionManager::setModel(KItemModelBase* model)
{
m_model = model;
+ if (model && model->count() > 0) {
+ m_currentItem = 0;
+ }
+}
+
+void KItemListSelectionManager::itemsInserted(const KItemRangeList& itemRanges)
+{
+ // Update the current item
+ if (m_currentItem < 0) {
+ setCurrentItem(0);
+ } else {
+ int inc = 0;
+ foreach (const KItemRange& itemRange, itemRanges) {
+ if (m_currentItem < itemRange.index) {
+ break;
+ }
+ inc += itemRange.count;
+ }
+ setCurrentItem(m_currentItem + inc);
+ }
+
+ // Update the selections
+ if (!m_selectedItems.isEmpty()) {
+ const QSet<int> previous = m_selectedItems;
+
+ QSet<int> current;
+ current.reserve(m_selectedItems.count());
+ QSetIterator<int> it(m_selectedItems);
+ while (it.hasNext()) {
+ const int index = it.next();
+ int inc = 0;
+ foreach (const KItemRange& itemRange, itemRanges) {
+ if (index < itemRange.index) {
+ break;
+ }
+ inc += itemRange.count;
+ }
+ current.insert(index + inc);
+ }
+
+ if (current != previous) {
+ m_selectedItems = current;
+ emit selectionChanged(current, previous);
+ }
+ }
+}
+
+void KItemListSelectionManager::itemsRemoved(const KItemRangeList& itemRanges)
+{
+ // Update the current item
+ if (m_currentItem >= 0) {
+ int currentItem = m_currentItem;
+ foreach (const KItemRange& itemRange, itemRanges) {
+ if (currentItem < itemRange.index) {
+ break;
+ }
+ if (currentItem >= itemRange.index + itemRange.count) {
+ currentItem -= itemRange.count;
+ } else if (currentItem >= m_model->count()) {
+ currentItem = m_model->count() - 1;
+ }
+ }
+ setCurrentItem(currentItem);
+ }
+
+ // Update the selections
+ if (!m_selectedItems.isEmpty()) {
+ const QSet<int> previous = m_selectedItems;
+
+ QSet<int> current;
+ current.reserve(m_selectedItems.count());
+ QSetIterator<int> it(m_selectedItems);
+ while (it.hasNext()) {
+ int index = it.next();
+ int dec = 0;
+ foreach (const KItemRange& itemRange, itemRanges) {
+ if (index < itemRange.index) {
+ break;
+ }
+
+ if (index < itemRange.index + itemRange.count) {
+ // The selection is part of the removed range
+ // and will get deleted
+ index = -1;
+ break;
+ }
+
+ dec += itemRange.count;
+ }
+ index -= dec;
+ if (index >= 0) {
+ current.insert(index);
+ }
+ }
+
+ if (current != previous) {
+ m_selectedItems = current;
+ emit selectionChanged(current, previous);
+ }
+ }
}
#include "kitemlistselectionmanager.moc"