11import asyncio
2+ import bisect
23from enum import IntEnum
34from typing import Union , Optional , TYPE_CHECKING , Sequence
45
@@ -33,7 +34,7 @@ class QESwapServerNPubListModel(QAbstractListModel):
3334
3435 # define listmodel rolemap
3536 _ROLE_NAMES = ('npub' , 'server_pubkey' , 'timestamp' , 'percentage_fee' , 'mining_fee' ,
36- 'min_amount' , 'max_forward_amount' , 'max_reverse_amount' )
37+ 'min_amount' , 'max_forward_amount' , 'max_reverse_amount' , 'pow_bits' )
3738 _ROLE_KEYS = range (Qt .ItemDataRole .UserRole , Qt .ItemDataRole .UserRole + len (_ROLE_NAMES ))
3839 _ROLE_MAP = dict (zip (_ROLE_KEYS , [bytearray (x .encode ()) for x in _ROLE_NAMES ]))
3940
@@ -77,6 +78,7 @@ def offer_to_model(self, x: 'SwapOffer'):
7778 'max_forward_amount' : x .pairs .max_forward ,
7879 'max_reverse_amount' : x .pairs .max_reverse ,
7980 'timestamp' : age (x .timestamp ),
81+ 'pow_bits' : x .pow_bits ,
8082 }
8183
8284 def updateModel (self , items : Sequence ['SwapOffer' ]):
@@ -103,10 +105,16 @@ def updateModel(self, items: Sequence['SwapOffer']):
103105
104106 # add new offers
105107 if offers :
106- self .beginInsertRows (QModelIndex (), len (self ._services ), len (self ._services ) + len (offers ) - 1 )
107108 for offer in offers :
108- self ._services .append (self .offer_to_model (offer ))
109- self .endInsertRows ()
109+ # offers are sorted by pow_bits
110+ insertion_index = bisect .bisect_left (
111+ self ._services ,
112+ - offer .pow_bits , # negate the values to get ascending order
113+ key = lambda service : - service ['pow_bits' ],
114+ )
115+ self .beginInsertRows (QModelIndex (), insertion_index , insertion_index )
116+ self ._services .insert (insertion_index , self .offer_to_model (offer ))
117+ self .endInsertRows ()
110118
111119 if offers or remove :
112120 self .countChanged .emit ()
0 commit comments