diff --git a/localization/rssguard_cs.ts b/localization/rssguard_cs.ts
index ab38a46b2..885f35c30 100644
--- a/localization/rssguard_cs.ts
+++ b/localization/rssguard_cs.ts
@@ -3077,39 +3077,39 @@ Tokeny vyprší: %2
MessageBrowser
You clicked some link. You can download the link contents or open it in external web browser.
-
+ Klikli jste na odkaz. Můžete stáhnout obsah odkazu nebo ho otevřít v externím webovém prohlížeči.
What action do you want to take?
-
+ Co chcete dělat?
Open in external browser
-
+ Otevřít v externím webovém prohlížeči
Download
-
+ Stáhnout
Always open links in external browser.
-
+ Vždy otevírat odkazy v ext. prohlížeči.
Incorrect link
-
+ Špatný odkaz
Selected hyperlink is invalid.
-
+ Vybraný odkaz je neplatný
Click this link to download it or open it with external browser.
-
+ Klikněte na tento odkaz pro stáhnutí jeho obsahu nebo pro jeho otevření v externím webovém prohlížeči.
image
-
+ obrázek
diff --git a/localization/rssguard_pt.ts b/localization/rssguard_pt.ts
index 26aeea7b3..1e449a0b6 100644
--- a/localization/rssguard_pt.ts
+++ b/localization/rssguard_pt.ts
@@ -198,11 +198,11 @@
ColorToolButton
Click me to change color!
-
+ Clique aqui para mudar a cor!
Select new color
-
+ Selecione a nova cor
@@ -310,7 +310,7 @@ Este site contêm %n feed(s).
Feeds were detected, but no suitable accounts are configured.
-
+ Feeds foram detectados, mas nenhuma conta adequada foi configurada.
@@ -671,7 +671,7 @@ ou esta função ainda não foi implementada.
Context menu for label
-
+ Menu de contexto para etiqueta
@@ -819,27 +819,27 @@ ou esta função ainda não foi implementada.
Name for your label
-
+ Nome para a sua etiqueta
Label's name cannot be empty.
-
+ O nome da etiqueta não pode estar vazio.
Perfect!
-
+ Perfeito!
Hot stuff
-
+ Conteúdo em alta
Create new label
-
+ Criar nova etiqueta
Edit label '%1'
-
+ Editar etiqueta '%1'
@@ -3068,7 +3068,7 @@ Expiração dos tokens de login: %2
New label
-
+ Nova etiqueta
diff --git a/localization/rssguard_sv.ts b/localization/rssguard_sv.ts
index d86407663..dc161c606 100644
--- a/localization/rssguard_sv.ts
+++ b/localization/rssguard_sv.ts
@@ -198,11 +198,11 @@
ColorToolButton
Click me to change color!
-
+ Klicka för att ändra färg
Select new color
-
+ Välj ny färg
@@ -310,7 +310,7 @@ Denna webbsida innehåller %n flöden.
Feeds were detected, but no suitable accounts are configured.
-
+ Flöden har identifierats, men inget passande konto är konfigurerat.
@@ -671,7 +671,7 @@ att funktionen inte är implementerad än.
Context menu for label
-
+ Kontextmeny för etikett
@@ -819,27 +819,27 @@ att funktionen inte är implementerad än.
Name for your label
-
+ Etikettnamn
Label's name cannot be empty.
-
+ Etikettnamnet kan inte lämnas tomt.
Perfect!
-
+ Perfekt!
Hot stuff
-
+ Hett material
Create new label
-
+ Skapa ny etikett
Edit label '%1'
-
+ Redigera etiketten "%1"
@@ -3067,7 +3067,7 @@ Inloggningstoken upphör: %2
New label
-
+ Ny etikett
diff --git a/src/librssguard/services/abstract/label.cpp b/src/librssguard/services/abstract/label.cpp
index 24dc591e6..cbd9259cb 100755
--- a/src/librssguard/services/abstract/label.cpp
+++ b/src/librssguard/services/abstract/label.cpp
@@ -41,7 +41,8 @@ int Label::countOfAllMessages() const {
}
bool Label::canBeEdited() const {
- return true;
+ return (getParentServiceRoot()->supportedLabelOperations() & ServiceRoot::LabelOperation::Editing) ==
+ ServiceRoot::LabelOperation::Editing;
}
bool Label::editViaGui() {
@@ -58,7 +59,8 @@ bool Label::editViaGui() {
}
bool Label::canBeDeleted() const {
- return true;
+ return (getParentServiceRoot()->supportedLabelOperations() & ServiceRoot::LabelOperation::Deleting) ==
+ ServiceRoot::LabelOperation::Deleting;
}
bool Label::deleteViaGui() {
diff --git a/src/librssguard/services/abstract/labelsnode.cpp b/src/librssguard/services/abstract/labelsnode.cpp
index 057704d87..52583bbc0 100755
--- a/src/librssguard/services/abstract/labelsnode.cpp
+++ b/src/librssguard/services/abstract/labelsnode.cpp
@@ -54,14 +54,23 @@ QList LabelsNode::contextMenuFeedsList() {
}
void LabelsNode::createLabel() {
- FormAddEditLabel frm(qApp->mainFormWidget());
- Label* new_lbl = frm.execForAdd();
+ if ((getParentServiceRoot()->supportedLabelOperations() & ServiceRoot::LabelOperation::Adding) == ServiceRoot::LabelOperation::Adding) {
+ FormAddEditLabel frm(qApp->mainFormWidget());
+ Label* new_lbl = frm.execForAdd();
- if (new_lbl != nullptr) {
- QSqlDatabase db = qApp->database()->connection(metaObject()->className());
+ if (new_lbl != nullptr) {
+ QSqlDatabase db = qApp->database()->connection(metaObject()->className());
- DatabaseQueries::createLabel(db, new_lbl, getParentServiceRoot()->accountId());
+ DatabaseQueries::createLabel(db, new_lbl, getParentServiceRoot()->accountId());
- getParentServiceRoot()->requestItemReassignment(new_lbl, this);
+ getParentServiceRoot()->requestItemReassignment(new_lbl, this);
+ }
+ }
+ else {
+ qApp->showGuiMessage(tr("This account does not allow you to create labels."),
+ tr("Not allowed"),
+ QSystemTrayIcon::MessageIcon::Critical,
+ qApp->mainFormWidget(),
+ true);
}
}
diff --git a/src/librssguard/services/abstract/serviceroot.cpp b/src/librssguard/services/abstract/serviceroot.cpp
index cb66bd4c3..ea2773a23 100644
--- a/src/librssguard/services/abstract/serviceroot.cpp
+++ b/src/librssguard/services/abstract/serviceroot.cpp
@@ -223,6 +223,10 @@ bool ServiceRoot::supportsCategoryAdding() const {
return false;
}
+ServiceRoot::LabelOperation ServiceRoot::supportedLabelOperations() const {
+ return LabelOperation::Adding | LabelOperation::Editing | LabelOperation::Deleting;
+}
+
void ServiceRoot::itemChanged(const QList& items) {
emit dataChanged(items);
}
@@ -703,3 +707,11 @@ void ServiceRoot::assembleCategories(Assignment categories) {
}
}
}
+
+ServiceRoot::LabelOperation operator|(ServiceRoot::LabelOperation lhs, ServiceRoot::LabelOperation rhs) {
+ return static_cast(static_cast(lhs) | static_cast(rhs));
+}
+
+ServiceRoot::LabelOperation operator&(ServiceRoot::LabelOperation lhs, ServiceRoot::LabelOperation rhs) {
+ return static_cast(static_cast(lhs) & static_cast(rhs));
+}
diff --git a/src/librssguard/services/abstract/serviceroot.h b/src/librssguard/services/abstract/serviceroot.h
index 00effd7fa..d6ffc1753 100644
--- a/src/librssguard/services/abstract/serviceroot.h
+++ b/src/librssguard/services/abstract/serviceroot.h
@@ -28,6 +28,13 @@ typedef QPair ImportanceChange;
class ServiceRoot : public RootItem {
Q_OBJECT
+ public:
+ enum class LabelOperation {
+ Adding = 1,
+ Editing = 2,
+ Deleting = 4
+ };
+
public:
explicit ServiceRoot(RootItem* parent = nullptr);
virtual ~ServiceRoot();
@@ -43,6 +50,7 @@ class ServiceRoot : public RootItem {
virtual QList undeletedMessages() const;
virtual bool supportsFeedAdding() const;
virtual bool supportsCategoryAdding() const;
+ virtual LabelOperation supportedLabelOperations() const;
// Returns list of specific actions for "Add new item" main window menu.
// So typical list of returned actions could look like:
@@ -238,4 +246,7 @@ class ServiceRoot : public RootItem {
QList m_serviceMenu;
};
+ServiceRoot::LabelOperation operator|(ServiceRoot::LabelOperation lhs, ServiceRoot::LabelOperation rhs);
+ServiceRoot::LabelOperation operator&(ServiceRoot::LabelOperation lhs, ServiceRoot::LabelOperation rhs);
+
#endif // SERVICEROOT_H
diff --git a/src/librssguard/services/gmail/gmailserviceroot.h b/src/librssguard/services/gmail/gmailserviceroot.h
index 0227b1887..59f92c70c 100644
--- a/src/librssguard/services/gmail/gmailserviceroot.h
+++ b/src/librssguard/services/gmail/gmailserviceroot.h
@@ -17,36 +17,32 @@ class GmailServiceRoot : public ServiceRoot, public CacheForServiceRoot {
void saveAccountDataToDatabase();
- bool downloadAttachmentOnMyOwn(const QUrl& url) const;
-
void setNetwork(GmailNetworkFactory* network);
GmailNetworkFactory* network() const;
- QList contextMenuMessagesList(const QList& messages);
- QList serviceMenu();
- bool isSyncable() const;
- bool canBeEdited() const;
- bool editViaGui();
- bool canBeDeleted() const;
- bool deleteViaGui();
- bool supportsFeedAdding() const;
- bool supportsCategoryAdding() const;
- void start(bool freshly_activated);
- void stop();
- QString code() const;
+ virtual bool downloadAttachmentOnMyOwn(const QUrl& url) const;
+ virtual QList contextMenuMessagesList(const QList& messages);
+ virtual QList serviceMenu();
+ virtual bool isSyncable() const;
+ virtual bool canBeEdited() const;
+ virtual bool editViaGui();
+ virtual bool canBeDeleted() const;
+ virtual bool deleteViaGui();
+ virtual bool supportsFeedAdding() const;
+ virtual bool supportsCategoryAdding() const;
+ virtual void start(bool freshly_activated);
+ virtual void stop();
+ virtual QString code() const;
+ virtual QString additionalTooltip() const;
+ virtual void saveAllCachedData(bool async = true);
- QString additionalTooltip() const;
-
- void saveAllCachedData(bool async = true);
-
- public slots:
void updateTitle();
private slots:
void replyToEmail();
protected:
- RootItem* obtainNewTreeForSyncIn() const;
+ virtual RootItem* obtainNewTreeForSyncIn() const;
private:
void writeNewEmail();
diff --git a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp
index 3ff341c9d..b4dc3db79 100644
--- a/src/librssguard/services/inoreader/inoreaderserviceroot.cpp
+++ b/src/librssguard/services/inoreader/inoreaderserviceroot.cpp
@@ -77,6 +77,10 @@ void InoreaderServiceRoot::saveAccountDataToDatabase() {
}
}
+ServiceRoot::LabelOperation InoreaderServiceRoot::supportedLabelOperations() const {
+ return ServiceRoot::LabelOperation(0);
+}
+
bool InoreaderServiceRoot::isSyncable() const {
return true;
}
diff --git a/src/librssguard/services/inoreader/inoreaderserviceroot.h b/src/librssguard/services/inoreader/inoreaderserviceroot.h
index 4b89c25fb..3ba2e972e 100644
--- a/src/librssguard/services/inoreader/inoreaderserviceroot.h
+++ b/src/librssguard/services/inoreader/inoreaderserviceroot.h
@@ -20,26 +20,25 @@ class InoreaderServiceRoot : public ServiceRoot, public CacheForServiceRoot {
void setNetwork(InoreaderNetworkFactory* network);
InoreaderNetworkFactory* network() const;
- bool isSyncable() const;
- bool canBeEdited() const;
- bool editViaGui();
- bool canBeDeleted() const;
- bool deleteViaGui();
- bool supportsFeedAdding() const;
- bool supportsCategoryAdding() const;
- void start(bool freshly_activated);
- void stop();
- QString code() const;
+ virtual LabelOperation supportedLabelOperations() const;
+ virtual bool isSyncable() const;
+ virtual bool canBeEdited() const;
+ virtual bool editViaGui();
+ virtual bool canBeDeleted() const;
+ virtual bool deleteViaGui();
+ virtual bool supportsFeedAdding() const;
+ virtual bool supportsCategoryAdding() const;
+ virtual void start(bool freshly_activated);
+ virtual void stop();
+ virtual QString code() const;
+ virtual QString additionalTooltip() const;
+ virtual void saveAllCachedData(bool async = true);
- QString additionalTooltip() const;
-
- RootItem* obtainNewTreeForSyncIn() const;
-
- void saveAllCachedData(bool async = true);
-
- public slots:
void updateTitle();
+ protected:
+ virtual RootItem* obtainNewTreeForSyncIn() const;
+
private:
void loadFromDatabase();
diff --git a/src/librssguard/services/owncloud/owncloudserviceroot.h b/src/librssguard/services/owncloud/owncloudserviceroot.h
index f02dd0f95..36f064708 100644
--- a/src/librssguard/services/owncloud/owncloudserviceroot.h
+++ b/src/librssguard/services/owncloud/owncloudserviceroot.h
@@ -39,8 +39,10 @@ class OwnCloudServiceRoot : public ServiceRoot, public CacheForServiceRoot {
public slots:
void addNewFeed(RootItem* selected_item, const QString& url);
+ protected:
+ virtual RootItem* obtainNewTreeForSyncIn() const;
+
private:
- RootItem* obtainNewTreeForSyncIn() const;
void loadFromDatabase();
OwnCloudNetworkFactory* m_network;
diff --git a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp
index 7834bd465..4bae7a179 100644
--- a/src/librssguard/services/tt-rss/ttrssserviceroot.cpp
+++ b/src/librssguard/services/tt-rss/ttrssserviceroot.cpp
@@ -32,6 +32,10 @@ TtRssServiceRoot::~TtRssServiceRoot() {
delete m_network;
}
+ServiceRoot::LabelOperation TtRssServiceRoot::supportedLabelOperations() const {
+ return ServiceRoot::LabelOperation(0);
+}
+
void TtRssServiceRoot::start(bool freshly_activated) {
Q_UNUSED(freshly_activated)
loadFromDatabase();
diff --git a/src/librssguard/services/tt-rss/ttrssserviceroot.h b/src/librssguard/services/tt-rss/ttrssserviceroot.h
index 661bdf9cd..90a22352c 100644
--- a/src/librssguard/services/tt-rss/ttrssserviceroot.h
+++ b/src/librssguard/services/tt-rss/ttrssserviceroot.h
@@ -19,21 +19,19 @@ class TtRssServiceRoot : public ServiceRoot, public CacheForServiceRoot {
explicit TtRssServiceRoot(RootItem* parent = nullptr);
virtual ~TtRssServiceRoot();
- void start(bool freshly_activated);
- void stop();
- QString code() const;
-
- bool isSyncable() const;
- bool canBeEdited() const;
- bool canBeDeleted() const;
- bool editViaGui();
- bool deleteViaGui();
- bool supportsFeedAdding() const;
- bool supportsCategoryAdding() const;
-
- QString additionalTooltip() const;
-
- void saveAllCachedData(bool async = true);
+ virtual LabelOperation supportedLabelOperations() const;
+ virtual void start(bool freshly_activated);
+ virtual void stop();
+ virtual QString code() const;
+ virtual bool isSyncable() const;
+ virtual bool canBeEdited() const;
+ virtual bool canBeDeleted() const;
+ virtual bool editViaGui();
+ virtual bool deleteViaGui();
+ virtual bool supportsFeedAdding() const;
+ virtual bool supportsCategoryAdding() const;
+ virtual QString additionalTooltip() const;
+ virtual void saveAllCachedData(bool async = true);
// Access to network.
TtRssNetworkFactory* network() const;
@@ -42,10 +40,12 @@ class TtRssServiceRoot : public ServiceRoot, public CacheForServiceRoot {
void updateTitle();
public slots:
- void addNewFeed(RootItem* selected_item, const QString& url = QString());
+ virtual void addNewFeed(RootItem* selected_item, const QString& url = QString());
+
+ protected:
+ virtual RootItem* obtainNewTreeForSyncIn() const;
private:
- RootItem* obtainNewTreeForSyncIn() const;
void loadFromDatabase();
TtRssNetworkFactory* m_network;