Permettre le déplacement individuel des nœuds du graphe #64
Loading…
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Permettre le déplacement individuel des nœuds du graphe
Contexte
La vue graphique en lecture seule permet désormais :
Ctrl+ défilement à deux doigts ;Shift+ glisser.Les positions des nœuds sont actuellement recalculées à partir d’une disposition déterministe en grille. Aucun nœud ne possède encore de position modifiable pendant l’utilisation.
La prochaine étape consiste à permettre le déplacement individuel d’un nœud avec un glisser simple.
Objectif
Permettre à l’utilisateur de déplacer une entité dans le canvas en maintenant le bouton principal sur son nœud puis en faisant glisser le pointeur.
Pendant le déplacement :
Interactions attendues
Déplacement d’un nœud
Le geste doit :
Déplacement global du canvas
Le comportement existant reste inchangé :
Un glisser avec
Shiftne doit jamais déplacer un nœud individuellement.Zoom
Le comportement existant reste inchangé :
Le déplacement individuel doit rester correct quel que soit le facteur de zoom.
Architecture attendue
Positions privées à la vue
InvestigationGraphModelreste inchangé.Les positions appartiennent exclusivement à
InvestigationGraphView.La vue doit conserver une structure privée par entité, par exemple :
Les positions ne doivent plus être recréées à chaque appel du callback de dessin.
Elles doivent être conservées dans une collection privée de la vue :
Les noms exacts peuvent évoluer, mais les responsabilités doivent rester identiques.
Cycle de vie de la disposition
Lors de
investigation_graph_view_set_graph():Lors de
investigation_graph_view_clear():Lors de
investigation_graph_view_free():EntityRecordempruntés.Conversion des coordonnées
Les événements GTK fournissent des coordonnées dans l’espace écran du widget.
Le déplacement des nœuds utilise les coordonnées logiques du graphe.
La conversion attendue est :
Le facteur de zoom doit être vérifié avant toute division.
Détection du nœud sous le pointeur
Une fonction privée doit rechercher le nœud contenant une position logique :
La recherche doit utiliser les dimensions réelles des nœuds.
Lorsque plusieurs nœuds se chevauchent, le nœud dessiné au premier plan doit être sélectionné en priorité. Une recherche depuis la fin du tableau vers le début est suffisante.
État du déplacement
La vue peut conserver au minimum :
Le pointeur
dragged_nodeest emprunté à la collection privée de disposition.Il doit être remis à
NULLlors :Priorité des gestes
L’ordre de décision doit être clair :
Shiftmaintenu : déplacement global du canvas ;Le glisser simple dans le vide ne doit pas déplacer le canvas.
Rendu
Le callback de dessin doit utiliser la disposition conservée par la vue.
Pendant le déplacement :
Aucune animation n’est exigée.
Réinitialisation
Ajouter une API publique pour restaurer la disposition initiale :
Cette fonction doit :
Pour cette première version, il est recommandé de conserver le zoom et le déplacement global du canvas.
Gestion de la mémoire
EntityRecordrestent empruntés au graphe.EntityRecord.set_graph()ouclear().Gestion des erreurs
En cas d’échec lors de la construction de la disposition :
Hors périmètre
Ce ticket n’inclut pas :
Ces fonctions feront l’objet de tickets séparés.
Critères d’acceptation
Shift+ glisser continue de déplacer tout le canvas.investigation_graph_view_clear()annule tout déplacement actif.investigation_graph_view_reset_layout()restaure la disposition initiale.InvestigationGraphModel.make clean && makeréussit avec-Werror -Wpedantic.make testréussit.git diff --checkne signale aucune erreur.Plan d’implémentation conseillé
InvestigationGraphNodeLayout.Shift+ glisser.investigation_graph_view_reset_layout().Validation manuelle
Shift+ glisser.