Reworked UI for easier workflow.
This commit is contained in:
163
ptlinux/ui/components/progress_panel.py
Normal file
163
ptlinux/ui/components/progress_panel.py
Normal file
@@ -0,0 +1,163 @@
|
||||
"""Operation progress, realm choice, and server-summary controls."""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from dataclasses import dataclass
|
||||
from typing import Any
|
||||
|
||||
|
||||
@dataclass(frozen=True)
|
||||
class ProgressPanel:
|
||||
container: Any
|
||||
realm_value: Any
|
||||
realm_selector: Any
|
||||
play_button: Any
|
||||
status: Any
|
||||
progress_text: Any
|
||||
speed_text: Any
|
||||
client_activity_text: Any
|
||||
download_context_text: Any
|
||||
activity_meta_text: Any
|
||||
progress_bar: Any
|
||||
server_status_content: Any
|
||||
server_status_debug_text: Any
|
||||
log_toggle: Any
|
||||
|
||||
def refresh_activity_metadata(self) -> None:
|
||||
self.activity_meta_text.set(
|
||||
self.download_context_text.get() or self.client_activity_text.get()
|
||||
)
|
||||
|
||||
def set_download_context(self, value: str) -> None:
|
||||
self.download_context_text.set(value)
|
||||
self.refresh_activity_metadata()
|
||||
|
||||
|
||||
def build_progress_panel(
|
||||
parent: Any,
|
||||
*,
|
||||
widgets: Any,
|
||||
tk_module: Any,
|
||||
default_realm: str,
|
||||
) -> ProgressPanel:
|
||||
activity_panel = widgets.Frame(parent, style="Surface.TFrame", padding=(10, 7))
|
||||
activity_panel.pack(fill="x", pady=(0, 8))
|
||||
realm_value = tk_module.StringVar(value=default_realm)
|
||||
activity_action = widgets.Frame(activity_panel, style="Surface.TFrame")
|
||||
activity_action.pack(side="right", fill="y", padx=(12, 0))
|
||||
play_button = widgets.Button(
|
||||
activity_action,
|
||||
text="PLAY",
|
||||
style="Play.TButton",
|
||||
underline=0,
|
||||
)
|
||||
play_button.pack(fill="both", expand=True)
|
||||
realm_selector = widgets.Combobox(
|
||||
activity_action,
|
||||
name="realm_selector",
|
||||
textvariable=realm_value,
|
||||
values=(default_realm,),
|
||||
state="readonly",
|
||||
style="Realm.TCombobox",
|
||||
font=("Sans", 9, "bold"),
|
||||
justify="center",
|
||||
width=20,
|
||||
)
|
||||
realm_selector.pack(fill="x", pady=(6, 5))
|
||||
activity_copy = widgets.Frame(activity_panel, style="Surface.TFrame")
|
||||
activity_copy.pack(side="left", fill="both", expand=True)
|
||||
status = tk_module.StringVar(value="Ready")
|
||||
progress_text = tk_module.StringVar(value="Click Play to start your journey")
|
||||
speed_text = tk_module.StringVar(value="")
|
||||
client_activity_text = tk_module.StringVar(value="")
|
||||
download_context_text = tk_module.StringVar(value="")
|
||||
activity_meta_text = tk_module.StringVar(value="")
|
||||
activity_heading = widgets.Frame(activity_copy, style="Surface.TFrame")
|
||||
activity_heading.pack(fill="x")
|
||||
widgets.Label(
|
||||
activity_heading,
|
||||
textvariable=status,
|
||||
style="Status.TLabel",
|
||||
).pack(side="left", anchor="w")
|
||||
widgets.Label(
|
||||
activity_heading,
|
||||
textvariable=activity_meta_text,
|
||||
style="Muted.TLabel",
|
||||
).pack(side="right", anchor="e")
|
||||
progress_bar = widgets.Progressbar(
|
||||
activity_copy,
|
||||
style="Depot.Horizontal.TProgressbar",
|
||||
mode="determinate",
|
||||
maximum=1,
|
||||
value=0,
|
||||
)
|
||||
progress_bar.pack(fill="x", pady=(5, 2))
|
||||
progress_details = widgets.Frame(activity_copy, style="Surface.TFrame")
|
||||
progress_details.pack(fill="x")
|
||||
widgets.Label(
|
||||
progress_details,
|
||||
textvariable=speed_text,
|
||||
style="Speed.TLabel",
|
||||
width=28,
|
||||
anchor="e",
|
||||
).pack(side="right")
|
||||
widgets.Label(
|
||||
progress_details,
|
||||
textvariable=progress_text,
|
||||
style="Muted.TLabel",
|
||||
anchor="w",
|
||||
).pack(side="left", fill="x", expand=True)
|
||||
server_status_row = widgets.Frame(activity_copy, style="Surface.TFrame")
|
||||
server_status_row.pack(fill="x", pady=(5, 1))
|
||||
widgets.Label(
|
||||
server_status_row,
|
||||
text="SERVERS",
|
||||
style="ServerHeading.TLabel",
|
||||
).pack(side="left", fill="y", padx=(0, 8))
|
||||
server_status_content = widgets.Frame(server_status_row, style="Surface.TFrame")
|
||||
server_status_content.pack(side="left", fill="y", anchor="w")
|
||||
log_toggle = tk_module.Button(
|
||||
server_status_row,
|
||||
text=">_",
|
||||
background="#191311",
|
||||
foreground="#f8fafc",
|
||||
activebackground="#24170f",
|
||||
activeforeground="#ffffff",
|
||||
font=("Monospace", 8, "bold"),
|
||||
padx=3,
|
||||
pady=1,
|
||||
borderwidth=0,
|
||||
highlightthickness=1,
|
||||
highlightbackground="#191311",
|
||||
highlightcolor="#f4bd61",
|
||||
relief="flat",
|
||||
takefocus=True,
|
||||
)
|
||||
log_toggle.pack(side="right", anchor="e", padx=(8, 0))
|
||||
server_status_debug_text = tk_module.StringVar(value="")
|
||||
widgets.Label(
|
||||
server_status_row,
|
||||
textvariable=server_status_debug_text,
|
||||
style="Muted.TLabel",
|
||||
).pack(side="right", anchor="e", padx=(8, 0))
|
||||
widgets.Label(
|
||||
server_status_content,
|
||||
text="Checking official server status…",
|
||||
style="ServerUnknown.TLabel",
|
||||
).pack(side="left", anchor="w")
|
||||
return ProgressPanel(
|
||||
container=activity_panel,
|
||||
realm_value=realm_value,
|
||||
realm_selector=realm_selector,
|
||||
play_button=play_button,
|
||||
status=status,
|
||||
progress_text=progress_text,
|
||||
speed_text=speed_text,
|
||||
client_activity_text=client_activity_text,
|
||||
download_context_text=download_context_text,
|
||||
activity_meta_text=activity_meta_text,
|
||||
progress_bar=progress_bar,
|
||||
server_status_content=server_status_content,
|
||||
server_status_debug_text=server_status_debug_text,
|
||||
log_toggle=log_toggle,
|
||||
)
|
||||
Reference in New Issue
Block a user