Question
Je voudrais créer une interface utilisateur sous forme de menu contextuel , menu contextuel similaire à celui utilisé dans Magit .
Caractéristiques
Définition de Popup
Une fenêtre contextuelle dans le contexte de cette question signifie une petite fenêtre temporaire qui contient une collection d'éléments de menu afin que l'utilisateur puisse sélectionner un et un seul de ces éléments.
Position sur l'écran
La fenêtre contextuelle peut apparaître dans n'importe quelle partie de l'écran, mais il est souhaitable qu'elle soit assez évidente et qu'elle apparaisse donc à côté de la fenêtre actuellement active.
Contenu du tampon contextuel
Les articles doivent être affichés sous forme de joli tableau. Assez est le contexte de la question signifie visuellement attrayant, cet effet peut être plus facilement obtenu en mettant des éléments de menu en rangées droites, voir
complete--insert-string
par exemple. Ce paragraphe sert de clarification supplémentaire, vous pouvez le faire à votre manière, cela ne rendra pas votre réponse incorrecte.
Sélection de l'élément de menu
La sélection devrait être effectuée en appuyant sur une seule touche ou, éventuellement avec une souris (bien que ce ne soit pas si important, les réponses contenant des propositions qui ne prennent pas en charge la souris sont légales). Si vous proposez une solution prenant en charge la souris, veuillez noter que l'utilisateur devrait pouvoir sélectionner un élément de menu de manière intuitive, c'est-à-dire en cliquant avec le bouton gauche sur le choix souhaité.
La souris NB peut être utilisée de nombreuses façons et d'autres manières d'indiquer un choix sont également les bienvenues.
Élimination de Popup
Une fois que l'utilisateur a sélectionné un élément de menu de la manière décrite ci-dessus, le tampon et donc sa fenêtre doivent être supprimés de la vue et supprimés. La fenêtre qui était active avant l'invocation du menu contextuel devrait redevenir active (c'est-à-dire redevenir active).
Valeur retournée et arguments
De préférence, cette conséquence des actions devrait entraîner le retour d'un objet Lisp. L'objet Lisp peut être soit:
nil
- cela indique que l'utilisateur a abandonné le menu contextuel en appuyant sur C-gou d'une autre manière †.string
- chaîne (il est permis d'utiliser un symbole) doit êtrestring-equal
à l'une des chaînes fournies au menu contextuel en tant que collection d'éléments réels.
D'autres manières de faire savoir au reste du programme le choix de l'utilisateur, ou, éventuellement, son absence, sont acceptables. Cependant, si ce n'est pas clair comment cela peut être effectué, je demande à tous les répondeurs d'improviser et ne me demande pas de clarification supplémentaire sur cet aspect.
C'est tout pour la valeur retournée. Quant aux paramètres d'entrée, ils devraient au moins inclure une collection de chaînes qui représentent des choix possibles (c'est-à-dire des éléments de menu).
Réponses acceptables
La réponse attendue peut prendre les formes suivantes:
Extrait de code suffisant permettant au lecteur averti d'écrire une fonction comme celle décrite ci-dessus; il n'est pas prévu ni nécessaire d'écrire toute la fonction de travail. Cependant, pour éviter toute incertitude (des parties considérables du code peuvent-elles être omises?), Je dois noter que les parties manquantes de l'extrait doivent être décrites dans la composante textuelle de la réponse.
Un lien vers une bibliothèque existante qui implémente des fonctionnalités similaires. Pour éviter toute incertitude, je dois noter que similaire dans notre cas signifie que la bibliothèque peut être utilisée pour créer une fenêtre contextuelle (voir la définition ci-dessus) qui a au moins 2 ou 3 fonctionnalités décrites ci-dessus. Si la bibliothèque proposée est différente au point où la condition énoncée précédemment ne peut pas être remplie, chacun de ces cas sera jugé indépendamment et sera toujours voté si OP le juge utile.
Description des fonctions Emacs intégrées ou tierces qui peuvent être utilisées pour implémenter toute fonctionnalité décrite dans la section «Fonctionnalités», voir ci-dessus. Pour éviter l' incertitude de, s'il vous plaît indiquer clairement comment votre réponse peut être utile pour les futurs lecteurs qui souhaitent mettre en œuvre pop - up , menu contextuel semblable à celui utilisé dans Magit .
† Les autres méthodes pour abandonner le menu contextuel peuvent inclure les suivantes (mais sans s'y limiter):
cliquer en dehors de la fenêtre du menu contextuel;
suppression du tampon contenant le popup sans faire de choix.
magit-popup
. Le nouveau package est appelétransient
, et c'est ce qui est utilisé dans les versions actuelles demagit
. Voir magit.vc/manual/transient pour la documentation.