diff --git a/electrum/gui/qt/utxo_list.py b/electrum/gui/qt/utxo_list.py index cddfc1bdd..0572c391c 100644 --- a/electrum/gui/qt/utxo_list.py +++ b/electrum/gui/qt/utxo_list.py @@ -38,7 +38,7 @@ from electrum.lnutil import MIN_FUNDING_SAT from electrum.util import profiler from .util import ColorScheme, MONOSPACE_FONT, EnterButton -from .my_treeview import MyTreeView +from .my_treeview import MyTreeView, MySortModel from .new_channel_dialog import NewChannelDialog from ..messages import MSG_FREEZE_ADDRESS, MSG_FREEZE_COIN @@ -68,6 +68,7 @@ class UTXOList(MyTreeView): stretch_column = Columns.LABEL ROLE_PREVOUT_STR = Qt.UserRole + 1000 + ROLE_SORT_ORDER = Qt.UserRole + 1001 key_role = ROLE_PREVOUT_STR def __init__(self, main_window: 'ElectrumWindow'): @@ -80,6 +81,9 @@ class UTXOList(MyTreeView): self.wallet = self.main_window.wallet self.std_model = QStandardItemModel(self) self.setModel(self.std_model) + self.proxy = MySortModel(self, sort_role=self.ROLE_SORT_ORDER) + self.proxy.setSourceModel(self.std_model) + self.setModel(self.proxy) self.setSelectionMode(QAbstractItemView.ExtendedSelection) self.setSortingEnabled(True) @@ -92,11 +96,11 @@ class UTXOList(MyTreeView): @profiler(min_threshold=0.05) def update(self): # not calling maybe_defer_update() as it interferes with coincontrol status bar + self.proxy.setDynamicSortFilter(False) # temp. disable re-sorting after every change utxos = self.wallet.get_utxos() - utxos.sort(key=lambda x: x.block_height, reverse=True) self._maybe_reset_coincontrol(utxos) self._utxo_dict = {} - self.model().clear() + self.std_model.clear() self.update_headers(self.__class__.headers) for idx, utxo in enumerate(utxos): name = utxo.prevout.to_str() @@ -117,9 +121,11 @@ class UTXOList(MyTreeView): utxo_item[self.Columns.AMOUNT].setFont(QFont(MONOSPACE_FONT)) utxo_item[self.Columns.PARENTS].setFont(QFont(MONOSPACE_FONT)) utxo_item[self.Columns.OUTPOINT].setFont(QFont(MONOSPACE_FONT)) - self.model().insertRow(idx, utxo_item) + self.std_model.insertRow(idx, utxo_item) self.refresh_row(name, idx) self.filter() + self.proxy.setDynamicSortFilter(True) + self.sortByColumn(self.Columns.OUTPOINT, Qt.DescendingOrder) self.update_coincontrol_bar() self.num_coins_label.setText(_('{} unspent transaction outputs').format(len(utxos))) @@ -144,6 +150,8 @@ class UTXOList(MyTreeView): utxo_item[self.Columns.PARENTS].setText('%6s'%num_parents if num_parents else '-') label = self.wallet.get_label_for_txid(txid) or '' utxo_item[self.Columns.LABEL].setText(label) + block_height_sort_key = self.wallet.adb.tx_height_to_sort_height(utxo.block_height) + utxo_item[self.Columns.OUTPOINT].setData(block_height_sort_key, self.ROLE_SORT_ORDER) SELECTED_TO_SPEND_TOOLTIP = _('Coin selected to be spent') if key in self._spend_set: tooltip = key + "\n" + SELECTED_TO_SPEND_TOOLTIP