Browse Source

Qt: on status changes, refresh item in invoice_list and request_list,

instead of calling update(), which repopulates the model.
patch-4
ThomasV 3 years ago
parent
commit
92c6d91157
  1. 17
      electrum/gui/qt/invoice_list.py
  2. 17
      electrum/gui/qt/main_window.py
  3. 32
      electrum/gui/qt/request_list.py
  4. 20
      electrum/gui/qt/util.py

17
electrum/gui/qt/invoice_list.py

@ -48,6 +48,7 @@ ROLE_SORT_ORDER = Qt.UserRole + 2
class InvoiceList(MyTreeView): class InvoiceList(MyTreeView):
key_role = ROLE_REQUEST_ID
class Columns(IntEnum): class Columns(IntEnum):
DATE = 0 DATE = 0
@ -74,14 +75,11 @@ class InvoiceList(MyTreeView):
self.setSelectionMode(QAbstractItemView.ExtendedSelection) self.setSelectionMode(QAbstractItemView.ExtendedSelection)
self.update() self.update()
def update_item(self, key, invoice: Invoice): def refresh_row(self, key, row):
model = self.std_model invoice = self.parent.wallet.invoices.get(key)
for row in range(0, model.rowCount()): if invoice is None:
item = model.item(row, 0)
if item.data(ROLE_REQUEST_ID) == key:
break
else:
return return
model = self.std_model
status_item = model.item(row, self.Columns.STATUS) status_item = model.item(row, self.Columns.STATUS)
status = self.parent.wallet.get_invoice_status(invoice) status = self.parent.wallet.get_invoice_status(invoice)
status_str = invoice.get_status_str(status) status_str = invoice.get_status_str(status)
@ -125,8 +123,9 @@ class InvoiceList(MyTreeView):
self.proxy.setDynamicSortFilter(True) self.proxy.setDynamicSortFilter(True)
# sort requests by date # sort requests by date
self.sortByColumn(self.Columns.DATE, Qt.DescendingOrder) self.sortByColumn(self.Columns.DATE, Qt.DescendingOrder)
# hide list if empty self.hide_if_empty()
if self.parent.isVisible():
def hide_if_empty(self):
b = self.std_model.rowCount() > 0 b = self.std_model.rowCount() > 0
self.setVisible(b) self.setVisible(b)
self.parent.invoices_label.setVisible(b) self.parent.invoices_label.setVisible(b)

17
electrum/gui/qt/main_window.py

@ -875,7 +875,8 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
self.tray.showMessage("Electrum", message, QSystemTrayIcon.Information, 20000) self.tray.showMessage("Electrum", message, QSystemTrayIcon.Information, 20000)
def timer_actions(self): def timer_actions(self):
self.request_list.refresh_status() self.request_list.refresh_all()
self.invoice_list.refresh_all()
# Note this runs in the GUI thread # Note this runs in the GUI thread
if self.need_update.is_set(): if self.need_update.is_set():
self.need_update.clear() self.need_update.clear()
@ -1028,11 +1029,11 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
if wallet != self.wallet: if wallet != self.wallet:
return return
self.history_model.refresh('update_tabs') self.history_model.refresh('update_tabs')
self.request_list.update() self.request_list.refresh_all()
self.invoice_list.refresh_all()
self.address_list.update() self.address_list.update()
self.utxo_list.update() self.utxo_list.update()
self.contact_list.update() self.contact_list.update()
self.invoice_list.update()
self.channels_list.update_rows.emit(wallet) self.channels_list.update_rows.emit(wallet)
self.update_completions() self.update_completions()
@ -1211,7 +1212,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
def delete_requests(self, keys): def delete_requests(self, keys):
for key in keys: for key in keys:
self.wallet.delete_request(key) self.wallet.delete_request(key)
self.request_list.update() self.request_list.delete_item(key)
self.clear_receive_tab() self.clear_receive_tab()
def delete_lightning_payreq(self, payreq_key): def delete_lightning_payreq(self, payreq_key):
@ -1596,7 +1597,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
self.notify(_('Payment received') + '\n' + key) self.notify(_('Payment received') + '\n' + key)
self.need_update.set() self.need_update.set()
else: else:
self.request_list.update_item(key, req) self.request_list.refresh_item(key)
def on_invoice_status(self, wallet, key): def on_invoice_status(self, wallet, key):
if wallet != self.wallet: if wallet != self.wallet:
@ -1606,9 +1607,9 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
return return
status = self.wallet.get_invoice_status(invoice) status = self.wallet.get_invoice_status(invoice)
if status == PR_PAID: if status == PR_PAID:
self.invoice_list.update() self.invoice_list.delete_item(key)
else: else:
self.invoice_list.update_item(key, invoice) self.invoice_list.refresh_item(key)
def on_payment_succeeded(self, wallet, key): def on_payment_succeeded(self, wallet, key):
description = self.wallet.get_label(key) description = self.wallet.get_label(key)
@ -1944,7 +1945,7 @@ class ElectrumWindow(QMainWindow, MessageBoxMixin, Logger):
def delete_invoices(self, keys): def delete_invoices(self, keys):
for key in keys: for key in keys:
self.wallet.delete_invoice(key) self.wallet.delete_invoice(key)
self.invoice_list.update() self.invoice_list.delete_item(key)
def payment_request_ok(self): def payment_request_ok(self):
pr = self.payment_request pr = self.payment_request

