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) fg_color=("gray82", "gray22"), corner_radius=6)
col_hdr.grid(row=0, column=0, sticky="ew", padx=4, pady=(6, 2)) col_hdr.grid(row=0, column=0, sticky="ew", padx=4, pady=(6, 2))
col_hdr.columnconfigure(0, weight=1) col_hdr.columnconfigure(0, weight=1)
for col, (w, lbl_key) in enumerate([ for col, (w, lbl_key, anc) in enumerate([
(0, "mods.col_name"), (0, "mods.col_name", "w"),
(80, "mods.col_downloaded"), (80, "mods.col_downloaded", "center"),
(80, "mods.col_linked"), (80, "mods.col_linked", "center"),
(160, "mods.col_server"), (160, "mods.col_server", "w"),
(80, ""), (80, "", "center"),
]): ]):
ctk.CTkLabel(col_hdr, text=t(lbl_key) if lbl_key else "", ctk.CTkLabel(col_hdr, text=t(lbl_key) if lbl_key else "",
font=ctk.CTkFont(weight="bold"), font=ctk.CTkFont(weight="bold"),
anchor="w", width=w or 1).grid( anchor=anc, width=w or 1).grid(
row=0, column=col, 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 "") 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 # Scrollable rows
scroll = ctk.CTkScrollableFrame(tab_frame) scroll = ctk.CTkScrollableFrame(tab_frame)
@@ -239,23 +242,23 @@ class ModsView(BaseView):
row.columnconfigure(0, weight=1) row.columnconfigure(0, weight=1)
# Mod name # Mod name
name_lbl = ctk.CTkLabel(row, text=f" {mod['name']}", anchor="w") name_lbl = ctk.CTkLabel(row, text=mod["name"], anchor="w")
name_lbl.grid(row=0, column=0, sticky="ew", padx=4, pady=3) name_lbl.grid(row=0, column=0, sticky="ew", padx=(8, 4), pady=3)
# Downloaded # Downloaded
ctk.CTkLabel( ctk.CTkLabel(
row, row,
text=" " if downloaded else " ", text="" if downloaded else "",
text_color=COLOR_OK if downloaded else COLOR_ERROR, text_color=COLOR_OK if downloaded else COLOR_ERROR,
width=80, anchor="w", width=80, anchor="center",
).grid(row=0, column=1, padx=4) ).grid(row=0, column=1, padx=4)
# Linked # Linked
ctk.CTkLabel( ctk.CTkLabel(
row, row,
text=" " if linked else (" " if not downloaded else " "), text="" if linked else ("" if not downloaded else ""),
text_color=COLOR_OK if linked else "gray", text_color=COLOR_OK if linked else "gray",
width=80, anchor="w", width=80, anchor="center",
).grid(row=0, column=2, padx=4) ).grid(row=0, column=2, padx=4)
# Server status # Server status
@@ -267,7 +270,7 @@ class ModsView(BaseView):
# Update button (hidden until stale detected) # Update button (hidden until stale detected)
folder_name = folder_path.name if folder_path else None folder_name = folder_path.name if folder_path else None
update_btn = ctk.CTkButton( 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: command=(lambda g=group, fn=folder_name:
self._update_mod(g, fn)) if folder_name else None, self._update_mod(g, fn)) if folder_name else None,
state="normal" if folder_name else "disabled", state="normal" if folder_name else "disabled",