Files
Dispatch/Dispatch_V0.1.1/ui/ticket_message_dialog.py
2026-04-29 08:18:54 +04:00

116 lines
3.5 KiB
Python
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# -*- coding: utf-8 -*-
# hub/ticket/ui/ticket_message_dialog.py
"""Простые диалоги Ticket на локальной GUI-библиотеке."""
from __future__ import annotations
from gui.components import Button, Dialog, Label, TextInput
from gui.containers import HContainer, VContainer
class TicketMessageDialog(Dialog):
"""Унифицированный диалог предупреждения или подтверждения."""
def __init__(
self,
title: str,
message: str,
accept_text: str = "ОК",
reject_text: str | None = None,
parent=None,
):
self._title = title
self._message = message
self._accept_text = accept_text
self._reject_text = reject_text
self._accept_button: Button | None = None
self._reject_button: Button | None = None
super().__init__(
title=title,
width=420,
height=220,
modal=True,
parent=parent,
)
self._setup_ui()
self._connect_signals()
@classmethod
def ask_confirmation(
cls,
parent,
title: str,
message: str,
accept_text: str = "Подтвердить",
reject_text: str = "Отмена",
) -> bool:
dialog = cls(
title=title,
message=message,
accept_text=accept_text,
reject_text=reject_text,
parent=parent,
)
return dialog.exec() == cls.DialogCode.Accepted
@classmethod
def show_warning(
cls,
parent,
title: str,
message: str,
) -> None:
cls(
title=title,
message=message,
accept_text="Закрыть",
reject_text=None,
parent=parent,
).exec()
def _setup_ui(self) -> None:
# Root-контейнер диалога сообщения: заголовок, текстовое поле и строка кнопок.
main_container = VContainer(margin=16, spacing=12)
self.add_widget(main_container)
title_label = Label(
self._title,
alignment="left",
style="TICKET_LIST_HEADER",
)
message_view = TextInput(
text=self._message,
style="TICKET_PREVIEW_AREA",
multiline=True,
)
message_view.set_read_only(True)
message_view.set_min_height(96)
# Actions-row диалога: выравнивает кнопки подтверждения и, при необходимости, отмены.
actions = HContainer(spacing=8, content_fit=True)
actions.add_stretch()
if self._reject_text is not None:
self._reject_button = Button(
self._reject_text,
style="FILTER_BUTTON",
content_fit=True,
)
actions.add_widget(self._reject_button)
self._accept_button = Button(
self._accept_text,
style="FILTER_BUTTON_ACTIVE",
content_fit=True,
)
actions.add_widget(self._accept_button)
main_container.add_widget(title_label)
main_container.add_widget(message_view)
main_container.add_widget(actions)
def _connect_signals(self) -> None:
if self._accept_button is not None:
self._accept_button.clicked.connect(self.accept)
if self._reject_button is not None:
self._reject_button.clicked.connect(self.reject)