from enum import StrEnum from enum import Enum, auto from pathlib import Path from typing import Dict from PyQt6.QtCore import Qt from PyQt6.QtGui import QIcon, QPixmap, QPainter # Paths PACKAGE_ROOT = Path(__file__).resolve().parent VIEW_ROOT = PACKAGE_ROOT / "view" RESOURCES_DIR = VIEW_ROOT / "resources" ROLE_TYPE = Qt.ItemDataRole.UserRole ROLE_ID = Qt.ItemDataRole.UserRole + 1 class IconName(str, Enum): UNDO = "undo" REDO = "redo" PAIRING = "pairing" DRAW = "draw" TIEBREAK = "tie-break" DELETE = "delete" SAVE_AS = "save_as" SAVE = "save" NEW = "new" EXIT = "exit" END = "end" OPEN = "load" ONGOING = "ongoing" EXPORT = "export" EDIT = "edit" ADD = "add" ABOUT = "about" WARS = "wars" DONE = "done" WIN = "win" PLAYERS = "players" WARCHRON = "warchron" TOKEN = "token" TOKENS = "tokens" TIEBREAK_TOKEN = auto() class Icons: _icon_cache: Dict[IconName, QIcon] = {} _pixmap_cache: Dict[IconName, QPixmap] = {} _paths = { IconName.UNDO: "arrow-curve-180-left", IconName.REDO: "arrow-curve", IconName.PAIRING: "arrow-switch", IconName.DRAW: "balance.png", IconName.TIEBREAK: "balance-unbalance.png", IconName.DELETE: "cross.png", IconName.SAVE_AS: "disk--pencil.png", IconName.SAVE: "disk.png", IconName.NEW: "document.png", IconName.EXIT: "door--arrow.png", IconName.END: "flag-white.png", IconName.OPEN: "folder.png", IconName.ONGOING: "hourglass.png", IconName.EXPORT: "notebook--arrow.png", IconName.EDIT: "pencil.png", IconName.ADD: "plus.png", IconName.ABOUT: "question.png", IconName.WARS: "swords-small.png", IconName.DONE: "tick.png", IconName.WIN: "trophy.png", IconName.PLAYERS: "users.png", IconName.WARCHRON: "warchron_logo.png", IconName.TOKEN: "point.png", IconName.TOKENS: "points.png", } @classmethod def get(cls, name: IconName) -> QIcon: if name not in cls._icon_cache: path = RESOURCES_DIR / cls._paths[name] cls._icon_cache[name] = QIcon(str(path)) return cls._icon_cache[name] @classmethod def get_pixmap(cls, name: IconName) -> QPixmap: if name in cls._pixmap_cache: return cls._pixmap_cache[name] if name == IconName.TIEBREAK_TOKEN: pix = cls._compose( cls.get_pixmap(IconName.TIEBREAK), cls.get_pixmap(IconName.TOKEN), ) else: path = RESOURCES_DIR / cls._paths[name] pix = QPixmap(path.as_posix()) cls._pixmap_cache[name] = pix return pix @staticmethod def _compose(left: QPixmap, right: QPixmap) -> QPixmap: w = left.width() + right.width() h = max(left.height(), right.height()) result = QPixmap(w, h) result.fill(Qt.GlobalColor.transparent) painter = QPainter(result) painter.drawPixmap(0, (h - left.height()) // 2, left) painter.drawPixmap(left.width(), (h - right.height()) // 2, right) painter.end() return result class ItemType(StrEnum): PLAYER = "player" WAR = "war" CAMPAIGN = "campaign" ROUND = "round" OBJECTIVE = "objective" WAR_PARTICIPANT = "war_participant" SECTOR = "sector" CAMPAIGN_PARTICIPANT = "campaign_participant" CHOICE = "choice" BATTLE = "battle" class RefreshScope(Enum): NONE = auto() PLAYERS_LIST = auto() WARS_TREE = auto() WAR_DETAILS = auto() CAMPAIGN_DETAILS = auto() ROUND_DETAILS = auto() CURRENT_SELECTION_DETAILS = auto() class ContextType(StrEnum): WAR = "war" CAMPAIGN = "campaign" CHOICE = "choice" BATTLE = "battle"