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"