De Colour Picker
of hoe Ed van der Meulen stoeit met kleuren

De werkwijze met de sinds RISC OS 3.5 aanwezige Colour Picker zal ieder wel bekend zijn. Wat niet direct opvalt, is dat er twee acties zijn. In eerste instantie worden de selecties door de ColourPicker module (zie PRM-5a) zelf uitgevoerd, zoals te zien is in het window. De muis acties worden meteen gehonoreerd. Bij wijziging van de getallen wordt de nieuwe keuze getoond na een op of neer cursor.

Pas in tweede instantie kan de gebruiker (client) de gegevens gebruiken of verdere acties uitvoeren. Het resultaat van de gekozen instellingen kan worden weergegeven als een 32-bits getal. In hexadecimale notatie is het van de vorm &BBGGRR00 met 8 bit voor elke kleur B(lauw), G(roen) en R(ood). In PRM-taal heet het een 'Palette entry', maar het wordt hier wat huiselijker 'colour' of kleurwaarde genoemd. In een eigen programma komt het te gebruiken resultaat beschikbaar via de Message_ColourPickerColourChoice (&47700) als OK wordt aangeklikt of RETURN wordt getoetst. Die laatste werkt alleen als het window de inputfocus heeft. De OK-klik en de RETURN worden na de Message &47700 altijd gevolgd door de Message_ColourPickerCloseDialogueRequest (&47702) tenzij ADJUST is gebruikt. Dan vervalt de 'CloseDialogueRequest'.
Het is belangrijk die twee stappen goed te onderscheiden om daar in een eigen programma niet tegen te zondigen.

