Browse Source

Merge #9185: [Qt] fix coincontrol sort issue

4231032 [Qt] Clean up and fix coincontrol tree widget handling (Wladimir J. van der Laan)
76af4eb [Qt] fix coincontrol sort issue (Jonas Schnelli)
0.14
Jonas Schnelli 8 years ago
parent
commit
e4dbeb9499
No known key found for this signature in database
GPG Key ID: 29D4BCB6416F53EC
  1. 43
      src/qt/coincontroldialog.cpp
  2. 38
      src/qt/coincontroldialog.h

43
src/qt/coincontroldialog.cpp

@ -35,6 +35,13 @@ QList<CAmount> CoinControlDialog::payAmounts;
CCoinControl* CoinControlDialog::coinControl = new CCoinControl(); CCoinControl* CoinControlDialog::coinControl = new CCoinControl();
bool CoinControlDialog::fSubtractFeeFromAmount = false; bool CoinControlDialog::fSubtractFeeFromAmount = false;
bool CCoinControlWidgetItem::operator<(const QTreeWidgetItem &other) const {
int column = treeWidget()->sortColumn();
if (column == CoinControlDialog::COLUMN_AMOUNT || column == CoinControlDialog::COLUMN_DATE || column == CoinControlDialog::COLUMN_CONFIRMATIONS)
return data(column, Qt::UserRole).toLongLong() < other.data(column, Qt::UserRole).toLongLong();
return QTreeWidgetItem::operator<(other);
}
CoinControlDialog::CoinControlDialog(const PlatformStyle *_platformStyle, QWidget *parent) : CoinControlDialog::CoinControlDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
QDialog(parent), QDialog(parent),
ui(new Ui::CoinControlDialog), ui(new Ui::CoinControlDialog),
@ -128,11 +135,9 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *_platformStyle, QWidge
ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 110); ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 110);
ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transaction hash in this column, but don't show it ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transaction hash in this column, but don't show it
ui->treeWidget->setColumnHidden(COLUMN_VOUT_INDEX, true); // store vout index in this column, but don't show it ui->treeWidget->setColumnHidden(COLUMN_VOUT_INDEX, true); // store vout index in this column, but don't show it
ui->treeWidget->setColumnHidden(COLUMN_AMOUNT_INT64, true); // store amount int64 in this column, but don't show it
ui->treeWidget->setColumnHidden(COLUMN_DATE_INT64, true); // store date int64 in this column, but don't show it
// default view is sorted by amount desc // default view is sorted by amount desc
sortView(COLUMN_AMOUNT_INT64, Qt::DescendingOrder); sortView(COLUMN_AMOUNT, Qt::DescendingOrder);
// restore list mode and sortorder as a convenience feature // restore list mode and sortorder as a convenience feature
QSettings settings; QSettings settings;
@ -164,15 +169,6 @@ void CoinControlDialog::setModel(WalletModel *_model)
} }
} }
// helper function str_pad
QString CoinControlDialog::strPad(QString s, int nPadLength, QString sPadding)
{
while (s.length() < nPadLength)
s = sPadding + s;
return s;
}
// ok button // ok button
void CoinControlDialog::buttonBoxClicked(QAbstractButton* button) void CoinControlDialog::buttonBoxClicked(QAbstractButton* button)
{ {
@ -338,7 +334,7 @@ void CoinControlDialog::sortView(int column, Qt::SortOrder order)
sortColumn = column; sortColumn = column;
sortOrder = order; sortOrder = order;
ui->treeWidget->sortItems(column, order); ui->treeWidget->sortItems(column, order);
ui->treeWidget->header()->setSortIndicator(getMappedColumn(sortColumn), sortOrder); ui->treeWidget->header()->setSortIndicator(sortColumn, sortOrder);
} }
// treeview: clicked on header // treeview: clicked on header
@ -346,12 +342,10 @@ void CoinControlDialog::headerSectionClicked(int logicalIndex)
{ {
if (logicalIndex == COLUMN_CHECKBOX) // click on most left column -> do nothing if (logicalIndex == COLUMN_CHECKBOX) // click on most left column -> do nothing
{ {
ui->treeWidget->header()->setSortIndicator(getMappedColumn(sortColumn), sortOrder); ui->treeWidget->header()->setSortIndicator(sortColumn, sortOrder);
} }
else else
{ {
logicalIndex = getMappedColumn(logicalIndex, false);
if (sortColumn == logicalIndex) if (sortColumn == logicalIndex)
sortOrder = ((sortOrder == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder); sortOrder = ((sortOrder == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder);
else else
@ -658,7 +652,7 @@ void CoinControlDialog::updateView()
model->listCoins(mapCoins); model->listCoins(mapCoins);
BOOST_FOREACH(const PAIRTYPE(QString, std::vector<COutput>)& coins, mapCoins) { BOOST_FOREACH(const PAIRTYPE(QString, std::vector<COutput>)& coins, mapCoins) {
QTreeWidgetItem *itemWalletAddress = new QTreeWidgetItem(); CCoinControlWidgetItem *itemWalletAddress = new CCoinControlWidgetItem();
itemWalletAddress->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked); itemWalletAddress->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked);
QString sWalletAddress = coins.first; QString sWalletAddress = coins.first;
QString sWalletLabel = model->getAddressTableModel()->labelForAddress(sWalletAddress); QString sWalletLabel = model->getAddressTableModel()->labelForAddress(sWalletAddress);
@ -686,9 +680,9 @@ void CoinControlDialog::updateView()
nSum += out.tx->vout[out.i].nValue; nSum += out.tx->vout[out.i].nValue;
nChildren++; nChildren++;
QTreeWidgetItem *itemOutput; CCoinControlWidgetItem *itemOutput;
if (treeMode) itemOutput = new QTreeWidgetItem(itemWalletAddress); if (treeMode) itemOutput = new CCoinControlWidgetItem(itemWalletAddress);
else itemOutput = new QTreeWidgetItem(ui->treeWidget); else itemOutput = new CCoinControlWidgetItem(ui->treeWidget);
itemOutput->setFlags(flgCheckbox); itemOutput->setFlags(flgCheckbox);
itemOutput->setCheckState(COLUMN_CHECKBOX,Qt::Unchecked); itemOutput->setCheckState(COLUMN_CHECKBOX,Qt::Unchecked);
@ -721,14 +715,15 @@ void CoinControlDialog::updateView()
// amount // amount
itemOutput->setText(COLUMN_AMOUNT, BitcoinUnits::format(nDisplayUnit, out.tx->vout[out.i].nValue)); itemOutput->setText(COLUMN_AMOUNT, BitcoinUnits::format(nDisplayUnit, out.tx->vout[out.i].nValue));
itemOutput->setText(COLUMN_AMOUNT_INT64, strPad(QString::number(out.tx->vout[out.i].nValue), 15, " ")); // padding so that sorting works correctly itemOutput->setData(COLUMN_AMOUNT, Qt::UserRole, QVariant((qlonglong)out.tx->vout[out.i].nValue)); // padding so that sorting works correctly
// date // date
itemOutput->setText(COLUMN_DATE, GUIUtil::dateTimeStr(out.tx->GetTxTime())); itemOutput->setText(COLUMN_DATE, GUIUtil::dateTimeStr(out.tx->GetTxTime()));
itemOutput->setText(COLUMN_DATE_INT64, strPad(QString::number(out.tx->GetTxTime()), 20, " ")); itemOutput->setData(COLUMN_DATE, Qt::UserRole, QVariant((qlonglong)out.tx->GetTxTime()));
// confirmations // confirmations
itemOutput->setText(COLUMN_CONFIRMATIONS, strPad(QString::number(out.nDepth), 8, " ")); itemOutput->setText(COLUMN_CONFIRMATIONS, QString::number(out.nDepth));
itemOutput->setData(COLUMN_CONFIRMATIONS, Qt::UserRole, QVariant((qlonglong)out.nDepth));
// transaction hash // transaction hash
uint256 txhash = out.tx->GetHash(); uint256 txhash = out.tx->GetHash();
@ -756,7 +751,7 @@ void CoinControlDialog::updateView()
{ {
itemWalletAddress->setText(COLUMN_CHECKBOX, "(" + QString::number(nChildren) + ")"); itemWalletAddress->setText(COLUMN_CHECKBOX, "(" + QString::number(nChildren) + ")");
itemWalletAddress->setText(COLUMN_AMOUNT, BitcoinUnits::format(nDisplayUnit, nSum)); itemWalletAddress->setText(COLUMN_AMOUNT, BitcoinUnits::format(nDisplayUnit, nSum));
itemWalletAddress->setText(COLUMN_AMOUNT_INT64, strPad(QString::number(nSum), 15, " ")); itemWalletAddress->setData(COLUMN_AMOUNT, Qt::UserRole, QVariant((qlonglong)nSum));
} }
} }

38
src/qt/coincontroldialog.h

@ -28,6 +28,17 @@ namespace Ui {
#define ASYMP_UTF8 "\xE2\x89\x88" #define ASYMP_UTF8 "\xE2\x89\x88"
class CCoinControlWidgetItem : public QTreeWidgetItem
{
public:
CCoinControlWidgetItem(QTreeWidget *parent, int type = Type) : QTreeWidgetItem(parent, type) {}
CCoinControlWidgetItem(int type = Type) : QTreeWidgetItem(type) {}
CCoinControlWidgetItem(QTreeWidgetItem *parent, int type = Type) : QTreeWidgetItem(parent, type) {}
bool operator<(const QTreeWidgetItem &other) const;
};
class CoinControlDialog : public QDialog class CoinControlDialog : public QDialog
{ {
Q_OBJECT Q_OBJECT
@ -59,13 +70,12 @@ private:
const PlatformStyle *platformStyle; const PlatformStyle *platformStyle;
QString strPad(QString, int, QString);
void sortView(int, Qt::SortOrder); void sortView(int, Qt::SortOrder);
void updateView(); void updateView();
enum enum
{ {
COLUMN_CHECKBOX, COLUMN_CHECKBOX = 0,
COLUMN_AMOUNT, COLUMN_AMOUNT,
COLUMN_LABEL, COLUMN_LABEL,
COLUMN_ADDRESS, COLUMN_ADDRESS,
@ -73,30 +83,8 @@ private:
COLUMN_CONFIRMATIONS, COLUMN_CONFIRMATIONS,
COLUMN_TXHASH, COLUMN_TXHASH,
COLUMN_VOUT_INDEX, COLUMN_VOUT_INDEX,
COLUMN_AMOUNT_INT64,
COLUMN_DATE_INT64
}; };
friend class CCoinControlWidgetItem;
// some columns have a hidden column containing the value used for sorting
int getMappedColumn(int column, bool fVisibleColumn = true)
{
if (fVisibleColumn)
{
if (column == COLUMN_AMOUNT_INT64)
return COLUMN_AMOUNT;
else if (column == COLUMN_DATE_INT64)
return COLUMN_DATE;
}
else
{
if (column == COLUMN_AMOUNT)
return COLUMN_AMOUNT_INT64;
else if (column == COLUMN_DATE)
return COLUMN_DATE_INT64;
}
return column;
}
private Q_SLOTS: private Q_SLOTS:
void showMenu(const QPoint &); void showMenu(const QPoint &);

Loading…
Cancel
Save