From 80b85ee3bebf1355894d62fa64622e3d7cf7955c Mon Sep 17 00:00:00 2001 From: Leonardo Robol Date: Tue, 25 Oct 2011 12:06:15 +0200 Subject: [PATCH] Now the count of unread posts is back with a brand new QStyledItemDelegate and custom painting. --- Larss.pro | 6 ++++-- include/feedmodel.h | 5 +++++ include/unreadcountitemdelegate.h | 32 ++++++++++++++++++++++++++++++++ larss/feedmodel.cpp | 7 +++++++ larss/mainwindow.cpp | 3 +++ larss/rssparser.cpp | 2 +- larss/unreadcountitemdelegate.cpp | 39 +++++++++++++++++++++++++++++++++++++++ 7 files changed, 91 insertions(+), 3 deletions(-) create mode 100644 include/unreadcountitemdelegate.h create mode 100644 larss/unreadcountitemdelegate.cpp diff --git a/Larss.pro b/Larss.pro index 437cd54..e19a7e7 100644 --- a/Larss.pro +++ b/Larss.pro @@ -17,7 +17,8 @@ SOURCES += larss/main.cpp\ larss/feedpoller.cpp \ larss/editfeeddialog.cpp \ larss/editcategorydialog.cpp \ - larss/feednode.cpp + larss/feednode.cpp \ + larss/unreadcountitemdelegate.cpp HEADERS += include/mainwindow.h \ include/feedmodel.h \ @@ -25,7 +26,8 @@ HEADERS += include/mainwindow.h \ include/feedpoller.h \ include/editfeeddialog.h \ include/editcategorydialog.h \ - include/feednode.h + include/feednode.h \ + include/unreadcountitemdelegate.h FORMS += ui/mainwindow.ui \ ui/editfeeddialog.ui \ diff --git a/include/feedmodel.h b/include/feedmodel.h index a7a2859..039970b 100644 --- a/include/feedmodel.h +++ b/include/feedmodel.h @@ -52,6 +52,11 @@ public: */ void select(); + /** + * @brief Call dataChanged + */ + void triggerDataChanged(); + FeedNode * itemFromIndex (const QModelIndex& index); signals: diff --git a/include/unreadcountitemdelegate.h b/include/unreadcountitemdelegate.h new file mode 100644 index 0000000..3f90d90 --- /dev/null +++ b/include/unreadcountitemdelegate.h @@ -0,0 +1,32 @@ +#ifndef UNREADCOUNTITEMDELEGATE_H +#define UNREADCOUNTITEMDELEGATE_H + +#include +#include +#include "feedmodel.h" +#include "rssparser.h" + +namespace Larss { + + class UnReadCountItemDelegate : public QStyledItemDelegate + { + Q_OBJECT + public: + explicit UnReadCountItemDelegate(FeedModel *feedModel, RssParser *rssParser, QObject *parent = 0); + + protected: + void paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const; + // QSize sizeHint(const QStyleOptionViewItem &option, const QModelIndex &index) const; + + signals: + + public slots: + + private: + FeedModel *feedModel; + RssParser *rssParser; + + }; +} + +#endif // UNREADCOUNTITEMDELEGATE_H diff --git a/larss/feedmodel.cpp b/larss/feedmodel.cpp index 944d2b8..e79b57b 100644 --- a/larss/feedmodel.cpp +++ b/larss/feedmodel.cpp @@ -177,3 +177,10 @@ FeedModel::itemFromIndex(const QModelIndex &index) return rootNode; } +void +FeedModel::triggerDataChanged() +{ + dataChanged(index(1, 1, QModelIndex()), + index(1, 1, QModelIndex())); +} + diff --git a/larss/mainwindow.cpp b/larss/mainwindow.cpp index 671c9d6..a052b92 100644 --- a/larss/mainwindow.cpp +++ b/larss/mainwindow.cpp @@ -2,6 +2,7 @@ #include "ui_mainwindow.h" #include "editfeeddialog.h" #include "editcategorydialog.h" +#include "unreadcountitemdelegate.h" #include #include @@ -26,7 +27,9 @@ MainWindow::MainWindow(QWidget *parent) : feedModel = new FeedModel(db, this); rssParser = new RssParser(db, feedModel, this); + // Create the delegate that counts unread posts. ui->feedTreeView->setModel(feedModel); + ui->feedTreeView->setItemDelegate (new UnReadCountItemDelegate(feedModel, rssParser)); // Load the RSSParser, hiding the unnecessary columns ui->newsTableView->setModel(rssParser); diff --git a/larss/rssparser.cpp b/larss/rssparser.cpp index e6ede52..28313b1 100644 --- a/larss/rssparser.cpp +++ b/larss/rssparser.cpp @@ -116,7 +116,7 @@ Larss::RssParser::setReadStatus(const QModelIndex& index, bool read) setData(read_index, read ? 1 : 0); if (!submitAll()) qDebug() << "Error while setting the read flag"; - dataChanged (index, index); + model->triggerDataChanged(); } quint64 diff --git a/larss/unreadcountitemdelegate.cpp b/larss/unreadcountitemdelegate.cpp new file mode 100644 index 0000000..c01e8d7 --- /dev/null +++ b/larss/unreadcountitemdelegate.cpp @@ -0,0 +1,39 @@ +#include "unreadcountitemdelegate.h" +#include "feednode.h" +#include +#include + +using namespace Larss; + +UnReadCountItemDelegate::UnReadCountItemDelegate(FeedModel *feedModel, RssParser *rssParser, QObject *parent) : + QStyledItemDelegate(parent), feedModel(feedModel), rssParser(rssParser) +{ +} + +void +UnReadCountItemDelegate::paint(QPainter *painter, const QStyleOptionViewItem &option, const QModelIndex &index) const +{ + if (index.isValid()) + { + FeedNode *node = feedModel->itemFromIndex(index); + if (node->type() == FeedNode::Feed) + { + quint32 unreadPosts = rssParser->getUnreadCount(index); + if (unreadPosts > 0) + { + // Draw highlight if necessary + if (option.state & QStyle::State_Selected) + painter->fillRect(option.rect, option.palette.highlight()); + + // Set bold font + QFont font = option.font; + font.setBold(true); + painter->setFont(font); + painter->drawText(option.rect, Qt::AlignLeft, QString ("%1 (%2)").arg(index.data(Qt::DisplayRole).toString()).arg(unreadPosts)); + + return; + } + } + } + QStyledItemDelegate::paint(painter, option, index); +} -- 2.1.4