From f4df2bbf2179cba3a3ce2c1a8dfecb3063b4388b Mon Sep 17 00:00:00 2001 From: Martchus Date: Tue, 5 Sep 2017 00:24:52 +0200 Subject: [PATCH] Allow opening internal error log via context menu --- tray/CMakeLists.txt | 1 + tray/gui/trayicon.cpp | 23 +++++++++++++++++-- tray/gui/trayicon.h | 3 +++ .../scalable/emblems/8/emblem-error.svg | 18 +++++++++++++++ tray/resources/syncthingtrayicons.qrc | 1 + widgets/misc/errorviewdialog.cpp | 1 + widgets/misc/errorviewdialog.h | 3 +++ 7 files changed, 48 insertions(+), 2 deletions(-) create mode 100644 tray/resources/icons/hicolor/scalable/emblems/8/emblem-error.svg diff --git a/tray/CMakeLists.txt b/tray/CMakeLists.txt index 88067f1..6272c65 100644 --- a/tray/CMakeLists.txt +++ b/tray/CMakeLists.txt @@ -61,6 +61,7 @@ set(REQUIRED_ICONS dialog-ok-apply edit-copy edit-paste + emblem-error folder folder-download folder-open diff --git a/tray/gui/trayicon.cpp b/tray/gui/trayicon.cpp index 8a80011..231eaad 100644 --- a/tray/gui/trayicon.cpp +++ b/tray/gui/trayicon.cpp @@ -60,6 +60,11 @@ TrayIcon::TrayIcon(const QString &connectionConfig, QObject *parent) QIcon::fromTheme(QStringLiteral("text-x-generic"), QIcon(QStringLiteral(":/icons/hicolor/scalable/mimetypes/text-x-generic.svg"))), tr("Log")), &QAction::triggered, m_trayMenu.widget(), &TrayWidget::showLog); + m_errorsAction = m_contextMenu.addAction( + QIcon::fromTheme(QStringLiteral("emblem-error"), QIcon(QStringLiteral(":/icons/hicolor/scalable/emblems/8/emblem-error.svg"))), + tr("Show internal errors")); + m_errorsAction->setVisible(false); + connect(m_errorsAction, &QAction::triggered, this, &TrayIcon::showInternalErrorsDialog); m_contextMenu.addMenu(m_trayMenu.widget()->connectionsMenu()); connect(m_contextMenu.addAction( QIcon::fromTheme(QStringLiteral("help-about"), QIcon(QStringLiteral(":/icons/hicolor/scalable/apps/help-about.svg"))), tr("About")), @@ -86,7 +91,7 @@ TrayIcon::TrayIcon(const QString &connectionConfig, QObject *parent) static_cast(&SyncthingConnection::connect)); connect(&m_dbusNotifier, &DBusStatusNotifier::dismissNotificationsRequested, m_trayMenu.widget(), &TrayWidget::dismissNotifications); connect(&m_dbusNotifier, &DBusStatusNotifier::showNotificationsRequested, m_trayMenu.widget(), &TrayWidget::showNotifications); - connect(&m_dbusNotifier, &DBusStatusNotifier::errorDetailsRequested, &ErrorViewDialog::showInstance); + connect(&m_dbusNotifier, &DBusStatusNotifier::errorDetailsRequested, this, &TrayIcon::showInternalErrorsDialog); #endif m_initialized = true; } @@ -134,7 +139,7 @@ void TrayIcon::handleMessageClicked() m_trayMenu.widget()->dismissNotifications(); break; case TrayIconMessageClickedAction::ShowInternalErrors: - ErrorViewDialog::instance()->show(); + showInternalErrorsDialog(); break; } } @@ -149,6 +154,11 @@ void TrayIcon::handleConnectionStatusChanged(SyncthingStatus status) m_status = status; } +void TrayIcon::handleErrorsCleared() +{ + m_errorsAction->setVisible(false); +} + void TrayIcon::showInternalError( const QString &errorMsg, SyncthingErrorCategory category, int networkError, const QNetworkRequest &request, const QByteArray &response) { @@ -178,6 +188,7 @@ void TrayIcon::showInternalError( showMessage(tr("Error"), errorMsg, QSystemTrayIcon::Critical); } ErrorViewDialog::addError(move(error)); + m_errorsAction->setVisible(true); } } @@ -272,4 +283,12 @@ void TrayIcon::showStatusNotification(SyncthingStatus status) } } } + +void TrayIcon::showInternalErrorsDialog() +{ + auto *const errorViewDlg = ErrorViewDialog::instance(); + connect(errorViewDlg, &ErrorViewDialog::errorsCleared, this, &TrayIcon::handleErrorsCleared); + centerWidget(errorViewDlg); + errorViewDlg->show(); +} } diff --git a/tray/gui/trayicon.h b/tray/gui/trayicon.h index 9147c19..421bf4f 100644 --- a/tray/gui/trayicon.h +++ b/tray/gui/trayicon.h @@ -34,17 +34,20 @@ public slots: const QString &errorMsg, Data::SyncthingErrorCategory category, int networkError, const QNetworkRequest &request, const QByteArray &response); void showSyncthingNotification(ChronoUtilities::DateTime when, const QString &message); void showStatusNotification(Data::SyncthingStatus status); + void showInternalErrorsDialog(); void updateStatusIconAndText(); private slots: void handleActivated(QSystemTrayIcon::ActivationReason reason); void handleMessageClicked(); void handleConnectionStatusChanged(Data::SyncthingStatus status); + void handleErrorsCleared(); private: bool m_initialized; TrayMenu m_trayMenu; QMenu m_contextMenu; + QAction *m_errorsAction; Data::SyncthingStatus m_status; #ifdef QT_UTILITIES_SUPPORT_DBUS_NOTIFICATIONS DBusStatusNotifier m_dbusNotifier; diff --git a/tray/resources/icons/hicolor/scalable/emblems/8/emblem-error.svg b/tray/resources/icons/hicolor/scalable/emblems/8/emblem-error.svg new file mode 100644 index 0000000..c198b42 --- /dev/null +++ b/tray/resources/icons/hicolor/scalable/emblems/8/emblem-error.svg @@ -0,0 +1,18 @@ + + + + + + + diff --git a/tray/resources/syncthingtrayicons.qrc b/tray/resources/syncthingtrayicons.qrc index 49b6840..4f12279 100644 --- a/tray/resources/syncthingtrayicons.qrc +++ b/tray/resources/syncthingtrayicons.qrc @@ -16,5 +16,6 @@ icons/hicolor/scalable/places/network-workgroup.svg icons/hicolor/scalable/actions/network-connect.svg icons/hicolor/scalable/places/folder-download.svg + icons/hicolor/scalable/emblems/8/emblem-error.svg diff --git a/widgets/misc/errorviewdialog.cpp b/widgets/misc/errorviewdialog.cpp index 4fe22f3..1b5c282 100644 --- a/widgets/misc/errorviewdialog.cpp +++ b/widgets/misc/errorviewdialog.cpp @@ -56,6 +56,7 @@ ErrorViewDialog::ErrorViewDialog() buttonLayout->addItem(new QSpacerItem(40, 20, QSizePolicy::Expanding, QSizePolicy::Minimum)); buttonLayout->addWidget(clearButton); connect(clearButton, &QPushButton::clicked, &ErrorViewDialog::clearErrors); + connect(clearButton, &QPushButton::clicked, this, &ErrorViewDialog::errorsCleared); } layout()->addItem(buttonLayout); diff --git a/widgets/misc/errorviewdialog.h b/widgets/misc/errorviewdialog.h index 977ab0b..dd1a510 100644 --- a/widgets/misc/errorviewdialog.h +++ b/widgets/misc/errorviewdialog.h @@ -17,6 +17,9 @@ public: static ErrorViewDialog *instance(); static void addError(InternalError &&newError); +Q_SIGNALS: + void errorsCleared(); + public Q_SLOTS: static void showInstance(); static void clearErrors();