32
electrum/gui/qt/request_list.py

@ -48,6 +48,7 @@ ROLE_SORT_ORDER = Qt.UserRole + 2
class RequestList(MyTreeView): class RequestList(MyTreeView):
key_role = ROLE_KEY
class Columns(IntEnum): class Columns(IntEnum):
DATE = 0 DATE = 0
@ -111,32 +112,14 @@ class RequestList(MyTreeView):
super().clearSelection() super().clearSelection()
self.selectionModel().clearCurrentIndex() self.selectionModel().clearCurrentIndex()
def refresh_status(self): def refresh_row(self, key, row):
m = self.std_model
for r in range(m.rowCount()):
idx = m.index(r, self.Columns.STATUS)
date_idx = idx.sibling(idx.row(), self.Columns.DATE)
date_item = m.itemFromIndex(date_idx)
status_item = m.itemFromIndex(idx)
key = date_item.data(ROLE_KEY)
req = self.wallet.get_request(key)
if req:
status = self.parent.wallet.get_request_status(key)
status_str = req.get_status_str(status)
status_item.setText(status_str)
status_item.setIcon(read_QIcon(pr_icons.get(status)))
def update_item(self, key, invoice: Invoice):
model = self.std_model model = self.std_model
for row in range(0, model.rowCount()): request = self.wallet.get_request(key)
item = model.item(row, 0) if request is None:
if item.data(ROLE_KEY) == key:
break
else:
return return
status_item = model.item(row, self.Columns.STATUS) status_item = model.item(row, self.Columns.STATUS)
status = self.parent.wallet.get_request_status(key) status = self.parent.wallet.get_request_status(key)
status_str = invoice.get_status_str(status) status_str = request.get_status_str(status)
status_item.setText(status_str) status_item.setText(status_str)
status_item.setIcon(read_QIcon(pr_icons.get(status))) status_item.setIcon(read_QIcon(pr_icons.get(status)))
@ -176,8 +159,9 @@ class RequestList(MyTreeView):
self.proxy.setDynamicSortFilter(True) self.proxy.setDynamicSortFilter(True)
# sort requests by date # sort requests by date
self.sortByColumn(self.Columns.DATE, Qt.DescendingOrder) self.sortByColumn(self.Columns.DATE, Qt.DescendingOrder)
# hide list if empty self.hide_if_empty()
if self.parent.isVisible():
def hide_if_empty(self):
b = self.std_model.rowCount() > 0 b = self.std_model.rowCount() > 0
self.setVisible(b) self.setVisible(b)
self.parent.receive_requests_label.setVisible(b) self.parent.receive_requests_label.setVisible(b)

20
electrum/gui/qt/util.py

@ -783,6 +783,26 @@ class MyTreeView(QTreeView):
self._pending_update = defer self._pending_update = defer
return defer return defer
def find_row_by_key(self, key):
for row in range(0, self.std_model.rowCount()):
item = self.std_model.item(row, 0)
if item.data(self.key_role) == key:
return row
def refresh_all(self):
for row in range(0, self.std_model.rowCount()):
item = self.std_model.item(row, 0)
key = item.data(self.key_role)
self.refresh_row(key, row)
def refresh_item(self, key):
row = self.find_row_by_key(key)
self.refresh_row(key, row)
def delete_item(self, key):
row = self.find_row_by_key(key)
self.std_model.takeRow(row)
self.hide_if_empty()
class MySortModel(QSortFilterProxyModel): class MySortModel(QSortFilterProxyModel):
def __init__(self, parent, *, sort_role): def __init__(self, parent, *, sort_role):

Loading…
Cancel
Save