m_mousePos(),
m_autoScrollIncrement(0),
m_autoScrollTimer(0),
- m_header(0)
+ m_header(0),
+ m_useHeaderWidths(false)
{
setAcceptHoverEvents(true);
if (m_header) {
m_header->setVisibleRoles(roles);
m_header->setVisibleRolesWidths(headerRolesWidths());
+ m_useHeaderWidths = false;
}
}
m_header->setVisibleRoles(m_visibleRoles);
m_header->setVisibleRolesWidths(headerRolesWidths());
m_header->setZValue(1);
+
+ m_useHeaderWidths = false;
updateHeaderWidth();
+
+ connect(m_header, SIGNAL(visibleRoleWidthChanged(QByteArray,qreal,qreal)),
+ this, SLOT(slotVisibleRoleWidthChanged(QByteArray,qreal,qreal)));
+
m_layouter->setHeaderHeight(m_header->size().height());
} else if (!show && m_header) {
delete m_header;
m_header = 0;
+ m_useHeaderWidths = false;
m_layouter->setHeaderHeight(0);
}
}
Q_UNUSED(item);
}
+bool KItemListView::itemSizeHintUpdateRequired(const QSet<QByteArray>& changedRoles) const
+{
+ Q_UNUSED(changedRoles);
+ return true;
+}
+
void KItemListView::onControllerChanged(KItemListController* current, KItemListController* previous)
{
Q_UNUSED(current);
updateHeaderWidth();
}
+bool KItemListView::markVisibleRolesSizesAsDirty()
+{
+ const bool dirty = m_itemSize.isEmpty();
+ if (dirty && !m_useHeaderWidths) {
+ m_visibleRolesSizes.clear();
+ m_layouter->setItemSize(QSizeF());
+ }
+ return dirty;
+}
+
void KItemListView::slotItemsInserted(const KItemRangeList& itemRanges)
{
markVisibleRolesSizesAsDirty();
void KItemListView::slotItemsChanged(const KItemRangeList& itemRanges,
const QSet<QByteArray>& roles)
{
+ const bool updateSizeHints = itemSizeHintUpdateRequired(roles);
+ if (updateSizeHints) {
+ markVisibleRolesSizesAsDirty();
+ }
+
foreach (const KItemRange& itemRange, itemRanges) {
const int index = itemRange.index;
const int count = itemRange.count;
- m_sizeHintResolver->itemsChanged(index, count, roles);
+ if (updateSizeHints) {
+ m_sizeHintResolver->itemsChanged(index, count, roles);
+ m_layouter->markAsDirty();
+ if (!m_layoutTimer->isActive()) {
+ m_layoutTimer->start();
+ }
+ }
+ // Apply the changed roles to the visible item-widgets
const int lastIndex = index + count - 1;
for (int i = index; i <= lastIndex; ++i) {
KItemListWidget* widget = m_visibleItems.value(i);
widget->setData(m_model->data(i), roles);
}
}
+
}
}
update();
}
+void KItemListView::slotVisibleRoleWidthChanged(const QByteArray& role,
+ qreal currentWidth,
+ qreal previousWidth)
+{
+ Q_UNUSED(previousWidth);
+
+ m_useHeaderWidths = true;
+
+ if (m_visibleRolesSizes.contains(role)) {
+ QSizeF roleSize = m_visibleRolesSizes.value(role);
+ roleSize.setWidth(currentWidth);
+ m_visibleRolesSizes.insert(role, roleSize);
+ }
+
+ m_layouter->setItemSize(QSizeF()); // Forces an update in applyDynamicItemSize()
+ updateLayout();
+}
+
void KItemListView::triggerAutoScrolling()
{
if (!m_autoScrollTimer) {
}
}
-bool KItemListView::markVisibleRolesSizesAsDirty()
-{
- const bool dirty = m_itemSize.isEmpty();
- if (dirty) {
- m_visibleRolesSizes.clear();
- m_layouter->setItemSize(QSizeF());
- }
- return dirty;
-}
-
void KItemListView::applyDynamicItemSize()
{
if (!m_itemSize.isEmpty()) {
if (m_visibleRolesSizes.isEmpty()) {
m_visibleRolesSizes = visibleRoleSizes();
- foreach (KItemListWidget* widget, visibleItemListWidgets()) {
- widget->setVisibleRolesSizes(m_visibleRolesSizes);
- }
-
if (m_header) {
m_header->setVisibleRolesWidths(headerRolesWidths());
}
}
if (m_layouter->itemSize().isEmpty()) {
+ // Calculate the maximum size of an item by considering the
+ // visible role sizes and apply them to the layouter.
qreal requiredWidth = 0;
qreal requiredHeight = 0;
}
m_layouter->setItemSize(dynamicItemSize);
+
+ // Update the role sizes for all visible widgets
+ foreach (KItemListWidget* widget, visibleItemListWidgets()) {
+ widget->setVisibleRolesSizes(m_visibleRolesSizes);
+ }
}
}