Add Dispatch_V0.1.1
This commit is contained in:
96
Dispatch_V0.1.1/gui/components/kanban_board.py
Normal file
96
Dispatch_V0.1.1/gui/components/kanban_board.py
Normal file
@@ -0,0 +1,96 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
# gui/components/kanban_board.py
|
||||
|
||||
"""Переиспользуемый компонент канбан-доски."""
|
||||
|
||||
from typing import Dict, List, Optional
|
||||
|
||||
from PySide6.QtCore import Signal
|
||||
from PySide6.QtWidgets import QWidget
|
||||
|
||||
from gui.components.kanban_card import KanbanCard
|
||||
from gui.components.kanban_column import KanbanColumn
|
||||
from gui.containers.h_container import HContainer
|
||||
from gui.containers.s_container import SContainer
|
||||
|
||||
|
||||
class KanbanBoard(SContainer):
|
||||
"""Канбан-доска из нескольких горизонтальных колонок."""
|
||||
|
||||
card_clicked = Signal(object)
|
||||
|
||||
def __init__(
|
||||
self,
|
||||
width_percent: Optional[int] = None,
|
||||
height_percent: Optional[int] = None,
|
||||
margin: int = 0,
|
||||
spacing: int = 0,
|
||||
parent: Optional[QWidget] = None,
|
||||
):
|
||||
super().__init__(
|
||||
width_percent=width_percent,
|
||||
height_percent=height_percent,
|
||||
margin=margin,
|
||||
spacing=spacing,
|
||||
content_fit=True,
|
||||
parent=parent,
|
||||
)
|
||||
self._columns: Dict[object, KanbanColumn] = {}
|
||||
self._columns_order: List[object] = []
|
||||
self._columns_container = HContainer(
|
||||
spacing=4,
|
||||
margin=[4, 4, 4, 4],
|
||||
parent=self,
|
||||
)
|
||||
|
||||
def add_column(
|
||||
self,
|
||||
column_id: object,
|
||||
title: str,
|
||||
color: str = "#DFE1E6",
|
||||
width_percent: Optional[int] = None,
|
||||
style: str = "KANBAN_COLUMN",
|
||||
) -> KanbanColumn:
|
||||
"""Добавить колонку на доску."""
|
||||
column = KanbanColumn(
|
||||
column_id=column_id,
|
||||
title=title,
|
||||
color=color,
|
||||
style=style,
|
||||
)
|
||||
column.card_clicked.connect(self.card_clicked.emit)
|
||||
self._columns[column_id] = column
|
||||
self._columns_order.append(column_id)
|
||||
self._columns_container.add_widget(column)
|
||||
self._recompute_column_widths(width_percent)
|
||||
return column
|
||||
|
||||
def get_column(self, column_id: object) -> Optional[KanbanColumn]:
|
||||
"""Получить колонку по ID."""
|
||||
return self._columns.get(column_id)
|
||||
|
||||
def get_columns(self) -> List[KanbanColumn]:
|
||||
"""Список всех колонок в порядке добавления."""
|
||||
return [self._columns[column_id] for column_id in self._columns_order]
|
||||
|
||||
def clear_all_cards(self) -> None:
|
||||
"""Удалить все карточки из всех колонок."""
|
||||
for column in self._columns.values():
|
||||
column.clear_cards()
|
||||
|
||||
def _recompute_column_widths(self, explicit_width: Optional[int] = None) -> None:
|
||||
n_columns = len(self._columns_order)
|
||||
if n_columns == 0:
|
||||
return
|
||||
if explicit_width is not None:
|
||||
for column_id in self._columns_order:
|
||||
self._columns[column_id].set_percent_sizes(width_percent=explicit_width)
|
||||
return
|
||||
base_width = 100 // n_columns
|
||||
remainder = 100 % n_columns
|
||||
for index, column_id in enumerate(self._columns_order):
|
||||
width = base_width + (1 if index < remainder else 0)
|
||||
self._columns[column_id].set_percent_sizes(width_percent=width)
|
||||
|
||||
|
||||
__all__ = ["KanbanBoard", "KanbanColumn", "KanbanCard"]
|
||||
Reference in New Issue
Block a user