Ripetere (un insieme di) opzioni

A volte potreste voler ripetere una serie di opzioni per un numero arbitrario di elementi. Per esempio. supponiamo che vogliate implementare un'estensione per ordinare un data.frame. Potreste voler consentire l'ordinamento in base a un numero arbitrario di colonne (in caso di parità tra le prime colonne). Ciò potrebbe essere realizzato semplicemente consentendo all'utente di selezionare più variabili in un <varslot> con multi="true". Ma se volete estenderlo, ad es. consentendo all'utente di specificare per ciascuna variabile se deve essere convertita in carattere/numerico o se l'ordinamento deve essere ascendente o discendente, è necessaria maggiore flessibilità. Altri esempi potrebbero essere tracciare più linee in un unico grafico (permettendo di selezionare oggetto, stile di linea, colore di linea, ecc. per ogni linea), o specificare una mappatura per ricodificare da un insieme di vecchi valori a nuovi valori.

Immettere il <optionset>. Diamo un'occhiata a un semplice esempio, prima:

<dialog [...]>
        [...]
        <optionset id="set" min_rows="1">
                <content>
                        <row>
                                <input id="firstname" label="Nome proprio" size="small">
                                <input id="lastname" label="Cognome" size="small">
                                <radio id="gender" label="Genere">
                                        <optioncolumn label="Maschio" value="m"/>
                                        <optioncolumn label="Femmina" value="f"/>
                                </radio>
                        </row>
                </content>

                <optioncolumn id="firstnames" label="Nome proprio" connect="firstname.text">
                <optioncolumn id="lastnames" label="Cognome" connect="lastname.text">
                <optioncolumn id="gender" connect="gender.string">
        </optionset>
        [...]
</dialog>
                

Qui abbiamo creato un'interfaccia utente per specificare un numero di persone (ad es. autori). L'interfaccia utente richiede almeno una voce (min_rows="1"). All'interno dell'elemento <optionset>, iniziamo specificando <content>, cioè quegli elementi che appartengono al set di opzioni. Avrete familiarità con la maggior parte degli elementi all'interno di <content>.

Successivamente specifichiamo le variabili di interesse che vorremo leggere dall'opzione impostata nel nostro file JS. Poiché avremo a che fare con un numero arbitrario di elementi, non possiamo semplicemente leggere getString ("firstname") in JS. Piuttosto, per ciascun valore di interesse, specifichiamo un <optioncolumn>. Per la prima colonna di opzioni nell'esempio, <connect="firstname.text"> significa che il contenuto dell'elemento <input> "firstname" viene letto per ciascun elemento. Le <optioncolumn> per le quali viene fornita un'etichetta saranno visualizzate sullo schermo, in una colonna accanto a quell'etichetta. In JS, ora possiamo recuperare i nomi di tutti gli autori utilizzando getList("set.firstname"), getList("set.lastnames") per i nomi di famiglia e getList("set.gender") per un array di stringhe "m"/"f".

Tenere presente che non ci sono restrizioni su cosa potete inserire all'interno di un <optionset>. Potete anche utilizzare componenti incorporati. Proprio come con qualsiasi altro elemento, tutto ciò che dovete fare è raccogliere le variabili di output di interesse in una specifica <optioncolumn>. Nel caso delle estensioni incorporate, questa è spesso una sezione della proprietà «code». Ad esempio:

<dialog [...]>
        [...]
        <optionset id="set" min_rows="1">
                <content>
                        [...]
                        <embed id="color" component="rkward::color_chooser" label="Colore"/>
                </content>

                [...]
                <optioncolumn id="color_params" connect="color.code.printout">
        </optionset>
        [...]
</dialog>
                

