Domanda
Vorrei creare un'interfaccia utente sotto forma di menu popup , menu popup simile a quello utilizzato in Magit .
Caratteristiche
Definizione di Popup
Popup nel contesto di questa domanda significa una piccola finestra temporanea che contiene una raccolta di voci di menu in modo che l'utente possa selezionare solo una di queste voci.
Posizione sullo schermo
Il popup può apparire in qualsiasi parte dello schermo, ma è auspicabile che sia abbastanza ovvio e quindi dovrebbe apparire accanto alla finestra attualmente attiva.
Contenuto del buffer popup
Gli oggetti dovrebbero essere visualizzati sotto forma di una bella tabella. Abbastanza è il contesto della domanda significa visivamente accattivante, questo effetto può essere ottenuto più facilmente mettendo le voci di menu in file diritte, vedi
complete--insert-string
ad esempio. Questo paragrafo serve per ulteriori chiarimenti, puoi farlo a modo tuo, questo non renderà la tua risposta errata.
Selezione della voce di menu
La selezione dovrebbe essere eseguita premendo un solo tasto o, facoltativamente, con un mouse (anche se non è così importante, quindi le risposte contenenti proposizioni che non supportano il mouse sono legali). Se proponi una soluzione che supporti il mouse, tieni presente che l'utente dovrebbe essere in grado di selezionare una voce di menu in modo intuitivo, ovvero facendo clic con il pulsante sinistro del mouse sulla scelta desiderata.
NB Il mouse può essere utilizzato in molti modi e sono anche ben accetti modi alternativi per indicare una scelta.
Eliminazione del popup
Una volta che l'utente ha selezionato una voce di menu nel modo sopra descritto, il buffer e quindi la sua finestra dovrebbero essere eliminati dalla vista e uccisi. La finestra che è stata attiva prima dell'invocazione del menu a comparsa dovrebbe essere nuovamente attiva (ovvero, diventare attiva).
Valore e argomenti restituiti
Preferibilmente, questa conseguenza delle azioni dovrebbe comportare la restituzione di un oggetto Lisp. L'oggetto Lisp può essere:
nil
- indica che l'utente ha interrotto il menu popup premendo C-go in qualche altro modo †.string
- stringa (è consentito utilizzare un simbolo) dovrebbe esserestring-equal
una delle stringhe fornite al menu popup come raccolta di oggetti reali.
Sono accettabili modi alternativi per far conoscere al resto del programma la scelta dell'utente o, eventualmente, la sua assenza. Tuttavia, se non è chiaro in che altro modo può essere eseguita, chiedo a tutti i rispondenti di improvvisare e non chiedermi ulteriori chiarimenti su questo aspetto.
Questo è tutto per il valore restituito. Per quanto riguarda i parametri di input, dovrebbero almeno includere una raccolta di stringhe che rappresentano possibili scelte (ovvero voci di menu).
Risposte accettabili
La risposta attesa può essere delle seguenti forme:
Snippet di codice sufficiente che consente al lettore istruito di scrivere funzioni come quella sopra descritta; non è previsto né necessario scrivere l'intera funzione di lavoro. Tuttavia, per evitare incertezza (è possibile omettere parti considerevoli di codice?), Devo notare che le parti mancanti dello snippet dovrebbero essere descritte nella componente testuale della risposta.
Un collegamento alla libreria esistente che implementa funzionalità simili. Per evitare incertezza, dovrei notare che simile nel nostro caso significa che la libreria può essere utilizzata per creare popup (vedere la definizione sopra) che abbia almeno 2 o 3 funzioni sopra descritte. Se la libreria proposta è diversa dal punto in cui non è possibile soddisfare la condizione precedentemente dichiarata, ciascuno di questi casi verrà valutato in modo indipendente e sarà sempre valutato se OP lo ritiene utile.
Descrizione delle funzioni integrate di Emacs o di terze parti che possono essere utilizzate per implementare qualsiasi funzione descritta nella sezione «Funzionalità», vedere sopra. Per evitare incertezza, indica chiaramente come la tua risposta può essere utile per i futuri lettori che desiderano implementare un menu popup , simile a quello utilizzato in Magit .
† I modi alternativi per interrompere il menu popup possono includere i seguenti (ma non limitato a questi):
facendo clic all'esterno della finestra del menu popup;
uccisione del buffer contenente il popup senza fare una scelta.
magit-popup
. Si chiama il nuovo pacchettotransient
e questo è ciò che viene utilizzato nelle versioni correnti dimagit
. Vedere magit.vc/manual/transient per la documentazione.