from typing import Callable from PySide6.QtGui import QAction, QIcon from PySide6.QtWidgets import QMenu class RAction(): def __init__(self, label: str, action: Callable[[], None] = None, shortcut: str = None, icon_from_theme: str = None, icon_file: str = None, checkable: bool = False, checked: bool = False ): """ :param label: the label :param action: the callback to be executed when clicked. Note: use the setter when creating a checkable menu item :param shortcut: the shortcut, e.g. 'Ctrl+X' :param icon_from_theme: environment specific name of an icon. On Linux: /usr/share/icons :param icon_file: path to an icon :param checkable: if this menu item behaves like a checkbox :param checked: if it is checked """ super(RAction, self).__init__() self.label = label self.action = action self.shortcut = shortcut self.icon_from_theme = icon_from_theme self.icon_file = icon_file self.checkable = checkable self.checked = checked self._action: QAction = None def set_action(self, action): self.action = lambda *args: self.decorated_action(action) def decorated_action(self, action): if self.checkable: self.checked = not self.checked self._update_check_state() action() def set_icon_from_theme(self, icon_from_theme: str): self.icon_from_theme = icon_from_theme def set_icon_file(self, icon_file: str): self.icon_file = icon_file def set_shortcut(self, shortcut: str): self.shortcut = shortcut def set_checkable(self, checkable: bool): self.checkable = checkable def set_checked(self, checked: bool): self.checked = checked self._update_check_state() def _update_check_state(self): if self._action: if self.checked: self._action.setIcon(QIcon("icons/ionicons/checkbox-outline.svg")) else: self._action.setIcon(QIcon("icons/ionicons/square-outline.svg")) def set_label(self, label: str): if self._action: self._action.setText(label) def to_qaction(self, qmenu: QMenu) -> QAction: action = QAction(self.label, qmenu) self._action = action if self.icon_from_theme: action.setIcon(QIcon.fromTheme(self.icon_from_theme)) if self.icon_file: action.setIcon(QIcon(self.icon_file)) if self.shortcut: action.setShortcut(self.shortcut) if self.action: action.triggered.connect(self.action) if self.checkable: self._update_check_state() return action