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() {