Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
27 commits
Select commit Hold shift + click to select a range
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions contrib/dash-qt.pro
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ FORMS += \
../src/qt/forms/coincontroldialog.ui \
../src/qt/forms/debugwindow.ui \
../src/qt/forms/editaddressdialog.ui \
../src/qt/forms/governancelist.ui \
../src/qt/forms/helpmessagedialog.ui \
../src/qt/forms/intro.ui \
../src/qt/forms/masternodelist.ui \
Expand Down
4 changes: 4 additions & 0 deletions src/Makefile.qt.include
Original file line number Diff line number Diff line change
Expand Up @@ -37,6 +37,7 @@ QT_FORMS_UI = \
qt/forms/coincontroldialog.ui \
qt/forms/editaddressdialog.ui \
qt/forms/helpmessagedialog.ui \
qt/forms/governancelist.ui \
qt/forms/intro.ui \
qt/forms/modaloverlay.ui \
qt/forms/masternodelist.ui \
Expand Down Expand Up @@ -69,6 +70,7 @@ QT_MOC_CPP = \
qt/moc_csvmodelwriter.cpp \
qt/moc_editaddressdialog.cpp \
qt/moc_guiutil.cpp \
qt/moc_governancelist.cpp \
qt/moc_intro.cpp \
qt/moc_macdockiconhandler.cpp \
qt/moc_macnotificationhandler.cpp \
Expand Down Expand Up @@ -147,6 +149,7 @@ BITCOIN_QT_H = \
qt/coincontroltreewidget.h \
qt/csvmodelwriter.h \
qt/editaddressdialog.h \
qt/governancelist.h \
qt/guiconstants.h \
qt/guiutil.h \
qt/intro.h \
Expand Down Expand Up @@ -256,6 +259,7 @@ BITCOIN_QT_WALLET_CPP = \
qt/coincontroldialog.cpp \
qt/coincontroltreewidget.cpp \
qt/editaddressdialog.cpp \
qt/governancelist.cpp \
qt/masternodelist.cpp \
qt/openuridialog.cpp \
qt/overviewpage.cpp \
Expand Down
63 changes: 62 additions & 1 deletion src/governance/governance-object.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -14,9 +14,10 @@
#include <net.h>
#include <validation.h>
#include <validationinterface.h>

#include <string>

static constexpr int64_t SECONDS_IN_ONE_MONTH = 60 * 60 * 24 * 30;

CGovernanceObject::CGovernanceObject() :
cs(),
nObjectType(GOVERNANCE_OBJECT_UNKNOWN),
Expand Down Expand Up @@ -624,6 +625,66 @@ int CGovernanceObject::CountMatchingVotes(vote_signal_enum_t eVoteSignalIn, vote
* Get specific vote counts for each outcome (funding, validity, etc)
*/

int64_t CGovernanceObject::GetPaymentStartTime()
{
UniValue data;
data.read(this->GetDataAsPlainString());
UniValue payment_start_data = find_value(data, "start_epoch");

if (payment_start_data.isNum()) return payment_start_data.get_int();

return -1;
}

int64_t CGovernanceObject::GetPaymentEndTime()
{
UniValue data;
data.read(this->GetDataAsPlainString());
UniValue payment_end_data = find_value(data, "end_epoch");
if (payment_end_data.isNum()) return payment_end_data.get_int();

return -1;
}

int64_t CGovernanceObject::GetCycles()
{
int diffInSeconds = GetPaymentEndTime() - GetPaymentStartTime();
int cycle = std::round((float)((float)diffInSeconds / (float)SECONDS_IN_ONE_MONTH));

return cycle;
}


int64_t CGovernanceObject::GetCurrentCycle()
{
int diffInSeconds = GetTime() - GetPaymentStartTime();
int cycle = std::ceil((float)((float)diffInSeconds / (float)SECONDS_IN_ONE_MONTH));

return cycle;
}


std::string CGovernanceObject::GetURL()
{
UniValue data;
data.read(this->GetDataAsPlainString());
UniValue url_data = find_value(data, "url");

if (url_data.isStr()) return url_data.get_str();

return "not a valid url";
}

int64_t CGovernanceObject::GetPaymentAmount()
{
UniValue data;
data.read(this->GetDataAsPlainString());
UniValue payment_amount = find_value(data, "payment_amount");
if (payment_amount.isNum()) return payment_amount.get_int();

return -1;
}

int CGovernanceObject::GetAbsoluteYesCount(vote_signal_enum_t eVoteSignalIn) const
{
return GetYesCount(eVoteSignalIn) - GetNoCount(eVoteSignalIn);
Expand Down
12 changes: 12 additions & 0 deletions src/governance/governance-object.h
Original file line number Diff line number Diff line change
Expand Up @@ -162,6 +162,18 @@ class CGovernanceObject

// Public Getter methods

int64_t GetPaymentStartTime();

int64_t GetPaymentEndTime();

int64_t GetPaymentAmount();

int64_t GetCycles();

int64_t GetCurrentCycle();

std::string GetURL();

int64_t GetCreationTime() const
{
return nTime;
Expand Down
8 changes: 8 additions & 0 deletions src/interfaces/node.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -443,6 +443,14 @@ class NodeImpl : public Node
fn(newList);
}));
}

