implement options model, show current options in options dialog
authorWladimir J. van der Laan <laanwj@gmail.com>
Tue, 31 May 2011 20:24:53 +0000 (22:24 +0200)
committerWladimir J. van der Laan <laanwj@gmail.com>
Tue, 31 May 2011 20:24:53 +0000 (22:24 +0200)
bitcoin.pro
gui/include/clientmodel.h
gui/include/mainoptionspage.h
gui/include/optionsdialog.h
gui/include/optionsmodel.h [new file with mode: 0644]
gui/src/bitcoingui.cpp
gui/src/clientmodel.cpp
gui/src/mainoptionspage.cpp
gui/src/optionsdialog.cpp
gui/src/optionsmodel.cpp [new file with mode: 0644]
gui/src/sendcoinsdialog.cpp

index 49574d6..5383563 100644 (file)
@@ -60,7 +60,8 @@ HEADERS += gui/include/bitcoingui.h \
     gui/include/clientmodel.h \
     gui/include/guiutil.h \
     gui/include/transactionrecord.h \
-    gui/include/guiconstants.h
+    gui/include/guiconstants.h \
+    gui/include/optionsmodel.h
 SOURCES += gui/src/bitcoin.cpp gui/src/bitcoingui.cpp \
     gui/src/transactiontablemodel.cpp \
     gui/src/addresstablemodel.cpp \
@@ -86,7 +87,8 @@ SOURCES += gui/src/bitcoin.cpp gui/src/bitcoingui.cpp \
     json/src/json_spirit_reader.cpp \
     gui/src/clientmodel.cpp \
     gui/src/guiutil.cpp \
-    gui/src/transactionrecord.cpp
+    gui/src/transactionrecord.cpp \
+    gui/src/optionsmodel.cpp
 
 RESOURCES += \
     gui/bitcoin.qrc
index 828c80f..44f1c0a 100644 (file)
@@ -2,6 +2,7 @@
 #define CLIENTMODEL_H
 
 #include <QObject>
+class OptionsModel;
 
 class ClientModel : public QObject
 {
@@ -20,6 +21,8 @@ public:
         MiscError
     };
 
+    OptionsModel *getOptionsModel();
+
     qint64 getBalance();
     QString getAddress();
     int getNumConnections();
@@ -29,6 +32,8 @@ public:
     qint64 getTransactionFee();
 
     StatusCode sendCoins(const QString &payTo, qint64 payAmount);
+private:
+    OptionsModel *options_model;
 
 signals:
     void balanceChanged(qint64 balance);
index de2ef9f..4ef5e60 100644 (file)
@@ -3,11 +3,30 @@
 
 #include <QWidget>
 