Naturalmente è possibile anche utilizzare la logica dell'interfaccia utente all'interno di un insieme di opzioni. Ci sono due opzioni per farlo: potete farlo effettuando una connessione (o creando uno script) nella sezione <logic> principale della vostra estensione, come al solito. Tuttavia, accederete agli elementi dell'interfaccia utente nell'area dei contenuti come (ad es.) "set.contents.firstname.XYZ". Notare il prefisso "set" (l'id che avete assegnato agli insiemi e ai "contenuti"). In alternativa, potete aggiungere una sezione <logic> separata come elemento figlio del vostro <optionset>. In questo caso, gli id saranno indirizzati in relazione all'area del contenuto, ad es. "nome.XYZ". Solo l'elemento <script> non è consentito nella sezione logica di un insieme di opzioni. Se volete utilizzare lo scripting, dovrete utilizzare la sezione <logic> principale dell'estensione.

Nota

Quando si esegue lo scripting della logica in un insieme di opzioni, tutto ciò che si può fare è accedere all'area del contenuto attuale. Pertanto, in genere, è significativo solo connettere tra loro gli elementi all'interno dell'area del contenuto. La connessione di una proprietà esterna a <optionset> a una proprietà all'interno dell'area contenuto può essere utile per l'inizializzazione. Tuttavia, la modifica dell'area del contenuto dopo l'inizializzazione non si applicherà agli elementi che l'utente ha già definito. Solo all'elemento attualmente selezionato nell'insieme.

Insiemi di opzioni «guidati»

Finora abbiamo considerato un <optionset> che fornisce pulsanti per aggiungere/rimuovere elementi. Tuttavia, in alcuni casi, è molto più naturale selezionare elementi al di fuori dell'<optionset> e fornire solo opzioni per personalizzare alcuni aspetti di ciascun elemento in un <optionset>. Ad esempio, supponiamo di voler consentire all'utente di tracciare più oggetti all'interno di un diagramma. Per ciascun oggetto, l'utente dovrebbe essere in grado di specificare il colore della linea. Potreste risolvere questo problema inserendo un <varselector> e un <varslot> all'interno dell'area <content>, consentendo all'utente di selezionare un elemento alla volta. Tuttavia, ciò significherà molti meno clic per l'utente, se si utilizza invece un <varslot multi="true"> esterno <optionset>. Quindi collegherete questa selezione di oggetti a un cosiddetto set di opzioni «guidato». Ecco come:

<dialog [...]>
        <logic>
                <connect client="set.vars" governor="vars.available"/>
                <connect client="set.varnames" governor="vars.available.shortname"/>
        </logic>
        [...]
        <varselector id="varsel"/>
        <varslot id="vars" label="Oggetti da tracciare"/>
        <optionset id="set" keycolumn="var">
                <content>
                        [...]
                        <embed id="color" component="rkward::color_chooser" label="Colore della linea"/>
                </content>

                [...]
                <optioncolumn id="vars" external="true">
                <optioncolumn id="varnames" external="true" label="Variable">
                <optioncolumn id="color_params" connect="color.code.printout">
        </optionset>
        [...]
</dialog>
                

Inizieremo guardando l'esempio in basso. Noterete che due specifiche <optioncolumn> hanno external="true". Questo dice a RKWard che questi sono controllati dall'esterno del <optionset>. Qui, l'unico scopo della colonna opzioni «varnames» è fornire etichette di facile lettura nella visualizzazione dell'insieme di opzioni (è collegata al modificatore «shortname» della proprietà che contiene gli oggetti selezionati). Lo scopo della colonna opzioni «vars» è di fungere da colonna «chiave», come specificato da <optionset keycolumn="vars"...>. Ciò significa che per ciascuna voce in questo elenco, l'insieme offrirà una serie di opzioni e le opzioni sono logicamente legate a queste voci. Questa colonna è collegata alla proprietà che contiene gli oggetti selezionati nel <varslot>. Cioè per ogni oggetto selezionato lì, <optionset> consentirà di specificare il colore della linea.

Nota

La colonna esterna può anche essere connessaa proprietà all'interno della regione <content>. Tuttavia, è importante notare che le colonne di opzioni dichiarate external="true" non dovrebbero mai essere modificate dall'interno di <optionset>, e le colonne di opzioni dichiarate external="false" (il valore predefinito) non dovrebbero mai essere modificate dall'esterno di <optionset>.

Alternative: quando non utilizzare gli insiemi di opzioni

Gli insiemi di opzioni sono uno strumento potente, ma a volte possono fare più creare più problemi che altro, poiché aggiungono una notevole complessità, sia dal punto di vista di uno sviluppatore di estensioni, sia dal punto di vista di un utente. Quindi, consigliamo di pensarci due volte, quando si utilizzano. Ecco qualche consiglio:

  • Per alcuni casi semplici, l'elemento <matrix> può fornire un'utile alternativa leggera.

  • Non far fare troppo alla propria estensione. Abbiamo fornito l'esempio dell'utilizzo di un optionset per un'estensione per tracciare diverse linee all'interno di un grafico. Ma in generale non è una buona idea creare un'estensione che produrrà grafici individuali per ogni elemento in un optionset. Piuttosto, fare in modo che l'estensione produca un grafico e l'utente possa invocarla più volte.

  • Se non si attendono più di due o tre elementi in un insieme, considerare invece di ripetere manualmente le opzioni.