forked from bitcoinafterlife/bal-electrum-plugin
Compare commits
2 Commits
fix/balbui
...
686c11080f
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
686c11080f | ||
|
|
be38c9b589 |
168
qt.py
168
qt.py
@@ -1271,6 +1271,30 @@ class _LockTimeEditor:
|
|||||||
return cls.min_allowed_value <= x <= cls.max_allowed_value
|
return cls.min_allowed_value <= x <= cls.max_allowed_value
|
||||||
|
|
||||||
|
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
"""
|
||||||
|
HeirsLockTimeEdit - A custom QWidget for editing locktime values in the context of heirs distribution.
|
||||||
|
|
||||||
|
This widget combines raw locktime editing with date-based selection and provides
|
||||||
|
additional functionality for managing locktime values in a heir inheritance scenario.
|
||||||
|
|
||||||
|
Features:
|
||||||
|
- Supports both raw locktime values and human-readable date formats
|
||||||
|
- Emits valueEdited signal when the locktime value changes
|
||||||
|
- Provides threshold-based validation for locktime values
|
||||||
|
- Integrates with heir distribution workflows
|
||||||
|
|
||||||
|
Attributes:
|
||||||
|
valueEdited (pyqtSignal): Signal emitted when the locktime value is edited
|
||||||
|
locktime_threshold (int): Minimum threshold value for locktime (default: 50000000)
|
||||||
|
|
||||||
|
Args:
|
||||||
|
parent: Optional parent QWidget
|
||||||
|
default_index (int): Default index for the combo box (default: 1)
|
||||||
|
"""
|
||||||
|
|
||||||
|
>>>>>>> origin/doc
|
||||||
class HeirsLockTimeEdit(QWidget, _LockTimeEditor):
|
class HeirsLockTimeEdit(QWidget, _LockTimeEditor):
|
||||||
valueEdited = pyqtSignal()
|
valueEdited = pyqtSignal()
|
||||||
locktime_threshold = 50000000
|
locktime_threshold = 50000000
|
||||||
@@ -2069,6 +2093,21 @@ class BalBuildWillDialog(BalDialog):
|
|||||||
COLOR_OK = "#05ad05"
|
COLOR_OK = "#05ad05"
|
||||||
|
|
||||||
def __init__(self, bal_window, parent=None):
|
def __init__(self, bal_window, parent=None):
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
"""Initialize the Build Will dialog.
|
||||||
|
|
||||||
|
Args:
|
||||||
|
bal_window (BalWindow): The main application window
|
||||||
|
parent (QWidget, optional): Parent widget. Defaults to None.
|
||||||
|
|
||||||
|
Initializes:
|
||||||
|
- Main UI components (message label, container widget)
|
||||||
|
- Message queue system with debounce timer
|
||||||
|
- Layout management
|
||||||
|
- Network connection
|
||||||
|
"""
|
||||||
|
>>>>>>> origin/doc
|
||||||
if not parent:
|
if not parent:
|
||||||
parent = bal_window.window
|
parent = bal_window.window
|
||||||
BalDialog.__init__(self, parent, bal_window.bal_plugin, _("Building Will"))
|
BalDialog.__init__(self, parent, bal_window.bal_plugin, _("Building Will"))
|
||||||
@@ -2076,6 +2115,7 @@ class BalBuildWillDialog(BalDialog):
|
|||||||
self.updatemessage.connect(self.msg_update)
|
self.updatemessage.connect(self.msg_update)
|
||||||
self.bal_window = bal_window
|
self.bal_window = bal_window
|
||||||
self.bal_plugin = bal_window.bal_plugin
|
self.bal_plugin = bal_window.bal_plugin
|
||||||
|
<<<<<<< HEAD
|
||||||
self.message_label = QLabel(_("Building Will:"))
|
self.message_label = QLabel(_("Building Will:"))
|
||||||
self.vbox = QVBoxLayout(self)
|
self.vbox = QVBoxLayout(self)
|
||||||
self.vbox.addWidget(self.message_label,0)
|
self.vbox.addWidget(self.message_label,0)
|
||||||
@@ -2086,6 +2126,45 @@ class BalBuildWillDialog(BalDialog):
|
|||||||
self.setMinimumHeight(100)
|
self.setMinimumHeight(100)
|
||||||
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
|
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
|
||||||
self.labels = []
|
self.labels = []
|
||||||
|
=======
|
||||||
|
|
||||||
|
# Main message label
|
||||||
|
self.message_label = QLabel(_("Building Will:"))
|
||||||
|
self.vbox = QVBoxLayout(self)
|
||||||
|
self.vbox.addWidget(self.message_label, 0)
|
||||||
|
|
||||||
|
# Container for dynamic messages
|
||||||
|
self.qwidget = QWidget(self)
|
||||||
|
self.vbox.addWidget(self.qwidget, 1)
|
||||||
|
|
||||||
|
# Layout for messages with reduced spacing
|
||||||
|
self.labelsbox = QVBoxLayout(self.qwidget)
|
||||||
|
self.labelsbox.setContentsMargins(0, 0, 0, 0)
|
||||||
|
self.labelsbox.setSpacing(4) # Reduced spacing between messages
|
||||||
|
|
||||||
|
# Set minimum dimensions
|
||||||
|
self.setMinimumWidth(600)
|
||||||
|
self.setMinimumHeight(100)
|
||||||
|
self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Preferred)
|
||||||
|
|
||||||
|
# Message queue implementation for efficient updates
|
||||||
|
self._message_queue = [] # Thread-safe message queue
|
||||||
|
self._message_timer = QTimer(self)
|
||||||
|
self._message_timer.setSingleShot(True)
|
||||||
|
self._message_timer.setInterval(50) # Debounce interval: 50ms
|
||||||
|
self._message_timer.timeout.connect(self._process_message_queue)
|
||||||
|
|
||||||
|
# Other initialization
|
||||||
|
self.labels = [] # Immediate message storage
|
||||||
|
self.check_row = None
|
||||||
|
self.inval_row = None
|
||||||
|
self.build_row = None
|
||||||
|
self.sign_row = None
|
||||||
|
self.push_row = None
|
||||||
|
self.network = Network.get_instance()
|
||||||
|
self._stopping = False
|
||||||
|
|
||||||
|
>>>>>>> origin/doc
|
||||||
self.check_row = None
|
self.check_row = None
|
||||||
self.inval_row = None
|
self.inval_row = None
|
||||||
self.build_row = None
|
self.build_row = None
|
||||||
@@ -2535,6 +2614,7 @@ class BalBuildWillDialog(BalDialog):
|
|||||||
w.deleteLater()
|
w.deleteLater()
|
||||||
|
|
||||||
def msg_update(self):
|
def msg_update(self):
|
||||||
|
<<<<<<< HEAD
|
||||||
self.clear_layout(self.labelsbox)
|
self.clear_layout(self.labelsbox)
|
||||||
for label in self.labels:
|
for label in self.labels:
|
||||||
label=label.replace("\n","<br>")
|
label=label.replace("\n","<br>")
|
||||||
@@ -2542,6 +2622,75 @@ class BalBuildWillDialog(BalDialog):
|
|||||||
self.labelsbox.addWidget(QLabel(label),1)
|
self.labelsbox.addWidget(QLabel(label),1)
|
||||||
self.setMinimumHeight(30*(len(self.labels)+2))
|
self.setMinimumHeight(30*(len(self.labels)+2))
|
||||||
|
|
||||||
|
=======
|
||||||
|
"""Updates the UI with new messages using a debounced queue system.
|
||||||
|
|
||||||
|
This method implements the following logic:
|
||||||
|
1. Adds all pending messages to the queue
|
||||||
|
2. Clears the immediate message storage
|
||||||
|
3. Starts the debounce timer if not already active
|
||||||
|
|
||||||
|
The actual UI update happens in _process_message_queue after the
|
||||||
|
debounce interval to prevent excessive UI updates.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
Thread-safe operation - can be called from any thread
|
||||||
|
"""
|
||||||
|
self._message_queue.extend(self.labels)
|
||||||
|
self.labels = [] # Clear immediate labels after queuing
|
||||||
|
if not self._message_timer.isActive():
|
||||||
|
self._message_timer.start()
|
||||||
|
|
||||||
|
def _process_message_queue(self):
|
||||||
|
"""Processes queued messages with debounce for efficient UI updates.
|
||||||
|
|
||||||
|
This method:
|
||||||
|
1. Clears the existing layout
|
||||||
|
2. Processes all queued messages
|
||||||
|
3. Updates the UI once with all new messages
|
||||||
|
4. Resets the queue
|
||||||
|
5. Adjusts dialog height based on content
|
||||||
|
|
||||||
|
The debounce interval (50ms) ensures rapid message bursts are
|
||||||
|
processed in a single batch, reducing UI flicker.
|
||||||
|
|
||||||
|
Note:
|
||||||
|
Called automatically by QTimer after debounce interval
|
||||||
|
"""
|
||||||
|
if not self._message_queue:
|
||||||
|
return
|
||||||
|
|
||||||
|
# Clear existing layout
|
||||||
|
self.clear_layout(self.labelsbox)
|
||||||
|
|
||||||
|
# Process all queued messages
|
||||||
|
for text in self._message_queue:
|
||||||
|
try:
|
||||||
|
# Format text for rich display
|
||||||
|
formatted_text = text.replace("\n", "<br>")
|
||||||
|
|
||||||
|
# Create label with proper settings
|
||||||
|
label = QLabel(formatted_text)
|
||||||
|
label.setWordWrap(True)
|
||||||
|
label.setTextFormat(Qt.TextFormat.RichText)
|
||||||
|
label.setOpenExternalLinks(False) # Security
|
||||||
|
|
||||||
|
# Set size policy
|
||||||
|
label.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Fixed)
|
||||||
|
|
||||||
|
# Add to layout
|
||||||
|
self.labelsbox.addWidget(label)
|
||||||
|
|
||||||
|
except Exception as e:
|
||||||
|
# Log errors without interrupting processing
|
||||||
|
import logging
|
||||||
|
logging.error(f"Error creating label in BalBuildWillDialog: {e}")
|
||||||
|
|
||||||
|
# Reset queue and update dimensions
|
||||||
|
self._message_queue = []
|
||||||
|
self.setMinimumHeight(min(30 * (len(self.labels) + 2), 400)) # Max height limit
|
||||||
|
|
||||||
|
>>>>>>> origin/doc
|
||||||
|
|
||||||
def get_text(self):
|
def get_text(self):
|
||||||
return self.message_label.text()
|
return self.message_label.text()
|
||||||
@@ -3759,4 +3908,23 @@ class CheckAliveException(Exception):
|
|||||||
def __init__(self,timestamp_to_check):
|
def __init__(self,timestamp_to_check):
|
||||||
self.timestamp_to_check = timestamp_to_check
|
self.timestamp_to_check = timestamp_to_check
|
||||||
def __str__(self):
|
def __str__(self):
|
||||||
|
<<<<<<< HEAD
|
||||||
|
=======
|
||||||
|
|
||||||
|
def __del__(self):
|
||||||
|
"""Explicit cleanup to prevent memory leaks.
|
||||||
|
|
||||||
|
This destructor ensures proper cleanup of:
|
||||||
|
- Message queue timer
|
||||||
|
- All widgets in the layout
|
||||||
|
- Network connections
|
||||||
|
|
||||||
|
Called automatically when the dialog is destroyed.
|
||||||
|
"""
|
||||||
|
if hasattr(self, '_message_timer') and self._message_timer:
|
||||||
|
self._message_timer.stop()
|
||||||
|
self._message_timer.deleteLater()
|
||||||
|
self.clear_layout(self.labelsbox)
|
||||||
|
|
||||||
|
>>>>>>> origin/doc
|
||||||
return "Check alive expired please update it: {}".format(datetime.fromtimestamp(self.timestamp_to_check).isoformat())
|
return "Check alive expired please update it: {}".format(datetime.fromtimestamp(self.timestamp_to_check).isoformat())
|
||||||
|
|||||||
Reference in New Issue
Block a user