+QT_BEGIN_NAMESPACE
+class QDataWidgetMapper;
+class QCheckBox;
+class QLineEdit;
+QT_END_NAMESPACE
+
+class OptionsModel;
+
 class MainOptionsPage : public QWidget
 {
     Q_OBJECT
 public:
-    explicit MainOptionsPage(QWidget *parent = 0);
+    explicit MainOptionsPage(QWidget *parent=0);
+
+    void setMapper(QDataWidgetMapper *mapper);
+private:
+    QCheckBox *bitcoin_at_startup;
+    QCheckBox *minimize_to_tray;
+    QCheckBox *map_port_upnp;
+    QCheckBox *minimize_on_close;
+    QCheckBox *connect_socks4;
+    QLineEdit *proxy_ip;
+    QLineEdit *proxy_port;
+    QLineEdit *fee_edit;
 
 signals:
 
index 501c82e..c064b0a 100644 (file)
@@ -7,13 +7,18 @@ QT_BEGIN_NAMESPACE
 class QStackedWidget;
 class QListWidget;
 class QListWidgetItem;
+class QDataWidgetMapper;
 QT_END_NAMESPACE
+class OptionsModel;
+class MainOptionsPage;
 
 class OptionsDialog : public QDialog
 {
     Q_OBJECT
 public:
-    explicit OptionsDialog(QWidget *parent = 0);
+    explicit OptionsDialog(QWidget *parent=0);
+
+    void setModel(OptionsModel *model);
 
 signals:
 
@@ -22,6 +27,9 @@ public slots:
 private:
     QListWidget *contents_widget;
     QStackedWidget *pages_widget;
+    MainOptionsPage *main_options_page;
+    OptionsModel *model;
+    QDataWidgetMapper *mapper;
 
     void setupMainPage();
 };
diff --git a/gui/include/optionsmodel.h b/gui/include/optionsmodel.h
new file mode 100644 (file)
index 0000000..4dd21c7
--- /dev/null
@@ -0,0 +1,34 @@
+#ifndef OPTIONSMODEL_H
+#define OPTIONSMODEL_H
+
+#include <QAbstractListModel>
+
+class OptionsModel : public QAbstractListModel
+{
+    Q_OBJECT
+public:
+    explicit OptionsModel(QObject *parent = 0);
+
+    enum OptionID {
+        StartAtStartup,
+        MinimizeToTray,
+        MapPortUPnP,
+        MinimizeOnClose,
+        ConnectSOCKS4,
+        ProxyIP,
+        ProxyPort,
+        Fee,
+        OptionIDRowCount
+    };
+
+    int rowCount(const QModelIndex & parent = QModelIndex()) const;
+    QVariant data(const QModelIndex & index, int role = Qt::DisplayRole) const;
+    bool setData(const QModelIndex & index, const QVariant & value, int role = Qt::EditRole);
+
+signals:
+
+public slots:
+
+};
+
+#endif // OPTIONSMODEL_H
index 66a3edd..6689122 100644 (file)
@@ -256,6 +256,7 @@ void BitcoinGUI::receivingAddressesClicked()
 void BitcoinGUI::optionsClicked()
 {
     OptionsDialog dlg;
+    dlg.setModel(model->getOptionsModel());
     dlg.exec();
 }
 
index be8b0b4..3582472 100644 (file)
@@ -1,11 +1,12 @@
 #include "clientmodel.h"
 #include "main.h"
 #include "guiconstants.h"
+#include "optionsmodel.h"
 
 #include <QTimer>
 
 ClientModel::ClientModel(QObject *parent) :
-    QObject(parent)
+    QObject(parent), options_model(0)
 {
     /* Until we build signal notifications into the bitcoin core,
        simply update everything using a timer.
@@ -13,6 +14,8 @@ ClientModel::ClientModel(QObject *parent) :
     QTimer *timer = new QTimer(this);
     connect(timer, SIGNAL(timeout()), this, SLOT(update()));
     timer->start(MODEL_UPDATE_DELAY);
+
+    options_model = new OptionsModel(this);
 }
 
 qint64 ClientModel::getBalance()
@@ -112,3 +115,7 @@ ClientModel::StatusCode ClientModel::sendCoins(const QString &payTo, qint64 payA
     return OK;
 }
 
+OptionsModel *ClientModel::getOptionsModel()
+{
+    return options_model;
+}
index 021e1e4..3d69bae 100644 (file)
@@ -1,42 +1,45 @@
 #include "mainoptionspage.h"
+#include "optionsmodel.h"
 
 #include <QHBoxLayout>
 #include <QVBoxLayout>
 #include <QCheckBox>
 #include <QLabel>
 #include <QLineEdit>
+#include <QDataWidgetMapper>
+#include <QDebug>
 
 MainOptionsPage::MainOptionsPage(QWidget *parent):
         QWidget(parent)
 {
     QVBoxLayout *layout = new QVBoxLayout();
 
-    QCheckBox *bitcoin_at_startup = new QCheckBox(tr("&Start Bitcoin on window system startup"));
+    bitcoin_at_startup = new QCheckBox(tr("&Start Bitcoin on window system startup"));
     layout->addWidget(bitcoin_at_startup);
 
-    QCheckBox *minimize_to_tray = new QCheckBox(tr("&Minimize to the tray instead of the taskbar"));
+    minimize_to_tray = new QCheckBox(tr("&Minimize to the tray instead of the taskbar"));
     layout->addWidget(minimize_to_tray);
 
-    QCheckBox *map_port_upnp = new QCheckBox(tr("Map port using &UPnP"));
+    map_port_upnp = new QCheckBox(tr("Map port using &UPnP"));
     layout->addWidget(map_port_upnp);
 
-    QCheckBox *minimize_on_close = new QCheckBox(tr("M&inimize on close"));
+    minimize_on_close = new QCheckBox(tr("M&inimize on close"));
     layout->addWidget(minimize_on_close);
 
-    QCheckBox *connect_socks4 = new QCheckBox(tr("&Connect through socks4 proxy:"));
+    connect_socks4 = new QCheckBox(tr("&Connect through socks4 proxy:"));
     layout->addWidget(connect_socks4);
 
     QHBoxLayout *proxy_hbox = new QHBoxLayout();
     proxy_hbox->addSpacing(18);
     QLabel *proxy_ip_label = new QLabel(tr("Proxy &IP: "));
     proxy_hbox->addWidget(proxy_ip_label);
-    QLineEdit *proxy_ip = new QLineEdit();
+    proxy_ip = new QLineEdit();
     proxy_ip->setMaximumWidth(140);
     proxy_ip_label->setBuddy(proxy_ip);
     proxy_hbox->addWidget(proxy_ip);
     QLabel *proxy_port_label = new QLabel(tr("&Port: "));
     proxy_hbox->addWidget(proxy_port_label);
-    QLineEdit *proxy_port = new QLineEdit();
+    proxy_port = new QLineEdit();
     proxy_port->setMaximumWidth(55);
     proxy_port_label->setBuddy(proxy_port);
     proxy_hbox->addWidget(proxy_port);
@@ -51,7 +54,7 @@ MainOptionsPage::MainOptionsPage(QWidget *parent):
     fee_hbox->addSpacing(18);
     QLabel *fee_label = new QLabel(tr("Pay transaction &fee"));
     fee_hbox->addWidget(fee_label);
-    QLineEdit *fee_edit = new QLineEdit();
+    fee_edit = new QLineEdit();
     fee_edit->setMaximumWidth(70);
     fee_label->setBuddy(fee_edit);
     fee_hbox->addWidget(fee_edit);
@@ -59,9 +62,21 @@ MainOptionsPage::MainOptionsPage(QWidget *parent):
 
     layout->addLayout(fee_hbox);
 
-
     layout->addStretch(1); /* Extra space at bottom */
 
     setLayout(layout);
 }
 
+void MainOptionsPage::setMapper(QDataWidgetMapper *mapper)
+{
+    /* Map model to widgets */
+    mapper->addMapping(bitcoin_at_startup, OptionsModel::StartAtStartup);
+    mapper->addMapping(minimize_to_tray, OptionsModel::MinimizeToTray);
+    mapper->addMapping(map_port_upnp, OptionsModel::MapPortUPnP);
+    mapper->addMapping(minimize_on_close, OptionsModel::MinimizeOnClose);
+    mapper->addMapping(connect_socks4, OptionsModel::ConnectSOCKS4);
+    mapper->addMapping(proxy_ip, OptionsModel::ProxyIP);
+    mapper->addMapping(proxy_port, OptionsModel::ProxyPort);
+    mapper->addMapping(fee_edit, OptionsModel::Fee);
+}
+
index 70dd863..e1f3d67 100644 (file)
@@ -1,4 +1,5 @@
 #include "optionsdialog.h"
+#include "optionsmodel.h"
 #include "mainoptionspage.h"
 
 #include <QHBoxLayout>
@@ -6,9 +7,11 @@
 #include <QPushButton>
 #include <QListWidget>
 #include <QStackedWidget>
+#include <QDataWidgetMapper>
 
-OptionsDialog::OptionsDialog(QWidget *parent) :
-    QDialog(parent), contents_widget(0), pages_widget(0)
+OptionsDialog::OptionsDialog(QWidget *parent):
+    QDialog(parent), contents_widget(0), pages_widget(0),
+    main_options_page(0), model(0)
 {
     contents_widget = new QListWidget();
     contents_widget->setMaximumWidth(128);
@@ -18,7 +21,8 @@ OptionsDialog::OptionsDialog(QWidget *parent) :
 
     QListWidgetItem *item_main = new QListWidgetItem(tr("Main"));
     contents_widget->addItem(item_main);
-    pages_widget->addWidget(new MainOptionsPage(this));
+    main_options_page = new MainOptionsPage(this);
+    pages_widget->addWidget(main_options_page);
 
     contents_widget->setCurrentRow(0);
 
@@ -40,11 +44,22 @@ OptionsDialog::OptionsDialog(QWidget *parent) :
 
     layout->addLayout(buttons);
 
-
     setLayout(layout);
     setWindowTitle(tr("Options"));
 
+    mapper = new QDataWidgetMapper();
+    mapper->setSubmitPolicy(QDataWidgetMapper::ManualSubmit);
+    mapper->setOrientation(Qt::Vertical);
+}
+
+void OptionsDialog::setModel(OptionsModel *model)
+{
+    this->model = model;
+
+    mapper->setModel(model);
+    main_options_page->setMapper(mapper);
 
+    mapper->toFirst();
 }
 
 void OptionsDialog::changePage(QListWidgetItem *current, QListWidgetItem *previous)
diff --git a/gui/src/optionsmodel.cpp b/gui/src/optionsmodel.cpp
new file mode 100644 (file)
index 0000000..25c7366
--- /dev/null
@@ -0,0 +1,52 @@
+#include "optionsmodel.h"
+#include "main.h"
+
+#include <QDebug>
+
+OptionsModel::OptionsModel(QObject *parent) :
+    QAbstractListModel(parent)
+{
+}
+
+int OptionsModel::rowCount(const QModelIndex & parent) const
+{
+    return OptionIDRowCount;
+}
+
+QVariant OptionsModel::data(const QModelIndex & index, int role) const
+{
+    qDebug() << "OptionsModel::data" << " " << index.row() << " " << role;
+    if(role == Qt::EditRole)
+    {
+        /* Delegate to specific column handlers */
+        switch(index.row())
+        {
+        case StartAtStartup:
+            return QVariant();
+        case MinimizeToTray:
+            return QVariant(fMinimizeToTray);
+        case MapPortUPnP:
+            return QVariant(fUseUPnP);
+        case MinimizeOnClose:
+            return QVariant(fMinimizeOnClose);
+        case ConnectSOCKS4:
+            return QVariant(fUseProxy);
+        case ProxyIP:
+            return QVariant(QString::fromStdString(addrProxy.ToStringIP()));
+        case ProxyPort:
+            return QVariant(QString::fromStdString(addrProxy.ToStringPort()));
+        case Fee:
+            return QVariant(QString::fromStdString(FormatMoney(nTransactionFee)));
+        default:
+            return QVariant();
+        }
+    }
+    return QVariant();
+}
+
+bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, int role)
+{
+    qDebug() << "OptionsModel::setData" << " " << index.row() << "=" << value;
+    emit dataChanged(index, index);
+    return true;
+}
index 398e236..9040d21 100644 (file)
@@ -90,9 +90,10 @@ void SendCoinsDialog::on_sendButton_clicked()
             QMessageBox::Ok, QMessageBox::Ok);
         ui->payAmount->setFocus();
         break;
+    case ClientModel::OK:
+        accept();
+        break;
     }
-    /* TODO: send command to core, once this succeeds do accept() */
-    //accept();
 }
 
 void SendCoinsDialog::on_pasteButton_clicked()