Skip to content

Commit e4dbeb9

Browse files
committed
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)
2 parents 0c577f2 + 4231032 commit e4dbeb9

File tree

2 files changed

+32
-49
lines changed

2 files changed

+32
-49
lines changed

src/qt/coincontroldialog.cpp

Lines changed: 19 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,13 @@ QList<CAmount> CoinControlDialog::payAmounts;
3535
CCoinControl* CoinControlDialog::coinControl = new CCoinControl();
3636
bool CoinControlDialog::fSubtractFeeFromAmount = false;
3737

38+
bool CCoinControlWidgetItem::operator<(const QTreeWidgetItem &other) const {
39+
int column = treeWidget()->sortColumn();
40+
if (column == CoinControlDialog::COLUMN_AMOUNT || column == CoinControlDialog::COLUMN_DATE || column == CoinControlDialog::COLUMN_CONFIRMATIONS)
41+
return data(column, Qt::UserRole).toLongLong() < other.data(column, Qt::UserRole).toLongLong();
42+
return QTreeWidgetItem::operator<(other);
43+
}
44+
3845
CoinControlDialog::CoinControlDialog(const PlatformStyle *_platformStyle, QWidget *parent) :
3946
QDialog(parent),
4047
ui(new Ui::CoinControlDialog),
@@ -128,11 +135,9 @@ CoinControlDialog::CoinControlDialog(const PlatformStyle *_platformStyle, QWidge
128135
ui->treeWidget->setColumnWidth(COLUMN_CONFIRMATIONS, 110);
129136
ui->treeWidget->setColumnHidden(COLUMN_TXHASH, true); // store transaction hash in this column, but don't show it
130137
ui->treeWidget->setColumnHidden(COLUMN_VOUT_INDEX, true); // store vout index in this column, but don't show it
131-
ui->treeWidget->setColumnHidden(COLUMN_AMOUNT_INT64, true); // store amount int64 in this column, but don't show it
132-
ui->treeWidget->setColumnHidden(COLUMN_DATE_INT64, true); // store date int64 in this column, but don't show it
133138

134139
// default view is sorted by amount desc
135-
sortView(COLUMN_AMOUNT_INT64, Qt::DescendingOrder);
140+
sortView(COLUMN_AMOUNT, Qt::DescendingOrder);
136141

137142
// restore list mode and sortorder as a convenience feature
138143
QSettings settings;
@@ -164,15 +169,6 @@ void CoinControlDialog::setModel(WalletModel *_model)
164169
}
165170
}
166171

167-
// helper function str_pad
168-
QString CoinControlDialog::strPad(QString s, int nPadLength, QString sPadding)
169-
{
170-
while (s.length() < nPadLength)
171-
s = sPadding + s;
172-
173-
return s;
174-
}
175-
176172
// ok button
177173
void CoinControlDialog::buttonBoxClicked(QAbstractButton* button)
178174
{
@@ -338,20 +334,18 @@ void CoinControlDialog::sortView(int column, Qt::SortOrder order)
338334
sortColumn = column;
339335
sortOrder = order;
340336
ui->treeWidget->sortItems(column, order);
341-
ui->treeWidget->header()->setSortIndicator(getMappedColumn(sortColumn), sortOrder);
337+
ui->treeWidget->header()->setSortIndicator(sortColumn, sortOrder);
342338
}
343339

