Browse Source

Change transaction table:

- Split "Description" column into "Type" and "Address", to make sorting easier (and facilitate filtering in the future)
- Merged "credit" and "debit" columns into one "amount" column that can be black (positive) or red (negative)
0.8
Wladimir J. van der Laan 14 years ago
parent
commit
34fa178243
  1. 26
      src/qt/bitcoingui.cpp
  2. 8
      src/qt/forms/addressbookdialog.ui
  3. 143
      src/qt/transactiontablemodel.cpp
  4. 12
      src/qt/transactiontablemodel.h

26
src/qt/bitcoingui.cpp

@ -265,6 +265,7 @@ void BitcoinGUI::setTabsModel(QAbstractItemModel *transaction_model) @@ -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) @@ -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) @@ -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);
}
}

8
src/qt/forms/addressbookdialog.ui

@ -17,7 +17,7 @@ @@ -17,7 +17,7 @@
<item>
<widget class="QTabWidget" name="tabWidget">
<property name="currentIndex">
<number>1</number>
<number>0</number>
</property>
<widget class="QWidget" name="sendTab">
<property name="toolTip">
@ -29,6 +29,9 @@ @@ -29,6 +29,9 @@
<layout class="QVBoxLayout" name="verticalLayout_2">
<item>
<widget class="QTableView" name="sendTableView">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>
@ -68,6 +71,9 @@ @@ -68,6 +71,9 @@
</item>
<item>
<widget class="QTableView" name="receiveTableView">
<property name="alternatingRowColors">
<bool>true</bool>
</property>
<property name="selectionMode">
<enum>QAbstractItemView::SingleSelection</enum>
</property>

143
src/qt/transactiontablemodel.cpp

@ -18,6 +18,15 @@ const QString TransactionTableModel::Sent = "s"; @@ -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 @@ -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() @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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 @@ -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.");
}
}
}

12
src/qt/transactiontablemodel.h

@ -18,9 +18,9 @@ public: @@ -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: @@ -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:

Loading…
Cancel
Save