void PaperWalletDialog::on_printButton_clicked() { QPrinter printer(QPrinter::HighResolution); QPrintDialog *qpd = new QPrintDialog(&printer, this); qpd->setPrintRange(QAbstractPrintDialog::AllPages); QList<QString> recipientPubKeyHashes; if ( qpd->exec() != QDialog::Accepted ) { return; } // Hardcode these values printer.setOrientation(QPrinter::Portrait); printer.setPaperSize(QPrinter::A4); printer.setFullPage(true); QPainter painter; if (! painter.begin(&printer)) { // failed to open file QMessageBox::critical(this, "Printing Error", tr("failed to open file, is it writable?"), QMessageBox::Ok, QMessageBox::Ok); return; } int walletCount = ui->walletCount->currentIndex() + 1; int walletsPerPage = 4; int pageHeight = printer.pageRect().height() - PAPER_WALLET_PAGE_MARGIN; int walletHeight = ui->paperTemplate->height(); double computedWalletHeight = 0.9 * pageHeight / walletsPerPage; double scale = computedWalletHeight / walletHeight; double walletPadding = pageHeight * 0.05 / (walletsPerPage - 1) / scale; QRegion walletRegion = QRegion(ui->paperTemplate->x(), ui->paperTemplate->y(), ui->paperTemplate->width(), ui->paperTemplate->height()); painter.scale(scale, scale); for(int i = 0; i < walletCount; i++) { QPoint point = QPoint(PAPER_WALLET_PAGE_MARGIN, (PAPER_WALLET_PAGE_MARGIN / 2) + ( i % walletsPerPage ) * (walletHeight + walletPadding)); this->render(&painter, point, walletRegion); recipientPubKeyHashes.append(ui->addressText->text()); if ( i % walletsPerPage == ( walletsPerPage - 1 ) ) { printer.newPage(); } this->on_getNewAddress_clicked(); } painter.end(); #ifdef ENABLE_WALLET QStringList formatted; WalletModelTransaction *tx; while( true ) { bool ok; // Ask for an amount to send to each paper wallet. It might be better to try to use the BitcoinAmountField, but this works fine. double amountInput = QInputDialog::getDouble(this, tr("Load Paper Wallets"), tr("The paper wallet printing process has begun.<br/>Please wait for the wallets to print completely and verify that everything printed correctly.<br/>Check for misalignments, ink bleeding, smears, or anything else that could make the private keys unreadable.<br/>Now, enter the number of ARG you wish to send to each wallet:"), 0, 0, 2147483647, 8, &ok); if(!ok) { return; } WalletModel::UnlockContext ctx(this->model->requestUnlock()); if(!ctx.isValid()) { return; } QList<SendCoinsRecipient> recipients; quint64 amount = (quint64) ( amountInput * COIN ); foreach(const QString &dest, recipientPubKeyHashes) { recipients.append(SendCoinsRecipient(dest,tr("Paper wallet %1").arg(dest), amount,"")); formatted.append(tr("<b>%1</b> to Paper Wallet <span style='font-family: monospace;'>%2</span>").arg(QString::number(amountInput, 'f', 8), GUIUtil::HtmlEscape(dest))); } tx = new WalletModelTransaction(recipients); WalletModel::SendCoinsReturn prepareStatus; if (this->model->getOptionsModel()->getCoinControlFeatures()) // coin control enabled prepareStatus = this->model->prepareTransaction(*tx, CoinControlDialog::coinControl); else prepareStatus = this->model->prepareTransaction(*tx); if (prepareStatus.status == WalletModel::InvalidAddress) { QMessageBox::critical(this, tr("Send Coins"), tr("The recipient address is not valid, please recheck."), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::InvalidAmount) { QMessageBox::critical(this, tr("Send Coins"), tr("The amount to pay must be larger than 0"), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::AmountExceedsBalance) { QMessageBox::critical(this, tr("Send Coins"), tr("The amount exceeds your balance."), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::AmountWithFeeExceedsBalance) { QMessageBox::critical(this, tr("Send Coins"), tr("The total exceeds your balance when the transaction fee is included"), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::DuplicateAddress) { QMessageBox::critical(this, tr("Send Coins"), tr("Duplicate address found, can only send to each address once per send operation."), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::TransactionCreationFailed) { QMessageBox::critical(this, tr("Send Coins"), tr("Transaction creation failed!"), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::OK) { break; } else { delete tx; return; } }
void PaperWalletDialog::on_printButton_clicked() { QPrinter printer(QPrinter::HighResolution); QPrintDialog *qpd = new QPrintDialog(&printer, this); qpd->setPrintRange(QAbstractPrintDialog::AllPages); QList<QString> recipientPubKeyHashes; if ( qpd->exec() != QDialog::Accepted ) { return; } // Hardcode these values printer.setOrientation(QPrinter::Portrait); printer.setPaperSize(QPrinter::A4); printer.setFullPage(true); QPainter painter; if (! painter.begin(&printer)) { // failed to open file QMessageBox::critical(this, "Printing Error", tr("failed to open file, is it writable?"), QMessageBox::Ok, QMessageBox::Ok); return; } int walletCount = ui->walletCount->currentIndex() + 1; int walletsPerPage = 4; int pageHeight = printer.pageRect().height() - PAPER_WALLET_PAGE_MARGIN; int walletHeight = ui->paperTemplate->height(); double computedWalletHeight = 0.9 * pageHeight / walletsPerPage; double scale = computedWalletHeight / walletHeight; double walletPadding = pageHeight * 0.05 / (walletsPerPage - 1) / scale; QRegion walletRegion = QRegion(ui->paperTemplate->x(), ui->paperTemplate->y(), ui->paperTemplate->width(), ui->paperTemplate->height()); painter.scale(scale, scale); for(int i = 0; i < walletCount; i++) { QPoint point = QPoint(PAPER_WALLET_PAGE_MARGIN, (PAPER_WALLET_PAGE_MARGIN / 2) + ( i % walletsPerPage ) * (walletHeight + walletPadding)); this->render(&painter, point, walletRegion); recipientPubKeyHashes.append(ui->addressText->text()); if ( i % walletsPerPage == ( walletsPerPage - 1 ) ) { printer.newPage(); } this->on_getNewAddress_clicked(); } painter.end(); #ifdef ENABLE_WALLET QStringList formatted; WalletModelTransaction *tx; while( true ) { bool ok; // Ask for an amount to send to each paper wallet. It might be better to try to use the BitcoinAmountField, but this works fine. double amountInput = QInputDialog::getDouble(this, tr("Load Paper Wallets"), tr("The paper wallet printing process has begun.<br/>Please wait for the wallets to print completely and verify that everything printed correctly.<br/>Check for misalignments, ink bleeding, smears, or anything else that could make the private keys unreadable.<br/>Now, enter the number of EPC you wish to send to each wallet:"), 0, 0, 2147483647, 8, &ok); if(!ok) { return; } WalletModel::UnlockContext ctx(this->model->requestUnlock()); if(!ctx.isValid()) { return; } QList<SendCoinsRecipient> recipients; quint64 amount = (quint64) ( amountInput * COIN ); for(const QString &dest : recipientPubKeyHashes) { recipients.append(SendCoinsRecipient(dest,tr("Paper wallet %1").arg(dest), amount,"")); formatted.append(tr("<b>%1</b> to Paper Wallet <span style='font-family: monospace;'>%2</span>").arg(QString::number(amountInput, 'f', 8), GUIUtil::HtmlEscape(dest))); } tx = new WalletModelTransaction(recipients); WalletModel::SendCoinsReturn prepareStatus; if (this->model->getOptionsModel()->getCoinControlFeatures()) // coin control enabled prepareStatus = this->model->prepareTransaction(*tx, CoinControlDialog::coinControl); else prepareStatus = this->model->prepareTransaction(*tx); if (prepareStatus.status == WalletModel::InvalidAddress) { QMessageBox::critical(this, tr("Send Coins"), tr("The recipient address is not valid, please recheck."), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::InvalidAmount) { QMessageBox::critical(this, tr("Send Coins"), tr("The amount to pay must be larger than 0"), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::AmountExceedsBalance) { QMessageBox::critical(this, tr("Send Coins"), tr("The amount exceeds your balance."), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::AmountWithFeeExceedsBalance) { QMessageBox::critical(this, tr("Send Coins"), tr("The total exceeds your balance when the transaction fee is included"), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::DuplicateAddress) { QMessageBox::critical(this, tr("Send Coins"), tr("Duplicate address found, can only send to each address once per send operation."), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::TransactionCreationFailed) { QMessageBox::critical(this, tr("Send Coins"), tr("Transaction creation failed!"), QMessageBox::Ok, QMessageBox::Ok); } else if (prepareStatus.status == WalletModel::OK) { break; } else { delete tx; return; } } // Stolen from sendcoinsdialog.cpp qint64 txFee = tx->getTransactionFee(); QString questionString = tr("Are you sure you want to send?"); questionString.append("<br /><br />%1"); if(txFee > 0) { // append fee string if a fee is required questionString.append("<hr /><span style='color:#aa0000;'>"); questionString.append(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), txFee)); questionString.append("</span> "); questionString.append(tr("added as transaction fee")); } // add total amount in all subdivision units questionString.append("<hr />"); qint64 totalAmount = tx->getTotalTransactionAmount() + txFee; QStringList alternativeUnits; for(BitcoinUnits::Unit u : BitcoinUnits::availableUnits()) { if(u != model->getOptionsModel()->getDisplayUnit()) alternativeUnits.append(BitcoinUnits::formatWithUnit(u, totalAmount)); } questionString.append(tr("Total Amount %1 (= %2)") .arg(BitcoinUnits::formatWithUnit(model->getOptionsModel()->getDisplayUnit(), totalAmount)) .arg(alternativeUnits.join(" " + tr("or") + " "))); QMessageBox::StandardButton retval = QMessageBox::question(this, tr("Confirm send coins"), questionString.arg(formatted.join("<br />")), QMessageBox::Yes | QMessageBox::Cancel, QMessageBox::Cancel); if(retval != QMessageBox::Yes) { delete tx; return; } WalletModel::SendCoinsReturn sendStatus = this->model->sendCoins(*tx); if (sendStatus.status == WalletModel::TransactionCommitFailed) { QMessageBox::critical(this, tr("Send Coins"), tr("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."), QMessageBox::Ok, QMessageBox::Ok); } delete tx; #endif return; }