Merge pull request 'Nodes: double click to connect' (#251) from tobtoht/feather:nodes_doubleclick into master

Reviewed-on: https://git.wownero.com/feather/feather/pulls/251
This commit is contained in:
tobtoht 2020-12-23 01:44:19 +00:00
commit 4f62d52e5e
2 changed files with 63 additions and 88 deletions

View file

@ -18,10 +18,10 @@
#include "utils/nodes.h" #include "utils/nodes.h"
#include "mainwindow.h" #include "mainwindow.h"
NodeWidget::NodeWidget(QWidget *parent) : NodeWidget::NodeWidget(QWidget *parent)
QWidget(parent), : QWidget(parent)
ui(new Ui::NodeWidget), , ui(new Ui::NodeWidget)
m_contextMenu(new QMenu(this)) { {
ui->setupUi(this); ui->setupUi(this);
connect(ui->btn_add_custom, &QPushButton::clicked, this, &NodeWidget::onCustomAddClicked); connect(ui->btn_add_custom, &QPushButton::clicked, this, &NodeWidget::onCustomAddClicked);
@ -35,112 +35,91 @@ NodeWidget::NodeWidget(QWidget *parent) :
} }
}); });
m_contextActionRemove = new QAction("Remove", this);
m_contextActionConnect = new QAction(QIcon(":/assets/images/connect.svg"), "Connect to node", this);
m_contextActionOpenStatusURL = new QAction(QIcon(":/assets/images/network.png"), "Visit status page", this);
m_contextActionCopy = new QAction(QIcon(":/assets/images/copy.png"), "Copy", this);
connect(m_contextActionConnect, &QAction::triggered, this, &NodeWidget::onContextConnect);
connect(m_contextActionRemove, &QAction::triggered, this, &NodeWidget::onContextCustomNodeRemove);
connect(m_contextActionOpenStatusURL, &QAction::triggered, this, &NodeWidget::onContextStatusURL);
connect(m_contextActionCopy, &QAction::triggered, this, &NodeWidget::onContextNodeCopy);
connect(m_contextActionRemove, &QAction::triggered, this, &NodeWidget::onContextCustomNodeRemove);
ui->wsView->setContextMenuPolicy(Qt::CustomContextMenu); ui->wsView->setContextMenuPolicy(Qt::CustomContextMenu);
ui->customView->setContextMenuPolicy(Qt::CustomContextMenu); ui->customView->setContextMenuPolicy(Qt::CustomContextMenu);
connect(ui->wsView, &QTreeView::customContextMenuRequested, this, &NodeWidget::onShowWSContextMenu); connect(ui->wsView, &QTreeView::customContextMenuRequested, this, &NodeWidget::onShowWSContextMenu);
connect(ui->customView, &QTreeView::customContextMenuRequested, this, &NodeWidget::onShowCustomContextMenu); connect(ui->customView, &QTreeView::customContextMenuRequested, this, &NodeWidget::onShowCustomContextMenu);
connect(ui->customView, &QTreeView::doubleClicked, this, &NodeWidget::onContextConnect);
connect(ui->wsView, &QTreeView::doubleClicked, this, &NodeWidget::onContextConnect);
} }
void NodeWidget::onShowWSContextMenu(const QPoint &pos) { void NodeWidget::onShowWSContextMenu(const QPoint &pos) {
QModelIndex index = ui->wsView->indexAt(pos); m_activeView = ui->wsView;
if (!index.isValid()) return; FeatherNode node = this->selectedNode();
if (node.full.isEmpty()) return;
FeatherNode node = m_wsModel->node(index.row());
this->showContextMenu(pos, node); this->showContextMenu(pos, node);
} }
void NodeWidget::onShowCustomContextMenu(const QPoint &pos) { void NodeWidget::onShowCustomContextMenu(const QPoint &pos) {
QModelIndex index = ui->customView->indexAt(pos); m_activeView = ui->customView;
if (!index.isValid()) return; FeatherNode node = this->selectedNode();
if (node.full.isEmpty()) return;
FeatherNode node = m_customModel->node(index.row());
this->showContextMenu(pos, node); this->showContextMenu(pos, node);
} }
void NodeWidget::showContextMenu(const QPoint &pos, const FeatherNode &node) { void NodeWidget::showContextMenu(const QPoint &pos, const FeatherNode &node) {
bool custom = node.custom; QMenu menu(this);
m_activeView = custom ? ui->customView : ui->wsView;
m_contextActionRemove = new QAction("Remove"); if (!node.isActive) {
m_contextActionConnect = new QAction("Connect to node"); menu.addAction(m_contextActionConnect);
m_contextActionConnect->setIcon(QIcon(":/assets/images/connect.svg"));
m_contextActionOpenStatusURL = new QAction("Visit status page");
m_contextActionOpenStatusURL->setIcon(QIcon(":/assets/images/network.png"));
m_contextActionCopy = new QAction("Copy");
m_contextActionCopy->setIcon(QIcon(":/assets/images/copy.png"));
if(!node.isActive) {
connect(m_contextActionConnect, &QAction::triggered, this, &NodeWidget::onContextConnect);
m_contextMenu->addAction(m_contextActionConnect);
} }
m_contextMenu->addAction(m_contextActionOpenStatusURL); menu.addAction(m_contextActionOpenStatusURL);
m_contextMenu->addAction(m_contextActionCopy); menu.addAction(m_contextActionCopy);
if(custom) { if (m_activeView == ui->customView)
connect(m_contextActionRemove, &QAction::triggered, this, &NodeWidget::onContextCustomNodeRemove); menu.addAction(m_contextActionRemove);
m_contextMenu->addAction(m_contextActionRemove);
connect(m_contextActionOpenStatusURL, &QAction::triggered, this, &NodeWidget::onContextCustomStatusURL); menu.exec(m_activeView->viewport()->mapToGlobal(pos));
connect(m_contextActionCopy, &QAction::triggered, this, &NodeWidget::onContextCustomNodeCopy);
} else {
connect(m_contextActionOpenStatusURL, &QAction::triggered, this, &NodeWidget::onContextWSStatusURL);
connect(m_contextActionCopy, &QAction::triggered, this, &NodeWidget::onContextWSNodeCopy);
}
m_contextMenu->exec(m_activeView->viewport()->mapToGlobal(pos));
m_contextActionRemove->deleteLater();
m_contextActionConnect->deleteLater();
m_contextActionOpenStatusURL->deleteLater();
m_contextActionCopy->deleteLater();
} }
void NodeWidget::onContextConnect() { void NodeWidget::onContextConnect() {
QObject *obj = sender();
if (obj == ui->customView)
m_activeView = ui->customView;
else
m_activeView = ui->wsView;
FeatherNode node = this->selectedNode();
if (!node.full.isEmpty())
emit connectToNode(node);
}
void NodeWidget::onContextStatusURL() {
FeatherNode node = this->selectedNode();
if (!node.full.isEmpty())
Utils::externalLinkWarning(this, node.as_url());
}
void NodeWidget::onContextNodeCopy() {
FeatherNode node = this->selectedNode();
Utils::copyToClipboard(node.full);
}
FeatherNode NodeWidget::selectedNode() {
QModelIndex index = m_activeView->currentIndex(); QModelIndex index = m_activeView->currentIndex();
if (!index.isValid()) return; if (!index.isValid()) return FeatherNode();
if(m_activeView->objectName() == "wsView"){ FeatherNode node;
FeatherNode node = m_wsModel->node(index.row()); if (m_activeView == ui->customView) {
emit connectToNode(node); node = m_customModel->node(index.row());
} else { } else {
FeatherNode node = m_customModel->node(index.row()); node = m_wsModel->node(index.row());
emit connectToNode(node);
} }
} return node;
void NodeWidget::onContextWSStatusURL() {
QModelIndex index = ui->wsView->currentIndex();
if (!index.isValid()) return;
FeatherNode node = m_wsModel->node(index.row());
Utils::externalLinkWarning(this, node.as_url());
}
void NodeWidget::onContextCustomStatusURL() {
QModelIndex index = ui->customView->currentIndex();
if (!index.isValid()) return;
FeatherNode node = m_customModel->node(index.row());
Utils::externalLinkWarning(this, node.as_url());
}
void NodeWidget::onContextDisconnect() {
QModelIndex index = ui->customView->currentIndex();
if (!index.isValid()) return;
FeatherNode node = m_customModel->node(index.row());
Utils::copyToClipboard(node.full);
}
void NodeWidget::onContextWSNodeCopy() {
QModelIndex index = ui->wsView->currentIndex();
if (!index.isValid()) return;
FeatherNode node = m_wsModel->node(index.row());
Utils::copyToClipboard(node.full);
}
void NodeWidget::onContextCustomNodeCopy() {
} }
void NodeWidget::onContextCustomNodeRemove() { void NodeWidget::onContextCustomNodeRemove() {

View file

@ -35,12 +35,9 @@ public slots:
private slots: private slots:
void onContextConnect(); void onContextConnect();
void onContextDisconnect();
void onContextCustomNodeRemove(); void onContextCustomNodeRemove();
void onContextWSStatusURL(); void onContextStatusURL();
void onContextCustomStatusURL(); void onContextNodeCopy();
void onContextWSNodeCopy();
void onContextCustomNodeCopy();
signals: signals:
void connectToNode(FeatherNode node); void connectToNode(FeatherNode node);
@ -54,14 +51,13 @@ private:
QTreeView *m_activeView; QTreeView *m_activeView;
QMenu *m_contextMenu;
QAction *m_contextActionConnect; QAction *m_contextActionConnect;
QAction *m_contextActionDisconnect;
QAction *m_contextActionRemove; QAction *m_contextActionRemove;
QAction *m_contextActionOpenStatusURL; QAction *m_contextActionOpenStatusURL;
QAction *m_contextActionCopy; QAction *m_contextActionCopy;
void showContextMenu(const QPoint &pos, const FeatherNode &node); void showContextMenu(const QPoint &pos, const FeatherNode &node);
FeatherNode selectedNode();
}; };
#endif // NODEWIDGET_H #endif // NODEWIDGET_H