URI: 
       tEnable sorting of list widgets - electrum - Electrum Bitcoin wallet
  HTML git clone https://git.parazyd.org/electrum
   DIR Log
   DIR Files
   DIR Refs
   DIR Submodules
       ---
   DIR commit 3965176295364f0af444525206afb49ef983ab36
   DIR parent b2c7d2d2ccee4e156d785dbff3d8e211fae0e86b
  HTML Author: Johann Bauer <bauerj@bauerj.eu>
       Date:   Sun, 28 Jan 2018 13:07:59 +0100
       
       Enable sorting of list widgets
       
       Diffstat:
         M gui/qt/address_list.py              |       5 +++--
         M gui/qt/history_list.py              |       6 +++++-
         M gui/qt/util.py                      |      15 +++++++++++++++
         M gui/qt/utxo_list.py                 |       3 ++-
       
       4 files changed, 25 insertions(+), 4 deletions(-)
       ---
   DIR diff --git a/gui/qt/address_list.py b/gui/qt/address_list.py
       t@@ -39,6 +39,7 @@ class AddressList(MyTreeWidget):
                MyTreeWidget.__init__(self, parent, self.create_menu, [], 2)
                self.refresh_headers()
                self.setSelectionMode(QAbstractItemView.ExtendedSelection)
       +        self.setSortingEnabled(True)
                self.show_change = 0
                self.show_used = 0
                self.change_button = QComboBox(self)
       t@@ -109,11 +110,11 @@ class AddressList(MyTreeWidget):
                    if fx and fx.get_fiat_address_config():
                        rate = fx.exchange_rate()
                        fiat_balance = fx.value_str(balance, rate)
       -                address_item = QTreeWidgetItem(['', address, label, balance_text, fiat_balance, "%d"%num])
       +                address_item = SortableTreeWidgetItem(['', address, label, balance_text, fiat_balance, "%d"%num])
                        address_item.setTextAlignment(4, Qt.AlignRight)
                        address_item.setFont(4, QFont(MONOSPACE_FONT))
                    else:
       -                address_item = QTreeWidgetItem(['', address, label, balance_text, "%d"%num])
       +                address_item = SortableTreeWidgetItem(['', address, label, balance_text, "%d"%num])
                    address_item.setFont(3, QFont(MONOSPACE_FONT))
                    if self.wallet.is_change(address):
                        address_item.setText(0, _('change'))
   DIR diff --git a/gui/qt/history_list.py b/gui/qt/history_list.py
       t@@ -59,6 +59,8 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop):
                AcceptFileDragDrop.__init__(self, ".txn")
                self.refresh_headers()
                self.setColumnHidden(1, True)
       +        self.setSortingEnabled(True)
       +        self.sortByColumn(0, Qt.AscendingOrder)
                self.start_timestamp = None
                self.end_timestamp = None
                self.years = []
       t@@ -243,9 +245,10 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop):
                        if value < 0:
                            entry.append(fx.format_fiat(tx_item['acquisition_price'].value))
                            entry.append(fx.format_fiat(tx_item['capital_gain'].value))
       -            item = QTreeWidgetItem(entry)
       +            item = SortableTreeWidgetItem(entry)
                    item.setIcon(0, icon)
                    item.setToolTip(0, str(conf) + " confirmation" + ("s" if conf != 1 else ""))
       +            item.setData(0, SortableTreeWidgetItem.DataRole, (status, conf))
                    if has_invoice:
                        item.setIcon(3, QIcon(":icons/seal"))
                    for i in range(len(entry)):
       t@@ -301,6 +304,7 @@ class HistoryList(MyTreeWidget, AcceptFileDragDrop):
                if items:
                    item = items[0]
                    item.setIcon(0, icon)
       +            item.setData(0, SortableTreeWidgetItem.DataRole, (status, conf))
                    item.setText(2, status_str)
        
            def create_menu(self, position):
   DIR diff --git a/gui/qt/util.py b/gui/qt/util.py
       t@@ -763,6 +763,21 @@ def get_parent_main_window(widget):
                    return widget
            return None
        
       +class SortableTreeWidgetItem(QTreeWidgetItem):
       +    DataRole = Qt.UserRole + 1
       +
       +    def __lt__(self, other):
       +        column = self.treeWidget().sortColumn()
       +        if None not in [x.data(column, self.DataRole) for x in [self, other]]:
       +            # We have set custom data to sort by
       +            return self.data(column, self.DataRole) < other.data(column, self.DataRole)
       +        try:
       +            # Is the value something numeric?
       +            return float(self.text(column)) < float(other.text(column))
       +        except ValueError:
       +            # If not, we will just do string comparison
       +            return self.text(column) < other.text(column)
       +
        
        if __name__ == "__main__":
            app = QApplication([])
   DIR diff --git a/gui/qt/utxo_list.py b/gui/qt/utxo_list.py
       t@@ -32,6 +32,7 @@ class UTXOList(MyTreeWidget):
            def __init__(self, parent=None):
                MyTreeWidget.__init__(self, parent, self.create_menu, [ _('Address'), _('Label'), _('Amount'), _('Height'), _('Output point')], 1)
                self.setSelectionMode(QAbstractItemView.ExtendedSelection)
       +        self.setSortingEnabled(True)
        
            def get_name(self, x):
                return x.get('prevout_hash') + ":%d"%x.get('prevout_n')
       t@@ -47,7 +48,7 @@ class UTXOList(MyTreeWidget):
                    name = self.get_name(x)
                    label = self.wallet.get_label(x.get('prevout_hash'))
                    amount = self.parent.format_amount(x['value'], whitespaces=True)
       -            utxo_item = QTreeWidgetItem([address, label, amount, '%d'%height, name[0:10] + '...' + name[-2:]])
       +            utxo_item = SortableTreeWidgetItem([address, label, amount, '%d'%height, name[0:10] + '...' + name[-2:]])
                    utxo_item.setFont(0, QFont(MONOSPACE_FONT))
                    utxo_item.setFont(2, QFont(MONOSPACE_FONT))
                    utxo_item.setFont(4, QFont(MONOSPACE_FONT))