changeset 266:dd6a09d2699f

Added delegate for certificate list items to render a custom ui.
author Raimund Renkert <rrenkert@intevation.de>
date Wed, 02 Apr 2014 09:26:38 +0200
parents ffd47b045d19
children 89e8783866f8
files ui/CMakeLists.txt ui/certificateitemdelegate.cpp ui/certificateitemdelegate.h
diffstat 3 files changed, 134 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/ui/CMakeLists.txt	Wed Apr 02 09:24:57 2014 +0200
+++ b/ui/CMakeLists.txt	Wed Apr 02 09:26:38 2014 +0200
@@ -20,6 +20,7 @@
     ${CMAKE_CURRENT_SOURCE_DIR}/helpdialog.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/aboutdialog.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/statusdialog.cpp
+    ${CMAKE_CURRENT_SOURCE_DIR}/certificateitemdelegate.cpp
     ${CMAKE_CURRENT_SOURCE_DIR}/installwrapper.cpp
     ${CERTIFICATELIST_SOURCES}
     ${DOWNLOADER_SOURCES}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/certificateitemdelegate.cpp	Wed Apr 02 09:26:38 2014 +0200
@@ -0,0 +1,90 @@
+#include <QtWidgets>
+
+#include "certificate.h"
+#include "certificateitemdelegate.h"
+
+void CertificateItemDelegate::paint(QPainter *painter,
+    const QStyleOptionViewItem &option, const QModelIndex &index) const
+{
+    // Save the current painter.
+    painter->save();
+    int status = index.data(Qt::UserRole + 1).toInt();
+    if (status == 0) {
+        // This status is not known, so draw the default item.
+        QStyledItemDelegate::paint(painter, option, index);
+        painter->restore();
+        return;
+    }
+
+    if (status == Certificate::InstallNew) {
+        //Set the icon and use bold and bigger font to highlight this item.
+        QIcon *icon = new QIcon(":/img/list-add.png");
+        QFont *font = new QFont();
+        font->setBold(true);
+        font->setPointSize(font->pointSize() + 1);
+        drawItem(painter, option, index, icon, font);
+    }
+    else if (status == Certificate::InstallOld) {
+        // Set the icon and use the default font for this item.
+        QIcon *icon = new QIcon(":/img/list-add.png");
+        QFont *font = new QFont();
+        drawItem(painter, option, index, icon, font);
+    }
+    else if (status == Certificate::RemoveNew) {
+        //Set the icon and use bold and bigger font to highlight this item.
+        QIcon *icon = new QIcon(":/img/list-remove.png");
+        QFont *font = new QFont();
+        font->setBold(true);
+        font->setPointSize(font->pointSize() + 1);
+        drawItem(painter, option, index, icon, font);
+    }
+    else if (status == Certificate::RemoveOld) {
+        // Set the icon and use the default font for this item.
+        QIcon *icon = new QIcon(":/img/list-remove.png");
+        QFont *font = new QFont();
+        drawItem(painter, option, index, icon, font);
+    }
+    else {
+        // Draw the default item.
+        QStyledItemDelegate::paint(painter, option, index);
+    }
+    // Restore the painter to have an unmodified painter for the next draw
+    // action.
+    painter->restore();
+    return;
+}
+
+void CertificateItemDelegate::drawItem(QPainter *painter,
+    const QStyleOptionViewItem &option, const QModelIndex &index,
+    QIcon *icon, QFont *font) const
+{
+    // Get temporary style option to draw a checkbox only.
+    QStyleOptionViewItem opt = option;
+    // Initialize the style options with the temporary option object.
+    initStyleOption(&opt, index);
+    // Clear all text to draw the checkbox only.
+    opt.text.clear();
+
+    // Draw highlighted background.
+    if (option.state & QStyle::State_Selected) {
+        painter->fillRect(option.rect, option.palette.highlight());
+    }
+
+    // Draw the checkbox control with the temporary options.
+    QApplication::style()->drawControl(QStyle::CE_ItemViewItem, &opt, painter);
+
+    // Draw the icon.
+    int iconSpace = 25;
+    if (!icon->isNull()) {
+        QRect rect = option.rect.adjusted(25, 0, 0, 0);
+        icon->paint(painter, rect, Qt::AlignVCenter|Qt::AlignLeft);
+        iconSpace = 50;
+    }
+
+    // Draw the text using the given font.
+    QString text = index.data().toString();
+    QRect rect = option.rect.adjusted(iconSpace, 0, 0, 0);
+    painter->setFont(*font);
+    painter->drawText(rect.left(), rect.top(), rect.width(), rect.height(),
+        Qt::AlignVCenter|Qt::AlignLeft, text, &rect);
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/ui/certificateitemdelegate.h	Wed Apr 02 09:26:38 2014 +0200
@@ -0,0 +1,43 @@
+
+#ifndef CERTIFICATELISTITEM_H
+#define CERTIFICATELISTITEM_H
+/**
+ * @file certificateitemdelegate.h
+ * @brief Item delegate drawing custom certificate items in list views.
+ *
+ */
+
+#include <QStyledItemDelegate>
+
+class CertificateItemDelegate : public QStyledItemDelegate
+{
+Q_OBJECT
+
+public:
+    CertificateItemDelegate(QWidget *parent = 0) : QStyledItemDelegate(parent){}
+
+    /**
+     * @brief Renders the delegate using the given painter and options.
+     *
+     * @param painter   The painter to draw the item.
+     * @param option    The style options.
+     * @param index     The model index of the item to draw.
+     */
+    void paint(QPainter *painter, const QStyleOptionViewItem &option,
+        const QModelIndex &index) const;
+
+private:
+
+    /**
+     * @brief Draw the item using the given parameters.
+     *
+     * @param painter   The painter to draw the item.
+     * @param option    The style options.
+     * @param index     The model index of the item to draw.
+     * @param icon      The icon to display.
+     * @param font      The font used to draw text.
+     */
+    void drawItem(QPainter *painter, const QStyleOptionViewItem &option,
+        const QModelIndex &index, QIcon *icon, QFont *font) const;
+};
+#endif

http://wald.intevation.org/projects/trustbridge/