04/23 Enhance app functionalities

This commit is contained in:
2026-04-23 16:54:24 -04:00
parent 64419a445a
commit f4eea48e4d
8 changed files with 427 additions and 45 deletions
+37 -7
View File
@@ -939,6 +939,10 @@ class CriterionDialog(tk.Toplevel):
y = (self.winfo_screenheight() - h) // 2
self.geometry(f"{w}x{h}+{x}+{y}")
# Recommended character limit for criterion descriptions.
# Beyond this the AI prompt grows large and eats into document token budget.
_DESC_SOFT_LIMIT = 500
def _build_ui(self):
C = COLOURS
@@ -950,14 +954,14 @@ class CriterionDialog(tk.Toplevel):
form.pack(fill="x", padx=24, pady=8)
form.columnconfigure(1, weight=1)
# Title
# Row 0 — Title
ttk.Label(form, text="Title *").grid(
row=0, column=0, sticky="w", padx=(0, 10), pady=6)
self._title_var = tk.StringVar()
ttk.Entry(form, textvariable=self._title_var).grid(
row=0, column=1, sticky="ew", pady=6)
# Description
# Row 1 — Description text area
ttk.Label(form, text="Description *").grid(
row=1, column=0, sticky="nw", padx=(0, 10), pady=6)
@@ -975,15 +979,39 @@ class CriterionDialog(tk.Toplevel):
self._desc_txt.pack(fill="both", expand=True, padx=4, pady=4)
desc_vsb.config(command=self._desc_txt.yview)
# Sort order
# Row 2 — Live character counter (guidance, not a hard block)
self._char_lbl = tk.Label(
form,
text=f"0 / {self._DESC_SOFT_LIMIT} chars",
bg=C["bg"], fg=C["text_dim"],
font=FONT_SMALL, anchor="e",
)
self._char_lbl.grid(row=2, column=1, sticky="e", pady=(0, 4))
def _update_char_count(event=None):
n = len(self._desc_txt.get("1.0", "end-1c"))
over = n > self._DESC_SOFT_LIMIT
colour = C["danger"] if over else C["text_dim"]
label = (
f"{n} / {self._DESC_SOFT_LIMIT} chars"
f" ⚠ exceeds recommended limit" if over else
f"{n} / {self._DESC_SOFT_LIMIT} chars"
)
self._char_lbl.config(text=label, fg=colour)
self._desc_txt.bind("<KeyRelease>", _update_char_count)
# Also update when content is inserted programmatically (edit pre-fill)
self._desc_txt.bind("<<Modified>>", _update_char_count)
# Row 3 — Sort order
ttk.Label(form, text="Sort Order").grid(
row=2, column=0, sticky="w", padx=(0, 10), pady=6)
row=3, column=0, sticky="w", padx=(0, 10), pady=6)
self._order_var = tk.StringVar(value="0")
ttk.Spinbox(form, from_=0, to=999,
textvariable=self._order_var, width=8).grid(
row=2, column=1, sticky="w", pady=6)
row=3, column=1, sticky="w", pady=6)
# Active flag
# Row 4 — Active flag
self._active_var = tk.BooleanVar(value=True)
tk.Checkbutton(
form, text="Active (included in AI evaluation)",
@@ -991,7 +1019,7 @@ class CriterionDialog(tk.Toplevel):
bg=C["bg"], fg=C["text"],
activebackground=C["bg"], activeforeground=C["accent"],
selectcolor=C["surface2"], font=FONT, cursor="hand2",
).grid(row=3, column=1, sticky="w", pady=6)
).grid(row=4, column=1, sticky="w", pady=6)
tk.Label(
self,
@@ -1018,6 +1046,8 @@ class CriterionDialog(tk.Toplevel):
self._desc_txt.insert("1.0", d.get("description") or "")
self._order_var.set(str(d.get("sort_order", 0)))
self._active_var.set(bool(d.get("is_active", True)))
# Trigger counter update now that content has been inserted
_update_char_count()
def _save(self):
title = self._title_var.get().strip()