200 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
			
		
		
	
	
			200 lines
		
	
	
		
			8.5 KiB
		
	
	
	
		
			Python
		
	
	
	
	
	
| from functools import partial
 | |
| 
 | |
| from . import qt_resources
 | |
| if qt_resources.QT_VERSION == 5:
 | |
|     from PyQt5.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QLabel,QWidget,QScrollArea)
 | |
|     from PyQt5.QtGui import (QPixmap, QImage, QBitmap, QPainter, QFontDatabase, QPen, QFont,
 | |
|                      QColor, QDesktopServices, qRgba, QPainterPath,QPalette)
 | |
| else:
 | |
|     from PyQt6.QtWidgets import (QDialog, QVBoxLayout, QHBoxLayout, QPushButton, QLabel,QWidget,QScrollArea)
 | |
|     from PyQt6.QtGui import (QPixmap, QImage, QBitmap, QPainter, QFontDatabase, QPen, QFont,
 | |
|                      QColor, QDesktopServices, qRgba, QPainterPath,QPalette)
 | |
| 
 | |
| 
 | |
| from electrum.util import decimal_point_to_base_unit_name
 | |
| from electrum.i18n import _
 | |
| 
 | |
| from ..bal import BalPlugin
 | |
| from .. import will as Will
 | |
| from .. import util as Util
 | |
| from .baldialog import BalDialog
 | |
| 
 | |
| 
 | |
| 
 | |
|     
 | |
| 
 | |
| 
 | |
| class WillDetailDialog(BalDialog):
 | |
| 
 | |
| 
 | |
|     def __init__(self, bal_window):
 | |
| 
 | |
|         self.will = bal_window.willitems
 | |
|         self.threshold = Util.parse_locktime_string(bal_window.will_settings['threshold'])
 | |
|         self.bal_window = bal_window 
 | |
|         Will.add_willtree(self.will)
 | |
|         super().__init__(bal_window.window)
 | |
|         self.config = bal_window.window.config
 | |
|         self.wallet = bal_window.wallet
 | |
|         self.format_amount = bal_window.window.format_amount
 | |
|         self.base_unit = bal_window.window.base_unit
 | |
|         self.format_fiat_and_units = bal_window.window.format_fiat_and_units
 | |
|         self.fx = bal_window.window.fx
 | |
|         self.format_fee_rate = bal_window.window.format_fee_rate
 | |
|         self.decimal_point = bal_window.bal_plugin.config.get_decimal_point()
 | |
|         self.base_unit_name = decimal_point_to_base_unit_name(self.decimal_point)
 | |
|         self.setWindowTitle(_('Will Details'))
 | |
|         self.setMinimumSize(670,700)
 | |
|         self.vlayout= QVBoxLayout()
 | |
|         w=QWidget()
 | |
|         hlayout = QHBoxLayout(w)
 | |
| 
 | |
|         b = QPushButton(_('Sign'))
 | |
|         b.clicked.connect(self.ask_password_and_sign_transactions)
 | |
|         hlayout.addWidget(b)
 | |
|  
 | |
|         b = QPushButton(_('Broadcast')) 
 | |
|         b.clicked.connect(self.broadcast_transactions) 
 | |
|         hlayout.addWidget(b) 
 | |
| 
 | |
|         b = QPushButton(_('Export'))
 | |
|         b.clicked.connect(self.export_will)
 | |
|         hlayout.addWidget(b)
 | |
|         """
 | |
|         toggle = "Hide"
 | |
|         if self.bal_window.bal_plugin._hide_replaced:
 | |
|             toggle = "Unhide"
 | |
|         self.toggle_replace_button = QPushButton(_(f"{toggle} replaced"))
 | |
|         self.toggle_replace_button.clicked.connect(self.toggle_replaced)
 | |
|         hlayout.addWidget(self.toggle_replace_button)
 | |
| 
 | |
|         toggle = "Hide"
 | |
|         if self.bal_window.bal_plugin._hide_invalidated:
 | |
|             toggle = "Unhide"
 | |
| 
 | |
|         self.toggle_invalidate_button = QPushButton(_(f"{toggle} invalidated"))
 | |
|         self.toggle_invalidate_button.clicked.connect(self.toggle_invalidated)
 | |
|         hlayout.addWidget(self.toggle_invalidate_button)
 | |
|         """
 | |
