mirror of
https://github.com/Omni-guides/Jackify.git
synced 2026-01-17 19:47:00 +01:00
Sync from development - prepare for v0.1.5.1
This commit is contained in:
66
jackify/frontends/gui/mixins/operation_lock_mixin.py
Normal file
66
jackify/frontends/gui/mixins/operation_lock_mixin.py
Normal file
@@ -0,0 +1,66 @@
|
||||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Operation Lock Mixin
|
||||
Provides reliable button state management for GUI operations
|
||||
"""
|
||||
|
||||
from contextlib import contextmanager
|
||||
|
||||
|
||||
class OperationLockMixin:
|
||||
"""
|
||||
Mixin that provides reliable button state management.
|
||||
Ensures controls are always re-enabled after operations, even if exceptions occur.
|
||||
"""
|
||||
|
||||
def operation_lock(self):
|
||||
"""
|
||||
Context manager that ensures controls are always re-enabled after operations.
|
||||
|
||||
Usage:
|
||||
with self.operation_lock():
|
||||
# Perform operation that might fail
|
||||
risky_operation()
|
||||
# Controls are guaranteed to be re-enabled here
|
||||
"""
|
||||
@contextmanager
|
||||
def lock_manager():
|
||||
try:
|
||||
if hasattr(self, '_disable_controls_during_operation'):
|
||||
self._disable_controls_during_operation()
|
||||
yield
|
||||
finally:
|
||||
# Ensure controls are re-enabled even if exceptions occur
|
||||
if hasattr(self, '_enable_controls_after_operation'):
|
||||
self._enable_controls_after_operation()
|
||||
|
||||
return lock_manager()
|
||||
|
||||
def safe_operation(self, operation_func, *args, **kwargs):
|
||||
"""
|
||||
Execute an operation with automatic button state management.
|
||||
|
||||
Args:
|
||||
operation_func: Function to execute
|
||||
*args, **kwargs: Arguments to pass to operation_func
|
||||
|
||||
Returns:
|
||||
Result of operation_func or None if exception occurred
|
||||
"""
|
||||
try:
|
||||
with self.operation_lock():
|
||||
return operation_func(*args, **kwargs)
|
||||
except Exception as e:
|
||||
# Log the error but don't re-raise - controls are already re-enabled
|
||||
if hasattr(self, 'logger'):
|
||||
self.logger.error(f"Operation failed: {e}", exc_info=True)
|
||||
# Could also show user error dialog here if needed
|
||||
return None
|
||||
|
||||
def reset_screen_to_defaults(self):
|
||||
"""
|
||||
Reset the screen to default state when navigating back from main menu.
|
||||
Override this method in subclasses to implement screen-specific reset logic.
|
||||
"""
|
||||
pass # Default implementation does nothing - subclasses should override
|
||||
Reference in New Issue
Block a user