116 lines
3.5 KiB
Python
116 lines
3.5 KiB
Python
# -*- 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)
|