344340
// treeview: clicked on header
345341
void CoinControlDialog::headerSectionClicked(int logicalIndex)
346342
{
347343
if (logicalIndex == COLUMN_CHECKBOX) // click on most left column -> do nothing
348344
{
349-
ui->treeWidget->header()->setSortIndicator(getMappedColumn(sortColumn), sortOrder);
345+
ui->treeWidget->header()->setSortIndicator(sortColumn, sortOrder);
350346
}
351347
else
352348
{
353-
logicalIndex = getMappedColumn(logicalIndex, false);
354-
355349
if (sortColumn == logicalIndex)
356350
sortOrder = ((sortOrder == Qt::AscendingOrder) ? Qt::DescendingOrder : Qt::AscendingOrder);
357351
else
@@ -658,7 +652,7 @@ void CoinControlDialog::updateView()
658652
model->listCoins(mapCoins);
659653

660654
BOOST_FOREACH(const PAIRTYPE(QString, std::vector<COutput>)& coins, mapCoins) {
661-
QTreeWidgetItem *itemWalletAddress = new QTreeWidgetItem();
655+
CCoinControlWidgetItem *itemWalletAddress = new CCoinControlWidgetItem();
662656
itemWalletAddress->setCheckState(COLUMN_CHECKBOX, Qt::Unchecked);
663657
QString sWalletAddress = coins.first;
664658
QString sWalletLabel = model->getAddressTableModel()->labelForAddress(sWalletAddress);
@@ -686,9 +680,9 @@ void CoinControlDialog::updateView()
686680
nSum += out.tx->vout[out.i].nValue;
687681
nChildren++;
688682

689-
QTreeWidgetItem *itemOutput;
690-
if (treeMode) itemOutput = new QTreeWidgetItem(itemWalletAddress);
691-
else itemOutput = new QTreeWidgetItem(ui->treeWidget);
683+
CCoinControlWidgetItem *itemOutput;
684+
if (treeMode) itemOutput = new CCoinControlWidgetItem(itemWalletAddress);
685+
else itemOutput = new CCoinControlWidgetItem(ui->treeWidget);
692686
itemOutput->setFlags(flgCheckbox);
693687
itemOutput->setCheckState(COLUMN_CHECKBOX,Qt::Unchecked);
694688

@@ -721,14 +715,15 @@ void CoinControlDialog::updateView()
721715

722716
// amount
723717
itemOutput->setText(COLUMN_AMOUNT, BitcoinUnits::format(nDisplayUnit, out.tx->vout[out.i].nValue));
724-
itemOutput->setText(COLUMN_AMOUNT_INT64, strPad(QString::number(out.tx->vout[out.i].nValue), 15, " ")); // padding so that sorting works correctly
718+
itemOutput->setData(COLUMN_AMOUNT, Qt::UserRole, QVariant((qlonglong)out.tx->vout[out.i].nValue)); // padding so that sorting works correctly
725719

726720
// date
727721
itemOutput->setText(COLUMN_DATE, GUIUtil::dateTimeStr(out.tx->GetTxTime()));
728-
itemOutput->setText(COLUMN_DATE_INT64, strPad(QString::number(out.tx->GetTxTime()), 20, " "));
722+
itemOutput->setData(COLUMN_DATE, Qt::UserRole, QVariant((qlonglong)out.tx->GetTxTime()));
729723

730724
// confirmations
731-
itemOutput->setText(COLUMN_CONFIRMATIONS, strPad(QString::number(out.nDepth), 8, " "));
725+
itemOutput->setText(COLUMN_CONFIRMATIONS, QString::number(out.nDepth));
726+
itemOutput->setData(COLUMN_CONFIRMATIONS, Qt::UserRole, QVariant((qlonglong)out.nDepth));
732727

733728
// transaction hash
734729
uint256 txhash = out.tx->GetHash();
@@ -756,7 +751,7 @@ void CoinControlDialog::updateView()
756751
{
757752
itemWalletAddress->setText(COLUMN_CHECKBOX, "(" + QString::number(nChildren) + ")");
758753
itemWalletAddress->setText(COLUMN_AMOUNT, BitcoinUnits::format(nDisplayUnit, nSum));
759-
itemWalletAddress->setText(COLUMN_AMOUNT_INT64, strPad(QString::number(nSum), 15, " "));
754+
itemWalletAddress->setData(COLUMN_AMOUNT, Qt::UserRole, QVariant((qlonglong)nSum));
760755
}
761756
}
762757

src/qt/coincontroldialog.h

Lines changed: 13 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,17 @@ namespace Ui {
2828

2929
#define ASYMP_UTF8 "\xE2\x89\x88"
3030

31+
class CCoinControlWidgetItem : public QTreeWidgetItem
32+
{
33+
public:
34+
CCoinControlWidgetItem(QTreeWidget *parent, int type = Type) : QTreeWidgetItem(parent, type) {}
35+
CCoinControlWidgetItem(int type = Type) : QTreeWidgetItem(type) {}
36+
CCoinControlWidgetItem(QTreeWidgetItem *parent, int type = Type) : QTreeWidgetItem(parent, type) {}
37+
38+
bool operator<(const QTreeWidgetItem &other) const;
39+
};
40+
41+
3142
class CoinControlDialog : public QDialog
3243
{
3344
Q_OBJECT
@@ -59,44 +70,21 @@ class CoinControlDialog : public QDialog
5970

6071
const PlatformStyle *platformStyle;
6172

62-
QString strPad(QString, int, QString);
6373
void sortView(int, Qt::SortOrder);
6474
void updateView();
6575

6676
enum
6777
{
68-
COLUMN_CHECKBOX,
78+
COLUMN_CHECKBOX = 0,
6979
COLUMN_AMOUNT,
7080
COLUMN_LABEL,
7181
COLUMN_ADDRESS,
7282
COLUMN_DATE,
7383
COLUMN_CONFIRMATIONS,
7484
COLUMN_TXHASH,
7585
COLUMN_VOUT_INDEX,
76-
COLUMN_AMOUNT_INT64,
77-
COLUMN_DATE_INT64
7886
};
79-
80-
// some columns have a hidden column containing the value used for sorting
81-
int getMappedColumn(int column, bool fVisibleColumn = true)
82-
{
83-
if (fVisibleColumn)
84-
{
85-
if (column == COLUMN_AMOUNT_INT64)
86-
return COLUMN_AMOUNT;
87-
else if (column == COLUMN_DATE_INT64)
88-
return COLUMN_DATE;
89-
}
90-
else
91-
{
92-
if (column == COLUMN_AMOUNT)
93-
return COLUMN_AMOUNT_INT64;
94-
else if (column == COLUMN_DATE)
95-
return COLUMN_DATE_INT64;
96-
}
97-
98-
return column;
99-
}
87+
friend class CCoinControlWidgetItem;
10088

10189
private Q_SLOTS:
10290
void showMenu(const QPoint &);

0 commit comments

Comments
 (0)