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;