diff --git a/Readme.org b/Readme.org index 52a881a..52b0968 100644 --- a/Readme.org +++ b/Readme.org @@ -198,6 +198,8 @@ ou * Documentation complémentaire +- [[file:docs/guide_utilisateur_gui.md][Guide utilisateur de l’interface graphique]] : actions, + vérifications et cas particuliers pour chaque étape du parcours non personnel. - [[file:Script.org][Référence des étapes et des scripts]] : commandes, arguments, prérequis, fichiers produits et parcours alternatifs. - [[file:docs/final_output.md][Fichiers finaux dans A Rendre]] : contenu du JPEG, sélection et diff --git a/copienator_gui/app.py b/copienator_gui/app.py index b323323..664a511 100644 --- a/copienator_gui/app.py +++ b/copienator_gui/app.py @@ -279,6 +279,7 @@ class CopienatorApp(tk.Tk): self.refaire_panel: RefaireSelection | None = None self.giving_names_panel: GivingNamesPanel | None = None self.complete_giving_names_button: ttk.Button | None = None + self.label_groups_button: ttk.Button | None = None self.pending_refaire_commands: list[list[str]] = [] self.refaire_command_index = 0 self._correction_progress_buffer = "" @@ -833,6 +834,7 @@ class CopienatorApp(tk.Tk): self.refaire_panel = None self.giving_names_panel = None self.complete_giving_names_button = None + self.label_groups_button = None entry = self.state_store.step(step.id) if self.state_store.evaluation else {} saved_variant = entry.get("variant", step.variants[0].id) if saved_variant not in {variant.id for variant in step.variants}: @@ -946,6 +948,22 @@ class CopienatorApp(tk.Tk): self._update_controls() def _render_context_controls(self, step: StepDefinition, row: int) -> int: + if step.id == "annotation" and self.variant_var.get() == "grouped": + controls = ttk.Frame(self.form) + controls.grid(row=row, column=0, columnspan=2, sticky="ew", pady=(0, 8)) + self.label_groups_button = ttk.Button( + controls, + text="Ouvrir les groupes de questions", + command=self._open_label_groups, + ) + self.label_groups_button.pack(side="left") + ttk.Label( + controls, + text="Une ligne = un groupe. Vérifiez et enregistrez le fichier avant d’exécuter BGnot.", + wraplength=470, + justify="left", + ).pack(side="left", padx=(10, 0)) + return row + 1 if step.id == "personal_read": controls = ttk.Frame(self.form) controls.grid(row=row, column=0, columnspan=2, sticky="w", pady=8) @@ -1208,6 +1226,13 @@ class CopienatorApp(tk.Tk): evaluation = self.evaluation self._open_desktop_path(evaluation / "Persp" if evaluation else None, "dossier Persp") + def _open_label_groups(self) -> None: + evaluation = self.evaluation + self._open_desktop_path( + evaluation / "label_groups" if evaluation else None, + "fichier label_groups", + ) + def _open_selected_copy(self) -> None: self._open_desktop_path(self.copy_paths.get(self.copy_var.get()), "copie") diff --git a/start-gui.sh b/start-gui.sh index b214a90..8999d0b 100755 --- a/start-gui.sh +++ b/start-gui.sh @@ -17,6 +17,9 @@ if [[ $# -eq 0 ]]; then folder="${candidate%/}" folder="${folder##*/}" case "$folder" in + [Ee]xample|[Ee]xamples|[Dd]oc|[Dd]ocs|[Dd]ocumentation) + continue + ;; copienator|copienator_gui|tests|OLD|__pycache__|build|dist|*.egg-info|venv|env|node_modules) continue ;; diff --git a/tests/test_gui_convenience.py b/tests/test_gui_convenience.py index 64efac9..63d0afc 100644 --- a/tests/test_gui_convenience.py +++ b/tests/test_gui_convenience.py @@ -210,6 +210,25 @@ class GuiConvenienceTests(unittest.TestCase): ) self.assertNotEqual(self.app.current_step.id, "giving_names") + def test_grouped_annotation_can_open_label_groups(self): + label_groups = self.evaluation / "label_groups" + label_groups.write_text("Ex 1 : 1), Ex 1 : 2)\n", encoding="utf-8") + self.app.state_store.update_step("annotation", variant="grouped") + self.app.tree.selection_set("annotation") + self.app.update() + + self.assertIsNotNone(self.app.label_groups_button) + self.assertEqual( + self.app.label_groups_button.cget("text"), + "Ouvrir les groupes de questions", + ) + with patch("copienator_gui.app.open_path") as opened: + self.app.label_groups_button.invoke() + opened.assert_called_once_with(label_groups) + + self.app._select_variant(0) + self.assertIsNone(self.app.label_groups_button) + def test_batch_status_waits_until_all_jobs_are_ready(self): self.app.state_store.update_step("correction", variant="batch", last_run_variant="batch") self.app._populate_tree()