""" Pomocný modul pro pozicování oken podle hostname počítače. Nastavení se načítá z layout_settings.json ve stejném adresáři. Použití: from window_layout import get_layout layout = get_layout() geom = layout["preview_viewer"] # {"x": 1100, "y": 0, "w": 1400, "h": 2100} root.geometry(f"{geom['w']}x{geom['h']}+{geom['x']}+{geom['y']}") Pro okna s "anchor": "bottom" (rename_dialog) použij get_bottom_y(): y = layout["rename_dialog"]["x"] # jen x, y se počítá dynamicky """ import json import socket from pathlib import Path _SETTINGS_FILE = Path(__file__).parent / "layout_settings.json" # Výchozí fallback layout (jeden monitor, původní chování) _DEFAULT = { "duplicity_viewer": None, # None = nepoužívat pevnou geometrii "preview_viewer": None, "rename_dialog": None, } def get_hostname() -> str: return socket.gethostname().upper() def get_layout() -> dict: """ Vrátí slovník s geometrií oken pro aktuální počítač. Pokud hostname není v settings, vrátí fallback (None = původní chování). """ hostname = get_hostname() if not _SETTINGS_FILE.exists(): return dict(_DEFAULT) try: settings = json.loads(_SETTINGS_FILE.read_text(encoding="utf-8")) except Exception: return dict(_DEFAULT) return settings.get(hostname, dict(_DEFAULT)) def apply_geometry(root, layout: dict, window: str, fallback_fn=None): """ Aplikuje geometrii okna z layoutu. - root: tkinter Tk nebo Toplevel - layout: výsledek get_layout() - window: klíč ("duplicity_viewer", "preview_viewer", "rename_dialog") - fallback_fn: callable() volaný pokud pro toto okno není layout definován """ geom = layout.get(window) if not geom: if fallback_fn: fallback_fn() return w = geom.get("w") h = geom.get("h") x = geom.get("x", 0) y = geom.get("y", 0) if geom.get("anchor") == "bottom": # Výška se ignoruje, okno se přilepí ke spodnímu okraji work area import ctypes, ctypes.wintypes rect = ctypes.wintypes.RECT() ctypes.windll.user32.SystemParametersInfoW(48, 0, ctypes.byref(rect), 0) root.update_idletasks() h_actual = root.winfo_height() y = rect.bottom - h_actual - 10 if w: root.geometry(f"+{x}+{y}") else: root.geometry(f"+{x}+{y}") else: if w and h: root.geometry(f"{w}x{h}+{x}+{y}") elif w: root.update_idletasks() root.geometry(f"{w}x{root.winfo_height()}+{x}+{y}") else: root.update_idletasks() root.geometry(f"+{x}+{y}") if __name__ == "__main__": hostname = get_hostname() layout = get_layout() print(f"Hostname: {hostname}") if all(v is None for v in layout.values()): print("Žádné nastavení pro tento počítač — používá se výchozí chování.") print(f"Přidej klíč '{hostname}' do {_SETTINGS_FILE}") else: print(f"Layout pro '{hostname}':") for k, v in layout.items(): print(f" {k}: {v}")