Je cherche à améliorer mon projet open source Retro Graphics Toolkit (pour plus d'informations, voir https://github.com/ComputerNerd/Retro-Graphics-Toolkit ) et une fonctionnalité que je prévois d'ajouter est l'annulation/refaire. Le problème est que mon programme fait un usage intensif des curseurs. Pour illustrer cela, voici une capture d'écran de mon programme en action.
La raison pour laquelle j'aime les curseurs est la rétroaction instantanée et un moyen facile de communiquer à l'utilisateur qu'il existe une valeur minimale et maximale pour ce qu'ils veulent définir par exemple (étant donné que ce programme est destiné aux anciennes consoles de jeu), la Sega Genesis prend uniquement en charge sprites qui ont jusqu'à 4x4 carreaux de grande taille, il est donc facile de limiter la taille de Sprite à 4x4. Dans cet exemple (l'éditeur Sprite), lorsque vous faites glisser le curseur, vous pouvez voir les changements se produire. Chaque fois qu'un curseur est déplacé, une fonction de rappel est appelée. Je pourrais ajouter du code pour pousser l'ancienne valeur dans une pile d'annulation. Le problème réside dans la façon dont les gens interagissent avec les curseurs. Disons que l'utilisateur fait glisser le curseur comme ceci 0,1,2,3 ... jusqu'à atteindre sa cible au lieu de cliquer sur la bonne place sur le curseur pour obtenir la bonne valeur. Si je pousse simplement la modification sur la pile d'annulation lors de l'annulation des modifications, ce sera très ennuyeux d'avoir à annuler ... 3,2,1,0 même si vous vouliez juste 0. La meilleure idée à laquelle je pouvais penser (comme de maintenant) consiste uniquement à pousser l'ancienne valeur vers la pile d'annulation après avoir utilisé un curseur différent ou fait autre chose ou après un délai d'expiration. Je ne pense pas que ce système soit suffisamment robuste et je pense qu'il doit y avoir une meilleure solution. Cela dit, quelqu'un a-t-il une meilleure idée de la façon d'implémenter l'annulation des curseurs? Je pensais avoir un bouton Appliquer mais je trouverais cela très ennuyeux. Ou peut-être même remplacer les curseurs mais avec quoi?
Je ne pense pas que beaucoup d'annulations seront un problème.
Si je déplace (déplacement de pixels) une sélection dans Photoshop, je comme pour annuler (et rétablir) au même niveau détaillé. Si je dois appuyer 20 fois sur CTRL + Z (ou Commande + Z) - ce n'est pas un problème.
Donc. Appuyez pour annuler la pile chaque fois que:
Je pense que vous devez faire un compromis raisonnable entre la quantité de contrôle que l'utilisateur doit annuler à chaque étape qu'il fait avec le fardeau de sauvegarder chaque petit changement comme une nouvelle étape dans l'histoire. En enregistrant chaque modification dans un seul curseur, une étape d'annulation pourrait obstruer votre pile d'historique. Que se passe-t-il si vous devez limiter les états de l'historique afin d'économiser sur l'utilisation de la mémoire par exemple, si l'utilisateur apporte 100 modifications à un curseur avant de modifier tout autre contrôle, alors 100 étapes de l'historique sont gaspillées pour toutes ces étapes.
En tant qu'utilisateur, je serais également ennuyé de devoir parcourir chaque modification que j'ai apportée à un seul curseur avant d'utiliser un contrôle différent. Je préférerais revenir à la valeur initiale à laquelle elle se trouvait avant de faire mes modifications. Je sacrifierais ce contrôle pour la commodité de pouvoir annuler plus rapidement.
Vous voulez également éviter toute confusion inutile pour l'utilisateur. Par exemple, avec un délai d'expiration, l'action des utilisateurs est parfois enregistrée en tant qu'action d'annulation dans l'historique, mais parfois pas (selon que le délai d'expiration a été atteint ou non). Cela peut entraîner une incertitude pour l'utilisateur quant à savoir si ce qu'il a fait peut être annulé ou non.
J'irais pour enregistrer la modification entière sur un seul curseur comme 1 étape dans l'histoire. Une fois que l'utilisateur a effectué une modification autre que sur ce curseur, une nouvelle étape de l'historique est créée.
Exemple.