2011-05-12 14:49:42 +02:00
# include "sendcoinsdialog.h"
2011-05-12 14:44:52 +02:00
# include "ui_sendcoinsdialog.h"
2011-06-30 18:05:29 +02:00
# include "walletmodel.h"
2011-07-25 21:35:45 +02:00
# include "bitcoinunits.h"
2011-07-07 17:33:15 +02:00
# include "addressbookpage.h"
2011-06-01 09:34:12 +02:00
# include "optionsmodel.h"
2011-07-16 19:01:05 +02:00
# include "sendcoinsentry.h"
2011-05-12 17:55:24 +02:00
2011-05-15 19:31:20 +02:00
# include <QMessageBox>
# include <QLocale>
2011-05-27 21:43:05 +02:00
# include <QDebug>
2011-05-12 20:16:42 +02:00
2011-07-16 19:01:05 +02:00
SendCoinsDialog : : SendCoinsDialog ( QWidget * parent ) :
2011-05-12 14:44:52 +02:00
QDialog ( parent ) ,
2011-05-30 20:20:12 +02:00
ui ( new Ui : : SendCoinsDialog ) ,
model ( 0 )
2011-05-12 14:44:52 +02:00
{
ui - > setupUi ( this ) ;
2011-07-08 19:25:35 +02:00
2011-07-16 19:01:05 +02:00
addEntry ( ) ;
2011-05-15 19:31:20 +02:00
2011-07-16 19:01:05 +02:00
connect ( ui - > addButton , SIGNAL ( clicked ( ) ) , this , SLOT ( addEntry ( ) ) ) ;
2011-05-12 14:44:52 +02:00
}
2011-06-30 18:05:29 +02:00
void SendCoinsDialog : : setModel ( WalletModel * model )
2011-05-30 20:20:12 +02:00
{
this - > model = model ;
2011-07-16 19:01:05 +02:00
for ( int i = 0 ; i < ui - > entries - > count ( ) ; + + i )
{
SendCoinsEntry * entry = qobject_cast < SendCoinsEntry * > ( ui - > entries - > itemAt ( i ) - > widget ( ) ) ;
if ( entry )
{
entry - > setModel ( model ) ;
}
}
2011-05-30 20:20:12 +02:00
}
2011-05-12 14:44:52 +02:00
SendCoinsDialog : : ~ SendCoinsDialog ( )
{
delete ui ;
}
2011-05-12 17:55:24 +02:00
void SendCoinsDialog : : on_sendButton_clicked ( )
{
2011-07-16 19:01:05 +02:00
QList < SendCoinsRecipient > recipients ;
bool valid = true ;
for ( int i = 0 ; i < ui - > entries - > count ( ) ; + + i )
{
SendCoinsEntry * entry = qobject_cast < SendCoinsEntry * > ( ui - > entries - > itemAt ( i ) - > widget ( ) ) ;
if ( entry )
{
if ( entry - > validate ( ) )
{
recipients . append ( entry - > getValue ( ) ) ;
}
else
{
valid = false ;
}
}
}
2011-05-30 20:20:12 +02:00
2011-07-16 19:01:05 +02:00
if ( ! valid | | recipients . isEmpty ( ) )
2011-05-14 17:25:05 +02:00
{
2011-05-15 19:31:20 +02:00
return ;
2011-05-14 17:25:05 +02:00
}
2011-05-27 21:43:05 +02:00
2011-07-16 19:01:05 +02:00
// Format confirmation message
QStringList formatted ;
foreach ( const SendCoinsRecipient & rcp , recipients )
{
2011-07-25 21:35:45 +02:00
formatted . append ( tr ( " %1 to %2 (%3) " ) . arg ( BitcoinUnits : : formatWithUnit ( BitcoinUnits : : BTC , rcp . amount ) , rcp . label , rcp . address ) ) ;
2011-07-16 19:01:05 +02:00
}
2011-06-25 19:32:36 +02:00
2011-07-07 17:33:15 +02:00
QMessageBox : : StandardButton retval = QMessageBox : : question ( this , tr ( " Confirm send coins " ) ,
2011-07-16 19:01:05 +02:00
tr ( " Are you sure you want to send %1? " ) . arg ( formatted . join ( tr ( " and " ) ) ) ,
2011-07-07 17:33:15 +02:00
QMessageBox : : Yes | QMessageBox : : Cancel ,
QMessageBox : : Cancel ) ;
if ( retval ! = QMessageBox : : Yes )
{
return ;
}
2011-07-16 19:01:05 +02:00
WalletModel : : SendCoinsReturn sendstatus = model - > sendCoins ( recipients ) ;
switch ( sendstatus . status )
2011-05-14 17:25:05 +02:00
{
2011-06-30 18:05:29 +02:00
case WalletModel : : InvalidAddress :
2011-05-30 20:20:12 +02:00
QMessageBox : : warning ( this , tr ( " Send Coins " ) ,
tr ( " The recepient address is not valid, please recheck. " ) ,
QMessageBox : : Ok , QMessageBox : : Ok ) ;
break ;
2011-06-30 18:05:29 +02:00
case WalletModel : : InvalidAmount :
2011-05-30 20:20:12 +02:00
QMessageBox : : warning ( this , tr ( " Send Coins " ) ,
tr ( " The amount to pay must be larger than 0. " ) ,
QMessageBox : : Ok , QMessageBox : : Ok ) ;
break ;
2011-06-30 18:05:29 +02:00
case WalletModel : : AmountExceedsBalance :
2011-05-30 20:20:12 +02:00
QMessageBox : : warning ( this , tr ( " Send Coins " ) ,
tr ( " Amount exceeds your balance " ) ,
QMessageBox : : Ok , QMessageBox : : Ok ) ;
break ;
2011-06-30 18:05:29 +02:00
case WalletModel : : AmountWithFeeExceedsBalance :
2011-05-30 20:20:12 +02:00
QMessageBox : : warning ( this , tr ( " Send Coins " ) ,
tr ( " Total exceeds your balance when the %1 transaction fee is included " ) .
2011-07-25 21:35:45 +02:00
arg ( BitcoinUnits : : formatWithUnit ( BitcoinUnits : : BTC , sendstatus . fee ) ) ,
2011-07-16 19:01:05 +02:00
QMessageBox : : Ok , QMessageBox : : Ok ) ;
break ;
case WalletModel : : DuplicateAddress :
QMessageBox : : warning ( this , tr ( " Send Coins " ) ,
tr ( " Duplicate address found, can only send to each address once in one send operation " ) ,
QMessageBox : : Ok , QMessageBox : : Ok ) ;
break ;
case WalletModel : : TransactionCreationFailed :
QMessageBox : : warning ( this , tr ( " Send Coins " ) ,
tr ( " Error: Transaction creation failed " ) ,
QMessageBox : : Ok , QMessageBox : : Ok ) ;
break ;
break ;
case WalletModel : : TransactionCommitFailed :
QMessageBox : : warning ( this , tr ( " Send Coins " ) ,
tr ( " Error: The transaction was rejected. This might happen if some of the coins in your wallet were already spent, such as if you used a copy of wallet.dat and coins were spent in the copy but not marked as spent here. " ) ,
2011-05-30 20:20:12 +02:00
QMessageBox : : Ok , QMessageBox : : Ok ) ;
break ;
2011-06-30 18:05:29 +02:00
case WalletModel : : OK :
2011-05-31 22:24:53 +02:00
accept ( ) ;
break ;
2011-05-14 17:25:05 +02:00
}
2011-05-12 17:55:24 +02:00
}
2011-07-16 19:01:05 +02:00
void SendCoinsDialog : : clear ( )
2011-05-12 17:55:24 +02:00
{
2011-07-16 19:01:05 +02:00
// Remove entries until only one left
while ( ui - > entries - > count ( ) > 1 )
{
delete ui - > entries - > takeAt ( 0 ) - > widget ( ) ;
}
2011-05-12 17:55:24 +02:00
2011-07-16 19:01:05 +02:00
// Reset the entry that is left to empty
SendCoinsEntry * entry = qobject_cast < SendCoinsEntry * > ( ui - > entries - > itemAt ( 0 ) - > widget ( ) ) ;
if ( entry )
2011-07-07 18:25:27 +02:00
{
2011-07-16 19:01:05 +02:00
entry - > clear ( ) ;
2011-07-07 18:25:27 +02:00
}
2011-05-13 22:00:27 +02:00
2011-07-16 19:01:05 +02:00
updateRemoveEnabled ( ) ;
2011-07-07 17:33:15 +02:00
2011-07-08 19:51:24 +02:00
ui - > sendButton - > setDefault ( true ) ;
2011-07-07 17:33:15 +02:00
}
void SendCoinsDialog : : reject ( )
{
clear ( ) ;
}
void SendCoinsDialog : : accept ( )
{
clear ( ) ;
}
2011-07-16 19:01:05 +02:00
void SendCoinsDialog : : addEntry ( )
{
SendCoinsEntry * entry = new SendCoinsEntry ( this ) ;
entry - > setModel ( model ) ;
ui - > entries - > addWidget ( entry ) ;
connect ( entry , SIGNAL ( removeEntry ( SendCoinsEntry * ) ) , this , SLOT ( removeEntry ( SendCoinsEntry * ) ) ) ;
updateRemoveEnabled ( ) ;
// Focus the field, so that entry can start immediately
entry - > clear ( ) ;
}
void SendCoinsDialog : : updateRemoveEnabled ( )
{
// Remove buttons are enabled as soon as there is more than one send-entry
bool enabled = ( ui - > entries - > count ( ) > 1 ) ;
for ( int i = 0 ; i < ui - > entries - > count ( ) ; + + i )
{
SendCoinsEntry * entry = qobject_cast < SendCoinsEntry * > ( ui - > entries - > itemAt ( i ) - > widget ( ) ) ;
if ( entry )
{
entry - > setRemoveEnabled ( enabled ) ;
}
}
setupTabChain ( 0 ) ;
}
void SendCoinsDialog : : removeEntry ( SendCoinsEntry * entry )
{
delete entry ;
updateRemoveEnabled ( ) ;
}
QWidget * SendCoinsDialog : : setupTabChain ( QWidget * prev )
{
for ( int i = 0 ; i < ui - > entries - > count ( ) ; + + i )
{
SendCoinsEntry * entry = qobject_cast < SendCoinsEntry * > ( ui - > entries - > itemAt ( i ) - > widget ( ) ) ;
if ( entry )
{
prev = entry - > setupTabChain ( prev ) ;
}
}
QWidget : : setTabOrder ( prev , ui - > addButton ) ;
QWidget : : setTabOrder ( ui - > addButton , ui - > sendButton ) ;
return ui - > sendButton ;
}