Als stand-alone.
Al in 1994 heeft Elliott Hughes laten zien hoe je de ColourPicker als stand-alone kunt gebruiken (Archive 8.2, nov.'94). Het resultaat van de gekozen instelwaarden werd als kleurwaarde in een error-window getoond. Dat is een eenvoudige maar wel irriterende methode, omdat het scherm meteen is geblokkeerd en na een klik het resultaat ook meteen is verdwenen. Waarom dan niet die waarde in het window zelf laten zien. Daarvoor is nog een leuk hoekje over. Dan begint de puzzel.

Met Wimp_PlotIcon.
De window-handel kan eenvoudig worden opgevangen, maar in de drie kleurenmodes wordt een wisselend aantal iconen gebruikt. Inclusief de 10 voor de basis template zijn dit voor RGB: 56, CMYK: 59 en HSV: 56. Deze templates zijn te vinden in Resources:$.Resources.Picker. Het wisselend aantal iconen maakt het niet aantrekkelijk om genummerde iconen in de bestaande window structuur onder te brengen. Daarom is eerst gekozen voor de loslopende versie met "Wimp_PlotIcon" Vanaf RISC OS 3 kan het ook buiten een redraw worden gebruikt, maar dan met screen coördinaten. Een grapje van de ontwerper van de template is, dat de top van het window ligt op x=60 en y=-484 i.p.v. 0/0 zoals gebruikelijk. Het resultaat staat in

.
    De voor ColourPicker benodigde gegevens staan in de regels 90 - 170. Met "ColourPicker_OpenDialogue" in [340] wordt het window opgestart. De vaste gegevens van het icoon staan in de regels 210 - 280. De variabele gegevens worden in DEF PROCplot berekend en uitgevoerd. De met de OK klik opgeroepen Message &47700 geeft via event 17 in het messageblok de verlangde kleurwaarde, die dan wordt getoond in het nieuwe icoon. Zo'n buiten het gareel vallend icoon moet om de haverklap worden ge'redraw'ed. Maar niet altijd, want anders tekent het programma bij afdekking van het window met een andere daarin rustig door. Dan werkt het net als een sproeier. DEF FNwin checkt of het window bedekt is. Om te voorkomen, dat met een OK klik het window verdwijnt -tenslotte is er 'Cancel'- is de variabele 'close%' gebruikt om ongehinderd verder te gaan. Zie de listing hoe dat is gerealiseerd.
ColourPicker De vernieuwde ColourPicker
Al gauw bevredigde het niet om alleen een resultaat uit te lezen en ontstond de wens om ook een waarde te kunnen invoeren om de bijbehorende kleur te kunnen beoordelen. Dit is nu gerealiseerd in twee stappen. De eerste was om het losse icoon toch in het gareel te krijgen, omdat anders geen programmatische bediening mogelijk is. Daarna komt de stap om de Picker de voorgeschotelde waarde te laten accepteren.

Nu met Wimp_CreateIcon.
Stap 1. Het ongelijke aantal iconen in de 3 kleurmodes kan worden gecompenseerd door in de RGB en HSV mode drie dummy iconen buiten de rooilijn te creŽren. Zie

. Ogenschijnlijk is dat niet nodig. Bij omschakeling van kleurmode vervangt de ColourPicker zijn iconen-set, zodat ook de eigen iconen gewist zijn. Bij elke omschakeling moeten de eigen iconen daarom ook steeds opnieuw worden gemaakt. Hoewel de nummers van de iconen netjes aansluiten bij die van de ColourPicker, blijkt dit tot vreemde interpretatie fouten te leiden. De drie dummy's zijn dus noodzakelijk. Zodra met de muis of toetsen de kleurinstellingen worden gewijzigd, wordt de dan ongeldige waarde in grijs gezet (kleur 4 ipv 7). Na een OK klik of Return wordt de kleur weer teruggezet.
    De vaste gegevens van de icoon-blokken staan in regel 210 - 310. Na de start met "ColourPicker_OpenDialogue" [370] is de window-handel bekend, die dan in [390] wordt ingevuld in de icoon-blokken. In [400] wordt dan na PROCfillicon met PROCicon(col%) het extra icoon getekend. Dan zijn ook de icoon-handels bekend, waarvan één in [420] nodig is. Een muis event 6 is ook nu nodig om na omschakeling het extra icoon weer terug te zetten.

Stap 2. Een beschrijfbaar icoon reageert alleen op muisklik met het zetten van de caret. Overige taken worden niet gehonoreerd. Dat komt slecht uit, omdat er wat te doen valt. Daarom start het icoon met buttontype 3 en kan nu in muisklik event 6 onder handen worden genomen. Dan wordt de button type gezet op 15 en tevens de achtergrond kleur van grijs naar wit gewijzigd. Dan ziet het icoon er zo uit.

    ColourPickerIcon In muis event 6 is nu een blokje ingevoegd met een omzetting van de kleurcode naar de hex-waarde, het zetten van de caret en de vermelde achtergrond en button omzetting. De wijzigingen worden gezet met "Wimp_SetIconState" in DEF PROCseticon() door de combinatie van de twee woorden 'eor' en 'clear', die de bits in de icoon-vlag wijzigen. Button 3 naar 15 betekent het zetten van 2 bits met (8+4)<<12. De achtergrondkleur van 1 naar 0 is het op 0 zetten van bit 1<<28. Beide worden hier gebruikt door afwisselend aan en uit zetten en staan daarom in het 'eor' woord. In het algemeen is de eenvoudigste manier om een icoon te 'redraw'en door PROCseticon(0,0) te gebruiken (vlag ongewijzigd).
Het ingeven van een nieuwe waarde werkt op de gebruikelijke Desktop methode en wordt afgesloten met een RETURN. Dat lokt wel eerst een Message &47700 met de oude waarde en een Message &47702 uit, maar dat wordt overruled door het eigen programma met de ontvangen Message_ColourPickerResetColourRequest (&47704) dat is opgeroepen door zelf een message uit te zenden.
    Dat gebeurt in KeyPressed event 8, waarin tevens een beveiliging tegen verkeerd ingegeven waarden [620 en 630]. Bovendien is variabele 'val%' als vlag toegevoegd, die PROCrecall() gebruikt ingeval het icoon voortijdig wordt verlaten met een cursor [680] of een muisklik elders in het window [570]. De oude situatie wordt dan hersteld. Normaal moet een toets event worden uitgeluid met "Wimp_ProcessKey" voor ongebruikte toets karakters. Maar omdat we in het eigen programma in tweede instantie aan de beurt zijn, blijft dat hier achterwege. Het werkt anders zelfs fataal. DEF FNwhich bepaalt welke van de ESG=1 groep (RGB, CMYK en HSV) is geselecteerd. Het voorbeeld staat al kant en klaar in de PRM.
Het programma ColPic staat in 19-07.verhalen en kan
worden gesaved.

N.B. 1. Het is in CYMK- en HSV-mode mogelijk, dat na een wijziging van de afzonderlijke waarden de '%' niet de werkelijk te berekenen waarden tonen, al of niet met een ongewijzigd eindresultaat. Dit is eenvoudig te controleren door naar de RGB-mode om te schakelen en weer terug.
2. Het tekstveld van de 'Blue' optie in RGB-mode loopt tot ruim 1/3 door tot in het schrijfveld van de %-waarde. Dat betekent, dat een muisklik om de caret te plaatsen alleen werkt in het overige 2/3 deel. Anders wordt alleen 'Blue' geselecteerd. Foutje van de zaak.