This commit is contained in:
Martin Rotter 2021-03-04 13:59:51 +01:00
parent 56c4619cfd
commit f28c681827
5 changed files with 86 additions and 6 deletions

View File

@ -13,6 +13,8 @@
#include "services/abstract/recyclebin.h"
#include "services/abstract/serviceroot.h"
#include <QPainter>
#include <QPainterPath>
#include <QSqlError>
#include <QSqlField>
@ -38,6 +40,37 @@ void MessagesModel::setupIcons() {
m_enclosuresIcon = qApp->icons()->fromTheme(QSL("mail-attachment"));
}
QIcon MessagesModel::generateIconForScore(double score) {
QPixmap pix(64, 64);
QPainter paint(&pix);
paint.setRenderHint(QPainter::RenderHint::Antialiasing);
int level = std::min(MSG_SCORE_MAX, std::max(MSG_SCORE_MIN, int(std::floor(score / 10.0))));
QPainterPath path;
path.addRoundedRect(QRectF(2, 2, 60, 60), 5, 5);
QPen pen(Qt::GlobalColor::black, 2);
paint.setPen(pen);
paint.fillPath(path, Qt::GlobalColor::white);
paint.drawPath(path);
path.clear();
paint.setPen(Qt::GlobalColor::transparent);
int bar_height = 6 * level;
// TODO: pokračovat tady, optimalizovat voláni vytváření těch ikon, skrýt text
// a zobrazit jen ikony, barva od červené do zelené
path.addRoundedRect(QRectF(2, 64 - bar_height - 2, 60, bar_height), 5, 5);
paint.fillPath(path, Qt::GlobalColor::green);
return pix;
}
MessagesModelCache* MessagesModel::cache() const {
return m_cache;
}
@ -281,6 +314,19 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
case Qt::ItemDataRole::EditRole:
return m_cache->containsData(idx.row()) ? m_cache->data(idx) : QSqlQueryModel::data(idx, role);
case Qt::ItemDataRole::ToolTipRole: {
if (idx.column() == MSG_DB_SCORE_INDEX) {
QVariant dta = m_cache->containsData(idx.row())
? m_cache->data(idx)
: QSqlQueryModel::data(idx);
return dta.toString();
}
else {
return QVariant();
}
}
case Qt::ItemDataRole::FontRole: {
QModelIndex idx_read = index(idx.row(), MSG_DB_READ_INDEX);
QVariant data_read = data(idx_read, Qt::EditRole);
@ -367,6 +413,11 @@ QVariant MessagesModel::data(const QModelIndex& idx, int role) const {
return dta.toBool() ? m_enclosuresIcon : QVariant();
}
else if (index_column == MSG_DB_SCORE_INDEX) {
QVariant dta = QSqlQueryModel::data(idx);
return generateIconForScore(dta.toDouble());
}
else {
return QVariant();
}

View File

@ -85,6 +85,9 @@ class MessagesModel : public QSqlQueryModel, public MessagesModelSqlLayer {
void setupHeaderData();
void setupIcons();
static QIcon generateIconForScore(double score);
private:
MessagesModelCache* m_cache;
MessageHighlighter m_messageHighlighter;
QString m_customDateFormat;

View File

@ -39,6 +39,9 @@
#define ID_IMPORTANT -3
#define ID_LABELS -4
#define MSG_SCORE_MAX 100
#define MSG_SCORE_MIN 0
#define ARGUMENTS_LIST_SEPARATOR "\n"
#define IS_IN_ARRAY(offset, array) ((offset >= 0) && (offset < array.count()))
#define DEFAULT_SQL_MESSAGES_FILTER "0 > 1"

View File

@ -14,6 +14,10 @@ IconFactory::~IconFactory() {
}
QIcon IconFactory::fromByteArray(QByteArray array) {
if (array.isEmpty()) {
return {};
}
array = QByteArray::fromBase64(array);
QIcon icon;
QBuffer buffer(&array);

View File

@ -76,7 +76,11 @@ bool FeedsImportExportModel::exportToOMPL20(QByteArray& result) {
outline_category.setAttribute(QSL("text"), child_item->title());
outline_category.setAttribute(QSL("description"), child_item->description());
outline_category.setAttribute(QSL("rssguard:icon"), QString(qApp->icons()->toByteArray(child_item->icon())));
if (!child_item->icon().isNull()) {
outline_category.setAttributeNS(APP_URL, QSL("rssguard:icon"), QString(qApp->icons()->toByteArray(child_item->icon())));
}
active_element.appendChild(outline_category);
items_to_process.push(child_item);
elements_to_use.push(outline_category);
@ -93,7 +97,13 @@ bool FeedsImportExportModel::exportToOMPL20(QByteArray& result) {
outline_feed.setAttribute(QSL("description"), child_feed->description());
outline_feed.setAttribute(QSL("encoding"), child_feed->encoding());
outline_feed.setAttribute(QSL("title"), child_feed->title());
outline_feed.setAttribute(QSL("rssguard:icon"), QString(qApp->icons()->toByteArray(child_feed->icon())));
outline_feed.setAttributeNS(APP_URL, QSL("rssguard:xmlUrlType"), QString::number(int(child_feed->sourceType())));
outline_feed.setAttributeNS(APP_URL, QSL("rssguard:postProcess"), child_feed->postProcessScript());
if (!child_feed->icon().isNull()) {
outline_feed.setAttributeNS(APP_URL, QSL("rssguard:icon"), QString(qApp->icons()->toByteArray(child_feed->icon())));
}
switch (child_feed->type()) {
case StandardFeed::Type::Rss0X:
@ -205,7 +215,9 @@ void FeedsImportExportModel::importAsOPML20(const QByteArray& data, bool fetch_m
QString feed_encoding = child_element.attribute(QSL("encoding"), DEFAULT_FEED_ENCODING);
QString feed_type = child_element.attribute(QSL("version"), DEFAULT_FEED_TYPE).toUpper();
QString feed_description = child_element.attribute(QSL("description"));
QIcon feed_icon = qApp->icons()->fromByteArray(child_element.attribute(QSL("rssguard:icon")).toLocal8Bit());
QIcon feed_icon = qApp->icons()->fromByteArray(child_element.attributeNS(APP_URL, QSL("icon")).toLocal8Bit());
QString source_type = child_element.attributeNS(APP_URL, QSL("xmlUrlType"));
QString post_process = child_element.attributeNS(APP_URL, QSL("postProcess"));
auto* new_feed = new StandardFeed(active_model_item);
new_feed->setTitle(feed_title);
@ -213,7 +225,10 @@ void FeedsImportExportModel::importAsOPML20(const QByteArray& data, bool fetch_m
new_feed->setEncoding(feed_encoding);
new_feed->setSource(feed_url);
new_feed->setCreationDate(QDateTime::currentDateTime());
new_feed->setIcon(feed_icon);
if (!feed_icon.isNull()) {
new_feed->setIcon(feed_icon);
}
if (feed_type == QL1S("RSS1")) {
new_feed->setType(StandardFeed::Type::Rdf);
@ -244,7 +259,7 @@ void FeedsImportExportModel::importAsOPML20(const QByteArray& data, bool fetch_m
// Add category and continue.
QString category_title = child_element.attribute(QSL("text"));
QString category_description = child_element.attribute(QSL("description"));
QIcon category_icon = qApp->icons()->fromByteArray(child_element.attribute(QSL("rssguard:icon")).toLocal8Bit());
QIcon category_icon = qApp->icons()->fromByteArray(child_element.attributeNS(APP_URL, QSL("icon")).toLocal8Bit());
if (category_title.isEmpty()) {
qWarningNN << LOGSEC_CORE
@ -259,7 +274,11 @@ void FeedsImportExportModel::importAsOPML20(const QByteArray& data, bool fetch_m
auto* new_category = new StandardCategory(active_model_item);
new_category->setTitle(category_title);
new_category->setIcon(category_icon);
if (!category_icon.isNull()) {
new_category->setIcon(category_icon);
}
new_category->setCreationDate(QDateTime::currentDateTime());
new_category->setDescription(category_description);
active_model_item->appendChild(new_category);