from __future__ import annotations from typing import TYPE_CHECKING import customtkinter as ctk from gui.locales import t from gui.views.base import BaseView if TYPE_CHECKING: from gui.app import ArmaModManagerApp class SettingsView(BaseView): """Appearance switcher, language selector, wizard re-opener, and current config display.""" def build(self) -> None: self.grid_columnconfigure(0, weight=1) self.grid_rowconfigure(1, weight=1) self._title_lbl = ctk.CTkLabel(self, text=t("settings.title"), font=ctk.CTkFont(size=22, weight="bold")) self._title_lbl.grid(row=0, column=0, sticky="w", padx=24, pady=(20, 8)) self._scroll = ctk.CTkScrollableFrame(self, fg_color="transparent") self._scroll.grid(row=1, column=0, sticky="nsew", padx=24, pady=(0, 12)) self._build_cards() def refresh(self) -> None: # Config info and language may have changed; rebuild everything. self._title_lbl.configure(text=t("settings.title")) for w in self._scroll.winfo_children(): w.destroy() self._build_cards() def _build_cards(self) -> None: # ── Server & Paths ──────────────────────────────────────────────────── c1 = ctk.CTkFrame(self._scroll) c1.pack(fill="x", pady=6) ctk.CTkLabel(c1, text=t("settings.server_card_title"), font=ctk.CTkFont(size=14, weight="bold")).pack( anchor="w", padx=16, pady=(14, 3)) ctk.CTkLabel(c1, text=t("settings.server_card_desc"), text_color="gray", wraplength=600, justify="left").pack( anchor="w", padx=16, pady=(0, 8)) ctk.CTkButton(c1, text=t("settings.wizard_btn"), width=160, command=self.app.open_wizard).pack( anchor="e", padx=16, pady=(0, 14)) # ── Appearance ──────────────────────────────────────────────────────── c2 = ctk.CTkFrame(self._scroll) c2.pack(fill="x", pady=6) ctk.CTkLabel(c2, text=t("settings.appearance_title"), font=ctk.CTkFont(size=14, weight="bold")).pack( anchor="w", padx=16, pady=(14, 3)) mode_var = ctk.StringVar(value=ctk.get_appearance_mode()) ctk.CTkOptionMenu(c2, values=["Dark", "Light", "System"], variable=mode_var, command=ctk.set_appearance_mode, width=140).pack(anchor="w", padx=16, pady=(0, 14)) # ── Language ────────────────────────────────────────────────────────── c_lang = ctk.CTkFrame(self._scroll) c_lang.pack(fill="x", pady=6) ctk.CTkLabel(c_lang, text=t("settings.language_title"), font=ctk.CTkFont(size=14, weight="bold")).pack( anchor="w", padx=16, pady=(14, 3)) from gui.locales import get_language current_display = "Tiếng Việt" if get_language() == "vi" else "English" ctk.CTkOptionMenu( c_lang, values=["English", "Tiếng Việt"], variable=ctk.StringVar(value=current_display), command=lambda v: self.app.switch_language("vi" if v == "Tiếng Việt" else "en"), width=160, ).pack(anchor="w", padx=16, pady=(0, 14)) # ── Current config info ─────────────────────────────────────────────── cfg = self.app.cfg if cfg: c3 = ctk.CTkFrame(self._scroll) c3.pack(fill="x", pady=6) ctk.CTkLabel(c3, text=t("settings.config_title"), font=ctk.CTkFont(size=14, weight="bold")).pack( anchor="w", padx=16, pady=(14, 3)) info = ( f"Server: {cfg.server_url}\n" f"Arma dir: {cfg.arma_dir}\n" f"Downloads: {cfg.downloads}\n" f"Presets: {cfg.modlist_html}\n" ) ctk.CTkLabel(c3, text=info, justify="left", font=ctk.CTkFont(family="Consolas", size=11), text_color="gray").pack(anchor="w", padx=16, pady=(0, 14))