cleanup: Remove ClockWidget and SystemMonitorWidget from core
These example widgets are now provided by plugins. Core widget_system.py now only contains BaseWidget class.
This commit is contained in:
parent
defb83d213
commit
84b73298e8
|
|
@ -359,219 +359,5 @@ class BaseWidget(QFrame):
|
||||||
return cls(data['widget_id'], data['name'], config)
|
return cls(data['widget_id'], data['name'], config)
|
||||||
|
|
||||||
|
|
||||||
class ClockWidget(BaseWidget):
|
|
||||||
"""Example clock widget - demonstrates the system."""
|
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
|
||||||
super().__init__("clock", "Clock", parent=parent)
|
|
||||||
|
|
||||||
self.time_label = QLabel("--:--:--")
|
|
||||||
self.time_label.setStyleSheet("""
|
|
||||||
QLabel {
|
|
||||||
color: white;
|
|
||||||
font-size: 24px;
|
|
||||||
font-weight: bold;
|
|
||||||
font-family: monospace;
|
|
||||||
}
|
|
||||||
""")
|
|
||||||
self.time_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
||||||
self.content_layout.addWidget(self.time_label)
|
|
||||||
|
|
||||||
self.date_label = QLabel("----/--/--")
|
|
||||||
self.date_label.setStyleSheet("color: rgba(255,255,255,150); font-size: 12px;")
|
|
||||||
self.date_label.setAlignment(Qt.AlignmentFlag.AlignCenter)
|
|
||||||
self.content_layout.addWidget(self.date_label)
|
|
||||||
|
|
||||||
# Update timer
|
|
||||||
self.timer = QTimer(self)
|
|
||||||
self.timer.timeout.connect(self._update)
|
|
||||||
self.timer.start(1000) # Update every second
|
|
||||||
self._update()
|
|
||||||
|
|
||||||
def _update(self):
|
|
||||||
"""Update clock display."""
|
|
||||||
from datetime import datetime
|
|
||||||
now = datetime.now()
|
|
||||||
self.time_label.setText(now.strftime("%H:%M:%S"))
|
|
||||||
self.date_label.setText(now.strftime("%Y-%m-%d"))
|
|
||||||
|
|
||||||
|
|
||||||
class SystemMonitorWidget(BaseWidget):
|
|
||||||
"""Example system monitor widget."""
|
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
|
||||||
super().__init__("system", "System Monitor", parent=parent)
|
|
||||||
|
|
||||||
self.cpu_label = QLabel("CPU: --%")
|
|
||||||
self.cpu_label.setStyleSheet("color: #4ecdc4; font-size: 14px;")
|
|
||||||
self.content_layout.addWidget(self.cpu_label)
|
|
||||||
|
|
||||||
self.ram_label = QLabel("RAM: --%")
|
|
||||||
self.ram_label.setStyleSheet("color: #ff8c42; font-size: 14px;")
|
|
||||||
self.content_layout.addWidget(self.ram_label)
|
|
||||||
|
|
||||||
# Update timer
|
|
||||||
self.timer = QTimer(self)
|
|
||||||
self.timer.timeout.connect(self._update)
|
|
||||||
self.timer.start(2000) # Update every 2 seconds
|
|
||||||
self._update()
|
|
||||||
|
|
||||||
def _update(self):
|
|
||||||
"""Update system stats."""
|
|
||||||
try:
|
|
||||||
import psutil
|
|
||||||
cpu = psutil.cpu_percent()
|
|
||||||
ram = psutil.virtual_memory().percent
|
|
||||||
|
|
||||||
self.cpu_label.setText(f"CPU: {cpu:.1f}%")
|
|
||||||
self.ram_label.setText(f"RAM: {ram:.1f}%")
|
|
||||||
except ImportError:
|
|
||||||
self.cpu_label.setText("CPU: N/A")
|
|
||||||
self.ram_label.setText("RAM: N/A")
|
|
||||||
|
|
||||||
|
|
||||||
class WidgetManager(QObject):
|
|
||||||
"""Manager for overlay widgets.
|
|
||||||
|
|
||||||
Handles widget lifecycle, positioning, and persistence.
|
|
||||||
"""
|
|
||||||
|
|
||||||
WIDGETS_FILE = Path("config/widgets.json")
|
|
||||||
|
|
||||||
def __init__(self, parent=None):
|
|
||||||
super().__init__(parent)
|
|
||||||
|
|
||||||
self.widgets: Dict[str, BaseWidget] = {}
|
|
||||||
self.WIDGETS_FILE.parent.mkdir(parents=True, exist_ok=True)
|
|
||||||
|
|
||||||
# Load saved widgets
|
|
||||||
self._load_widgets()
|
|
||||||
|
|
||||||
def register_widget_type(self, widget_id: str, widget_class: type, name: str):
|
|
||||||
"""Register a widget type that plugins can create.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
widget_id: Unique identifier for this widget type
|
|
||||||
widget_class: Class inheriting from BaseWidget
|
|
||||||
name: Human-readable name
|
|
||||||
"""
|
|
||||||
self._widget_types[widget_id] = {
|
|
||||||
'class': widget_class,
|
|
||||||
'name': name
|
|
||||||
}
|
|
||||||
|
|
||||||
def create_widget(self, widget_id: str, instance_id: Optional[str] = None, config: Optional[WidgetConfig] = None) -> BaseWidget:
|
|
||||||
"""Create a new widget instance.
|
|
||||||
|
|
||||||
Args:
|
|
||||||
widget_id: Type of widget to create
|
|
||||||
instance_id: Optional unique instance ID
|
|
||||||
config: Optional configuration
|
|
||||||
|
|
||||||
Returns:
|
|
||||||
Created widget
|
|
||||||
"""
|
|
||||||
if instance_id is None:
|
|
||||||
instance_id = f"{widget_id}_{len(self.widgets)}"
|
|
||||||
|
|
||||||
# Create widget (for now, just create built-in types)
|
|
||||||
if widget_id == "clock":
|
|
||||||
widget = ClockWidget()
|
|
||||||
elif widget_id == "system":
|
|
||||||
widget = SystemMonitorWidget()
|
|
||||||
else:
|
|
||||||
# For plugin-created widgets, they'd pass their own class
|
|
||||||
widget = BaseWidget(instance_id, widget_id, config)
|
|
||||||
|
|
||||||
widget.widget_id = instance_id
|
|
||||||
self.widgets[instance_id] = widget
|
|
||||||
|
|
||||||
# Connect signals
|
|
||||||
widget.moved.connect(lambda x, y, wid=instance_id: self._on_widget_moved(wid, x, y))
|
|
||||||
widget.closed.connect(lambda wid=instance_id: self._on_widget_closed(wid))
|
|
||||||
|
|
||||||
return widget
|
|
||||||
|
|
||||||
def show_widget(self, widget_id: str):
|
|
||||||
"""Show a widget by ID."""
|
|
||||||
if widget_id in self.widgets:
|
|
||||||
self.widgets[widget_id].show()
|
|
||||||
|
|
||||||
def hide_widget(self, widget_id: str):
|
|
||||||
"""Hide a widget by ID."""
|
|
||||||
if widget_id in self.widgets:
|
|
||||||
self.widgets[widget_id].hide()
|
|
||||||
|
|
||||||
def remove_widget(self, widget_id: str):
|
|
||||||
"""Remove and destroy a widget."""
|
|
||||||
if widget_id in self.widgets:
|
|
||||||
self.widgets[widget_id].close()
|
|
||||||
del self.widgets[widget_id]
|
|
||||||
self._save_widgets()
|
|
||||||
|
|
||||||
def _on_widget_moved(self, widget_id: str, x: int, y: int):
|
|
||||||
"""Handle widget moved."""
|
|
||||||
self._save_widgets()
|
|
||||||
|
|
||||||
def _on_widget_closed(self, widget_id: str):
|
|
||||||
"""Handle widget closed."""
|
|
||||||
if widget_id in self.widgets:
|
|
||||||
del self.widgets[widget_id]
|
|
||||||
self._save_widgets()
|
|
||||||
|
|
||||||
def _save_widgets(self):
|
|
||||||
"""Save widget configurations."""
|
|
||||||
data = {
|
|
||||||
'widgets': [
|
|
||||||
widget.save_config()
|
|
||||||
for widget in self.widgets.values()
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
|
||||||
with open(self.WIDGETS_FILE, 'w') as f:
|
|
||||||
json.dump(data, f, indent=2)
|
|
||||||
|
|
||||||
def _load_widgets(self):
|
|
||||||
"""Load widget configurations."""
|
|
||||||
self._widget_types = {}
|
|
||||||
|
|
||||||
if not self.WIDGETS_FILE.exists():
|
|
||||||
return
|
|
||||||
|
|
||||||
try:
|
|
||||||
with open(self.WIDGETS_FILE, 'r') as f:
|
|
||||||
data = json.load(f)
|
|
||||||
|
|
||||||
# Recreate widgets (would need widget type registry for full implementation)
|
|
||||||
for widget_data in data.get('widgets', []):
|
|
||||||
# For now, skip loading - plugins would recreate their widgets
|
|
||||||
pass
|
|
||||||
|
|
||||||
except Exception as e:
|
|
||||||
print(f"[WidgetManager] Failed to load widgets: {e}")
|
|
||||||
|
|
||||||
def get_all_widgets(self) -> List[BaseWidget]:
|
|
||||||
"""Get all managed widgets."""
|
|
||||||
return list(self.widgets.values())
|
|
||||||
|
|
||||||
def show_all(self):
|
|
||||||
"""Show all widgets."""
|
|
||||||
for widget in self.widgets.values():
|
|
||||||
widget.show()
|
|
||||||
|
|
||||||
def hide_all(self):
|
|
||||||
"""Hide all widgets."""
|
|
||||||
for widget in self.widgets.values():
|
|
||||||
widget.hide()
|
|
||||||
|
|
||||||
|
|
||||||
# Global widget manager instance
|
|
||||||
_widget_manager: Optional[WidgetManager] = None
|
|
||||||
|
|
||||||
|
|
||||||
def get_widget_manager() -> WidgetManager:
|
|
||||||
"""Get the global widget manager instance."""
|
|
||||||
global _widget_manager
|
|
||||||
if _widget_manager is None:
|
|
||||||
_widget_manager = WidgetManager()
|
|
||||||
return _widget_manager
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue