From 26e4431d3bdd990e96367fad83a1a528784ef192 Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Wed, 7 Oct 2020 16:10:57 +0200 Subject: [PATCH] Work on labels. --- src/librssguard/gui/colortoolbutton.cpp | 10 ++- src/librssguard/gui/colortoolbutton.h | 3 + .../gui/dialogs/formaddeditlabel.cpp | 36 +++++++-- .../gui/dialogs/formaddeditlabel.h | 3 +- .../gui/dialogs/formaddeditlabel.ui | 77 +++++++++---------- .../miscellaneous/databasequeries.cpp | 19 +++++ .../miscellaneous/databasequeries.h | 4 + src/librssguard/services/abstract/label.cpp | 35 ++++++++- src/librssguard/services/abstract/label.h | 9 ++- .../services/abstract/labelsnode.cpp | 11 ++- .../services/abstract/serviceroot.cpp | 12 +++ .../services/standard/standardserviceroot.cpp | 3 + 12 files changed, 165 insertions(+), 57 deletions(-) diff --git a/src/librssguard/gui/colortoolbutton.cpp b/src/librssguard/gui/colortoolbutton.cpp index 88f851ecd..f687dc0d5 100644 --- a/src/librssguard/gui/colortoolbutton.cpp +++ b/src/librssguard/gui/colortoolbutton.cpp @@ -5,6 +5,7 @@ #include #include #include +#include ColorToolButton::ColorToolButton(QWidget* parent) : QToolButton(parent), m_color(Qt::GlobalColor::black) { connect(this, &ColorToolButton::clicked, this, [this]() { @@ -29,6 +30,14 @@ void ColorToolButton::setColor(const QColor& color) { repaint(); } +void ColorToolButton::setRandomColor() { + auto rnd_color = QRandomGenerator::global()->bounded(0xFFFFFF); + auto rnd_color_name = QString("#%1").arg(QString::number(rnd_color, 16)); + + setColor(rnd_color_name); + emit colorChanged(rnd_color_name); +} + void ColorToolButton::paintEvent(QPaintEvent* e) { Q_UNUSED(e) QPainter p(this); @@ -46,6 +55,5 @@ void ColorToolButton::paintEvent(QPaintEvent* e) { QPainterPath path; path.addRoundedRect(QRectF(rect), 3, 3); - p.fillPath(path, m_color); } diff --git a/src/librssguard/gui/colortoolbutton.h b/src/librssguard/gui/colortoolbutton.h index 7341f8e62..8525972b7 100644 --- a/src/librssguard/gui/colortoolbutton.h +++ b/src/librssguard/gui/colortoolbutton.h @@ -14,6 +14,9 @@ class ColorToolButton : public QToolButton { QColor color() const; void setColor(const QColor& color); + public slots: + void setRandomColor(); + signals: void colorChanged(const QColor& new_color); diff --git a/src/librssguard/gui/dialogs/formaddeditlabel.cpp b/src/librssguard/gui/dialogs/formaddeditlabel.cpp index bd48593c1..308754209 100644 --- a/src/librssguard/gui/dialogs/formaddeditlabel.cpp +++ b/src/librssguard/gui/dialogs/formaddeditlabel.cpp @@ -2,18 +2,40 @@ #include "gui/dialogs/formaddeditlabel.h" +#include "gui/guiutilities.h" +#include "miscellaneous/application.h" +#include "miscellaneous/iconfactory.h" #include "services/abstract/label.h" -FormAddEditLabel::FormAddEditLabel(QWidget* parent) : QDialog(parent), ui(new Ui::FormAddEditLabel) { - ui->setupUi(this); -} +FormAddEditLabel::FormAddEditLabel(QWidget* parent) : QDialog(parent) { + m_ui.setupUi(this); + m_ui.m_txtName->lineEdit()->setPlaceholderText(tr("Name for your label")); -FormAddEditLabel::~FormAddEditLabel() { - delete ui; + connect(m_ui.m_txtName->lineEdit(), &QLineEdit::textChanged, this, [this](const QString& text) { + m_ui.m_buttonBox->button(QDialogButtonBox::StandardButton::Ok)->setEnabled(!text.isEmpty()); + + if (text.isEmpty()) { + m_ui.m_txtName->setStatus(LineEditWithStatus::StatusType::Error, tr("Label's name cannot be empty.")); + } + else { + m_ui.m_txtName->setStatus(LineEditWithStatus::StatusType::Ok, tr("Perfect!")); + } + }); + + m_ui.m_txtName->lineEdit()->setText(tr("Hot stuff")); } Label* FormAddEditLabel::execForAdd() { - auto exit_code = exec(); + GuiUtilities::applyDialogProperties(*this, qApp->icons()->fromTheme(QSL("tag-properties")), tr("Create new label")); + m_ui.m_btnColor->setRandomColor(); - return nullptr; + auto exit_code = exec(); + auto xxx = m_ui.m_btnColor->color().name(); + + if (exit_code == QDialog::DialogCode::Accepted) { + return new Label(m_ui.m_txtName->lineEdit()->text(), m_ui.m_btnColor->color()); + } + else { + return nullptr; + } } diff --git a/src/librssguard/gui/dialogs/formaddeditlabel.h b/src/librssguard/gui/dialogs/formaddeditlabel.h index eabe4f034..d4f86fea8 100644 --- a/src/librssguard/gui/dialogs/formaddeditlabel.h +++ b/src/librssguard/gui/dialogs/formaddeditlabel.h @@ -18,13 +18,12 @@ class FormAddEditLabel : public QDialog { public: explicit FormAddEditLabel(QWidget* parent = nullptr); - ~FormAddEditLabel(); public slots: Label* execForAdd(); private: - Ui::FormAddEditLabel* ui; + Ui::FormAddEditLabel m_ui; }; #endif // FORMADDEDITLABEL_H diff --git a/src/librssguard/gui/dialogs/formaddeditlabel.ui b/src/librssguard/gui/dialogs/formaddeditlabel.ui index 1300f3a14..5ab5a9218 100644 --- a/src/librssguard/gui/dialogs/formaddeditlabel.ui +++ b/src/librssguard/gui/dialogs/formaddeditlabel.ui @@ -6,35 +6,29 @@ 0 0 - 400 - 300 + 224 + 97 Dialog - - - - - Name - - + + + + + + + ... + + + + + + + - - - - - - - Qt::Horizontal - - - QDialogButtonBox::Cancel|QDialogButtonBox::Ok - - - - + Qt::Vertical @@ -47,17 +41,13 @@ - - - - Color + + + + Qt::Horizontal - - - - - - ... + + QDialogButtonBox::Cancel|QDialogButtonBox::Ok @@ -76,37 +66,40 @@
colortoolbutton.h
+ + m_btnColor + - buttonBox + m_buttonBox accepted() FormAddEditLabel accept() - 248 - 254 + 214 + 132 157 - 274 + 141 - buttonBox + m_buttonBox rejected() FormAddEditLabel reject() - 316 - 260 + 214 + 132 - 286 - 274 + 223 + 141 diff --git a/src/librssguard/miscellaneous/databasequeries.cpp b/src/librssguard/miscellaneous/databasequeries.cpp index 1191f3a5a..4f29b5b9a 100755 --- a/src/librssguard/miscellaneous/databasequeries.cpp +++ b/src/librssguard/miscellaneous/databasequeries.cpp @@ -31,6 +31,25 @@ #include #include +bool DatabaseQueries::createLabel(const QSqlDatabase& db, Label* label, int account_id) { + QSqlQuery q(db); + + q.setForwardOnly(true); + q.prepare("INSERT INTO Labels (name, color, custom_id, account_id) " + "VALUES (:name, :color, :custom_id, :account_id);"); + q.bindValue(QSL(":name"), label->title()); + q.bindValue(QSL(":color"), label->color().name()); + q.bindValue(QSL(":custom_id"), label->customId()); + q.bindValue(QSL(":account_id"), account_id); + auto res = q.exec(); + + if (res && q.lastInsertId().isValid()) { + label->setId(q.lastInsertId().toInt()); + } + + return res; +} + bool DatabaseQueries::markImportantMessagesReadUnread(const QSqlDatabase& db, int account_id, RootItem::ReadStatus read) { QSqlQuery q(db); diff --git a/src/librssguard/miscellaneous/databasequeries.h b/src/librssguard/miscellaneous/databasequeries.h index c9b4d7d82..ffe4196ef 100644 --- a/src/librssguard/miscellaneous/databasequeries.h +++ b/src/librssguard/miscellaneous/databasequeries.h @@ -7,6 +7,7 @@ #include "core/messagefilter.h" #include "services/abstract/category.h" +#include "services/abstract/label.h" #include "services/abstract/serviceroot.h" #include "services/standard/standardfeed.h" @@ -17,6 +18,9 @@ class DatabaseQueries { public: + // Label operators. + static bool createLabel(const QSqlDatabase& db, Label* label, int account_id); + // Message operators. static bool markImportantMessagesReadUnread(const QSqlDatabase& db, int account_id, RootItem::ReadStatus read); static bool markMessagesReadUnread(const QSqlDatabase& db, const QStringList& ids, RootItem::ReadStatus read); diff --git a/src/librssguard/services/abstract/label.cpp b/src/librssguard/services/abstract/label.cpp index d101b9761..adb2a6e98 100755 --- a/src/librssguard/services/abstract/label.cpp +++ b/src/librssguard/services/abstract/label.cpp @@ -2,6 +2,37 @@ #include "services/abstract/label.h" -Label::Label(RootItem* parent_item) : RootItem(parent_item), m_name(QString()), m_backColor(QColor()) { - setKind(RootItem::Kind::Labels); +#include +#include + +Label::Label(const QString& name, const QColor& color, RootItem* parent_item) : RootItem(parent_item) { + setColor(color); + setTitle(name); +} + +Label::Label(RootItem* parent_item) : RootItem(parent_item) { + setKind(RootItem::Kind::Label); +} + +QColor Label::color() const { + return m_color; +} + +void Label::setColor(const QColor& color) { + setIcon(generateIcon(color)); + m_color = color; +} + +QIcon Label::generateIcon(const QColor& color) { + QPixmap pxm(64, 64); + + pxm.fill(Qt::GlobalColor::transparent); + + QPainter paint(&pxm); + QPainterPath path; + + path.addRoundedRect(QRectF(pxm.rect()), 10, 10); + paint.fillPath(path, color); + + return pxm; } diff --git a/src/librssguard/services/abstract/label.h b/src/librssguard/services/abstract/label.h index 2bfd8faef..2daa15dbe 100755 --- a/src/librssguard/services/abstract/label.h +++ b/src/librssguard/services/abstract/label.h @@ -11,11 +11,16 @@ class Label : public RootItem { Q_OBJECT public: + explicit Label(const QString& name, const QColor& color, RootItem* parent_item = nullptr); explicit Label(RootItem* parent_item = nullptr); + QColor color() const; + void setColor(const QColor& color); + + static QIcon generateIcon(const QColor& color); + private: - QString m_name; - QColor m_backColor; + QColor m_color; }; #endif // LABEL_H diff --git a/src/librssguard/services/abstract/labelsnode.cpp b/src/librssguard/services/abstract/labelsnode.cpp index 46c1459bf..1082c5536 100755 --- a/src/librssguard/services/abstract/labelsnode.cpp +++ b/src/librssguard/services/abstract/labelsnode.cpp @@ -4,6 +4,8 @@ #include "gui/dialogs/formaddeditlabel.h" #include "miscellaneous/application.h" +#include "miscellaneous/databasefactory.h" +#include "miscellaneous/databasequeries.h" #include "miscellaneous/iconfactory.h" #include "services/abstract/serviceroot.h" @@ -31,6 +33,13 @@ QList LabelsNode::contextMenuFeedsList() { void LabelsNode::createLabel() { FormAddEditLabel frm(qApp->mainFormWidget()); + Label* new_lbl = frm.execForAdd(); - frm.execForAdd(); + if (new_lbl != nullptr) { + QSqlDatabase db = qApp->database()->connection(metaObject()->className()); + + DatabaseQueries::createLabel(db, new_lbl, getParentServiceRoot()->accountId()); + + getParentServiceRoot()->requestItemReassignment(new_lbl, this); + } } diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp index 6fbdb8c4f..4ba6701d7 100644 --- a/src/librssguard/services/abstract/serviceroot.cpp +++ b/src/librssguard/services/abstract/serviceroot.cpp @@ -502,6 +502,18 @@ bool ServiceRoot::loadMessagesForItem(RootItem* item, MessagesModel* model) { model->setFilter(QString("Messages.is_important = 1 AND Messages.is_deleted = 0 AND Messages.is_pdeleted = 0 AND Messages.account_id = %1") .arg(QString::number(accountId()))); } + else if (item->kind() == RootItem::Kind::Label) { + // Show messages with particular label. + model->setFilter(QString("Messages.is_deleted = 0 AND Messages.is_pdeleted = 0 AND Messages.account_id = %1 AND " + "(SELECT COUNT(*) FROM LabelsInMessages WHERE account_id = %1 AND message = Messages.custom_id AND label = %2) > 0") + .arg(QString::number(accountId()), QString::number(item->id()))); + } + else if (item->kind() == RootItem::Kind::Labels) { + // Show messages with any label. + model->setFilter(QString("Messages.is_deleted = 0 AND Messages.is_pdeleted = 0 AND Messages.account_id = %1 AND " + "(SELECT COUNT(*) FROM LabelsInMessages WHERE account_id = %1 AND message = Messages.custom_id) > 0") + .arg(QString::number(accountId()))); + } else { QList children = item->getSubTreeFeeds(); QString filter_clause = textualFeedIds(children).join(QSL(", ")); diff --git a/src/librssguard/services/standard/standardserviceroot.cpp b/src/librssguard/services/standard/standardserviceroot.cpp index 47c6d5f46..3a24d9b13 100644 --- a/src/librssguard/services/standard/standardserviceroot.cpp +++ b/src/librssguard/services/standard/standardserviceroot.cpp @@ -143,6 +143,9 @@ void StandardServiceRoot::loadFromDatabase() { appendChild(recycleBin()); appendChild(importantNode()); appendChild(new LabelsNode(this)); + + // TODO: Load all labels and append. + updateCounts(true); }