Files
Dispatch/Dispatch_V0.1.1/gui/components/kanban_card.py
2026-04-29 08:18:54 +04:00

100 lines
3.4 KiB
Python

# -*- coding: utf-8 -*-
# gui/components/kanban_card.py
"""Переиспользуемая карточка для канбан-доски."""
from typing import Optional
from PySide6.QtCore import Qt, Signal
from PySide6.QtWidgets import QWidget, QSizePolicy
from gui.containers.h_container import HContainer
from gui.containers.s_container import SContainer
from gui.containers.v_container import VContainer
from gui.components.label import Label
class KanbanCard(SContainer):
"""Одна карточка на канбан-доске."""
card_clicked = Signal(object)
def __init__(
self,
card_id: object,
title: str = "",
subtitle: str = "",
status_color: str = "#DFE1E6",
style: str = "TASK_CARD",
parent: Optional[QWidget] = None,
):
super().__init__(
width_percent=100,
margin=[6, 4, 6, 4],
style=style,
content_fit=True,
parent=parent,
)
self._card_id = card_id
self._status_color = status_color
self._build_ui(title, subtitle, status_color)
@property
def card_id(self) -> object:
"""Идентификатор карточки."""
return self._card_id
def set_title(self, text: str) -> None:
"""Установить текст заголовка."""
self._title_label.set_text(text)
def set_subtitle(self, text: str) -> None:
"""Установить текст подзаголовка."""
self._subtitle_label.set_text(text)
def set_status_color(self, color: str) -> None:
"""Установить цвет полосы состояния."""
self._status_color = color
self._status_strip.setStyleSheet(
f"background-color: {color}; border: none; border-radius: 2px;"
)
def set_badge_text(self, text: str) -> None:
"""Установить текст бейджа состояния."""
self._badge_label.set_text(text)
self._badge_label.setVisible(bool(text))
def set_badge_style(self, style_key: str) -> None:
"""Установить стиль бейджа (ключ APP_STYLES)."""
self._badge_label.style(style_key=style_key)
def _build_ui(self, title: str, subtitle: str, status_color: str) -> None:
row = HContainer(parent=self)
self._status_strip = QWidget()
self._status_strip.setFixedWidth(4)
self._status_strip.setSizePolicy(QSizePolicy.Fixed, QSizePolicy.Expanding)
self._status_strip.setStyleSheet(
f"background-color: {status_color}; border: none; border-radius: 2px;"
)
row.add_widget(self._status_strip)
content = VContainer(margin=[6, 4, 4, 4], spacing=2, parent=row)
self._badge_label = Label("", style="TASK_BADGE")
self._badge_label.setVisible(False)
self._badge_label.set_max_height(20)
content.add_widget(self._badge_label)
self._title_label = Label(title, style="TASK_CARD_TITLE")
content.add_widget(self._title_label)
self._subtitle_label = Label(subtitle, style="TASK_CARD_SUBTITLE")
content.add_widget(self._subtitle_label)
def mousePressEvent(self, event) -> None:
"""Обработка клика по карточке."""
if event.button() == Qt.LeftButton:
self.card_clicked.emit(self._card_id)
super().mousePressEvent(event)