From 1d5b90a6938d48bdce6dd0716d44fb7f2427b069 Mon Sep 17 00:00:00 2001 From: Martchus Date: Mon, 24 Dec 2018 17:19:11 +0100 Subject: [PATCH] Allow always to change config --- connector/syncthingnotifier.h | 9 +++ .../syncthingfileitemaction.cpp | 13 +--- fileitemactionplugin/syncthingmenuaction.cpp | 77 ++++++++++++------- fileitemactionplugin/syncthingmenuaction.h | 10 ++- 4 files changed, 71 insertions(+), 38 deletions(-) diff --git a/connector/syncthingnotifier.h b/connector/syncthingnotifier.h index a6e3456..3f3aad6 100644 --- a/connector/syncthingnotifier.h +++ b/connector/syncthingnotifier.h @@ -60,6 +60,7 @@ class LIB_SYNCTHING_CONNECTOR_EXPORT SyncthingNotifier : public QObject { public: SyncthingNotifier(const SyncthingConnection &connection, QObject *parent = nullptr); + const SyncthingConnection &connection() const; SyncthingHighLevelNotification enabledNotifications() const; unsigned int ignoreInavailabilityAfterStart() const; #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD @@ -112,6 +113,14 @@ private: bool m_initialized; }; +/*! + * \brief Returns the associated connection. + */ +inline const SyncthingConnection &SyncthingNotifier::connection() const +{ + return m_connection; +} + /*! * \brief Returns which notifications are enabled (by default none). */ diff --git a/fileitemactionplugin/syncthingfileitemaction.cpp b/fileitemactionplugin/syncthingfileitemaction.cpp index 5e4d15b..a4fe334 100644 --- a/fileitemactionplugin/syncthingfileitemaction.cpp +++ b/fileitemactionplugin/syncthingfileitemaction.cpp @@ -47,18 +47,11 @@ SyncthingFileItemAction::SyncthingFileItemAction(QObject *parent, const QVariant QList SyncthingFileItemAction::actions(const KFileItemListProperties &fileItemInfo, QWidget *parentWidget) { - // handle case when not connected yet - if (!s_data.connection().isConnected()) { - s_data.connection().connect(); - auto *menuAction = new SyncthingMenuAction(fileItemInfo, QList(), parentWidget); - connect(&s_data.connection(), &SyncthingConnection::statusChanged, menuAction, &SyncthingMenuAction::updateStatus); - return QList() << menuAction; - } - const QList actions = createActions(fileItemInfo, parentWidget); + // don't show anything if no relevant actions could be determined - if (actions.isEmpty()) { - return actions; + if (s_data.connection().isConnected() && actions.isEmpty()) { + return QList(); } return QList({ new SyncthingMenuAction(fileItemInfo, actions, parentWidget) }); diff --git a/fileitemactionplugin/syncthingmenuaction.cpp b/fileitemactionplugin/syncthingmenuaction.cpp index 1e08c79..f9e4ce4 100644 --- a/fileitemactionplugin/syncthingmenuaction.cpp +++ b/fileitemactionplugin/syncthingmenuaction.cpp @@ -13,37 +13,62 @@ using namespace Data; SyncthingMenuAction::SyncthingMenuAction(const KFileItemListProperties &properties, const QList &actions, QWidget *parentWidget) : QAction(parentWidget) , m_properties(properties) + , m_notifier(SyncthingFileItemAction::staticData().connection()) { - if (!actions.isEmpty()) { - auto *menu = new QMenu(parentWidget); - menu->addActions(actions); - setMenu(menu); - } - updateStatus(SyncthingFileItemAction::staticData().connection().status()); + // init according to current state + createMenu(actions); + updateActionStatus(); + + // setup handling future state change + m_notifier.setEnabledNotifications(SyncthingHighLevelNotification::ConnectedDisconnected); + connect(&m_notifier, &SyncthingNotifier::connected, this, &SyncthingMenuAction::handleConnectedChanged); + connect(&m_notifier, &SyncthingNotifier::disconnected, this, &SyncthingMenuAction::handleConnectedChanged); } -void SyncthingMenuAction::updateStatus(SyncthingStatus status) +void SyncthingMenuAction::handleConnectedChanged() { - if (status != SyncthingStatus::Disconnected && status != SyncthingStatus::Reconnecting && status != SyncthingStatus::BeingDestroyed) { + // update the current menu + if (QMenu *const menu = this->menu()) { + setMenu(nullptr); + delete menu; + } + createMenu(SyncthingFileItemAction::createActions(m_properties, parentWidget())); + + // update status of action itself + updateActionStatus(); +} + +void SyncthingMenuAction::updateActionStatus() +{ + auto &data = SyncthingFileItemAction::staticData(); + auto &connection = data.connection(); + + // handle case when already connected + if (connection.isConnected()) { setText(tr("Syncthing")); setIcon(statusIcons().scanninig); - if (!menu()) { - const QList actions = SyncthingFileItemAction::createActions(m_properties, parentWidget()); - if (!actions.isEmpty()) { - auto *menu = new QMenu(parentWidget()); - menu->addActions(actions); - setMenu(menu); - } - } - } else { - if (status != SyncthingStatus::Reconnecting) { - SyncthingFileItemAction::staticData().connection().connect(); - } - setText(tr("Syncthing - connecting")); - setIcon(statusIcons().disconnected); - if (QMenu *menu = this->menu()) { - setMenu(nullptr); - delete menu; - } + return; } + + // attempt to connect if not reconnecting anyways and there's no configuration issue + if (connection.status() != SyncthingStatus::Reconnecting && !data.hasError()) { + connection.connect(); + } + + if (connection.hasPendingRequests()) { + setText(tr("Syncthing - connecting")); + } else { + setText(tr("Syncthing - not connected")); + } + setIcon(statusIcons().disconnected); +} + +void SyncthingMenuAction::createMenu(const QList &actions) +{ + if (actions.isEmpty()) { + return; + } + auto *const menu = new QMenu(parentWidget()); + menu->addActions(actions); + setMenu(menu); } diff --git a/fileitemactionplugin/syncthingmenuaction.h b/fileitemactionplugin/syncthingmenuaction.h index 32d80b9..7775b2b 100644 --- a/fileitemactionplugin/syncthingmenuaction.h +++ b/fileitemactionplugin/syncthingmenuaction.h @@ -1,6 +1,8 @@ #ifndef SYNCTHINGMENUACTION_H #define SYNCTHINGMENUACTION_H +#include "../connector/syncthingnotifier.h" + #include #include @@ -19,11 +21,15 @@ public: explicit SyncthingMenuAction(const KFileItemListProperties &properties = KFileItemListProperties(), const QList &actions = QList(), QWidget *parentWidget = nullptr); -public Q_SLOTS: - void updateStatus(Data::SyncthingStatus status); +private Q_SLOTS: + void handleConnectedChanged(); + void updateActionStatus(); private: + void createMenu(const QList &actions); + KFileItemListProperties m_properties; + Data::SyncthingNotifier m_notifier; }; #endif // SYNCTHINGMENUACTION_H