diff --git a/src/qt/bitcoingui.cpp b/src/qt/bitcoingui.cpp index 76ae3ddb..24311bfd 100644 --- a/src/qt/bitcoingui.cpp +++ b/src/qt/bitcoingui.cpp @@ -265,6 +265,7 @@ void BitcoinGUI::setTabsModel(QAbstractItemModel *transaction_model) QTableView *transaction_table = transactionViews.at(i); transaction_table->setModel(proxy_model); + transaction_table->setAlternatingRowColors(true); transaction_table->setSelectionBehavior(QAbstractItemView::SelectRows); transaction_table->setSelectionMode(QAbstractItemView::ExtendedSelection); transaction_table->setSortingEnabled(true); @@ -275,12 +276,12 @@ void BitcoinGUI::setTabsModel(QAbstractItemModel *transaction_model) TransactionTableModel::Status, 23); transaction_table->horizontalHeader()->resizeSection( TransactionTableModel::Date, 120); - transaction_table->horizontalHeader()->setResizeMode( - TransactionTableModel::Description, QHeaderView::Stretch); transaction_table->horizontalHeader()->resizeSection( - TransactionTableModel::Debit, 79); + TransactionTableModel::Type, 120); + transaction_table->horizontalHeader()->setResizeMode( + TransactionTableModel::ToAddress, QHeaderView::Stretch); transaction_table->horizontalHeader()->resizeSection( - TransactionTableModel::Credit, 79); + TransactionTableModel::Amount, 79); } connect(transaction_model, SIGNAL(rowsInserted(const QModelIndex &, int, int)), @@ -457,23 +458,24 @@ void BitcoinGUI::transactionDetails(const QModelIndex& idx) void BitcoinGUI::incomingTransaction(const QModelIndex & parent, int start, int end) { TransactionTableModel *ttm = model->getTransactionTableModel(); - qint64 credit = ttm->index(start, TransactionTableModel::Credit, parent) + qint64 amount = ttm->index(start, TransactionTableModel::Amount, parent) .data(Qt::EditRole).toULongLong(); - qint64 debit = ttm->index(start, TransactionTableModel::Debit, parent) - .data(Qt::EditRole).toULongLong(); - if((credit+debit)>0 && !model->inInitialBlockDownload()) + if(amount>0 && !model->inInitialBlockDownload()) { // On incoming transaction, make an info balloon // Unless the initial block download is in progress, to prevent balloon-spam QString date = ttm->index(start, TransactionTableModel::Date, parent) .data().toString(); - QString description = ttm->index(start, TransactionTableModel::Description, parent) + QString type = ttm->index(start, TransactionTableModel::Type, parent) + .data().toString(); + QString address = ttm->index(start, TransactionTableModel::ToAddress, parent) .data().toString(); trayIcon->showMessage(tr("Incoming transaction"), - "Date: " + date + "\n" + - "Amount: " + QString::fromStdString(FormatMoney(credit+debit, true)) + "\n" + - description, + tr("Date: ") + date + "\n" + + tr("Amount: ") + QString::fromStdString(FormatMoney(amount, true)) + "\n" + + tr("Type: ") + type + "\n" + + tr("Address: ") + address + "\n", QSystemTrayIcon::Information); } } diff --git a/src/qt/forms/addressbookdialog.ui b/src/qt/forms/addressbookdialog.ui index f9b95c40..04277896 100644 --- a/src/qt/forms/addressbookdialog.ui +++ b/src/qt/forms/addressbookdialog.ui @@ -17,7 +17,7 @@ - 1 + 0 @@ -29,6 +29,9 @@ + + true + QAbstractItemView::SingleSelection @@ -68,6 +71,9 @@ + + true + QAbstractItemView::SingleSelection diff --git a/src/qt/transactiontablemodel.cpp b/src/qt/transactiontablemodel.cpp index 18ab421e..e49629c9 100644 --- a/src/qt/transactiontablemodel.cpp +++ b/src/qt/transactiontablemodel.cpp @@ -18,6 +18,15 @@ const QString TransactionTableModel::Sent = "s"; const QString TransactionTableModel::Received = "r"; const QString TransactionTableModel::Other = "o"; +// Credit and Debit columns are right-aligned as they contain numbers +static int column_alignments[] = { + Qt::AlignLeft|Qt::AlignVCenter, + Qt::AlignLeft|Qt::AlignVCenter, + Qt::AlignLeft|Qt::AlignVCenter, + Qt::AlignLeft|Qt::AlignVCenter, + Qt::AlignRight|Qt::AlignVCenter + }; + // Comparison operator for sort/binary search of model tx list struct TxLessThan { @@ -195,22 +204,12 @@ struct TransactionTablePriv }; -// Credit and Debit columns are right-aligned as they contain numbers -static int column_alignments[] = { - Qt::AlignLeft|Qt::AlignVCenter, - Qt::AlignLeft|Qt::AlignVCenter, - Qt::AlignLeft|Qt::AlignVCenter, - Qt::AlignRight|Qt::AlignVCenter, - Qt::AlignRight|Qt::AlignVCenter, - Qt::AlignLeft|Qt::AlignVCenter - }; - TransactionTableModel::TransactionTableModel(CWallet* wallet, QObject *parent): QAbstractTableModel(parent), wallet(wallet), priv(new TransactionTablePriv(wallet, this)) { - columns << tr("Status") << tr("Date") << tr("Description") << tr("Debit") << tr("Credit"); + columns << tr("Status") << tr("Date") << tr("Type") << tr("Address") << tr("Amount"); priv->refreshWallet(); @@ -248,7 +247,7 @@ void TransactionTableModel::update() // Status (number of confirmations) and (possibly) description // columns changed for all rows. emit dataChanged(index(0, Status), index(priv->size()-1, Status)); - emit dataChanged(index(0, Description), index(priv->size()-1, Description)); + emit dataChanged(index(0, ToAddress), index(priv->size()-1, ToAddress)); } } @@ -326,42 +325,70 @@ std::string TransactionTableModel::lookupAddress(const std::string &address) con return description; } -QVariant TransactionTableModel::formatTxDescription(const TransactionRecord *wtx) const +QVariant TransactionTableModel::formatTxType(const TransactionRecord *wtx) const { QString description; switch(wtx->type) { case TransactionRecord::RecvWithAddress: - description = tr("Received with: ") + QString::fromStdString(lookupAddress(wtx->address)); + description = tr("Received with"); break; case TransactionRecord::RecvFromIP: - description = tr("Received from IP: ") + QString::fromStdString(wtx->address); + description = tr("Received from IP"); break; case TransactionRecord::SendToAddress: - description = tr("Sent to: ") + QString::fromStdString(lookupAddress(wtx->address)); + description = tr("Sent to"); break; case TransactionRecord::SendToIP: - description = tr("Sent to IP: ") + QString::fromStdString(wtx->address); + description = tr("Sent to IP"); break; case TransactionRecord::SendToSelf: description = tr("Payment to yourself"); break; + case TransactionRecord::Generated: + description = tr("Generated"); + break; + } + return QVariant(description); +} + +QVariant TransactionTableModel::formatTxToAddress(const TransactionRecord *wtx) const +{ + QString description; + + switch(wtx->type) + { + case TransactionRecord::RecvWithAddress: + description = QString::fromStdString(lookupAddress(wtx->address)); + break; + case TransactionRecord::RecvFromIP: + description = QString::fromStdString(wtx->address); + break; + case TransactionRecord::SendToAddress: + description = QString::fromStdString(lookupAddress(wtx->address)); + break; + case TransactionRecord::SendToIP: + description = QString::fromStdString(wtx->address); + break; + case TransactionRecord::SendToSelf: + description = QString(); + break; case TransactionRecord::Generated: switch(wtx->status.maturity) { case TransactionStatus::Immature: - description = tr("Generated (matures in %n more blocks)", "", + description = tr("(matures in %n more blocks)", "", wtx->status.matures_in); break; case TransactionStatus::Mature: - description = tr("Generated"); + description = QString(); break; case TransactionStatus::MaturesWarning: - description = tr("Generated - Warning: This block was not received by any other nodes and will probably not be accepted!"); + description = tr("(Warning: This block was not received by any other nodes and will probably not be accepted!)"); break; case TransactionStatus::NotAccepted: - description = tr("Generated (not accepted)"); + description = tr("(not accepted)"); break; } break; @@ -369,38 +396,14 @@ QVariant TransactionTableModel::formatTxDescription(const TransactionRecord *wtx return QVariant(description); } -QVariant TransactionTableModel::formatTxDebit(const TransactionRecord *wtx) const +QVariant TransactionTableModel::formatTxAmount(const TransactionRecord *wtx) const { - if(wtx->debit) + QString str = QString::fromStdString(FormatMoney(wtx->credit + wtx->debit)); + if(!wtx->status.confirmed || wtx->status.maturity != TransactionStatus::Mature) { - QString str = QString::fromStdString(FormatMoney(wtx->debit)); - if(!wtx->status.confirmed || wtx->status.maturity != TransactionStatus::Mature) - { - str = QString("[") + str + QString("]"); - } - return QVariant(str); - } - else - { - return QVariant(); - } -} - -QVariant TransactionTableModel::formatTxCredit(const TransactionRecord *wtx) const -{ - if(wtx->credit) - { - QString str = QString::fromStdString(FormatMoney(wtx->credit)); - if(!wtx->status.confirmed || wtx->status.maturity != TransactionStatus::Mature) - { - str = QString("[") + str + QString("]"); - } - return QVariant(str); - } - else - { - return QVariant(); + str = QString("[") + str + QString("]"); } + return QVariant(str); } QVariant TransactionTableModel::formatTxDecoration(const TransactionRecord *wtx) const @@ -449,12 +452,12 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const { case Date: return formatTxDate(rec); - case Description: - return formatTxDescription(rec); - case Debit: - return formatTxDebit(rec); - case Credit: - return formatTxCredit(rec); + case Type: + return formatTxType(rec); + case ToAddress: + return formatTxToAddress(rec); + case Amount: + return formatTxAmount(rec); } } else if(role == Qt::EditRole) @@ -466,12 +469,12 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const return QString::fromStdString(rec->status.sortKey); case Date: return rec->time; - case Description: - return formatTxDescription(rec); - case Debit: - return rec->debit; - case Credit: - return rec->credit; + case Type: + return formatTxType(rec); + case ToAddress: + return formatTxToAddress(rec); + case Amount: + return rec->credit + rec->debit; } } else if (role == Qt::ToolTipRole) @@ -492,6 +495,10 @@ QVariant TransactionTableModel::data(const QModelIndex &index, int role) const { return QColor(128, 128, 128); } + if(index.column() == Amount && (rec->credit+rec->debit) < 0) + { + return QColor(255, 0, 0); + } } else if (role == TypeRole) { @@ -535,12 +542,12 @@ QVariant TransactionTableModel::headerData(int section, Qt::Orientation orientat return tr("Transaction status. Hover over this field to show number of confirmations."); case Date: return tr("Date and time that the transaction was received."); - case Description: - return tr("Short description of the transaction."); - case Debit: - return tr("Amount removed from balance."); - case Credit: - return tr("Amount added to balance."); + case Type: + return tr("Type of transaction."); + case ToAddress: + return tr("Destination address of transaction."); + case Amount: + return tr("Amount removed from or added to balance."); } } } diff --git a/src/qt/transactiontablemodel.h b/src/qt/transactiontablemodel.h index 72a645b3..d19e1a3a 100644 --- a/src/qt/transactiontablemodel.h +++ b/src/qt/transactiontablemodel.h @@ -18,9 +18,9 @@ public: enum { Status = 0, Date = 1, - Description = 2, - Debit = 3, - Credit = 4 + Type = 2, + ToAddress = 3, + Amount = 4 } ColumnIndex; enum { @@ -47,9 +47,9 @@ private: std::string lookupAddress(const std::string &address) const; QVariant formatTxStatus(const TransactionRecord *wtx) const; QVariant formatTxDate(const TransactionRecord *wtx) const; - QVariant formatTxDescription(const TransactionRecord *wtx) const; - QVariant formatTxDebit(const TransactionRecord *wtx) const; - QVariant formatTxCredit(const TransactionRecord *wtx) const; + QVariant formatTxType(const TransactionRecord *wtx) const; + QVariant formatTxToAddress(const TransactionRecord *wtx) const; + QVariant formatTxAmount(const TransactionRecord *wtx) const; QVariant formatTxDecoration(const TransactionRecord *wtx) const; private slots: