From 74de3ed8f68aded8d19ddb456c233737d5b4d17f Mon Sep 17 00:00:00 2001 From: Cy Rossignol Date: Mon, 31 May 2021 19:46:55 -0500 Subject: [PATCH] Add system tray notification for new polls This adds a GUI hook that displays a system notification when a node receives a new poll as well as an accompanying GUI option to disable those notifications. --- src/qt/bitcoingui.cpp | 21 +++++++++++++++++++++ src/qt/bitcoingui.h | 1 + src/qt/forms/optionsdialog.ui | 7 +++++++ src/qt/optionsdialog.cpp | 1 + src/qt/optionsmodel.cpp | 12 ++++++++++++ src/qt/optionsmodel.h | 3 +++ 6 files changed, 45 insertions(+) diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index f2471c43b6..d6776852cc 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -42,6 +42,7 @@ #include "clicklabel.h" #include "univalue.h" #include "upgradeqt.h" +#include "voting/votingmodel.h" #ifdef Q_OS_MAC #include "macdockiconhandler.h" @@ -807,6 +808,12 @@ void BitcoinGUI::setResearcherModel(ResearcherModel *researcherModel) void BitcoinGUI::setVotingModel(VotingModel *votingModel) { votingPage->setVotingModel(votingModel); + + if (!votingModel) { + return; + } + + connect(votingModel, SIGNAL(newPollReceived()), this, SLOT(handleNewPoll())); } void BitcoinGUI::createTrayIcon() @@ -1786,6 +1793,20 @@ void BitcoinGUI::updateBeaconIcon() .arg(researcherModel->formatBeaconStatus())); } +void BitcoinGUI::handleNewPoll() +{ + if (!clientModel || !clientModel->getOptionsModel()) { + return; + } + + if (!clientModel->getOptionsModel()->getDisablePollNotifications()) { + notificator->notify( + Notificator::Information, + tr("New Poll"), + tr("A new poll is available. Open Gridcoin to vote.")); + } +} + // ----------------------------------------------------------------------------- // Class: ToolbarButtonIconFilter // ----------------------------------------------------------------------------- diff --git a/src/qt/bitcoingui.h b/src/qt/bitcoingui.h index 7ef1163cc8..3f6d7bddf7 100644 --- a/src/qt/bitcoingui.h +++ b/src/qt/bitcoingui.h @@ -274,6 +274,7 @@ private slots: QString GetEstimatedStakingFrequency(unsigned int nEstimateTime); void updateGlobalStatus(); + void handleNewPoll(); }; //! diff --git a/src/qt/forms/optionsdialog.ui b/src/qt/forms/optionsdialog.ui index 2f24fb4e88..43bbb533f0 100644 --- a/src/qt/forms/optionsdialog.ui +++ b/src/qt/forms/optionsdialog.ui @@ -286,6 +286,13 @@ + + + + Disable Poll Notifications + + + diff --git a/src/qt/optionsdialog.cpp b/src/qt/optionsdialog.cpp index 45749d48ba..2d85a2a12f 100644 --- a/src/qt/optionsdialog.cpp +++ b/src/qt/optionsdialog.cpp @@ -148,6 +148,7 @@ void OptionsDialog::setMapper() /* Window */ mapper->addMapping(ui->disableTransactionNotifications, OptionsModel::DisableTrxNotifications); + mapper->addMapping(ui->disablePollNotifications, OptionsModel::DisablePollNotifications); #ifndef Q_OS_MAC mapper->addMapping(ui->minimizeToTray, OptionsModel::MinimizeToTray); mapper->addMapping(ui->minimizeOnClose, OptionsModel::MinimizeOnClose); diff --git a/src/qt/optionsmodel.cpp b/src/qt/optionsmodel.cpp index 7219246236..a8014f2db8 100644 --- a/src/qt/optionsmodel.cpp +++ b/src/qt/optionsmodel.cpp @@ -46,6 +46,7 @@ void OptionsModel::Init() fStartMin = settings.value("fStartMin", true).toBool(); fMinimizeToTray = settings.value("fMinimizeToTray", false).toBool(); fDisableTrxNotifications = settings.value("fDisableTrxNotifications", false).toBool(); + fDisablePollNotifications = settings.value("fDisablePollNotifications", false).toBool(); bDisplayAddresses = settings.value("bDisplayAddresses", false).toBool(); fMinimizeOnClose = settings.value("fMinimizeOnClose", false).toBool(); fCoinControlFeatures = settings.value("fCoinControlFeatures", false).toBool(); @@ -97,6 +98,8 @@ QVariant OptionsModel::data(const QModelIndex & index, int role) const return QVariant(fMinimizeToTray); case DisableTrxNotifications: return QVariant(fDisableTrxNotifications); + case DisablePollNotifications: + return QVariant(fDisablePollNotifications); case MapPortUPnP: return settings.value("fUseUPnP", gArgs.GetBoolArg("-upnp", true)); case MinimizeOnClose: @@ -178,6 +181,10 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in fDisableTrxNotifications = value.toBool(); settings.setValue("fDisableTrxNotifications", fDisableTrxNotifications); break; + case DisablePollNotifications: + fDisablePollNotifications = value.toBool(); + settings.setValue("fDisablePollNotifications", fDisablePollNotifications); + break; case MapPortUPnP: fUseUPnP = value.toBool(); settings.setValue("fUseUPnP", fUseUPnP); @@ -338,6 +345,11 @@ bool OptionsModel::getDisableTrxNotifications() return fDisableTrxNotifications; } +bool OptionsModel::getDisablePollNotifications() +{ + return fDisablePollNotifications; +} + bool OptionsModel::getMinimizeOnClose() { return fMinimizeOnClose; diff --git a/src/qt/optionsmodel.h b/src/qt/optionsmodel.h index 14ed35f5fb..6d77b0a794 100644 --- a/src/qt/optionsmodel.h +++ b/src/qt/optionsmodel.h @@ -22,6 +22,7 @@ class OptionsModel : public QAbstractListModel MinimizeToTray, // bool StartMin, // bool DisableTrxNotifications, // bool + DisablePollNotifications,// bool MapPortUPnP, // bool MinimizeOnClose, // bool ProxyUse, // bool @@ -54,6 +55,7 @@ class OptionsModel : public QAbstractListModel bool getStartMin(); bool getMinimizeToTray(); bool getDisableTrxNotifications(); + bool getDisablePollNotifications(); bool getMinimizeOnClose(); int getDisplayUnit(); bool getDisplayAddresses(); @@ -75,6 +77,7 @@ class OptionsModel : public QAbstractListModel bool fStartAtStartup; bool fStartMin; bool fDisableTrxNotifications; + bool fDisablePollNotifications; bool bDisplayAddresses; bool fMinimizeOnClose; bool fCoinControlFeatures;