04/23 Enhance app functionalities
This commit is contained in:
@@ -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()
|
||||
|
||||
Reference in New Issue
Block a user