Files
ordinaceprojekt/Medevio/60 ScansProcessing/Testy/window_layout.py
T
2026-06-02 09:40:05 +02:00

100 lines
3.1 KiB
Python

"""
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}")