Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Organize optionsdialog (split off Window and Network page) and add option to change language #1220

Merged
merged 2 commits into from
May 9, 2012
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
289 changes: 194 additions & 95 deletions src/qt/optionsdialog.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -19,73 +19,103 @@
#include <QDoubleValidator>
#include <QRegExpValidator>
#include <QDialogButtonBox>
#include <QDir>
#include <QMessageBox>

/* First page of options */
class MainOptionsPage : public QWidget
class OptionsPage: public QWidget
{
Q_OBJECT
public:
explicit OptionsPage(QWidget *parent=0): QWidget(parent) {}

virtual void setMapper(MonitoredDataMapper *mapper) = 0;
};

class MainOptionsPage: public OptionsPage
{
Q_OBJECT
public:
explicit MainOptionsPage(QWidget *parent=0);

void setMapper(MonitoredDataMapper *mapper);
virtual void setMapper(MonitoredDataMapper *mapper);
private:
QCheckBox *detach_database;
BitcoinAmountField *fee_edit;
};

class WindowOptionsPage: public OptionsPage
{
Q_OBJECT
public:
explicit WindowOptionsPage(QWidget *parent=0);

virtual void setMapper(MonitoredDataMapper *mapper);
private:
QCheckBox *bitcoin_at_startup;
#ifndef Q_WS_MAC
QCheckBox *minimize_to_tray;
#endif
QCheckBox *map_port_upnp;
#ifndef Q_WS_MAC
QCheckBox *minimize_on_close;
#endif
QCheckBox *connect_socks4;
QCheckBox *detach_database;
QLineEdit *proxy_ip;
QLineEdit *proxy_port;
BitcoinAmountField *fee_edit;

signals:

public slots:

};

class DisplayOptionsPage : public QWidget
class DisplayOptionsPage: public OptionsPage
{
Q_OBJECT
public:
explicit DisplayOptionsPage(QWidget *parent=0);

void setMapper(MonitoredDataMapper *mapper);
virtual void setMapper(MonitoredDataMapper *mapper);
private:
QValueComboBox *lang;
QValueComboBox *unit;
QCheckBox *display_addresses;
signals:
bool restart_warning_displayed;
private slots:
void showRestartWarning();
};

public slots:
class NetworkOptionsPage: public OptionsPage
{
Q_OBJECT
public:
explicit NetworkOptionsPage(QWidget *parent=0);

virtual void setMapper(MonitoredDataMapper *mapper);
private:
QCheckBox *map_port_upnp;
QCheckBox *connect_socks4;
QLineEdit *proxy_ip;
QLineEdit *proxy_port;
BitcoinAmountField *fee_edit;
};


#include "optionsdialog.moc"

OptionsDialog::OptionsDialog(QWidget *parent):
QDialog(parent), contents_widget(0), pages_widget(0),
model(0), main_page(0), display_page(0)
model(0)
{
contents_widget = new QListWidget();
contents_widget->setMaximumWidth(128);

pages_widget = new QStackedWidget();
pages_widget->setMinimumWidth(300);
pages_widget->setMinimumWidth(500);
pages_widget->setMinimumHeight(300);

QListWidgetItem *item_main = new QListWidgetItem(tr("Main"));
contents_widget->addItem(item_main);
main_page = new MainOptionsPage(this);
pages_widget->addWidget(main_page);
pages.append(new MainOptionsPage(this));
pages.append(new NetworkOptionsPage(this));
pages.append(new WindowOptionsPage(this));
pages.append(new DisplayOptionsPage(this));

QListWidgetItem *item_display = new QListWidgetItem(tr("Display"));
contents_widget->addItem(item_display);
display_page = new DisplayOptionsPage(this);
pages_widget->addWidget(display_page);
foreach(OptionsPage *page, pages)
{
QListWidgetItem *item = new QListWidgetItem(page->windowTitle());
contents_widget->addItem(item);
pages_widget->addWidget(page);
}

contents_widget->setCurrentRow(0);

Expand Down Expand Up @@ -125,8 +155,11 @@ void OptionsDialog::setModel(OptionsModel *model)
this->model = model;

mapper->setModel(model);
main_page->setMapper(mapper);
display_page->setMapper(mapper);

foreach(OptionsPage *page, pages)
{
page->setMapper(mapper);
}

mapper->toFirst();
}
Expand Down Expand Up @@ -163,10 +196,116 @@ void OptionsDialog::disableApply()
apply_button->setEnabled(false);
}

