]> cloud.milkyroute.net Git - dolphin.git/commitdiff
Show the role-description in the header of the details view
authorPeter Penz <peter.penz19@gmail.com>
Tue, 20 Sep 2011 16:00:39 +0000 (18:00 +0200)
committerPeter Penz <peter.penz19@gmail.com>
Tue, 20 Sep 2011 16:01:34 +0000 (18:01 +0200)
src/kitemviews/kfileitemmodel.cpp
src/kitemviews/kfileitemmodel.h
src/kitemviews/kitemlistheader.cpp
src/kitemviews/kitemlistheader_p.h
src/kitemviews/kitemlistview.cpp
src/kitemviews/kitemlistview.h
src/kitemviews/kitemmodelbase.h

index 0eb8d11e01e86d39641690ae6e88b4bb334fe998..9b96d7eac5983b0264b83412bbdbd84797954495 100644 (file)
@@ -212,6 +212,30 @@ bool KFileItemModel::supportsDropping(int index) const
     return item.isNull() ? false : item.isDir();
 }
 
     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()) {
 KFileItem KFileItemModel::fileItem(int index) const
 {
     if (index >= 0 && index < count()) {
index b84cef216922b70b46853d5185268048caa91482..b79eec4eeb25e2859f0ff98e6859fa15f065d9f2 100644 (file)
@@ -81,6 +81,9 @@ public:
     /** @reimp */
     virtual bool supportsDropping(int index) const;
 
     /** @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
     /**
      * @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
index d1730a090d85c0062248542d3d5262dd8941e526..e5cb43a57c5054ac602f437c8eb6881af73e2675 100644 (file)
@@ -27,7 +27,9 @@
 
 KItemListHeader::KItemListHeader(QGraphicsWidget* parent) :
     QGraphicsWidget(parent),
 
 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());
 {
     QStyleOptionHeader opt;
     const QSize headerSize = style()->sizeFromContents(QStyle::CT_HeaderSection, &opt, QSize());
@@ -66,16 +68,62 @@ KItemModelBase* KItemListHeader::model() const
     return m_model;
 }
 
     return m_model;
 }
 
+void KItemListHeader::setVisibleRoles(const QList<QByteArray>& roles)
+{
+    m_visibleRoles = roles;
+    update();
+}
+
+QList<QByteArray> KItemListHeader::visibleRoles() const
+{
+    return m_visibleRoles;
+}
+
+void KItemListHeader::setVisibleRolesWidths(const QHash<QByteArray, qreal> rolesWidths)
+{
+    m_visibleRolesWidths = rolesWidths;
+    update();
+}
+
+QHash<QByteArray, qreal> KItemListHeader::visibleRolesWidths() const
+{
+    return m_visibleRolesWidths;
+}
+
 void KItemListHeader::paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget)
 {
     Q_UNUSED(option);
     Q_UNUSED(widget);
 
 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);
     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)
 }
 
 void KItemListHeader::slotSortRoleChanged(const QByteArray& current, const QByteArray& previous)
index d99cbe6366b737c892f8f696b2bdd7dce69734ff..e75bd7b148f067792a81b2d133924d3d070e3777 100644 (file)
@@ -22,6 +22,8 @@
 
 #include <libdolphin_export.h>
 #include <QGraphicsWidget>
 
 #include <libdolphin_export.h>
 #include <QGraphicsWidget>
+#include <QHash>
+#include <QList>
 
 class KItemModelBase;
 
 
 class KItemModelBase;
 
@@ -39,6 +41,12 @@ public:
     void setModel(KItemModelBase* model);
     KItemModelBase* model() const;
 
     void setModel(KItemModelBase* model);
     KItemModelBase* model() const;
 
+    void setVisibleRoles(const QList<QByteArray>& roles);
+    QList<QByteArray> visibleRoles() const;
+
+    void setVisibleRolesWidths(const QHash<QByteArray, qreal> rolesWidths);
+    QHash<QByteArray, qreal> visibleRolesWidths() const;
+
     virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
 
 private slots:
     virtual void paint(QPainter* painter, const QStyleOptionGraphicsItem* option, QWidget* widget = 0);
 
 private slots:
@@ -47,6 +55,8 @@ private slots:
 
 private:
     KItemModelBase* m_model;
 
 private:
     KItemModelBase* m_model;
+    QList<QByteArray> m_visibleRoles;
+    QHash<QByteArray, qreal> m_visibleRolesWidths;
 };
 
 #endif
 };
 
 #endif
index 7b73bc616ab6292112ae083fc40e529478780392..b17ca47b7cb4f5cbd3e206ca5afabf4c5511e8c2 100644 (file)
@@ -199,6 +199,11 @@ void KItemListView::setVisibleRoles(const QList<QByteArray>& roles)
 
     markVisibleRolesSizesAsDirty();
     updateLayout();
 
     markVisibleRolesSizesAsDirty();
     updateLayout();
+
+    if (m_header) {
+        m_header->setVisibleRoles(roles);
+        m_header->setVisibleRolesWidths(headerRolesWidths());
+    }
 }
 
 QList<QByteArray> KItemListView::visibleRoles() const
 }
 
 QList<QByteArray> 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 = 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());
         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();
         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();
             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();
             }
             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();
             }
             if (scrollOrientation() == Qt::Horizontal) {
                 newOffset += currentBoundingRect.right() - viewGeometry.right();
             }
@@ -1276,6 +1280,10 @@ void KItemListView::applyDynamicItemSize()
         foreach (KItemListWidget* widget, visibleItemListWidgets()) {
             widget->setVisibleRolesSizes(m_visibleRolesSizes);
         }
         foreach (KItemListWidget* widget, visibleItemListWidgets()) {
             widget->setVisibleRolesSizes(m_visibleRolesSizes);
         }
+
+        if (m_header) {
+            m_header->setVisibleRolesWidths(headerRolesWidths());
+        }
     }
 
     if (m_layouter->itemSize().isEmpty()) {
     }
 
     if (m_layouter->itemSize().isEmpty()) {
@@ -1334,6 +1342,19 @@ void KItemListView::updateHeaderWidth()
     m_header->resize(size().width(), m_header->size().height());
 }
 
     m_header->resize(size().width(), m_header->size().height());
 }
 
+QHash<QByteArray, qreal> KItemListView::headerRolesWidths() const
+{
+    QHash<QByteArray, qreal> rolesWidths;
+
+    QHashIterator<QByteArray, QSizeF> 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;
 int KItemListView::calculateAutoScrollingIncrement(int pos, int range, int oldInc)
 {
     int inc = 0;
index 17db18b31a1950192e05bc1d4facfcc1fb4d0be8..da02e0bc232c7b5c5e50e6777e6423d0f3857d37 100644 (file)
@@ -304,6 +304,11 @@ private:
      */
     void updateHeaderWidth();
 
      */
     void updateHeaderWidth();
 
+    /**
+     * @return The widths of each visible role that is shown in the KItemListHeader.
+     */
+    QHash<QByteArray, qreal> headerRolesWidths() const;
+
     /**
      * Helper function for triggerAutoScrolling().
      * @param pos    Logical position of the mouse relative to the range.
     /**
      * Helper function for triggerAutoScrolling().
      * @param pos    Logical position of the mouse relative to the range.
index 88d393b1fd2c6e978f2f109cd5b0e9ecc736a8ff..742bc291551157144aa2defcaf4d2183e2836bf8 100644 (file)
@@ -115,6 +115,10 @@ public:
     void setSortOrder(Qt::SortOrder order);
     Qt::SortOrder sortOrder() const;
 
     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;
 
     /**
     virtual QString roleDescription(const QByteArray& role) const;
 
     /**