Een (aantal) opties herhalen

Soms wilt u een aantal opties herhalen voor een willekeurig aantal items. Bijv. stel dat u een plugin voor het sorteren van een data.frame wilt maken. U zou dit kunnen doen met het sorteren van een willekeurig aantal kolommen (in het geval dat de eerste kolommen met elkaar overeenkomen). Dit kan eenvoudig door de gebruiker meerdere variabelen te laten selecteren in een <varslot> met multi="true". Maar als u dit uitbreidt, bijv. door de gebruiker voor elke variabele te laten opgeven of die naar karakter/numeriek wordt omgezet, of dat het sorteren in de ene of in de andere richting moet, dan heeft u meer flexibiliteit nodig. Andere voorbeelden zouden zijn het plotten van meerdere lijnen in een plot (met keuze van object, lijnstijl, lijnkleur, etc., voor elke lijn), of een afbeelding (mapping) op te geven voor het terug-coderen van een verzameling oude naar nieuwe waarden.

Dit leidt tot de <optionset>. Laten we eerst een eenvoudig voorbeeld bekijken:

<dialog [...]>
        [...]
        <optionset id="verzameling" min_rows="1">
                <content>
                        <row>
                                <input id="voornaam" label="Voornamen" size="klein">
                                <input id="achternaam" label="Familienaam" size="small">
                                <radio id="geslacht" label="Geslacht">
                                        <optioncolumn label="Mannelijk" value="m"/>
                                        <optioncolumn label="Vrouwelijk" value="f"/>
                                </radio>
                        </row>
                </content>

                <optioncolumn id="voornamen" label="Voornamen" connect="firstname.text">
                <optioncolumn id="achternaam" label="Familienaam" connect="lastname.text">
                <optioncolumn id="geslacht" connect="geslacht.string">
        </optionset>
        [...]
</dialog>
                

Hier hebben we een UI gemaakt voor het opgeven van aantal personen (bijv. auteurs). De UI vereist de invoer van tenminste een persoon (min_rows="1"). In het <optionset>-element beginnen we met het opgevenvan de <content>, bijv. die elementen die behoren tot de verzameling van opties. U kent de meeste elementen wel in de <content> al.

Vervolgens geven we de gewenste variabelen op die we willen lezen uit de optieverzameling (optionset)in ons JS-bestand. Om dat we te maken zullen hebben met een willekeurig aantal items, kunnen we ons niet beperken tot het lezen van getString ("voornaam") in JS. In plaats daarvan moeten we voor elke gewenste waarde, een <optioncolumn> opgeven. Voor de eerste optiekolom in het voorbeeld, betekent <connect="voornaam.text"> dat de inhoud van het <input>-element "voornaam" wordt gelezen voor elk item. <optioncolumn>s waarvoor een label (naam) is gegeven, worden getoond, in een kolom met die naam. In JS kunnen we nu de voornamen ophalen van alle auteurs met behulp van getList("verzameling.voornaam"), getList("set.achternamen") voor de achternamen, en getList("set.geslacht") voor een array van "m"/"v"strings.

Merk op dat er geen beperkingen zijn voor wat u in een <optionset> kunt plaatsen. U kunt zelfs ingebedde-componenten gebruiken. Net als met elk ander element is alles wat u moet doen het verzamelen van de gewenste uitvoervariabelen in een <optioncolumn>-specificatie. In het geval van ingebedde plugins, is dit vaak een sectie van de "code"-eigenschap. Bijv.:

<dialog [...]>
        [...]
        <optionset id="verzameling" min_rows="1">
                <content>
                        [...]
                        <embed id="kleur" component="rkward::kleur_kiezer" label="Kleur"/>
                </content>

                [...]
                <optioncolumn id="kleur_params" connect="kleur.code.afdruk">
        </optionset>
        [...]
</dialog>
                

