2011-05-12 14:49:42 +02:00
# include "optionsdialog.h"
2011-05-31 22:24:53 +02:00
# include "optionsmodel.h"
2011-06-20 21:31:42 +02:00
# include "bitcoinamountfield.h"
2011-06-01 14:40:06 +02:00
# include "monitoreddatamapper.h"
2011-06-11 12:46:09 +02:00
# include "guiutil.h"
2011-07-29 14:36:35 +02:00
# include "bitcoinunits.h"
# include "qvaluecombobox.h"
2011-05-12 14:44:52 +02:00
# include <QHBoxLayout>
# include <QVBoxLayout>
# include <QPushButton>
2011-05-13 22:00:27 +02:00
# include <QListWidget>
# include <QStackedWidget>
2011-06-01 14:40:06 +02:00
# include <QCheckBox>
# include <QLabel>
# include <QLineEdit>
# include <QIntValidator>
# include <QDoubleValidator>
# include <QRegExpValidator>
2011-06-24 21:23:43 +02:00
# include <QDialogButtonBox>
2011-06-01 14:40:06 +02:00
2011-07-25 21:35:45 +02:00
/* First page of options */
2011-06-01 14:40:06 +02:00
class MainOptionsPage : public QWidget
{
2011-09-19 12:40:23 +02:00
Q_OBJECT
2011-06-01 14:40:06 +02:00
public :
explicit MainOptionsPage ( QWidget * parent = 0 ) ;
void setMapper ( MonitoredDataMapper * mapper ) ;
private :
QCheckBox * bitcoin_at_startup ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2011-06-01 14:40:06 +02:00
QCheckBox * minimize_to_tray ;
2011-10-07 13:21:45 +02:00
# endif
2011-06-01 14:40:06 +02:00
QCheckBox * map_port_upnp ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2011-06-01 14:40:06 +02:00
QCheckBox * minimize_on_close ;
2011-10-07 13:21:45 +02:00
# endif
2011-06-01 14:40:06 +02:00
QCheckBox * connect_socks4 ;
QLineEdit * proxy_ip ;
QLineEdit * proxy_port ;
2011-06-20 21:31:42 +02:00
BitcoinAmountField * fee_edit ;
2011-06-01 14:40:06 +02:00
signals :
public slots :
} ;
2011-05-12 14:44:52 +02:00
2011-07-25 21:35:45 +02:00
class DisplayOptionsPage : public QWidget
{
2011-09-19 12:40:23 +02:00
Q_OBJECT
2011-07-25 21:35:45 +02:00
public :
explicit DisplayOptionsPage ( QWidget * parent = 0 ) ;
void setMapper ( MonitoredDataMapper * mapper ) ;
private :
2011-07-29 14:36:35 +02:00
QValueComboBox * unit ;
2011-07-30 17:42:02 +02:00
QCheckBox * display_addresses ;
2011-07-25 21:35:45 +02:00
signals :
public slots :
} ;
2011-09-19 12:40:23 +02:00
# include "optionsdialog.moc"
2011-05-31 22:24:53 +02:00
OptionsDialog : : OptionsDialog ( QWidget * parent ) :
QDialog ( parent ) , contents_widget ( 0 ) , pages_widget ( 0 ) ,
2011-07-25 21:35:45 +02:00
model ( 0 ) , main_page ( 0 ) , display_page ( 0 )
2011-05-12 14:44:52 +02:00
{
contents_widget = new QListWidget ( ) ;
contents_widget - > setMaximumWidth ( 128 ) ;
pages_widget = new QStackedWidget ( ) ;
pages_widget - > setMinimumWidth ( 300 ) ;
QListWidgetItem * item_main = new QListWidgetItem ( tr ( " Main " ) ) ;
contents_widget - > addItem ( item_main ) ;
2011-07-25 21:35:45 +02:00
main_page = new MainOptionsPage ( this ) ;
pages_widget - > addWidget ( main_page ) ;
QListWidgetItem * item_display = new QListWidgetItem ( tr ( " Display " ) ) ;
2011-07-29 14:36:35 +02:00
contents_widget - > addItem ( item_display ) ;
2011-07-25 21:35:45 +02:00
display_page = new DisplayOptionsPage ( this ) ;
pages_widget - > addWidget ( display_page ) ;
2011-05-12 14:44:52 +02:00
contents_widget - > setCurrentRow ( 0 ) ;
QHBoxLayout * main_layout = new QHBoxLayout ( ) ;
main_layout - > addWidget ( contents_widget ) ;
main_layout - > addWidget ( pages_widget , 1 ) ;
QVBoxLayout * layout = new QVBoxLayout ( ) ;
layout - > addLayout ( main_layout ) ;
2011-06-24 21:23:43 +02:00
QDialogButtonBox * buttonbox = new QDialogButtonBox ( ) ;
buttonbox - > setStandardButtons ( QDialogButtonBox : : Apply | QDialogButtonBox : : Ok | QDialogButtonBox : : Cancel ) ;
apply_button = buttonbox - > button ( QDialogButtonBox : : Apply ) ;
layout - > addWidget ( buttonbox ) ;
2011-05-12 14:44:52 +02:00
setLayout ( layout ) ;
setWindowTitle ( tr ( " Options " ) ) ;
2011-06-01 09:33:48 +02:00
/* Widget-to-option mapper */
2011-06-01 14:40:06 +02:00
mapper = new MonitoredDataMapper ( this ) ;
2011-05-31 22:24:53 +02:00
mapper - > setSubmitPolicy ( QDataWidgetMapper : : ManualSubmit ) ;
mapper - > setOrientation ( Qt : : Vertical ) ;
2011-06-01 14:40:06 +02:00
/* enable apply button when data modified */
connect ( mapper , SIGNAL ( viewModified ( ) ) , this , SLOT ( enableApply ( ) ) ) ;
/* disable apply button when new data loaded */
connect ( mapper , SIGNAL ( currentIndexChanged ( int ) ) , this , SLOT ( disableApply ( ) ) ) ;
2011-06-01 09:33:48 +02:00
/* Event bindings */
2011-07-25 21:35:45 +02:00
connect ( contents_widget , SIGNAL ( currentRowChanged ( int ) ) , this , SLOT ( changePage ( int ) ) ) ;
2011-06-24 21:23:43 +02:00
connect ( buttonbox - > button ( QDialogButtonBox : : Ok ) , SIGNAL ( clicked ( ) ) , this , SLOT ( okClicked ( ) ) ) ;
connect ( buttonbox - > button ( QDialogButtonBox : : Cancel ) , SIGNAL ( clicked ( ) ) , this , SLOT ( cancelClicked ( ) ) ) ;
connect ( buttonbox - > button ( QDialogButtonBox : : Apply ) , SIGNAL ( clicked ( ) ) , this , SLOT ( applyClicked ( ) ) ) ;
2011-05-31 22:24:53 +02:00
}
void OptionsDialog : : setModel ( OptionsModel * model )
{
this - > model = model ;
mapper - > setModel ( model ) ;
2011-07-25 21:35:45 +02:00
main_page - > setMapper ( mapper ) ;
display_page - > setMapper ( mapper ) ;
2011-05-12 14:44:52 +02:00
2011-05-31 22:24:53 +02:00
mapper - > toFirst ( ) ;
2011-05-12 14:44:52 +02:00
}
2011-07-25 21:35:45 +02:00
void OptionsDialog : : changePage ( int index )
2011-05-12 14:44:52 +02:00
{
2011-07-25 21:35:45 +02:00
pages_widget - > setCurrentIndex ( index ) ;
2011-05-12 14:44:52 +02:00
}
2011-06-01 09:33:48 +02:00
void OptionsDialog : : okClicked ( )
{
mapper - > submit ( ) ;
accept ( ) ;
}
void OptionsDialog : : cancelClicked ( )
{
reject ( ) ;
}
void OptionsDialog : : applyClicked ( )
{
mapper - > submit ( ) ;
apply_button - > setEnabled ( false ) ;
}
void OptionsDialog : : enableApply ( )
{
apply_button - > setEnabled ( true ) ;
}
2011-06-01 14:40:06 +02:00
void OptionsDialog : : disableApply ( )
{
apply_button - > setEnabled ( false ) ;
}
MainOptionsPage : : MainOptionsPage ( QWidget * parent ) :
QWidget ( parent )
{
QVBoxLayout * layout = new QVBoxLayout ( ) ;
bitcoin_at_startup = new QCheckBox ( tr ( " &Start Bitcoin on window system startup " ) ) ;
2011-06-11 12:46:09 +02:00
bitcoin_at_startup - > setToolTip ( tr ( " Automatically start Bitcoin after the computer is turned on " ) ) ;
2011-06-01 14:40:06 +02:00
layout - > addWidget ( bitcoin_at_startup ) ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2011-06-01 14:40:06 +02:00
minimize_to_tray = new QCheckBox ( tr ( " &Minimize to the tray instead of the taskbar " ) ) ;
2011-06-11 12:46:09 +02:00
minimize_to_tray - > setToolTip ( tr ( " Show only a tray icon after minimizing the window " ) ) ;
2011-06-01 14:40:06 +02:00
layout - > addWidget ( minimize_to_tray ) ;
2011-10-07 13:21:45 +02:00
# endif
2011-06-01 14:40:06 +02:00
map_port_upnp = new QCheckBox ( tr ( " Map port using &UPnP " ) ) ;
2011-06-11 12:46:09 +02:00
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. " ) ) ;
2011-06-01 14:40:06 +02:00
layout - > addWidget ( map_port_upnp ) ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2011-06-01 14:40:06 +02:00
minimize_on_close = new QCheckBox ( tr ( " M&inimize on close " ) ) ;
2011-06-11 12:46:09 +02:00
minimize_on_close - > setToolTip ( tr ( " Minimize instead of exit the application when the window is closed. When this option is enabled, the application will be closed only after selecting Quit in the menu. " ) ) ;
2011-06-01 14:40:06 +02:00
layout - > addWidget ( minimize_on_close ) ;
2011-10-07 13:21:45 +02:00
# endif
2011-06-01 14:40:06 +02:00
2011-06-11 12:46:09 +02:00
connect_socks4 = new QCheckBox ( tr ( " &Connect through SOCKS4 proxy: " ) ) ;
connect_socks4 - > setToolTip ( tr ( " Connect to the Bitcon network through a SOCKS4 proxy (e.g. when connecting through Tor) " ) ) ;
2011-06-01 14:40:06 +02:00
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 ) ;
proxy_ip = new QLineEdit ( ) ;
proxy_ip - > setMaximumWidth ( 140 ) ;
proxy_ip - > setEnabled ( false ) ;
proxy_ip - > setValidator ( new QRegExpValidator ( QRegExp ( " [0-9]{1,3} \\ .[0-9]{1,3} \\ .[0-9]{1,3} \\ .[0-9]{1,3} " ) , this ) ) ;
2011-06-11 12:46:09 +02:00
proxy_ip - > setToolTip ( tr ( " IP address of the proxy (e.g. 127.0.0.1) " ) ) ;
2011-06-01 14:40:06 +02:00
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 ) ;
proxy_port = new QLineEdit ( ) ;
proxy_port - > setMaximumWidth ( 55 ) ;
proxy_port - > setValidator ( new QIntValidator ( 0 , 65535 , this ) ) ;
proxy_port - > setEnabled ( false ) ;
2011-06-11 12:46:09 +02:00
proxy_port - > setToolTip ( tr ( " Port of the proxy (e.g. 1234) " ) ) ;
2011-06-01 14:40:06 +02:00
proxy_port_label - > setBuddy ( proxy_port ) ;
proxy_hbox - > addWidget ( proxy_port ) ;
proxy_hbox - > addStretch ( 1 ) ;
layout - > addLayout ( proxy_hbox ) ;
2012-02-05 13:28:39 +01:00
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. " ) ) ;
2011-06-01 14:40:06 +02:00
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 ) ;
2011-06-20 21:31:42 +02:00
fee_edit = new BitcoinAmountField ( ) ;
2012-02-05 13:28:39 +01:00
fee_edit - > setToolTip ( tr ( " Optional transaction fee per kB that helps make sure your transactions are processed quickly. Most transactions are 1 kB. Fee 0.01 recommended. " ) ) ;
2011-06-01 14:40:06 +02:00
fee_label - > setBuddy ( fee_edit ) ;
fee_hbox - > addWidget ( fee_edit ) ;
fee_hbox - > addStretch ( 1 ) ;
layout - > addLayout ( fee_hbox ) ;
2011-06-18 11:53:25 +02:00
layout - > addStretch ( 1 ) ; // Extra space at bottom
2011-06-01 14:40:06 +02:00
setLayout ( layout ) ;
connect ( connect_socks4 , SIGNAL ( toggled ( bool ) ) , proxy_ip , SLOT ( setEnabled ( bool ) ) ) ;
connect ( connect_socks4 , SIGNAL ( toggled ( bool ) ) , proxy_port , SLOT ( setEnabled ( bool ) ) ) ;
2011-06-05 12:43:18 +02:00
# ifndef USE_UPNP
map_port_upnp - > setDisabled ( true ) ;
# endif
2011-06-01 14:40:06 +02:00
}
void MainOptionsPage : : setMapper ( MonitoredDataMapper * mapper )
{
2011-06-18 11:53:25 +02:00
// Map model to widgets
2011-06-01 14:40:06 +02:00
mapper - > addMapping ( bitcoin_at_startup , OptionsModel : : StartAtStartup ) ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2011-06-01 14:40:06 +02:00
mapper - > addMapping ( minimize_to_tray , OptionsModel : : MinimizeToTray ) ;
2011-10-07 13:21:45 +02:00
# endif
2011-06-01 14:40:06 +02:00
mapper - > addMapping ( map_port_upnp , OptionsModel : : MapPortUPnP ) ;
2011-10-07 13:21:45 +02:00
# ifndef Q_WS_MAC
2011-06-01 14:40:06 +02:00
mapper - > addMapping ( minimize_on_close , OptionsModel : : MinimizeOnClose ) ;
2011-10-07 13:21:45 +02:00
# endif
2011-06-01 14:40:06 +02:00
mapper - > addMapping ( connect_socks4 , OptionsModel : : ConnectSOCKS4 ) ;
mapper - > addMapping ( proxy_ip , OptionsModel : : ProxyIP ) ;
mapper - > addMapping ( proxy_port , OptionsModel : : ProxyPort ) ;
mapper - > addMapping ( fee_edit , OptionsModel : : Fee ) ;
}
2011-07-25 21:35:45 +02:00
DisplayOptionsPage : : DisplayOptionsPage ( QWidget * parent ) :
QWidget ( parent )
{
QVBoxLayout * layout = new QVBoxLayout ( ) ;
2011-07-30 17:42:02 +02:00
2011-07-25 21:35:45 +02:00
QHBoxLayout * unit_hbox = new QHBoxLayout ( ) ;
unit_hbox - > addSpacing ( 18 ) ;
2011-07-29 14:36:35 +02:00
QLabel * unit_label = new QLabel ( tr ( " &Unit to show amounts in: " ) ) ;
2011-07-25 21:35:45 +02:00
unit_hbox - > addWidget ( unit_label ) ;
2011-07-29 14:36:35 +02:00
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 " ) ) ;
2011-07-25 21:35:45 +02:00
unit_label - > setBuddy ( unit ) ;
unit_hbox - > addWidget ( unit ) ;
layout - > addLayout ( unit_hbox ) ;
2011-07-30 17:42:02 +02:00
display_addresses = new QCheckBox ( tr ( " Display addresses in transaction list " ) , this ) ;
layout - > addWidget ( display_addresses ) ;
2011-07-25 21:35:45 +02:00
layout - > addStretch ( ) ;
setLayout ( layout ) ;
}
void DisplayOptionsPage : : setMapper ( MonitoredDataMapper * mapper )
{
2011-07-29 14:36:35 +02:00
mapper - > addMapping ( unit , OptionsModel : : DisplayUnit ) ;
2011-07-30 17:42:02 +02:00
mapper - > addMapping ( display_addresses , OptionsModel : : DisplayAddresses ) ;
2011-07-25 21:35:45 +02:00
}