|         b = QPushButton(_('Invalidate'))
 | |
|         b.clicked.connect(bal_window.invalidate_will)
 | |
|         hlayout.addWidget(b)
 | |
|         self.vlayout.addWidget(w)
 | |
| 
 | |
|         self.paint_scroll_area()
 | |
|         #vlayout.addWidget(QLabel(_("DON'T PANIC !!! everything is fine, all possible futures are covered")))
 | |
|         self.vlayout.addWidget(QLabel(_("Expiration date: ")+Util.locktime_to_str(self.threshold)))
 | |
|         self.vlayout.addWidget(self.scrollbox)
 | |
|         w=QWidget()
 | |
|         hlayout = QHBoxLayout(w)
 | |
|         hlayout.addWidget(QLabel(_("Valid Txs:")+ str(len(Will.only_valid_list(self.will)))))
 | |
|         hlayout.addWidget(QLabel(_("Total Txs:")+ str(len(self.will))))
 | |
|         self.vlayout.addWidget(w)
 | |
|         self.setLayout(self.vlayout)
 | |
| 
 | |
|     def paint_scroll_area(self):
 | |
|         #self.scrollbox.deleteLater()
 | |
|         #self.willlayout.deleteLater()
 | |
|         #self.detailsWidget.deleteLater()
 | |
|         self.scrollbox = QScrollArea()
 | |
|         viewport = QWidget(self.scrollbox)
 | |
|         self.willlayout = QVBoxLayout(viewport)
 | |
|         self.detailsWidget = WillWidget(parent=self)
 | |
|         self.willlayout.addWidget(self.detailsWidget)
 | |
| 
 | |
|         self.scrollbox.setWidget(viewport)
 | |
|         viewport.setLayout(self.willlayout)
 | |
|     def ask_password_and_sign_transactions(self):
 | |
|         self.bal_window.ask_password_and_sign_transactions(callback=self.update)
 | |
|         self.update()
 | |
|     def broadcast_transactions(self):
 | |
|         self.bal_window.broadcast_transactions()
 | |
|         self.update()
 | |
|     def export_will(self):
 | |
|         self.bal_window.export_will()
 | |
|     def toggle_replaced(self):
 | |
|         self.bal_window.bal_plugin.hide_replaced()
 | |
|         toggle = _("Hide")
 | |
|         if self.bal_window.bal_plugin._hide_replaced:
 | |
|             toggle = _("Unhide")
 | |
|         self.toggle_replace_button.setText(f"{toggle} {_('replaced')}")
 | |
|         self.update()
 | |
| 
 | |
|     def toggle_invalidated(self):
 | |
|         self.bal_window.bal_plugin.hide_invalidated()
 | |
|         toggle = _("Hide")
 | |
|         if self.bal_window.bal_plugin._hide_invalidated:
 | |
|             toggle = _("Unhide")
 | |
|         self.toggle_invalidate_button.setText(_(f"{toggle} {_('invalidated')}"))
 | |
|         self.update()
 | |
| 
 | |
|     def update(self):
 | |
|         self.will = self.bal_window.willitems
 | |
|         pos = self.vlayout.indexOf(self.scrollbox)
 | |
|         self.vlayout.removeWidget(self.scrollbox)
 | |
|         self.paint_scroll_area()
 | |
|         self.vlayout.insertWidget(pos,self.scrollbox)
 | |
|         super().update()
 | |
| 
 | |
| class WillWidget(QWidget):
 | |
|     def __init__(self,father=None,parent = None):
 | |
|         super().__init__()
 | |
