diff --git a/tray/CMakeLists.txt b/tray/CMakeLists.txt index eed7681..6b4d48e 100644 --- a/tray/CMakeLists.txt +++ b/tray/CMakeLists.txt @@ -98,7 +98,7 @@ find_package(c++utilities${CONFIGURATION_PACKAGE_SUFFIX} 5.6.0 REQUIRED) use_cpp_utilities() # find qtutilities -find_package(qtutilities${CONFIGURATION_PACKAGE_SUFFIX_QTUTILITIES} 6.0.0 REQUIRED) +find_package(qtutilities${CONFIGURATION_PACKAGE_SUFFIX_QTUTILITIES} 6.4.0 REQUIRED) use_qt_utilities() # find backend libraries diff --git a/tray/gui/trayicon.cpp b/tray/gui/trayicon.cpp index 9b66c09..d3c113e 100644 --- a/tray/gui/trayicon.cpp +++ b/tray/gui/trayicon.cpp @@ -295,9 +295,9 @@ void TrayIcon::showNewDir(const QString &devId, const QString &dirId, const QStr void TrayIcon::showInternalErrorsDialog() { - auto *const errorViewDlg = InternalErrorsDialog::instance(); - connect(errorViewDlg, &InternalErrorsDialog::errorsCleared, this, &TrayIcon::handleErrorsCleared); - centerWidget(errorViewDlg); - errorViewDlg->show(); + if (!InternalErrorsDialog::hasInstance()) { + connect(InternalErrorsDialog::instance(), &InternalErrorsDialog::errorsCleared, this, &TrayIcon::handleErrorsCleared); + } + trayMenu().widget().showInternalErrorsDialog(); } } // namespace QtGui diff --git a/tray/gui/traywidget.cpp b/tray/gui/traywidget.cpp index 2160fd7..7c64cc3 100644 --- a/tray/gui/traywidget.cpp +++ b/tray/gui/traywidget.cpp @@ -3,16 +3,13 @@ #include "./trayicon.h" #include "./traymenu.h" +#include #include #include #include #include #include -#ifdef SYNCTHINGTRAY_UNIFY_TRAY_MENUS -#include -#endif - #include #ifdef LIB_SYNCTHING_CONNECTOR_SUPPORT_SYSTEMD @@ -244,8 +241,9 @@ void TrayWidget::showSettingsDialog() // by simply saving the settings immediately. connect(s_settingsDlg, &SettingsDialog::applied, &Settings::save); } - centerWidget(s_settingsDlg); - showDialog(s_settingsDlg); + + // show settings dialog centered or maximized if the relatively big windows would overflow + showDialog(s_settingsDlg, centerWidgetAvoidingOverflow(s_settingsDlg)); } void TrayWidget::showAboutDialog() @@ -292,24 +290,21 @@ void TrayWidget::showOwnDeviceId() { auto *const dlg = ownDeviceIdDialog(m_connection); dlg->setAttribute(Qt::WA_DeleteOnClose, true); - centerWidget(dlg); - showDialog(dlg); + showDialog(dlg, centerWidgetAvoidingOverflow(dlg)); } void TrayWidget::showLog() { auto *const dlg = TextViewDialog::forLogEntries(m_connection); dlg->setAttribute(Qt::WA_DeleteOnClose, true); - centerWidget(dlg); - showDialog(dlg); + showDialog(dlg, centerWidgetAvoidingOverflow(dlg)); } void TrayWidget::showNotifications() { auto *const dlg = TextViewDialog::forLogEntries(m_notifications, tr("New notifications")); dlg->setAttribute(Qt::WA_DeleteOnClose, true); - centerWidget(dlg); - showDialog(dlg); + showDialog(dlg, centerWidgetAvoidingOverflow(dlg)); m_notifications.clear(); dismissNotifications(); } @@ -329,15 +324,16 @@ void TrayWidget::showInternalErrorsButton() { m_internalErrorsButton->setVisible(true); } +#endif void TrayWidget::showInternalErrorsDialog() { auto *const errorViewDlg = InternalErrorsDialog::instance(); +#ifdef SYNCTHINGTRAY_UNIFY_TRAY_MENUS connect(errorViewDlg, &InternalErrorsDialog::errorsCleared, this, &TrayWidget::handleErrorsCleared); - centerWidget(errorViewDlg); - errorViewDlg->show(); -} #endif + showDialog(errorViewDlg, centerWidgetAvoidingOverflow(errorViewDlg)); +} void TrayWidget::dismissNotifications() { @@ -816,12 +812,19 @@ void TrayWidget::handleConnectionSelected(QAction *connectionAction) } } -void TrayWidget::showDialog(QWidget *dlg) +void TrayWidget::showDialog(QWidget *dlg, bool maximized) { if (m_menu) { m_menu->close(); } - dlg->show(); + if (maximized) { + // assign the minimum size so when the window is "de-maximized" again it doesn't overflow again and is not misplaced + dlg->resize(dlg->minimumSize()); + centerWidget(dlg); + dlg->showMaximized(); + } else { + dlg->show(); + } dlg->activateWindow(); } diff --git a/tray/gui/traywidget.h b/tray/gui/traywidget.h index b2a67e7..bdc0e51 100644 --- a/tray/gui/traywidget.h +++ b/tray/gui/traywidget.h @@ -67,8 +67,8 @@ public Q_SLOTS: void showUsingPositioningSettings(); #ifdef SYNCTHINGTRAY_UNIFY_TRAY_MENUS void showInternalErrorsButton(); - void showInternalErrorsDialog(); #endif + void showInternalErrorsDialog(); void dismissNotifications(); void restartSyncthing(); void quitTray(); @@ -103,7 +103,7 @@ private Q_SLOTS: #endif void handleNewNotification(CppUtilities::DateTime when, const QString &msg); void handleConnectionSelected(QAction *connectionAction); - void showDialog(QWidget *dlg); + void showDialog(QWidget *dlg, bool maximized = false); private: TrayMenu *m_menu; diff --git a/widgets/misc/internalerrorsdialog.h b/widgets/misc/internalerrorsdialog.h index 91eb1b2..80f79e7 100644 --- a/widgets/misc/internalerrorsdialog.h +++ b/widgets/misc/internalerrorsdialog.h @@ -15,6 +15,7 @@ class SYNCTHINGWIDGETS_EXPORT InternalErrorsDialog : public TextViewDialog { public: ~InternalErrorsDialog() override; static InternalErrorsDialog *instance(); + static bool hasInstance(); static void addError(InternalError &&newError); Q_SIGNALS: @@ -43,6 +44,11 @@ inline InternalErrorsDialog *InternalErrorsDialog::instance() return s_instance ? s_instance : (s_instance = new InternalErrorsDialog); } +inline bool InternalErrorsDialog::hasInstance() +{ + return s_instance != nullptr; +} + inline void InternalErrorsDialog::showInstance() { instance()->show();