┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2012-05-01 23:11:06 +0200
committerPeter Penz <[email protected]>2012-05-01 23:14:52 +0200
commitd76b113ad10fe207ef23d5dd44c63ee076c71521 (patch)
tree2cda5384e4036f4f048392548ea75243ce6b7fc2 /src/kitemviews
parent6a7cb5ff7d29cc636b432a96e0db9ef9f9030527 (diff)
Places Panel: Allow hiding of items
Related changes: - Animate changed items for the details-view in case it is not expandable - Remove the hardcoded "isHidden"-code in KStandardItemListWidget and allow derived widgets to define themselves what means "hidden" within their context. The current code needs a lot of bugfixing, but lets make this in smaller steps during the next days...
Diffstat (limited to 'src/kitemviews')
-rw-r--r--src/kitemviews/kfileitemlistwidget.cpp5
-rw-r--r--src/kitemviews/kfileitemlistwidget.h1
-rw-r--r--src/kitemviews/kitemlistview.cpp33
-rw-r--r--src/kitemviews/kstandarditem.cpp13
-rw-r--r--src/kitemviews/kstandarditem.h3
-rw-r--r--src/kitemviews/kstandarditemlistwidget.cpp7
-rw-r--r--src/kitemviews/kstandarditemlistwidget.h6
-rw-r--r--src/kitemviews/kstandarditemmodel.cpp37
-rw-r--r--src/kitemviews/kstandarditemmodel.h38
9 files changed, 122 insertions, 21 deletions
diff --git a/src/kitemviews/kfileitemlistwidget.cpp b/src/kitemviews/kfileitemlistwidget.cpp
index a5a4f9c0b..62a17710c 100644
--- a/src/kitemviews/kfileitemlistwidget.cpp
+++ b/src/kitemviews/kfileitemlistwidget.cpp
@@ -88,4 +88,9 @@ bool KFileItemListWidget::isRoleRightAligned(const QByteArray& role) const
return role == "size";
}
+bool KFileItemListWidget::isHidden() const
+{
+ return data().value("text").toString().startsWith(QLatin1Char('.'));
+}
+
#include "kfileitemlistwidget.moc"
diff --git a/src/kitemviews/kfileitemlistwidget.h b/src/kitemviews/kfileitemlistwidget.h
index 4bd375481..bb9034bfa 100644
--- a/src/kitemviews/kfileitemlistwidget.h
+++ b/src/kitemviews/kfileitemlistwidget.h
@@ -46,6 +46,7 @@ public:
protected:
virtual bool isRoleRightAligned(const QByteArray& role) const;
+ virtual bool isHidden() const;
};
#endif
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 48849a3c1..2177c6296 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -1701,17 +1701,22 @@ bool KItemListView::moveWidget(KItemListWidget* widget,const QPointF& newPos)
bool startMovingAnim = false;
- // When having a grid the moving-animation should only be started, if it is done within
- // one row in the vertical scroll-orientation or one column in the horizontal scroll-orientation.
- // Otherwise instead of a moving-animation a create-animation on the new position will be used
- // instead. This is done to prevent overlapping (and confusing) moving-animations.
- const int index = widget->index();
- const Cell cell = m_visibleCells.value(index);
- if (cell.column >= 0 && cell.row >= 0) {
- if (scrollOrientation() == Qt::Vertical) {
- startMovingAnim = (cell.row == m_layouter->itemRow(index));
- } else {
- startMovingAnim = (cell.column == m_layouter->itemColumn(index));
+ if (m_itemSize.isEmpty()) {
+ // The items are not aligned in a grid but either as columns or rows.
+ startMovingAnim = !supportsItemExpanding();
+ } else {
+ // When having a grid the moving-animation should only be started, if it is done within
+ // one row in the vertical scroll-orientation or one column in the horizontal scroll-orientation.
+ // Otherwise instead of a moving-animation a create-animation on the new position will be used
+ // instead. This is done to prevent overlapping (and confusing) moving-animations.
+ const int index = widget->index();
+ const Cell cell = m_visibleCells.value(index);
+ if (cell.column >= 0 && cell.row >= 0) {
+ if (scrollOrientation() == Qt::Vertical) {
+ startMovingAnim = (cell.row == m_layouter->itemRow(index));
+ } else {
+ startMovingAnim = (cell.column == m_layouter->itemColumn(index));
+ }
}
}
@@ -2221,6 +2226,12 @@ bool KItemListView::changesItemGridLayout(const QSizeF& newGridSize,
bool KItemListView::animateChangedItemCount(int changedItemCount) const
{
+ if (m_itemSize.isEmpty()) {
+ // We have only columns or only rows, but no grid: An animation is usually
+ // welcome when inserting or removing items.
+ return !supportsItemExpanding();
+ }
+
if (m_layouter->size().isEmpty() || m_layouter->itemSize().isEmpty()) {
return false;
}
diff --git a/src/kitemviews/kstandarditem.cpp b/src/kitemviews/kstandarditem.cpp
index 1754c531b..e7655f9c8 100644
--- a/src/kitemviews/kstandarditem.cpp
+++ b/src/kitemviews/kstandarditem.cpp
@@ -48,6 +48,14 @@ KStandardItem::KStandardItem(const QIcon& icon, const QString& text, KStandardIt
setText(text);
}
+KStandardItem::KStandardItem(const KStandardItem& item) :
+ m_parent(item.m_parent),
+ m_children(item.m_children),
+ m_model(item.m_model),
+ m_data(item.m_data)
+{
+}
+
KStandardItem::~KStandardItem()
{
}
@@ -103,6 +111,11 @@ KStandardItem* KStandardItem::parent() const
return m_parent;
}
+void KStandardItem::setData(const QHash<QByteArray, QVariant>& values)
+{
+ m_data = values;
+}
+
QHash<QByteArray, QVariant> KStandardItem::data() const
{
return m_data;
diff --git a/src/kitemviews/kstandarditem.h b/src/kitemviews/kstandarditem.h
index a108572a7..3628989a2 100644
--- a/src/kitemviews/kstandarditem.h
+++ b/src/kitemviews/kstandarditem.h
@@ -44,6 +44,7 @@ public:
explicit KStandardItem(KStandardItem* parent = 0);
explicit KStandardItem(const QString& text, KStandardItem* parent = 0);
KStandardItem(const QIcon& icon, const QString& text, KStandardItem* parent = 0);
+ KStandardItem(const KStandardItem& item);
virtual ~KStandardItem();
/**
@@ -70,7 +71,9 @@ public:
void setParent(KStandardItem* parent);
KStandardItem* parent() const;
+ void setData(const QHash<QByteArray, QVariant>& values);
QHash<QByteArray, QVariant> data() const;
+
QList<KStandardItem*> children() const;
private:
diff --git a/src/kitemviews/kstandarditemlistwidget.cpp b/src/kitemviews/kstandarditemlistwidget.cpp
index 43df72f95..14a3db066 100644
--- a/src/kitemviews/kstandarditemlistwidget.cpp
+++ b/src/kitemviews/kstandarditemlistwidget.cpp
@@ -426,6 +426,11 @@ bool KStandardItemListWidget::isRoleRightAligned(const QByteArray& role) const
return false;
}
+bool KStandardItemListWidget::isHidden() const
+{
+ return false;
+}
+
void KStandardItemListWidget::setTextColor(const QColor& color)
{
if (color != m_customTextColor) {
@@ -671,7 +676,7 @@ void KStandardItemListWidget::triggerCacheRefreshing()
const QHash<QByteArray, QVariant> values = data();
m_isExpandable = m_supportsItemExpanding && values["isExpandable"].toBool();
- m_isHidden = values["text"].toString().startsWith(QLatin1Char('.'));
+ m_isHidden = isHidden();
updateExpansionArea();
updateTextsCache();
diff --git a/src/kitemviews/kstandarditemlistwidget.h b/src/kitemviews/kstandarditemlistwidget.h
index 1bd44e2f6..d942b89a9 100644
--- a/src/kitemviews/kstandarditemlistwidget.h
+++ b/src/kitemviews/kstandarditemlistwidget.h
@@ -108,6 +108,12 @@ protected:
*/
virtual bool isRoleRightAligned(const QByteArray& role) const;
+ /**
+ * @return True if the item should be visually marked as hidden item. Per default
+ * false is returned.
+ */
+ virtual bool isHidden() const;
+
void setTextColor(const QColor& color);
QColor textColor() const;
diff --git a/src/kitemviews/kstandarditemmodel.cpp b/src/kitemviews/kstandarditemmodel.cpp
index 04749b9b5..d0be1325f 100644
--- a/src/kitemviews/kstandarditemmodel.cpp
+++ b/src/kitemviews/kstandarditemmodel.cpp
@@ -38,19 +38,22 @@ KStandardItemModel::~KStandardItemModel()
void KStandardItemModel::insertItem(int index, KStandardItem* item)
{
- if (!m_indexesForItems.contains(item) && !item->m_model) {
+ if (item && !m_indexesForItems.contains(item) && !item->m_model) {
+ item->m_model = this;
m_items.insert(index, item);
m_indexesForItems.insert(item, index);
- item->m_model = this;
// TODO: no hierarchical items are handled yet
+ onItemInserted(index);
emit itemsInserted(KItemRangeList() << KItemRange(index, 1));
}
}
void KStandardItemModel::replaceItem(int index, KStandardItem* item)
{
- if (index >= 0 && index < count()) {
+ if (item && index >= 0 && index < count() && !item->m_model) {
+ item->m_model = this;
+
QSet<QByteArray> changedRoles;
KStandardItem* oldItem= m_items[index];
@@ -75,6 +78,7 @@ void KStandardItemModel::replaceItem(int index, KStandardItem* item)
m_items[index] = item;
m_indexesForItems.insert(item, index);
+ onItemReplaced(index);
emit itemsChanged(KItemRangeList() << KItemRange(index, 1), changedRoles);
} else {
kWarning() << "No item available to replace on the given index" << index;
@@ -83,11 +87,6 @@ void KStandardItemModel::replaceItem(int index, KStandardItem* item)
}
}
-void KStandardItemModel::appendItem(KStandardItem *item)
-{
- insertItem(m_items.count(), item);
-}
-
void KStandardItemModel::removeItem(int index)
{
if (index >= 0 && index < count()) {
@@ -97,6 +96,7 @@ void KStandardItemModel::removeItem(int index)
delete item;
item = 0;
+ onItemRemoved(index);
emit itemsRemoved(KItemRangeList() << KItemRange(index, 1));
// TODO: no hierarchical items are handled yet
}
@@ -115,6 +115,11 @@ int KStandardItemModel::index(const KStandardItem* item) const
return m_indexesForItems.value(item, -1);
}
+void KStandardItemModel::appendItem(KStandardItem *item)
+{
+ insertItem(m_items.count(), item);
+}
+
int KStandardItemModel::count() const
{
return m_items.count();
@@ -186,4 +191,20 @@ QList<QPair<int, QVariant> > KStandardItemModel::groups() const
return groups;
}
+void KStandardItemModel::onItemInserted(int index)
+{
+ Q_UNUSED(index);
+}
+
+void KStandardItemModel::onItemReplaced(int index)
+{
+ Q_UNUSED(index);
+}
+
+void KStandardItemModel::onItemRemoved(int index)
+{
+ Q_UNUSED(index);
+}
+
+
#include "kstandarditemmodel.moc"
diff --git a/src/kitemviews/kstandarditemmodel.h b/src/kitemviews/kstandarditemmodel.h
index 5cf60085b..d1a036fd0 100644
--- a/src/kitemviews/kstandarditemmodel.h
+++ b/src/kitemviews/kstandarditemmodel.h
@@ -43,13 +43,30 @@ public:
explicit KStandardItemModel(QObject* parent = 0);
virtual ~KStandardItemModel();
+ /**
+ * Inserts the item \a item at the index \a index. If the index
+ * is equal to the number of items of the model, the item
+ * gets appended as last element. KStandardItemModel takes
+ * the ownership of the item.
+ */
void insertItem(int index, KStandardItem* item);
+
+ /**
+ * Replaces the item on the index \a index by \a item.
+ * KStandardItemModel takes the ownership of the item. The
+ * old item gets deleted.
+ */
void replaceItem(int index, KStandardItem* item);
- void appendItem(KStandardItem* item);
+
void removeItem(int index);
KStandardItem* item(int index) const;
int index(const KStandardItem* item) const;
+ /**
+ * Convenience method for insertItem(count(), item).
+ */
+ void appendItem(KStandardItem* item);
+
virtual int count() const;
virtual QHash<QByteArray, QVariant> data(int index) const;
virtual bool setData(int index, const QHash<QByteArray, QVariant>& values);
@@ -59,6 +76,25 @@ public:
virtual QString roleDescription(const QByteArray& role) const;
virtual QList<QPair<int, QVariant> > groups() const;
+protected:
+ /**
+ * Is invoked after an item has been inserted and before the signal
+ * itemsInserted() gets emitted.
+ */
+ virtual void onItemInserted(int index);
+
+ /**
+ * Is invoked after an item has been replaced and before the signal
+ * itemsChanged() gets emitted.
+ */
+ virtual void onItemReplaced(int index);
+
+ /**
+ * Is invoked after an item has been removed and before the signal
+ * itemsRemoved() gets emitted.
+ */
+ virtual void onItemRemoved(int index);
+
private:
QList<KStandardItem*> m_items;
QHash<const KStandardItem*, int> m_indexesForItems;