z230
This commit is contained in:
@@ -0,0 +1,99 @@
|
||||
"""
|
||||
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}")
|
||||
Reference in New Issue
Block a user