diff --git a/gui/views/mods.py b/gui/views/mods.py index c890d7d..bb2d1a9 100644 --- a/gui/views/mods.py +++ b/gui/views/mods.py @@ -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,23 +242,23 @@ 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="✓" 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 ctk.CTkLabel( 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", - 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",