std::unique_ptr<Handler> handleNotifyGovernanceListChanged(NotifyGovernanceListChangedFn fn) override
{
return MakeHandler(
::uiInterface.NotifyGovernanceListChanged_connect([fn](std::vector<const CGovernanceObject*> newList) {
fn(newList);
}));
}
std::unique_ptr<Handler> handleNotifyAdditionalDataSyncProgressChanged(NotifyAdditionalDataSyncProgressChangedFn fn) override
{
return MakeHandler(
Expand Down
7 changes: 7 additions & 0 deletions src/interfaces/node.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@ class RPCTimerInterface;
class UniValue;
class proxyType;
struct CNodeStateStats;
struct CGovernanceObject;

namespace interfaces {
class Handler;
Expand Down Expand Up @@ -325,6 +326,12 @@ class Node
std::function<void(const CDeterministicMNList& newList)>;
virtual std::unique_ptr<Handler> handleNotifyMasternodeListChanged(NotifyMasternodeListChangedFn fn) = 0;

//! Register handler for governance list update messages.
using NotifyGovernanceListChangedFn =
std::function<void(std::vector<const CGovernanceObject*> newList)>;
virtual std::unique_ptr<Handler> handleNotifyGovernanceListChanged(NotifyGovernanceListChangedFn fn) = 0;


//! Register handler for additional data sync progress update messages.
using NotifyAdditionalDataSyncProgressChangedFn =
std::function<void(double nSyncProgress)>;
Expand Down
18 changes: 18 additions & 0 deletions src/qt/bitcoingui.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
#include <interfaces/node.h>
#include <ui_interface.h>
#include <util/system.h>
#include <qt/governancelist.h>
#include <qt/masternodelist.h>

#include <iostream>
Expand Down Expand Up @@ -583,6 +584,14 @@ void BitcoinGUI::createToolBars()
masternodeButton->setEnabled(true);
}

if (settings.value("fShowGovernanceTab").toBool()) {
governanceButton = new QToolButton(this);
governanceButton->setText(tr("&Governance"));
governanceButton->setStatusTip(tr("Browse governance"));
tabGroup->addButton(governanceButton);
connect(governanceButton, &QToolButton::clicked, this, &BitcoinGUI::gotoGovernancePage);
}

connect(overviewButton, &QToolButton::clicked, this, &BitcoinGUI::gotoOverviewPage);
connect(sendCoinsButton, &QToolButton::clicked, [this]{ gotoSendCoinsPage(); });
connect(coinJoinCoinsButton, &QToolButton::clicked, [this]{ gotoCoinJoinCoinsPage(); });
Expand Down Expand Up @@ -1006,6 +1015,15 @@ void BitcoinGUI::gotoMasternodePage()
}
}