/* Main options */
MainOptionsPage::MainOptionsPage(QWidget *parent):
QWidget(parent)
OptionsPage(parent)
{
QVBoxLayout *layout = new QVBoxLayout();
setWindowTitle(tr("Main"));

QLabel *fee_help = new QLabel(tr("Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended."));
fee_help->setWordWrap(true);
layout->addWidget(fee_help);

QHBoxLayout *fee_hbox = new QHBoxLayout();
fee_hbox->addSpacing(18);
QLabel *fee_label = new QLabel(tr("Pay transaction &fee"));
fee_hbox->addWidget(fee_label);
fee_edit = new BitcoinAmountField();

fee_label->setBuddy(fee_edit);
fee_hbox->addWidget(fee_edit);
fee_hbox->addStretch(1);

layout->addLayout(fee_hbox);

detach_database = new QCheckBox(tr("Detach databases at shutdown"));
detach_database->setToolTip(tr("Detach block and address databases at shutdown. This means they can be moved to another data directory, but it slows down shutdown. The wallet is always detached."));
layout->addWidget(detach_database);

layout->addStretch(1); // Extra space at bottom
setLayout(layout);
}

void MainOptionsPage::setMapper(MonitoredDataMapper *mapper)
{
// Map model to widgets
mapper->addMapping(fee_edit, OptionsModel::Fee);
mapper->addMapping(detach_database, OptionsModel::DetachDatabases);
}

/* Display options */
DisplayOptionsPage::DisplayOptionsPage(QWidget *parent):
OptionsPage(parent), restart_warning_displayed(false)
{
setWindowTitle(tr("Display"));

QVBoxLayout *layout = new QVBoxLayout();

QHBoxLayout *lang_hbox = new QHBoxLayout();
lang_hbox->addSpacing(18);
QLabel *lang_label = new QLabel(tr("User Interface &Language: "));
lang_hbox->addWidget(lang_label);
lang = new QValueComboBox(this);
// Make list of languages
QDir translations(":translations");
lang->addItem("(default)", QVariant(""));
foreach(const QString &langStr, translations.entryList())
{
lang->addItem(langStr, QVariant(langStr));
}

lang->setToolTip(tr("The user interface language can be set here. This setting will only take effect after restarting Bitcoin."));
connect(lang, SIGNAL(activated(int)), this, SLOT(showRestartWarning()));

lang_label->setBuddy(lang);
lang_hbox->addWidget(lang);

layout->addLayout(lang_hbox);

QHBoxLayout *unit_hbox = new QHBoxLayout();
unit_hbox->addSpacing(18);
QLabel *unit_label = new QLabel(tr("&Unit to show amounts in: "));
unit_hbox->addWidget(unit_label);
unit = new QValueComboBox(this);
unit->setModel(new BitcoinUnits(this));
unit->setToolTip(tr("Choose the default subdivision unit to show in the interface, and when sending coins"));

unit_label->setBuddy(unit);
unit_hbox->addWidget(unit);

layout->addLayout(unit_hbox);

display_addresses = new QCheckBox(tr("&Display addresses in transaction list"), this);
display_addresses->setToolTip(tr("Whether to show Bitcoin addresses in the transaction list"));
layout->addWidget(display_addresses);

layout->addStretch();
setLayout(layout);
}

void DisplayOptionsPage::setMapper(MonitoredDataMapper *mapper)
{
mapper->addMapping(lang, OptionsModel::Language);
mapper->addMapping(unit, OptionsModel::DisplayUnit);
mapper->addMapping(display_addresses, OptionsModel::DisplayAddresses);
}

void DisplayOptionsPage::showRestartWarning()
{
if(!restart_warning_displayed)
{
QMessageBox::warning(this, tr("Warning"), tr("This setting will take effect after restarting Bitcoin."), QMessageBox::Ok);
restart_warning_displayed = true;
}
}

/* Window options */
WindowOptionsPage::WindowOptionsPage(QWidget *parent):
OptionsPage(parent)
{
QVBoxLayout *layout = new QVBoxLayout();
setWindowTitle(tr("Window"));

bitcoin_at_startup = new QCheckBox(tr("&Start Bitcoin on window system startup"));
bitcoin_at_startup->setToolTip(tr("Automatically start Bitcoin after the computer is turned on"));
Expand All @@ -182,6 +321,29 @@ MainOptionsPage::MainOptionsPage(QWidget *parent):
layout->addWidget(minimize_on_close);
#endif

layout->addStretch(1); // Extra space at bottom
setLayout(layout);
}

