From 93e6af3e2098008a0949be5466f917fda78f498d Mon Sep 17 00:00:00 2001 From: antonpavanvo Date: Tue, 31 May 2022 22:04:36 +0400 Subject: [PATCH] feat: hide to tray on closing --- ui/squawk.cpp | 74 +++++++++++++++++++++-------- ui/squawk.h | 4 ++ ui/widgets/settings/pagegeneral.cpp | 10 ++++ ui/widgets/settings/pagegeneral.h | 1 + ui/widgets/settings/pagegeneral.ui | 13 +++++ 5 files changed, 82 insertions(+), 20 deletions(-) diff --git a/ui/squawk.cpp b/ui/squawk.cpp index 9b6158c..34ff4b2 100644 --- a/ui/squawk.cpp +++ b/ui/squawk.cpp @@ -20,6 +20,7 @@ #include "ui_squawk.h" #include #include +#include Squawk::Squawk(Models::Roster& p_rosterModel, QWidget *parent) : QMainWindow(parent), @@ -51,12 +52,13 @@ Squawk::Squawk(Models::Roster& p_rosterModel, QWidget *parent) : m_ui->comboBox->addItem(Shared::availabilityIcon(av), Shared::Global::getName(av)); } m_ui->comboBox->setCurrentIndex(static_cast(Shared::Availability::offline)); - + createTrayIcon(); + connect(m_ui->actionAccounts, &QAction::triggered, this, &Squawk::onAccounts); connect(m_ui->actionPreferences, &QAction::triggered, this, &Squawk::onPreferences); connect(m_ui->actionAddContact, &QAction::triggered, this, &Squawk::onNewContact); connect(m_ui->actionAddConference, &QAction::triggered, this, &Squawk::onNewConference); - connect(m_ui->actionQuit, &QAction::triggered, this, &Squawk::close); + connect(m_ui->actionQuit, &QAction::triggered, [this]() { hide(); close(); }); // Actually closing connect(m_ui->comboBox, qOverload(&QComboBox::activated), this, &Squawk::onComboboxActivated); //connect(m_ui->roster, &QTreeView::doubleClicked, this, &Squawk::onRosterItemDoubleClicked); connect(m_ui->roster, &QTreeView::customContextMenuRequested, this, &Squawk::onRosterContextMenu); @@ -89,10 +91,35 @@ Squawk::Squawk(Models::Roster& p_rosterModel, QWidget *parent) : settings.endGroup(); } +QSystemTrayIcon* Squawk::trayIcon; + Squawk::~Squawk() { delete contextMenu; + delete trayIcon; } +void Squawk::createTrayIcon() +{ + QSettings settings; + trayIcon = new QSystemTrayIcon(this); + trayIcon->setIcon(QApplication::windowIcon()); + + QMenu * menu = new QMenu(this); + QAction * viewWindow = new QAction("Open Main Window", this);//TODO add translations + QAction * quitAction = new QAction("Quit", this); + + connect(viewWindow, SIGNAL(triggered()), this, SLOT(show())); + connect(quitAction, &QAction::triggered, [this]() { hide(); close(); }); // Actually closing + + menu->addAction(viewWindow); + menu->addAction(quitAction); + + trayIcon->setContextMenu(menu); + if(settings.value("trayIconCheckbox").toBool()) + trayIcon->show(); +} + + void Squawk::onAccounts() { if (accounts == nullptr) { @@ -183,25 +210,32 @@ void Squawk::onJoinConferenceAccepted() void Squawk::closeEvent(QCloseEvent* event) { - if (accounts != nullptr) { - accounts->close(); - } - if (preferences != nullptr) { - preferences->close(); - } - if (about != nullptr) { - about->close(); - } - - for (std::map::const_iterator itr = vCards.begin(), end = vCards.end(); itr != end; ++itr) { - disconnect(itr->second, &VCard::destroyed, this, &Squawk::onVCardClosed); - itr->second->close(); - } - vCards.clear(); - writeSettings(); - emit closing();; + QSettings settings; + if(this->isVisible() && settings.value("trayIconCheckbox").toBool()){ + event->ignore(); + this->hide(); - QMainWindow::closeEvent(event); + } else { + if (accounts != nullptr) { + accounts->close(); + } + if (preferences != nullptr) { + preferences->close(); + } + if (about != nullptr) { + about->close(); + } + + for (std::map::const_iterator itr = vCards.begin(), end = vCards.end(); itr != end; ++itr) { + disconnect(itr->second, &VCard::destroyed, this, &Squawk::onVCardClosed); + itr->second->close(); + } + vCards.clear(); + writeSettings(); + emit closing(); + + QMainWindow::closeEvent(event); + } } void Squawk::onAccountsClosed() { diff --git a/ui/squawk.h b/ui/squawk.h index 15a73dd..40b7f61 100644 --- a/ui/squawk.h +++ b/ui/squawk.h @@ -24,6 +24,7 @@ #include #include #include +#include #include #include @@ -85,6 +86,7 @@ signals: public: Models::Roster::ElId currentConversationId() const; void closeCurrentConversation(); + static QSystemTrayIcon *trayIcon; public slots: void writeSettings(); @@ -93,6 +95,8 @@ public slots: void select(QModelIndex index); private: + void createTrayIcon(); + QScopedPointer m_ui; Accounts* accounts; diff --git a/ui/widgets/settings/pagegeneral.cpp b/ui/widgets/settings/pagegeneral.cpp index 9ed46a2..7608fcb 100644 --- a/ui/widgets/settings/pagegeneral.cpp +++ b/ui/widgets/settings/pagegeneral.cpp @@ -18,6 +18,7 @@ #include "pagegeneral.h" #include "ui_pagegeneral.h" +#include "ui/squawk.h" PageGeneral::PageGeneral(QWidget* parent): QWidget(parent), @@ -28,7 +29,10 @@ PageGeneral::PageGeneral(QWidget* parent): QSettings settings; m_ui->downloadsPathInput->setText(settings.value("downloadsPath").toString()); + m_ui->trayIconCheckbox->setChecked(settings.value("trayIconCheckbox").toBool()); + connect(m_ui->downloadsPathButton, &QPushButton::clicked, this, &PageGeneral::onBrowseButtonClicked); + connect(m_ui->trayIconCheckbox, &QCheckBox::stateChanged, this, &PageGeneral::onTrayIconCheckboxChecked); } PageGeneral::~PageGeneral() @@ -76,3 +80,9 @@ void PageGeneral::onDialogDestroyed() { dialog = nullptr; } + +void PageGeneral::onTrayIconCheckboxChecked(){ + QSettings settings; + settings.setValue("trayIconCheckbox", m_ui->trayIconCheckbox->isChecked()); + Squawk::trayIcon->setVisible(m_ui->trayIconCheckbox->isChecked()); +} diff --git a/ui/widgets/settings/pagegeneral.h b/ui/widgets/settings/pagegeneral.h index 7f58d71..4f6197e 100644 --- a/ui/widgets/settings/pagegeneral.h +++ b/ui/widgets/settings/pagegeneral.h @@ -47,6 +47,7 @@ private slots: void onBrowseButtonClicked(); void onDialogAccepted(); void onDialogDestroyed(); + void onTrayIconCheckboxChecked(); private: QScopedPointer m_ui; diff --git a/ui/widgets/settings/pagegeneral.ui b/ui/widgets/settings/pagegeneral.ui index e412668..af944d7 100644 --- a/ui/widgets/settings/pagegeneral.ui +++ b/ui/widgets/settings/pagegeneral.ui @@ -39,6 +39,19 @@ + + + + Qt::LeftToRight + + + Hide Squawk to tray + + + false + + +