summaryrefslogtreecommitdiffstats
path: root/pica-client
diff options
context:
space:
mode:
Diffstat (limited to 'pica-client')
-rw-r--r--pica-client/dialogs/nodesdialog.cpp48
-rw-r--r--pica-client/dialogs/nodesdialog.h4
-rw-r--r--pica-client/nodes.cpp12
-rw-r--r--pica-client/nodes.h1
4 files changed, 65 insertions, 0 deletions
diff --git a/pica-client/dialogs/nodesdialog.cpp b/pica-client/dialogs/nodesdialog.cpp
index 6b4ce74..2a3eb86 100644
--- a/pica-client/dialogs/nodesdialog.cpp
+++ b/pica-client/dialogs/nodesdialog.cpp
@@ -25,6 +25,9 @@
#include <QHBoxLayout>
#include <QListWidget>
#include <QMenu>
+#include <QRegExp>
+#include <QMessageBox>
+#include <QInputDialog>
NodesDialog::NodesDialog(QWidget *parent) :
QDialog(parent)
@@ -32,12 +35,17 @@ NodesDialog::NodesDialog(QWidget *parent) :
Nodes nodes(config_dbname);
lwNodes = new QListWidget(this);
pbOk = new QPushButton(tr("OK"), this);
+ pbAdd = new QPushButton(tr("Add"), this);
+ pbDelete = new QPushButton(tr("Delete"), this);
QHBoxLayout *lh = new QHBoxLayout(this);
QVBoxLayout *lv = new QVBoxLayout();
lh->addWidget(lwNodes, 4, Qt::AlignLeft);
+ lv->addWidget(pbAdd, 0, Qt::AlignTop);
+ lv->addWidget(pbDelete, 0, Qt::AlignTop);
lv->addWidget(pbOk, 0, Qt::AlignTop);
+ lv->addStretch();
lh->addLayout(lv, 0);
setLayout(lh);
@@ -51,6 +59,8 @@ NodesDialog::NodesDialog(QWidget *parent) :
}
connect(pbOk, SIGNAL(clicked()), this, SLOT(OK()));
+ connect(pbDelete, SIGNAL(clicked()), this, SLOT(Delete()));
+ connect(pbAdd, SIGNAL(clicked()), this, SLOT(Add()));
setWindowTitle(tr("Known nodes"));
}
@@ -59,3 +69,41 @@ void NodesDialog::OK()
{
done(0);
}
+
+void NodesDialog::Add()
+{
+ QRegExp rx("(.+):(\\d{1,5})");
+ bool ok;
+ QString input = QInputDialog::getText(this, tr("Add New Node"),
+ tr("hostname:port (ex. picanode.example:com:2299 1.2.3.4:1234)"), QLineEdit::Normal, NULL, &ok);
+
+ if (ok && rx.exactMatch(input))
+ {
+ Nodes nodes(config_dbname);
+ Nodes::NodeRecord nr;
+
+ nr.address = rx.cap(1);
+ nr.port = rx.cap(2).toUInt();
+
+ nodes.Add(nr);
+ new QListWidgetItem(nr.address.append(':').append(QString::number(nr.port)), lwNodes);
+ }
+}
+
+void NodesDialog::Delete()
+{
+ if (lwNodes->currentItem())
+ {
+ Nodes nodes(config_dbname);
+ Nodes::NodeRecord nr;
+ QRegExp rx("(.+):(\\d{1,5})");
+
+ if (rx.exactMatch(lwNodes->currentItem()->text()))
+ {
+ nr.address = rx.cap(1);
+ nr.port = rx.cap(2).toUInt();
+ nodes.Delete(nr);
+ delete lwNodes->takeItem(lwNodes->currentRow());
+ }
+ }
+}
diff --git a/pica-client/dialogs/nodesdialog.h b/pica-client/dialogs/nodesdialog.h
index 35ecbe8..8eca10d 100644
--- a/pica-client/dialogs/nodesdialog.h
+++ b/pica-client/dialogs/nodesdialog.h
@@ -34,10 +34,14 @@ signals:
public slots:
private slots:
void OK();
+ void Delete();
+ void Add();
private:
QListWidget *lwNodes;
QPushButton *pbOk;
+ QPushButton *pbDelete;
+ QPushButton *pbAdd;
};
#endif // NODESDIALOG_H
diff --git a/pica-client/nodes.cpp b/pica-client/nodes.cpp
index 983bb56..1c7fae0 100644
--- a/pica-client/nodes.cpp
+++ b/pica-client/nodes.cpp
@@ -42,6 +42,18 @@ void Nodes::Add(NodeRecord &n)
lasterr = query.lastError();
}
+void Nodes::Delete(NodeRecord &n)
+{
+ QSqlQuery query;
+
+ query.prepare("delete from nodes where address = :addr and port = :port");
+ query.bindValue(":addr", n.address);
+ query.bindValue(":port", n.port);
+ query.exec();
+
+ lasterr = query.lastError();
+}
+
QList<Nodes::NodeRecord> Nodes::GetNodes()
{
QList<NodeRecord> L;
diff --git a/pica-client/nodes.h b/pica-client/nodes.h
index 3ddca51..e15988b 100644
--- a/pica-client/nodes.h
+++ b/pica-client/nodes.h
@@ -34,6 +34,7 @@ public:
Nodes(QString storage);
void Add(NodeRecord &n);
+ void Delete(NodeRecord &n);
QList<NodeRecord> GetNodes();
void MakeClean();//remove old inactive node records
void UpdateStatus(NodeRecord &n, bool alive);