fix: align mods view column headers with data rows

- Use padx=(8,4) consistently for the name column in both header and rows,
  removing the leading-space text hack in row labels
- Add a 16px spacer at the right end of the header to compensate for
  CTkScrollableFrame's internal scrollbar width
- Centre-align Downloaded and Linked columns (header + tick/cross labels)
- Unify update button width to 80px to match header col width
This commit is contained in:
Tran G. (Revernomad) Khoa
2026-04-14 14:42:29 +07:00
parent ecfa5fa636
commit 45cb023513

View File

@@ -184,19 +184,22 @@ class ModsView(BaseView):
fg_color=("gray82", "gray22"), corner_radius=6)
col_hdr.grid(row=0, column=0, sticky="ew", padx=4, pady=(6, 2))
col_hdr.columnconfigure(0, weight=1)
for col, (w, lbl_key) in enumerate([
(0, "mods.col_name"),
(80, "mods.col_downloaded"),
(80, "mods.col_linked"),
(160, "mods.col_server"),
(80, ""),
for col, (w, lbl_key, anc) in enumerate([
(0, "mods.col_name", "w"),
(80, "mods.col_downloaded", "center"),
(80, "mods.col_linked", "center"),
(160, "mods.col_server", "w"),
(80, "", "center"),
]):
ctk.CTkLabel(col_hdr, text=t(lbl_key) if lbl_key else "",
font=ctk.CTkFont(weight="bold"),
anchor="w", width=w or 1).grid(
anchor=anc, width=w or 1).grid(
row=0, column=col,
padx=(10 if col == 0 else 4, 4), pady=5,
padx=(8 if col == 0 else 4, 4), pady=5,
sticky="ew" if col == 0 else "")
# Spacer compensates for CTkScrollableFrame's internal scrollbar width
# so the header columns line up with the data rows below.
ctk.CTkLabel(col_hdr, text="", width=16).grid(row=0, column=5, padx=0)
# Scrollable rows
scroll = ctk.CTkScrollableFrame(tab_frame)
@@ -239,15 +242,15 @@ class ModsView(BaseView):
row.columnconfigure(0, weight=1)
# Mod name
name_lbl = ctk.CTkLabel(row, text=f" {mod['name']}", anchor="w")
name_lbl.grid(row=0, column=0, sticky="ew", padx=4, pady=3)
name_lbl = ctk.CTkLabel(row, text=mod["name"], anchor="w")
name_lbl.grid(row=0, column=0, sticky="ew", padx=(8, 4), pady=3)
# Downloaded
ctk.CTkLabel(
row,
text="" if downloaded else "",
text_color=COLOR_OK if downloaded else COLOR_ERROR,
width=80, anchor="w",
width=80, anchor="center",
).grid(row=0, column=1, padx=4)
# Linked
@@ -255,7 +258,7 @@ class ModsView(BaseView):
row,
text="" if linked else ("" if not downloaded else ""),
text_color=COLOR_OK if linked else "gray",
width=80, anchor="w",
width=80, anchor="center",
).grid(row=0, column=2, padx=4)
# Server status
@@ -267,7 +270,7 @@ class ModsView(BaseView):
# Update button (hidden until stale detected)
folder_name = folder_path.name if folder_path else None
update_btn = ctk.CTkButton(
row, text=t("mods.update_btn"), width=70,
row, text=t("mods.update_btn"), width=80,
command=(lambda g=group, fn=folder_name:
self._update_mod(g, fn)) if folder_name else None,
state="normal" if folder_name else "disabled",