100 lines
3.1 KiB
Python
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}")
|