void WindowOptionsPage::setMapper(MonitoredDataMapper *mapper)
{
// Map model to widgets
mapper->addMapping(bitcoin_at_startup, OptionsModel::StartAtStartup);
#ifndef Q_WS_MAC
mapper->addMapping(minimize_to_tray, OptionsModel::MinimizeToTray);
#endif
#ifndef Q_WS_MAC
mapper->addMapping(minimize_on_close, OptionsModel::MinimizeOnClose);
#endif
}

/* Network options */
NetworkOptionsPage::NetworkOptionsPage(QWidget *parent):
OptionsPage(parent)
{
QVBoxLayout *layout = new QVBoxLayout();
setWindowTitle(tr("Network"));

map_port_upnp = new QCheckBox(tr("Map port using &UPnP"));
map_port_upnp->setToolTip(tr("Automatically open the Bitcoin client port on the router. This only works when your router supports UPnP and it is enabled."));
layout->addWidget(map_port_upnp);
Expand Down Expand Up @@ -211,30 +373,9 @@ MainOptionsPage::MainOptionsPage(QWidget *parent):
proxy_port_label->setBuddy(proxy_port);
proxy_hbox->addWidget(proxy_port);
proxy_hbox->addStretch(1);

layout->addLayout(proxy_hbox);
QLabel *fee_help = new QLabel(tr("Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended."));
fee_help->setWordWrap(true);
layout->addWidget(fee_help);

QHBoxLayout *fee_hbox = new QHBoxLayout();
fee_hbox->addSpacing(18);
QLabel *fee_label = new QLabel(tr("Pay transaction &fee"));
fee_hbox->addWidget(fee_label);
fee_edit = new BitcoinAmountField();

fee_label->setBuddy(fee_edit);
fee_hbox->addWidget(fee_edit);
fee_hbox->addStretch(1);

layout->addLayout(fee_hbox);

detach_database = new QCheckBox(tr("Detach databases at shutdown"));
detach_database->setToolTip(tr("Detach block and address databases at shutdown. This means they can be moved to another data directory, but it slows down shutdown. The wallet is always detached."));
layout->addWidget(detach_database);

layout->addStretch(1); // Extra space at bottom

setLayout(layout);

connect(connect_socks4, SIGNAL(toggled(bool)), proxy_ip, SLOT(setEnabled(bool)));
Expand All @@ -245,53 +386,11 @@ MainOptionsPage::MainOptionsPage(QWidget *parent):
#endif
}

void MainOptionsPage::setMapper(MonitoredDataMapper *mapper)
void NetworkOptionsPage::setMapper(MonitoredDataMapper *mapper)
{
// Map model to widgets
mapper->addMapping(bitcoin_at_startup, OptionsModel::StartAtStartup);
#ifndef Q_WS_MAC
mapper->addMapping(minimize_to_tray, OptionsModel::MinimizeToTray);
#endif
mapper->addMapping(map_port_upnp, OptionsModel::MapPortUPnP);
#ifndef Q_WS_MAC
mapper->addMapping(minimize_on_close, OptionsModel::MinimizeOnClose);
#endif
mapper->addMapping(connect_socks4, OptionsModel::ConnectSOCKS4);
mapper->addMapping(proxy_ip, OptionsModel::ProxyIP);
mapper->addMapping(proxy_port, OptionsModel::ProxyPort);
mapper->addMapping(fee_edit, OptionsModel::Fee);
mapper->addMapping(detach_database, OptionsModel::DetachDatabases);
}

DisplayOptionsPage::DisplayOptionsPage(QWidget *parent):
QWidget(parent)
{
QVBoxLayout *layout = new QVBoxLayout();

QHBoxLayout *unit_hbox = new QHBoxLayout();
unit_hbox->addSpacing(18);
QLabel *unit_label = new QLabel(tr("&Unit to show amounts in: "));
unit_hbox->addWidget(unit_label);
unit = new QValueComboBox(this);
unit->setModel(new BitcoinUnits(this));
unit->setToolTip(tr("Choose the default subdivision unit to show in the interface, and when sending coins"));

unit_label->setBuddy(unit);
unit_hbox->addWidget(unit);

layout->addLayout(unit_hbox);

display_addresses = new QCheckBox(tr("&Display addresses in transaction list"), this);
display_addresses->setToolTip(tr("Whether to show Bitcoin addresses in the transaction list"));
layout->addWidget(display_addresses);

layout->addStretch();

setLayout(layout);
}

void DisplayOptionsPage::setMapper(MonitoredDataMapper *mapper)
{
mapper->addMapping(unit, OptionsModel::DisplayUnit);
mapper->addMapping(display_addresses, OptionsModel::DisplayAddresses);
}