┌   ┐
54
└   ┘

summaryrefslogtreecommitdiff
path: root/src/kitemviews/kitemlistview.cpp
diff options
context:
space:
mode:
authorPeter Penz <[email protected]>2012-02-06 23:26:20 +0100
committerPeter Penz <[email protected]>2012-02-06 23:31:49 +0100
commit5369ee6819a26d9d3f106521c525c03f81a943ce (patch)
treeb6a31372f7fa6cd58aac1c7faeca6d5d96d50e32 /src/kitemviews/kitemlistview.cpp
parent7af39fb960352e0504153c627db0615d80758ebe (diff)
Group header improvements
- Use a simpler background and colors as suggested by Martin Zilz. This is just an early draft, I need to post some comparison screenshots to Martin for review. - Fixes of some layout issues that have been revealed because of adjusting the group header heights. - More clever animation/no-animation detection when doing listview-property changes in parallel.
Diffstat (limited to 'src/kitemviews/kitemlistview.cpp')
-rw-r--r--src/kitemviews/kitemlistview.cpp74
1 files changed, 48 insertions, 26 deletions
diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp
index 52d857705..a2252b918 100644
--- a/src/kitemviews/kitemlistview.cpp
+++ b/src/kitemviews/kitemlistview.cpp
@@ -55,6 +55,7 @@ KItemListView::KItemListView(QGraphicsWidget* parent) :
m_enabledSelectionToggles(false),
m_grouped(false),
m_activeTransactions(0),
+ m_endTransactionAnimationHint(Animation),
m_itemSize(),
m_controller(0),
m_model(0),
@@ -125,6 +126,8 @@ void KItemListView::setScrollOrientation(Qt::Orientation orientation)
it.next();
it.value()->setScrollOrientation(orientation);
}
+ updateGroupHeaderHeight();
+
}
doLayout(NoAnimation);
@@ -331,14 +334,19 @@ void KItemListView::setStyleOption(const KItemListStyleOption& option)
const KItemListStyleOption previousOption = m_styleOption;
m_styleOption = option;
+ if (m_grouped) {
+ updateGroupHeaderHeight();
+ }
+
QHashIterator<int, KItemListWidget*> it(m_visibleItems);
while (it.hasNext()) {
it.next();
it.value()->setStyleOption(option);
}
- m_sizeHintResolver->clearCache();
+ m_sizeHintResolver->clearCache();
doLayout(Animation);
+
onStyleOptionChanged(option, previousOption);
}
@@ -548,7 +556,8 @@ void KItemListView::endTransaction()
if (m_activeTransactions == 0) {
onTransactionEnd();
- doLayout(NoAnimation);
+ doLayout(m_endTransactionAnimationHint);
+ m_endTransactionAnimationHint = Animation;
}
}
@@ -557,7 +566,6 @@ bool KItemListView::isTransactionActive() const
return m_activeTransactions > 0;
}
-
void KItemListView::setHeaderShown(bool show)
{
@@ -893,7 +901,7 @@ void KItemListView::slotItemsRemoved(const KItemRangeList& itemRanges)
// geometry update if necessary.
const int activeTransactions = m_activeTransactions;
m_activeTransactions = 0;
- doLayout(animateChangedItemCount(count) ? Animation : NoAnimation, index, -count);
+ doLayout(animateChangedItemCount(count) ? Animation : NoAnimation, index, -count);
m_activeTransactions = activeTransactions;
}
}
@@ -978,12 +986,7 @@ void KItemListView::slotGroupedSortingChanged(bool current)
m_layouter->markAsDirty();
if (m_grouped) {
- // Apply the height of the header to the layouter
- const qreal groupHeaderHeight = m_styleOption.fontMetrics.height() +
- m_styleOption.margin * 2;
- m_layouter->setGroupHeaderHeight(groupHeaderHeight);
-
- updateVisibleGroupHeaders();
+ updateGroupHeaderHeight();
} else {
// Clear all visible headers
QMutableHashIterator<KItemListWidget*, KItemListGroupHeader*> it (m_visibleGroups);
@@ -1287,7 +1290,16 @@ void KItemListView::doLayout(LayoutAnimationHint hint, int changedIndex, int cha
m_layoutTimer->stop();
}
- if (!m_model || m_model->count() < 0 || m_activeTransactions > 0) {
+ if (m_activeTransactions > 0) {
+ if (hint == NoAnimation) {
+ // As soon as at least one property change should be done without animation,
+ // the whole transaction will be marked as not animated.
+ m_endTransactionAnimationHint = NoAnimation;
+ }
+ return;
+ }
+
+ if (!m_model || m_model->count() < 0) {
return;
}
@@ -1608,13 +1620,13 @@ void KItemListView::updateGroupHeaderForWidget(KItemListWidget* widget)
return;
}
- KItemListGroupHeader* header = m_visibleGroups.value(widget);
- if (!header) {
- header = m_groupHeaderCreator->create(this);
- header->setParentItem(widget);
- m_visibleGroups.insert(widget, header);
+ KItemListGroupHeader* groupHeader = m_visibleGroups.value(widget);
+ if (!groupHeader) {
+ groupHeader = m_groupHeaderCreator->create(this);
+ groupHeader->setParentItem(widget);
+ m_visibleGroups.insert(widget, groupHeader);
}
- Q_ASSERT(header->parentItem() == widget);
+ Q_ASSERT(groupHeader->parentItem() == widget);
// Determine the shown data for the header by doing a binary
// search in the groups-list
@@ -1630,18 +1642,18 @@ void KItemListView::updateGroupHeaderForWidget(KItemListWidget* widget)
}
} while (groups.at(mid).first != index && min <= max);
- header->setData(groups.at(mid).second);
- header->setRole(model()->sortRole());
- header->setStyleOption(m_styleOption);
- header->setScrollOrientation(scrollOrientation());
+ groupHeader->setData(groups.at(mid).second);
+ groupHeader->setRole(model()->sortRole());
+ groupHeader->setStyleOption(m_styleOption);
+ groupHeader->setScrollOrientation(scrollOrientation());
- header->show();
+ groupHeader->show();
}
void KItemListView::updateGroupHeaderLayout(KItemListWidget* widget)
{
- KItemListGroupHeader* header = m_visibleGroups.value(widget);
- Q_ASSERT(header);
+ KItemListGroupHeader* groupHeader = m_visibleGroups.value(widget);
+ Q_ASSERT(groupHeader);
const int index = widget->index();
const QRectF groupHeaderRect = m_layouter->groupHeaderRect(index);
@@ -1651,8 +1663,8 @@ void KItemListView::updateGroupHeaderLayout(KItemListWidget* widget)
// group header position to the relative position.
const QPointF groupHeaderPos(groupHeaderRect.x() - itemRect.x(),
- groupHeaderRect.height());
- header->setPos(groupHeaderPos);
- header->resize(groupHeaderRect.size());
+ groupHeader->setPos(groupHeaderPos);
+ groupHeader->resize(groupHeaderRect.size());
}
void KItemListView::recycleGroupHeaderForWidget(KItemListWidget* widget)
@@ -1893,6 +1905,16 @@ bool KItemListView::scrollBarRequired(const QSizeF& size) const
: maxOffset > size.width();
}
+void KItemListView::updateGroupHeaderHeight()
+{
+ qreal groupHeaderHeight = m_styleOption.fontMetrics.height();
+ groupHeaderHeight += (scrollOrientation() == Qt::Vertical)
+ ? m_styleOption.margin * 4 : m_styleOption.margin * 2;
+ m_layouter->setGroupHeaderHeight(groupHeaderHeight);
+
+ updateVisibleGroupHeaders();
+}
+
int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc)
{
int inc = 0;