Files
KPK/ui_utils.py
T
2026-06-23 15:20:56 +02:00

167 lines
4.4 KiB
Python

from kivy.uix.popup import Popup
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.button import Button
from kivy.uix.label import Label
from kivy.uix.scrollview import ScrollView
from kivy.metrics import dp
from kivy.clock import Clock
import data
def _popup_info(title: str, text: str, *, monospace: bool = False):
from kivy.uix.popup import Popup
from kivy.uix.label import Label
from kivy.uix.boxlayout import BoxLayout
from kivy.uix.scrollview import ScrollView
from kivy.uix.button import Button
from kivy.metrics import dp
from kivy.clock import Clock
POP_W = dp(520)
MIN_H = dp(220)
MAX_H = dp(900)
PAD = dp(12)
SP = dp(10)
BTN_H = dp(52)
FONT = dp(18)
LINE_H = FONT * 1.35
TEXT_PAD_X = dp(10)
# 🔹 výběr fontu
font_name = "RobotoMono-Regular.ttf" if monospace else "Roboto-Regular.ttf"
root = BoxLayout(
orientation="vertical",
spacing=SP,
padding=(PAD, PAD, PAD, PAD),
)
# --- Scroll + text wrapper ---
scroll = ScrollView(
do_scroll_x=False,
do_scroll_y=True,
bar_width=dp(8),
)
text_box = BoxLayout(
orientation="vertical",
size_hint=(1, None),
padding=(TEXT_PAD_X, 0, TEXT_PAD_X, 0),
)
text_box.bind(minimum_height=text_box.setter("height"))
lbl = Label(
text=text or "",
halign="left" if monospace else "center",
valign="top",
font_size=FONT,
font_name=font_name,
size_hint=(1, None),
)
# --- synchronizace šířky ---
def _sync_text_size(*_):
inner_w = max(text_box.width - (TEXT_PAD_X * 2), dp(10))
lbl.text_size = (inner_w, None)
# --- synchronizace výšky ---
def _sync_label_height(*_):
lbl.height = max(lbl.texture_size[1], dp(10))
lbl.bind(texture_size=_sync_label_height)
text_box.bind(width=lambda *_: _sync_text_size())
text_box.add_widget(lbl)
scroll.add_widget(text_box)
btn = Button(
text="OK",
size_hint_y=None,
height=BTN_H,
)
popup = Popup(
title=title,
content=root,
size_hint=(None, None),
size=(POP_W, MIN_H),
auto_dismiss=False,
)
def _dismiss_after_touch(*_):
Clock.schedule_once(lambda *_: popup.dismiss(), 0)
btn.bind(on_release=_dismiss_after_touch)
root.add_widget(scroll)
root.add_widget(btn)
# --- odhad výšky ---
lines = (text or "").splitlines() or [""]
est_text_h = max(len(lines) * LINE_H, dp(80))
est_total_h = est_text_h + BTN_H + 2 * PAD + SP
popup.height = min(max(est_total_h, MIN_H), MAX_H)
# --- doladění po otevření ---
def _after_open(*_):
_sync_text_size()
def _measure(*_):
real_text_h = lbl.texture_size[1]
real_total_h = real_text_h + BTN_H + 2 * PAD + SP
popup.height = min(max(real_total_h, MIN_H), MAX_H)
Clock.schedule_once(_measure, 0)
Clock.schedule_once(_after_open, 0)
popup.open()
# =====================================================
# BARVY PODLE TYPU ÚČTU
# =====================================================
UCET_COLORS = {
"open": (0.36, 0.36, 0.36, 1),
"normal": (0.0, 0.2, 0.0, 1), #zelena
"blocked": (0.5, 0.0, 0.35, 1), #tmave cervena
"storno": (0.7, 0.2, 0.2, 1),
"is_storno": (0.6, 0.6, 0.6, 1),
"paymentchg": (0.2, 0.4, 0.8, 1),
"occupied": (0.05, 0.1, 0.25, 1) #tmave modra
}
def ucet_ui_type(u: data.UcetSelect, my_client_id: str | None = None) -> str:
# --- změna platby ---
if u.origin == "Zmena_Platby":
return "paymentchg"
# --- jsem storno ---
if u.is_storno:
return "is_storno"
# --- byl stornován ---
if u.storno:
return "storno"
# --- otevřený účet ---
is_open = (not u.closed_at and not u.ucislo)
# --- má položky? ---
has_items = bool(getattr(u, "poloz", None))
# --- blokovaný ---
if u.blocked_by:
if my_client_id:
owner = u.blocked_by.split("|", 1)[0]
if owner != my_client_id:
return "blocked"
else:
return "occupied" if has_items else "open"
return "blocked"
# --- otevřený účet ---
if is_open:
if has_items:
return "occupied"
else:
return "open" # prázdný účet = volný stůl
# --- fallback ---
return "open"