diff --git a/libs/ui/KisMultiFeedRSSModel.cpp b/libs/ui/KisMultiFeedRSSModel.cpp --- a/libs/ui/KisMultiFeedRSSModel.cpp +++ b/libs/ui/KisMultiFeedRSSModel.cpp @@ -197,7 +197,12 @@ RssItem item = m_aggregatedFeed.at(index.row()); switch (role) { - case Qt::DisplayRole: // fall through + case Qt::DisplayRole: + { + return QString("" + item.title + "" + "

" + item.pubDate.toString("dd-MM-yyyy hh:mm") + "

" + "

" + item.description + "


"); + } case TitleRole: return item.title; case DescriptionRole: diff --git a/libs/ui/widgets/KisNewsWidget.h b/libs/ui/widgets/KisNewsWidget.h --- a/libs/ui/widgets/KisNewsWidget.h +++ b/libs/ui/widgets/KisNewsWidget.h @@ -20,11 +20,21 @@ #include #include +#include #include class MultiFeedRssModel; +class KisNewsDelegate : public QStyledItemDelegate +{ + Q_OBJECT +public: + KisNewsDelegate(QObject *parent = 0); + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const override; + QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const override; +}; + /** * @brief The KisNewsWidget class shows the latest news from Krita.org */ diff --git a/libs/ui/widgets/KisNewsWidget.cpp b/libs/ui/widgets/KisNewsWidget.cpp --- a/libs/ui/widgets/KisNewsWidget.cpp +++ b/libs/ui/widgets/KisNewsWidget.cpp @@ -19,10 +19,63 @@ #include #include +#include +#include +#include +#include +#include #include "kis_config.h" #include "KisMultiFeedRSSModel.h" + +KisNewsDelegate::KisNewsDelegate(QObject *parent) + : QStyledItemDelegate(parent) +{ + qDebug() << "Delegate created"; +} + +void KisNewsDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + painter->save(); + + QStyleOptionViewItem optionCopy = option; + initStyleOption(&optionCopy, index); + + QStyle *style = optionCopy.widget? optionCopy.widget->style() : QApplication::style(); + + QTextDocument doc; + doc.setHtml(optionCopy.text); + + /// Painting item without text + optionCopy.text = QString(); + style->drawControl(QStyle::CE_ItemViewItem, &optionCopy, painter); + + QAbstractTextDocumentLayout::PaintContext ctx; + + // Highlighting text if item is selected + if (optionCopy.state & QStyle::State_Selected) { + ctx.palette.setColor(QPalette::Text, optionCopy.palette.color(QPalette::Active, QPalette::HighlightedText)); + } + + painter->translate(optionCopy.rect.left(), optionCopy.rect.top()); + QRect clip(0, 0, optionCopy.rect.width(), optionCopy.rect.height()); + doc.setPageSize(clip.size()); + doc.drawContents(painter, clip); + painter->restore(); +} + +QSize KisNewsDelegate::sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + QStyleOptionViewItem optionCopy = option; + initStyleOption(&optionCopy, index); + + QTextDocument doc; + doc.setHtml(optionCopy.text); + doc.setTextWidth(optionCopy.rect.width()); + return QSize(doc.idealWidth(), doc.size().height()); +} + KisNewsWidget::KisNewsWidget(QWidget *parent) : QWidget(parent) { @@ -39,7 +92,9 @@ else { m_rssModel->removeFeed(QLatin1String("https://krita.org/en/feed/")); } + listNews->setModel(m_rssModel); + listNews->setItemDelegate(new KisNewsDelegate(listNews)); connect(listNews, SIGNAL(clicked(const QModelIndex&)), this, SLOT(itemSelected(const QModelIndex&))); }