From e9e97786bb26f98a711ba22b3058819bbd641c3c Mon Sep 17 00:00:00 2001 From: Martin Rotter Date: Fri, 15 Dec 2023 09:02:26 +0100 Subject: [PATCH] fix #695 --- resources/scripts/web_ui/rssguard.html | 192 ++++++++++++++++-- src/librssguard/miscellaneous/iconfactory.cpp | 4 + .../standard/gui/formeditstandardaccount.cpp | 3 + .../standard/gui/standardaccountdetails.cpp | 57 ++++++ .../standard/gui/standardaccountdetails.h | 4 + .../standard/gui/standardaccountdetails.ui | 23 +++ .../services/standard/standardserviceroot.cpp | 7 + 7 files changed, 274 insertions(+), 16 deletions(-) diff --git a/resources/scripts/web_ui/rssguard.html b/resources/scripts/web_ui/rssguard.html index fe996685f..db61e21ed 100644 --- a/resources/scripts/web_ui/rssguard.html +++ b/resources/scripts/web_ui/rssguard.html @@ -1,6 +1,25 @@ - + @@ -114,23 +150,103 @@ -
+
+
+ +
+
+ +
+
-
diff --git a/src/librssguard/miscellaneous/iconfactory.cpp b/src/librssguard/miscellaneous/iconfactory.cpp index 6d500b779..fbddb5eda 100644 --- a/src/librssguard/miscellaneous/iconfactory.cpp +++ b/src/librssguard/miscellaneous/iconfactory.cpp @@ -47,6 +47,10 @@ QIcon IconFactory::fromByteArray(QByteArray array) { } QByteArray IconFactory::toByteArray(const QIcon& icon) { + if (icon.isNull()) { + return {}; + } + QByteArray array; QBuffer buffer(&array); diff --git a/src/librssguard/services/standard/gui/formeditstandardaccount.cpp b/src/librssguard/services/standard/gui/formeditstandardaccount.cpp index 9c502ade0..9d22fba1e 100644 --- a/src/librssguard/services/standard/gui/formeditstandardaccount.cpp +++ b/src/librssguard/services/standard/gui/formeditstandardaccount.cpp @@ -23,11 +23,14 @@ void FormEditStandardAccount::loadAccountData() { else { m_standardDetails->m_ui.m_txtTitle->setText(m_account->title()); } + + m_standardDetails->m_ui.m_btnIcon->setIcon(m_account->fullIcon()); } void FormEditStandardAccount::apply() { FormAccountDetails::apply(); + m_account->setIcon(m_standardDetails->m_ui.m_btnIcon->icon()); m_account->setTitle(m_standardDetails->m_ui.m_txtTitle->text()); m_account->saveAccountDataToDatabase(); diff --git a/src/librssguard/services/standard/gui/standardaccountdetails.cpp b/src/librssguard/services/standard/gui/standardaccountdetails.cpp index 01b84765c..50a871bed 100644 --- a/src/librssguard/services/standard/gui/standardaccountdetails.cpp +++ b/src/librssguard/services/standard/gui/standardaccountdetails.cpp @@ -2,6 +2,63 @@ #include "services/standard/gui/standardaccountdetails.h" +#include "3rd-party/boolinq/boolinq.h" +#include "miscellaneous/iconfactory.h" +#include "services/standard/standardserviceentrypoint.h" + +#include +#include + StandardAccountDetails::StandardAccountDetails(QWidget* parent) : QWidget(parent) { m_ui.setupUi(this); + + QMenu* icon_menu = new QMenu(tr("Icon selection"), this); + auto* action_load_icon_from_file = + new QAction(qApp->icons()->fromTheme(QSL("image-x-generic")), tr("Load icon from file..."), this); + auto* action_default_icon = + new QAction(qApp->icons()->fromTheme(QSL("application-rss+xml")), tr("Use default icon from icon theme"), this); + + connect(action_load_icon_from_file, &QAction::triggered, this, &StandardAccountDetails::onLoadIconFromFile); + connect(action_default_icon, &QAction::triggered, this, &StandardAccountDetails::onUseDefaultIcon); + + icon_menu->addAction(action_load_icon_from_file); + icon_menu->addAction(action_default_icon); + + m_ui.m_btnIcon->setMenu(icon_menu); +} + +void StandardAccountDetails::onLoadIconFromFile() { + auto supported_formats = QImageReader::supportedImageFormats(); + auto prefixed_formats = boolinq::from(supported_formats) + .select([](const QByteArray& frmt) { + return QSL("*.%1").arg(QString::fromLocal8Bit(frmt)); + }) + .toStdList(); + + QStringList list_formats = FROM_STD_LIST(QStringList, prefixed_formats); + + QFileDialog dialog(this, + tr("Select icon file for the account"), + qApp->homeFolder(), + tr("Images (%1)").arg(list_formats.join(QL1C(' ')))); + + dialog.setFileMode(QFileDialog::FileMode::ExistingFile); + dialog.setWindowIcon(qApp->icons()->fromTheme(QSL("image-x-generic"))); + dialog.setOptions(QFileDialog::Option::DontUseNativeDialog | QFileDialog::Option::ReadOnly); + dialog.setViewMode(QFileDialog::ViewMode::Detail); + dialog.setLabelText(QFileDialog::DialogLabel::Accept, tr("Select icon")); + dialog.setLabelText(QFileDialog::DialogLabel::Reject, tr("Cancel")); + + //: Label for field with icon file name textbox for selection dialog. + dialog.setLabelText(QFileDialog::DialogLabel::LookIn, tr("Look in:")); + dialog.setLabelText(QFileDialog::DialogLabel::FileName, tr("Icon name:")); + dialog.setLabelText(QFileDialog::DialogLabel::FileType, tr("Icon type:")); + + if (dialog.exec() == QDialog::DialogCode::Accepted) { + m_ui.m_btnIcon->setIcon(QIcon(dialog.selectedFiles().value(0))); + } +} + +void StandardAccountDetails::onUseDefaultIcon() { + m_ui.m_btnIcon->setIcon(StandardServiceEntryPoint().icon()); } diff --git a/src/librssguard/services/standard/gui/standardaccountdetails.h b/src/librssguard/services/standard/gui/standardaccountdetails.h index 0d6f790f4..c1e977df8 100644 --- a/src/librssguard/services/standard/gui/standardaccountdetails.h +++ b/src/librssguard/services/standard/gui/standardaccountdetails.h @@ -19,6 +19,10 @@ class StandardAccountDetails : public QWidget { public: explicit StandardAccountDetails(QWidget* parent = nullptr); + private slots: + void onLoadIconFromFile(); + void onUseDefaultIcon(); + private: Ui::StandardAccountDetails m_ui; }; diff --git a/src/librssguard/services/standard/gui/standardaccountdetails.ui b/src/librssguard/services/standard/gui/standardaccountdetails.ui index 69e25f80a..5141517b5 100644 --- a/src/librssguard/services/standard/gui/standardaccountdetails.ui +++ b/src/librssguard/services/standard/gui/standardaccountdetails.ui @@ -24,6 +24,29 @@ + + + + Icon + + + + + + + + 40 + 40 + + + + Select icon for your account. + + + QToolButton::InstantPopup + + + diff --git a/src/librssguard/services/standard/standardserviceroot.cpp b/src/librssguard/services/standard/standardserviceroot.cpp index ff214a161..a8d67efa5 100644 --- a/src/librssguard/services/standard/standardserviceroot.cpp +++ b/src/librssguard/services/standard/standardserviceroot.cpp @@ -355,6 +355,7 @@ QVariantHash StandardServiceRoot::customDatabaseData() const { QVariantHash data = ServiceRoot::customDatabaseData(); data[QSL("title")] = title(); + data[QSL("icon")] = IconFactory::toByteArray(icon()); return data; } @@ -363,6 +364,12 @@ void StandardServiceRoot::setCustomDatabaseData(const QVariantHash& data) { ServiceRoot::setCustomDatabaseData(data); setTitle(data.value(QSL("title"), defaultTitle()).toString()); + + QByteArray icon_data = data.value(QSL("icon")).toByteArray(); + + if (!icon_data.isEmpty()) { + setIcon(IconFactory::fromByteArray(icon_data)); + } } QString StandardServiceRoot::defaultTitle() {