From 51cd727066efaf548a68585ec0bb66fa1a766c4d Mon Sep 17 00:00:00 2001 From: Peter Penz Date: Tue, 20 Sep 2011 18:00:39 +0200 Subject: [PATCH] Show the role-description in the header of the details view --- src/kitemviews/kfileitemmodel.cpp | 24 ++++++++++++++ src/kitemviews/kfileitemmodel.h | 3 ++ src/kitemviews/kitemlistheader.cpp | 50 +++++++++++++++++++++++++++++- src/kitemviews/kitemlistheader_p.h | 10 ++++++ src/kitemviews/kitemlistview.cpp | 33 ++++++++++++++++---- src/kitemviews/kitemlistview.h | 5 +++ src/kitemviews/kitemmodelbase.h | 4 +++ 7 files changed, 122 insertions(+), 7 deletions(-) diff --git a/src/kitemviews/kfileitemmodel.cpp b/src/kitemviews/kfileitemmodel.cpp index 0eb8d11e0..9b96d7eac 100644 --- a/src/kitemviews/kfileitemmodel.cpp +++ b/src/kitemviews/kfileitemmodel.cpp @@ -212,6 +212,30 @@ bool KFileItemModel::supportsDropping(int index) const return item.isNull() ? false : item.isDir(); } +QString KFileItemModel::roleDescription(const QByteArray& role) const +{ + QString descr; + + switch (roleIndex(role)) { + case NameRole: descr = i18nc("@item:intable", "Name"); break; + case SizeRole: descr = i18nc("@item:intable", "Size"); break; + case DateRole: descr = i18nc("@item:intable", "Date"); break; + case PermissionsRole: descr = i18nc("@item:intable", "Permissions"); break; + case OwnerRole: descr = i18nc("@item:intable", "Owner"); break; + case GroupRole: descr = i18nc("@item:intable", "Group"); break; + case TypeRole: descr = i18nc("@item:intable", "Type"); break; + case DestinationRole: descr = i18nc("@item:intable", "Destination"); break; + case PathRole: descr = i18nc("@item:intable", "Path"); break; + case NoRole: break; + case IsDirRole: break; + case IsExpandedRole: break; + case ExpansionLevelRole: break; + default: Q_ASSERT(false); break; + } + + return descr; +} + KFileItem KFileItemModel::fileItem(int index) const { if (index >= 0 && index < count()) { diff --git a/src/kitemviews/kfileitemmodel.h b/src/kitemviews/kfileitemmodel.h index b84cef216..b79eec4ee 100644 --- a/src/kitemviews/kfileitemmodel.h +++ b/src/kitemviews/kfileitemmodel.h @@ -81,6 +81,9 @@ public: /** @reimp */ virtual bool supportsDropping(int index) const; + /** @reimp */ + virtual QString roleDescription(const QByteArray& role) const; + /** * @return The file-item for the index \a index. If the index is in a valid * range it is assured that the file-item is not null. The runtime diff --git a/src/kitemviews/kitemlistheader.cpp b/src/kitemviews/kitemlistheader.cpp index d1730a090..e5cb43a57 100644 --- a/src/kitemviews/kitemlistheader.cpp +++ b/src/kitemviews/kitemlistheader.cpp @@ -27,7 +27,9 @@ KItemListHeader::KItemListHeader(QGraphicsWidget* parent) : QGraphicsWidget(parent), - m_model(0) + m_model(0), + m_visibleRoles(), + m_visibleRolesWidths() { QStyleOptionHeader opt; const QSize headerSize = style()->sizeFromContents(QStyle::CT_HeaderSection, &opt, QSize()); @@ -66,16 +68,62 @@ KItemModelBase* KItemListHeader::model() const return m_model; } +void KItemListHeader::setVisibleRoles(const QList& roles) +{ + m_visibleRoles = roles; + update(); +} + +QList KItemListHeader::visibleRoles() const +{ + return m_visibleRoles; +} + +void KItemListHeader::setVisibleRolesWidths(const QHash rolesWidths) +{ + m_visibleRolesWidths = rolesWidths; + update(); +} + +QHash KItemListHeader::visibleRolesWidths() const +{ + return m_visibleRolesWidths; +} + void KItemListHeader::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget) { Q_UNUSED(option); Q_UNUSED(widget); + // Draw background QStyleOption opt; opt.init(widget); opt.rect = rect().toRect(); opt.state |= QStyle::State_Horizontal; style()->drawControl(QStyle::CE_HeaderEmptyArea, &opt, painter); + + if (!m_model) { + return; + } + + // Draw roles + // TODO: This is a rough draft only + QFontMetricsF fontMetrics(font()); + QTextOption textOption(Qt::AlignLeft | Qt::AlignVCenter); + + painter->setFont(font()); + painter->setPen(palette().text().color()); + + const qreal margin = style()->pixelMetric(QStyle::PM_HeaderMargin); + qreal x = margin; + foreach (const QByteArray& role, m_visibleRoles) { + const QString roleDescription = m_model->roleDescription(role); + const qreal textWidth = fontMetrics.width(roleDescription); + QRectF rect(x, 0, textWidth, size().height()); + painter->drawText(rect, roleDescription, textOption); + + x += m_visibleRolesWidths.value(role) + margin; + } } void KItemListHeader::slotSortRoleChanged(const QByteArray& current, const QByteArray& previous) diff --git a/src/kitemviews/kitemlistheader_p.h b/src/kitemviews/kitemlistheader_p.h index d99cbe636..e75bd7b14 100644 --- a/src/kitemviews/kitemlistheader_p.h +++ b/src/kitemviews/kitemlistheader_p.h @@ -22,6 +22,8 @@ #include #include +#include +#include class KItemModelBase; @@ -39,6 +41,12 @@ public: void setModel(KItemModelBase* model); KItemModelBase* model() const; + void setVisibleRoles(const QList& roles); + QList visibleRoles() const; + + void setVisibleRolesWidths(const QHash rolesWidths); + QHash visibleRolesWidths() const; + virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0); private slots: @@ -47,6 +55,8 @@ private slots: private: KItemModelBase* m_model; + QList m_visibleRoles; + QHash m_visibleRolesWidths; }; #endif diff --git a/src/kitemviews/kitemlistview.cpp b/src/kitemviews/kitemlistview.cpp index 7b73bc616..b17ca47b7 100644 --- a/src/kitemviews/kitemlistview.cpp +++ b/src/kitemviews/kitemlistview.cpp @@ -199,6 +199,11 @@ void KItemListView::setVisibleRoles(const QList& roles) markVisibleRolesSizesAsDirty(); updateLayout(); + + if (m_header) { + m_header->setVisibleRoles(roles); + m_header->setVisibleRolesWidths(headerRolesWidths()); + } } QList KItemListView::visibleRoles() const @@ -231,6 +236,8 @@ void KItemListView::setHeaderShown(bool show) m_header = new KItemListHeader(this); m_header->setPos(0, 0); m_header->setModel(m_model); + m_header->setVisibleRoles(m_visibleRoles); + m_header->setVisibleRolesWidths(headerRolesWidths()); m_header->setZValue(1); updateHeaderWidth(); m_layouter->setHeaderHeight(m_header->size().height()); @@ -759,17 +766,14 @@ void KItemListView::slotCurrentChanged(int current, int previous) if (currentBoundingRect.top() < viewGeometry.top()) { Q_ASSERT(scrollOrientation() == Qt::Vertical); newOffset += currentBoundingRect.top() - viewGeometry.top(); - } - else if ((currentBoundingRect.bottom() > viewGeometry.bottom())) { + } else if ((currentBoundingRect.bottom() > viewGeometry.bottom())) { Q_ASSERT(scrollOrientation() == Qt::Vertical); newOffset += currentBoundingRect.bottom() - viewGeometry.bottom(); - } - else if (currentBoundingRect.left() < viewGeometry.left()) { + } else if (currentBoundingRect.left() < viewGeometry.left()) { if (scrollOrientation() == Qt::Horizontal) { newOffset += currentBoundingRect.left() - viewGeometry.left(); } - } - else if ((currentBoundingRect.right() > viewGeometry.right())) { + } else if ((currentBoundingRect.right() > viewGeometry.right())) { if (scrollOrientation() == Qt::Horizontal) { newOffset += currentBoundingRect.right() - viewGeometry.right(); } @@ -1276,6 +1280,10 @@ void KItemListView::applyDynamicItemSize() foreach (KItemListWidget* widget, visibleItemListWidgets()) { widget->setVisibleRolesSizes(m_visibleRolesSizes); } + + if (m_header) { + m_header->setVisibleRolesWidths(headerRolesWidths()); + } } if (m_layouter->itemSize().isEmpty()) { @@ -1334,6 +1342,19 @@ void KItemListView::updateHeaderWidth() m_header->resize(size().width(), m_header->size().height()); } +QHash KItemListView::headerRolesWidths() const +{ + QHash rolesWidths; + + QHashIterator it(m_visibleRolesSizes); + while (it.hasNext()) { + it.next(); + rolesWidths.insert(it.key(), it.value().width()); + } + + return rolesWidths; +} + int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc) { int inc = 0; diff --git a/src/kitemviews/kitemlistview.h b/src/kitemviews/kitemlistview.h index 17db18b31..da02e0bc2 100644 --- a/src/kitemviews/kitemlistview.h +++ b/src/kitemviews/kitemlistview.h @@ -304,6 +304,11 @@ private: */ void updateHeaderWidth(); + /** + * @return The widths of each visible role that is shown in the KItemListHeader. + */ + QHash headerRolesWidths() const; + /** * Helper function for triggerAutoScrolling(). * @param pos Logical position of the mouse relative to the range. diff --git a/src/kitemviews/kitemmodelbase.h b/src/kitemviews/kitemmodelbase.h index 88d393b1f..742bc2915 100644 --- a/src/kitemviews/kitemmodelbase.h +++ b/src/kitemviews/kitemmodelbase.h @@ -115,6 +115,10 @@ public: void setSortOrder(Qt::SortOrder order); Qt::SortOrder sortOrder() const; + /** + * @return Translated description for the \p role. The description is e.g. used + * for the header in KItemListView. + */ virtual QString roleDescription(const QByteArray& role) const; /** -- 2.47.3