void BitcoinGUI::gotoGovernancePage()
{
QSettings settings;
if (settings.value("fShowGovernanceTab").toBool() && governanceButton) {
governanceButton->setChecked(true);
if (walletFrame) walletFrame->gotoGovernancePage();
}
}

void BitcoinGUI::gotoReceiveCoinsPage()
{
receiveCoinsButton->setChecked(true);
Expand Down
3 changes: 3 additions & 0 deletions src/qt/bitcoingui.h
Original file line number Diff line number Diff line change
Expand Up @@ -124,6 +124,7 @@ class BitcoinGUI : public QMainWindow
QToolButton* receiveCoinsButton = nullptr;
QToolButton* historyButton = nullptr;
QToolButton* masternodeButton = nullptr;
QToolButton* governanceButton = nullptr;
QAction* appToolBarLogoAction = nullptr;
QAction* quitAction = nullptr;
QAction* sendCoinsMenuAction = nullptr;
Expand Down Expand Up @@ -293,6 +294,8 @@ public Q_SLOTS:
void gotoHistoryPage();
/** Switch to masternode page */
void gotoMasternodePage();
/** Switch to governance page */
void gotoGovernancePage();
/** Switch to receive coins page */
void gotoReceiveCoinsPage();
/** Switch to send coins page */
Expand Down
28 changes: 26 additions & 2 deletions src/qt/clientmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,6 @@ ClientModel::~ClientModel()
int ClientModel::getNumConnections(unsigned int flags) const
{
CConnman::NumConnections connections = CConnman::CONNECTIONS_NONE;

Comment thread
daharkan marked this conversation as resolved.
Outdated
if(flags == CONNECTIONS_IN)
connections = CConnman::CONNECTIONS_IN;
else if (flags == CONNECTIONS_OUT)
Expand All @@ -83,6 +82,7 @@ void ClientModel::setMasternodeList(const CDeterministicMNList& mnList)
Q_EMIT masternodeListChanged();
}


CDeterministicMNList ClientModel::getMasternodeList() const
{
LOCK(cs_mnlinst);
Expand All @@ -95,6 +95,23 @@ void ClientModel::refreshMasternodeList()
setMasternodeList(m_node.evo().getListAtChainTip());
}


void ClientModel::setGovernanceList(std::vector<const CGovernanceObject*> list)
{
govListCached = list;
Q_EMIT governanceListChanged();
}


std::vector<const CGovernanceObject*> ClientModel::getGovernanceList()
{
// right now gets all the list. This may change
govListCached = governance.GetAllNewerThan(0);

return govListCached;
}


int ClientModel::getHeaderTipHeight() const
{
if (cachedBestHeaderHeight == -1) {
Expand Down Expand Up @@ -289,7 +306,12 @@ static void NotifyMasternodeListChanged(ClientModel *clientmodel, const CDetermi
clientmodel->setMasternodeList(newList);
}

static void NotifyAdditionalDataSyncProgressChanged(ClientModel *clientmodel, double nSyncProgress)
static void NotifyGovernanceListChanged(ClientModel *clientmodel, std::vector<const CGovernanceObject*> newList)
{
clientmodel->setGovernanceList(newList);
}

static void NotifyAdditionalDataSyncProgressChanged(ClientModel* clientmodel, double nSyncProgress)
{
QMetaObject::invokeMethod(clientmodel, "additionalDataSyncProgressChanged", Qt::QueuedConnection,
Q_ARG(double, nSyncProgress));
Expand All @@ -298,6 +320,7 @@ static void NotifyAdditionalDataSyncProgressChanged(ClientModel *clientmodel, do
void ClientModel::subscribeToCoreSignals()
{
// Connect signals to client

m_handler_show_progress = m_node.handleShowProgress(std::bind(ShowProgress, this, std::placeholders::_1, std::placeholders::_2));
m_handler_notify_num_connections_changed = m_node.handleNotifyNumConnectionsChanged(std::bind(NotifyNumConnectionsChanged, this, std::placeholders::_1));
m_handler_notify_network_active_changed = m_node.handleNotifyNetworkActiveChanged(std::bind(NotifyNetworkActiveChanged, this, std::placeholders::_1));
Expand All @@ -307,6 +330,7 @@ void ClientModel::subscribeToCoreSignals()
m_handler_notify_chainlock = m_node.handleNotifyChainLock(std::bind(NotifyChainLock, this, std::placeholders::_1, std::placeholders::_2));
m_handler_notify_header_tip = m_node.handleNotifyHeaderTip(std::bind(BlockTipChanged, this, std::placeholders::_1, std::placeholders::_2, std::placeholders::_3, std::placeholders::_4, std::placeholders::_5, true));
m_handler_notify_masternodelist_changed = m_node.handleNotifyMasternodeListChanged(std::bind(NotifyMasternodeListChanged, this, std::placeholders::_1));
m_handler_notify_masternodelist_changed = m_node.handleNotifyGovernanceListChanged(std::bind(NotifyGovernanceListChanged, this, std::placeholders::_1));
m_handler_notify_additional_data_sync_progess_changed = m_node.handleNotifyAdditionalDataSyncProgressChanged(std::bind(NotifyAdditionalDataSyncProgressChanged, this, std::placeholders::_1));
}

Expand Down
7 changes: 7 additions & 0 deletions src/qt/clientmodel.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@
#ifndef BITCOIN_QT_CLIENTMODEL_H
#define BITCOIN_QT_CLIENTMODEL_H

#include <governance/governance.h>
#include <interfaces/node.h>
#include <sync.h>

Expand Down Expand Up @@ -67,6 +68,9 @@ class ClientModel : public QObject
CDeterministicMNList getMasternodeList() const;
void refreshMasternodeList();

void setGovernanceList(std::vector<const CGovernanceObject*> list);
std::vector<const CGovernanceObject*> getGovernanceList();

//! Returns enum BlockSource of the current importing/syncing state
enum BlockSource getBlockSource() const;
//! Return warnings to be displayed in status bar
Expand Down Expand Up @@ -96,6 +100,7 @@ class ClientModel : public QObject
std::unique_ptr<interfaces::Handler> m_handler_notify_chainlock;
std::unique_ptr<interfaces::Handler> m_handler_notify_header_tip;
std::unique_ptr<interfaces::Handler> m_handler_notify_masternodelist_changed;
std::unique_ptr<interfaces::Handler> m_handler_notify_governancelist_changed;
std::unique_ptr<interfaces::Handler> m_handler_notify_additional_data_sync_progess_changed;
OptionsModel *optionsModel;
PeerTableModel *peerTableModel;
Expand All @@ -108,6 +113,7 @@ class ClientModel : public QObject
// representation of the list in UI during initial sync/reindex, so we cache it here too.
mutable CCriticalSection cs_mnlinst; // protects mnListCached
CDeterministicMNListPtr mnListCached;
std::vector<const CGovernanceObject*> govListCached;

void subscribeToCoreSignals();
void unsubscribeFromCoreSignals();
Expand All @@ -116,6 +122,7 @@ class ClientModel : public QObject
void numConnectionsChanged(int count);
void masternodeListChanged() const;
void chainLockChanged(const QString& bestChainLockHash, int bestChainLockHeight);
void governanceListChanged() const;
void numBlocksChanged(int count, const QDateTime& blockDate, const QString& blockHash, double nVerificationProgress, bool header);
void additionalDataSyncProgressChanged(double nSyncProgress);
void mempoolSizeChanged(long count, size_t mempoolSizeInBytes);
Expand Down
Loading