# HG changeset patch # User Raimund Renkert # Date 1396423598 -7200 # Node ID dd6a09d2699f44bf588a52d08fd3820f57e20fa5 # Parent ffd47b045d194bd7390459c277c838d3e457872f Added delegate for certificate list items to render a custom ui. diff -r ffd47b045d19 -r dd6a09d2699f ui/CMakeLists.txt --- 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} diff -r ffd47b045d19 -r dd6a09d2699f ui/certificateitemdelegate.cpp --- /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 + +#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); +} diff -r ffd47b045d19 -r dd6a09d2699f ui/certificateitemdelegate.h --- /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 + +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