|         vlayout = QVBoxLayout()
 | |
|         self.setLayout(vlayout)
 | |
|         self.will = parent.bal_window.willitems
 | |
|         self.parent = parent
 | |
|         for w in self.will:
 | |
|             if self.will[w].get_status('REPLACED') and self.parent.bal_window.bal_plugin._hide_replaced:
 | |
|                 continue
 | |
|             if self.will[w].get_status('INVALIDATED') and self.parent.bal_window.bal_plugin._hide_invalidated:
 | |
|                 continue
 | |
|             f = self.will[w].father
 | |
|             if father == f:
 | |
|                 qwidget = QWidget()
 | |
|                 childWidget = QWidget()
 | |
|                 hlayout=QHBoxLayout(qwidget)
 | |
|                 qwidget.setLayout(hlayout)
 | |
|                 vlayout.addWidget(qwidget)
 | |
|                 detailw=QWidget()
 | |
|                 detaillayout=QVBoxLayout()
 | |
|                 detailw.setLayout(detaillayout)
 | |
| 
 | |
|                 willpushbutton = QPushButton(w)
 | |
| 
 | |
|                 willpushbutton.clicked.connect(partial(self.parent.bal_window.show_transaction,txid=w))
 | |
|                 detaillayout.addWidget(willpushbutton)
 | |
|                 locktime = Util.locktime_to_str(self.will[w].tx.locktime)
 | |
|                 creation = Util.locktime_to_str(self.will[w].time)
 | |
|                 def qlabel(title,value):
 | |
|                     label = "<b>"+_(str(title)) + f":</b>\t{str(value)}"
 | |
|                     return QLabel(label)
 | |
|                 detaillayout.addWidget(qlabel("Locktime",locktime))
 | |
|                 detaillayout.addWidget(qlabel("Creation Time",creation))
 | |
|                 total_fees = self.will[w].tx.input_value() - self.will[w].tx.output_value()
 | |
|                 decoded_fees = total_fees #Util.decode_amount(total_fees,self.parent.decimal_point)
 | |
|                 fee_per_byte = round(total_fees/self.will[w].tx.estimated_size(),3)
 | |
|                 fees_str = str(decoded_fees) + " ("+  str(fee_per_byte) + " sats/vbyte)"
 | |
|                 detaillayout.addWidget(qlabel("Transaction fees:",fees_str))
 | |
|                 detaillayout.addWidget(qlabel("Status:",self.will[w].status))
 | |
|                 detaillayout.addWidget(QLabel(""))
 | |
|                 detaillayout.addWidget(QLabel("<b>Heirs:</b>"))
 | |
|                 for heir in self.will[w].heirs:
 | |
|                     if "w!ll3x3c\"" not in heir:
 | |
|                         decoded_amount = Util.decode_amount(self.will[w].heirs[heir][3],self.parent.decimal_point)
 | |
|                         detaillayout.addWidget(qlabel(heir,f"{decoded_amount} {self.parent.base_unit_name}"))
 | |
|                 if self.will[w].we:
 | |
|                     detaillayout.addWidget(QLabel(""))
 | |
|                     detaillayout.addWidget(QLabel(_("<b>Willexecutor:</b:")))
 | |
|                     decoded_amount = Util.decode_amount(self.will[w].we['base_fee'],self.parent.decimal_point)
 | |
| 
 | |
|                     detaillayout.addWidget(qlabel(self.will[w].we['url'],f"{decoded_amount} {self.parent.base_unit_name}"))
 | |
|                 detaillayout.addStretch()
 | |
|                 pal = QPalette()
 | |
|                 pal.setColor(QPalette.ColorRole.Window, QColor(self.will[w].get_color()))
 | |
|                 detailw.setAutoFillBackground(True)
 | |
|                 detailw.setPalette(pal)
 | |
| 
 | |
|                 hlayout.addWidget(detailw)
 | |
|                 hlayout.addWidget(WillWidget(w,parent = parent))
 | |
| 
 | 
