Source code for qtframework.widgets.base

"""Base widget class."""

from __future__ import annotations

from typing import Any

from PySide6.QtCore import Property, Signal
from PySide6.QtWidgets import QWidget


[docs] class Widget(QWidget): """Enhanced base widget with framework integration.""" style_changed = Signal() def __init__( self, parent: QWidget | None = None, *, object_name: str | None = None, style_class: str | None = None, ) -> None: """Initialize widget. Args: parent: Parent widget object_name: Object name for styling style_class: CSS-like class for styling """ super().__init__(parent) if object_name: self.setObjectName(object_name) self._style_class = style_class or "" if self._style_class: self.setProperty("class", self._style_class) self._custom_properties: dict[str, Any] = {} def _get_style_class(self) -> str: """Get style class. Returns: Style class name """ return self._style_class def _set_style_class(self, value: str) -> None: """Set style class. Args: value: Style class name """ if self._style_class != value: self._style_class = value self.setProperty("class", value) self.style_changed.emit() self.style().unpolish(self) self.style().polish(self) self.update() styleClass = Property(str, _get_style_class, _set_style_class) # noqa: N815
[docs] def add_style_class(self, class_name: str) -> None: """Add a style class. Args: class_name: Class name to add """ classes = self._style_class.split() if self._style_class else [] if class_name not in classes: classes.append(class_name) self._set_style_class(" ".join(classes))
[docs] def remove_style_class(self, class_name: str) -> None: """Remove a style class. Args: class_name: Class name to remove """ classes = self._style_class.split() if self._style_class else [] if class_name in classes: classes.remove(class_name) self._set_style_class(" ".join(classes))
[docs] def toggle_style_class(self, class_name: str) -> None: """Toggle a style class. Args: class_name: Class name to toggle """ classes = self._style_class.split() if self._style_class else [] if class_name in classes: classes.remove(class_name) else: classes.append(class_name) self._set_style_class(" ".join(classes))
[docs] def has_style_class(self, class_name: str) -> bool: """Check if widget has a style class. Args: class_name: Class name to check Returns: True if class is present """ classes = self._style_class.split() if self._style_class else [] return class_name in classes
[docs] def set_custom_property(self, name: str, value: Any) -> None: """Set a custom property. Args: name: Property name value: Property value """ self._custom_properties[name] = value self.setProperty(name, value) self.style().unpolish(self) self.style().polish(self) self.update()
[docs] def get_custom_property(self, name: str, default: Any = None) -> Any: """Get a custom property. Args: name: Property name default: Default value Returns: Property value or default """ return self._custom_properties.get(name, default)
[docs] def get_application(self) -> Any | None: """Get the application instance. Returns: Application instance or None """ from PySide6.QtWidgets import QApplication from qtframework.core.application import Application app = QApplication.instance() if isinstance(app, Application): return app return None