Natuurlijk kunt u ook UI-logica in een optionset gebruiken. Hiervoor zijn er twee manieren: U kunt dit zoals gebruikelijk doen door het maken van een verbinding (of script) in de hoofdsectie <logic> van uw plugin. Echter, u krijgt toegang tot de UI-elementen in het contents-gebied, met (bijv.) "verzameling.contents.voornaam.XYZ". Let op het voorvoegsel (prefix) "verzameling" (de id die u heeft toegekend aan de set (verzameling) en "contents" (inhoud). En anders kunt u een aparte <logic>-sectie als child element van uw <optionset> toevoegen. In dit geval zijn ids relatief ten opzichte van het contents-gebied, bijv. "voornaam.XYZ". Alleen het <script>-element is niet toegestaan in de sectie van een optionset. Als u een script wilt maken, moet u ook de <logic>-sectie gebruiken van de hoofdsectie <logic> van de plugin.

Opmerking

Bij het maken van logische scripts in een optionset, kunt u alleen toegang krijgen tot de huidige content region (inhoudsgebied). Het is dus alleen mogelijk om elementen binnen een content region met elkaar te verbinden. Het verbinden van een eigenschap buiten de <optionset> met een eigenschap binnen de content region kan misschien nuttig zijn bij de initialisatie. Maar het wijzigen van de contents region na de initialisatie zal niet van toepassing zijn voor elementen die door de gebruiker al zijn gedefinieerd. Slechts de huidig geselecteerde item in de set (verzameling).

"Driven" optionsets

Tot dusver hebben we een <optionset> beschouwd, die knoppen levert voor het toevoegen / verwijderen van items. In sommige gevallen, echter, is het natuurlijker items te selecteren buiten de <optionset>, en alleen opties te leveren voor het aanpassen van sommige aspecten van elk item in een <optionset>. Bijv. stel dat u de gebruiker wilt toestaan een aantal objecten in een plot te plotten. Voor elk object moet de gebruiker in staat zijn de kleur op te geven. U zou dit kunnen oplossen door het plaatsen van een <varselector> en <varslot> in het <content>-gebied, waardoor de gebruiker de items een voor een kan selecteren. De gebruiker zal echter veel minder hoeven te klikken als u in plaats daarvan <varslot multi="true"> buiten de <optionset> gebruikt. Daarna verbindt u deze selectie van objecten aan een zogenoemde "driven" optionset. Hier volgt hoe u dit doet:

<dialog [...]>
        <logic>
                <connect client="verzameling.vars" governor="vars.beschikbaar"/>
                <connect client="verzameling.varnamen" governor="vars.available.shortname"/>
        </logic>
        [...]
        <varselector id="varsel"/>
        <varslot id="vars" label="Te plotten objecten"/>
        <optionset id="verzameling" keycolumn="var">
                <content>
                        [...]
                        <embed id="kleur" component="rkward::kleur_kiezer" label="Lijnkleur"/>
                </content>

                [...]
                <optioncolumn id="vars" external="true">
                <optioncolumn id="varnamen" external="true" label="Variabele">
                <optioncolumn id="kleur_params" connect="kleur.code.afdruk">
        </optionset>
        [...]
</dialog>
                

We beginnen met het bekijken van het voorbeeld onderaan. U ziet dat twee <optioncolumn> specificaties external="true" hebben. Dit vertelt RKWard dat deze bestuurd bestuurd worden van buiten de <optionset>. Hier is het enige doel van de "varnamen"-option column (optiekolom) is het leveren van gemakkelijk leesbare namen bij het tonen van de optionset (het is verbonden met de "shortname" modifier(veranderen in korte naam) van de eigenschap die de geselecteerde objecten inhoudt). Het doel van de "vars"-option column is te dienen als de "key"-column (sleutelkolom), zoals opgegeven door <optionset keycolumn="vars"...>. Dit betekent dat voor elk item in de lijst de verzameling een van de beschikbare opties zal aanbieden, en opties hier logisch verbonden zijn met deze items. Deze kolom is verbonden met de eigenschap die de geselecteerde objecten inhoudt in <varslot>. Dus voor elk element dat daar wordt gekozen, kan met de <optionset> de kleur worden opgegeven.

Opmerking

Een externe kolom kan ook worden verbonden met eigenschappen in het <content>-gebied. Maar het is belangrijk op te merken dat optioncolumns die external="true" zijn gedeclareerd, nooit binnen <optionset> mogen worden gewijzigd, en optioncolumns die external="false" (de standaard) zijn gedeclareerd, nooit buiten de <optionset> mogen worden gewijzigd..

Alternatieven: wanneer optionsets niet te gebruiken

Optionsets zijn een krachtig gereedschap, maar zij kunnen soms meer kwaad doen dan goed, omdat zij een enorme complexiteit toevoegen, zowel voor een plugin-ontwikkelaar, als voor een gebruiker. Denk dus twee keer na voordat u die gebruikt. Hier volgt wat advies:

  • In eenvoudige gevallen, is het<matrix>-element misschien een nuttig lichtgewicht alternatief.

  • Laat uw plugin niet te veel doen. We gaven een voorbeeld van het gebruik van een optionset (verzameling van opties) voor een plugin voor het tekenen van een aantal lijnen in een plot. Maar in het algemeen is het geen goed idee een plugin te maken voor aparte plots voor elk item in een optionset. Beter is het dat de plugin een plot produceert, die de gebruiker meerdere keren kan aanroepen.

  • Indien u niet meer dan twee of drie items in een set verwacht, overweeg dan de opties met de hand te herhalen.