|
|||||||||||||||||||||||||||||||||||||||||||
|
Dans cet article, j'aborde un deck CanDo appelé "ColorChange" qui peut être utilisé avec d'autres decks CanDo. Il contient une carte, appelée "ChangePalette", qui utilise des boutons, des curseurs proportionnels et des pointeurs personnalisés pour permettre aux couleurs de l'écran d'être modifiées, copiées, échangées et interpolées. Cette carte peut être affichée à partir de n'importe quel deck CanDo à l'aide des commandes CanDo qui traitent ColorChange comme un sous-deck. Pour illustrer le fonctionnement du deck ColorChange, j'ai créé un autre deck nommé "Colors" qui utilise ColorChange comme sous-deck. Le deck Colors Le listing 1 montre une impression du programme Colors ; la figure 1 montre son interface. Le deck contient une carte, MainCard. Il s'agit d'une fenêtre basse résolution (320x200) de 32 couleurs contenant 32 barres de couleur horizontales, une pour chaque couleur de la palette. Il y a un bouton intitulé "ChangeColors" dans le coin inférieur droit de la carte. En appuyant sur ce bouton, la carte ChangePalette du deck ColorChange est activée. Avant de discuter de la façon dont cela est fait, regardons de plus près ma carte principale MainCard. ![]() Figure 1 - La carte MainCard Ensuite, la valeur de la variable "Invocation" est vérifiée. Cette variable sera égale à 0 lorsque la carte principale sera attachée pour la première fois, car toutes les variables numériques non assignées ont une valeur par défaut de 0. Une valeur de 1 est attribuée à Invocation plus tard dans le script. Lorsque Invocation est égale à 0, la routine globale "GetColors" est exécutée. Cette routine affecte simplement les valeurs des composantes rouge, verte et bleue de chaque couleur de la palette à des tableaux nommés Red, Green et Blue. Ensuite, les couleurs de la fenêtre sont définies en fonction de ces variables de tableau. Pourquoi prendre la peine de déterminer les valeurs des couleurs et de les définir immédiatement comme elles le sont déjà ? Eh bien, il s'avère que chaque fois qu'une carte est attachée, CanDo réinitialise toujours ses couleurs aux couleurs par défaut, indépendamment de ce qu'elles étaient lorsque la carte a été détachée. Par conséquent, si MainCard n'était qu'une carte dans un deck CanDo à plusieurs cartes et que le deck ColorChange était utilisé pour changer ses couleurs, ces couleurs seraient perdues lorsque la carte est détachée puis rattachée. Pour cette raison, le script "BeforeDetachment" exécute la routine "GetColors". Celle-ci sauvegarde la palette actuelle afin qu'elle puisse être restaurée lorsque MainCard est rattachée. Les valeurs des composants de couleur doivent également être déterminées la première fois que la carte est attachée afin d'éviter que toutes les couleurs ne soient réglées sur le noir, car les éléments des tableaux Red, Green et Blue sont par défaut à 0 avant d'être initialisés. En outre, dans la même boucle qui définit les couleurs de la fenêtre, des barres de couleur horizontales sont dessinées. Lorsque la carte "ChangePalette" est sur le point de se terminer, un message est envoyé au deck parent, dans ce cas "Colors". Cela active le script "MessageFromSubDeck". Jusqu'à dix paramètres peuvent être transmis à ce script ; ils sont automatiquement affectés aux variables système Arg1-Arg10. Un seul paramètre est transmis par la carte "ChangePalette", la chaîne "Quit". La commande "ClosePendingWindow" ferme toutes les fenêtres de requête dont l'exécution est terminée. Ensuite, la commande "FirstCard" est utilisée pour activer la première carte du deck. Comme MainCard est la seule carte du deck, elle se termine puis se réactive. Cette opération est bien sûr totalement inutile, mais elle illustre la façon dont les nouvelles couleurs de la carte sont enregistrées lorsque la carte se détache, puis réinitialisées lorsque la carte se rattache. Lorsque le bouton "ChangeColors" est activé, son script OnRelease charge le deck de couleurs ChangeColors dans un tampon nommé "CC". Il ouvre ensuite la carte ChangePalette à l'aide de la commande "OpenRequester". On peut aussi utiliser la commande "OpenWindow". Il n'y a qu'une seule différence entre ces deux commandes. OpenRequester ouvre la carte du sous-deck et empêche l'utilisateur d'interagir avec la carte parente jusqu'à ce qu'il quitte le sous-deck. OpenWindow ouvre la carte du sous-deck et permet à l'utilisateur d'interagir avec elle et avec la carte parente simultanément. Le deck ColorChange Le listing 2 montre une impression du programme ColorChange ; la figure 2 montre son interface (telle qu'elle apparaît sur la carte MainCard du deck Colors). Les paramètres de la fenêtre de cette carte sont illustrés à la figure 3. L'origine est réglée sur (20,20) afin qu'elle soit légèrement décalée lorsqu'elle apparaît au-dessus d'une autre carte CanDo. Sa taille est de 200x140, plus petite que la plus basse résolution de l'Amiga (320x200). Il est important que la fenêtre soit configurée pour s'ouvrir sur l'écran actuel. Sinon, la carte ChangePalette apparaîtra sur son propre écran, masquant la carte parente qui l'a invoquée. Il est également important de faire de la carte ChangePalette une fenêtre bicolore. Cela permet à la carte de fonctionner avec n'importe quelle carte parente. Lorsque CanDo tente d'ouvrir une fenêtre sur l'écran actuel, il vérifie la taille de la fenêtre et sa profondeur de couleur. Si la fenêtre est plus petite et que sa profondeur de couleur est inférieure à l'écran, CanDo ouvre la fenêtre sur l'écran, en augmentant la profondeur de couleur de la fenêtre si nécessaire. Si la profondeur de couleur de la fenêtre est supérieure à celle de l'écran, la fenêtre s'ouvre sur son propre écran. Ainsi, en faisant de ChangePalette une fenêtre bicolore, elle fonctionnera avec une carte parente de n'importe quelle profondeur de couleur. ![]() Figure 2 - La carte ChangePalette ![]() Figure 3 - Réglage de la fenêtre pour la carte ChangePalette Trois des boutons de texte, "Copy", "Exchange" et "Spread", sont situés entre les deux boutons de zone. "Copy" est utilisé pour copier une couleur à un autre endroit de la palette. "Exchange" permet d'échanger deux couleurs de la palette. "Spread" est utilisé pour créer des couleurs intermédiaires graduées entre deux couleurs de la palette. Les trois autres boutons de texte, "OK", "Cancel" et "Restore", sont situés au bas de la carte. "OK" est utilisé pour accepter la palette actuelle et revenir à la carte parente. "Cancel" est utilisé pour restaurer la palette originale et revenir à la carte parente. "Restore" permet de rétablir la palette d'origine sans revenir à la carte parente. Les trois curseurs proportionnels, Rouge, Vert et Bleu, sont situés au centre de la carte. Ils sont utilisés pour ajuster les valeurs des composantes rouge, verte et bleue de la couleur actuelle. Les lettres R, G et B à gauche des curseurs indiquent quel curseur est utilisé pour chacune des composantes de couleur. De même, les chiffres situés à droite des curseurs indiquent la valeur actuelle de chaque composante de couleur. Ces chiffres peuvent aller de 0 à 255. Le script AfterAttachment Lorsque la carte "ChangePalette" est invoquée pour la première fois avec la commande "OpenRequester" dans la carte parente, son script AfterAttachment s'exécute. Ce script détermine le nombre de couleurs de la palette de la carte à partir de la variable système "WindowColors". Rappelez-vous que CanDo ajuste automatiquement le nombre de couleurs à celui de la carte parente. Ensuite, le nombre de lignes et de colonnes à utiliser pour afficher les nuanciers de couleurs dans le bouton "Palette" est calculé. Un algorithme simple est utilisé. Lorsque le nombre de couleurs est inférieur ou égal à huit, les échantillons sont affichés sur une seule ligne. Lorsque le nombre de couleurs est supérieur à huit, plusieurs rangées sont utilisées. Sachez que si vous utilisez un écran de plus de 32 couleurs (comme dans le cas de certains des nouveaux modes graphiques AGA), vous devrez peut-être modifier l'algorithme. Une fois que le nombre de colonnes et de rangées est déterminé, la position de l'échantillon de couleur supérieur gauche et l'espacement des échantillons sont calculés. Ensuite, les échantillons sont dessinés à l'aide de la commande "AreaRectangle". Le mode de dessin est réglé sur "JAM2" de sorte que lorsque les valeurs de couleur sont affichées à côté des curseurs proportionnels, les nouveaux chiffres écrasent complètement les anciens. Ensuite, les caractères R, G et B sont affichés à gauche des curseurs. Enfin, le stylo A est mis à 0 (couleur de fond) avec la commande "SetPen", les routines globales Box, SetProps et GetColors sont exécutées et la variable PendingCommand est mise à "None". Les routines globales et la variable "PendingCommand" sont présentées ci-dessous. La routine Box La routine globale Box dessine un rectangle autour de la palette de couleurs actuellement sélectionnée dans le bouton "Palette". Le numéro du stylo à utiliser pour le rectangle est transmis à la routine en tant qu'argument et est référencé comme "Arg1". Cette routine détermine d'abord la ligne et la colonne de la couleur actuelle. Ensuite, les coordonnées du coin supérieur gauche du rectangle sont calculées. La couleur actuelle est temporairement fixée à la valeur d'Arg1, le rectangle est dessiné et la couleur actuelle est réinitialisée à sa valeur d'origine. Remarquez sur la figure 2 que les échantillons de couleur sont séparés les uns des autres d'un pixel. Le rectangle qui est dessiné autour de l'échantillon de couleur utilise cet espace. La routine SetProps La routine globale SetProps définit les positions des boutons des curseurs proportionnels et affiche leurs valeurs correspondantes à droite des curseurs. Pour ce faire, il faut d'abord déterminer les valeurs des composantes rouge, verte et bleue de la couleur actuelle. La commande "GetRGB" renvoie une valeur comprise entre 0 et 255 pour chaque composante. Ces valeurs sont affichées à droite du curseur approprié selon un format qui affiche toujours trois chiffres, quel que soit le nombre de chiffres des valeurs. Par exemple, les valeurs de 0, 5, 25 et 142 sont affichées sous la forme 000, 005, 025 et 142. Ensuite, la position du bouton de chaque curseur est définie à l'aide de la commande "SetPropPosition". Les curseurs sont abordés en détail plus loin. La routine GetColors La routine globale GetColors enregistre les valeurs des composantes rouge, verte et bleue de chaque couleur de la palette dans les variables de tableau R, G et B. Cela permet de restaurer les couleurs ultérieurement à l'aide de la routine "ResetColors". La routine ResetColors La routine globale ResetColors restaure les couleurs originales de la palette stockées dans les tableaux R, G et B. Elle est utilisée par les routines "Restore" et "ResetColors". Elle est utilisée par les boutons "Restore" et "Cancel". Le bouton Copy Le bouton "Copy" est utilisé pour copier la couleur actuelle à un autre endroit de la palette. Tout d'abord, une couleur est sélectionnée dans le bouton "Palette", ce qui en fait la couleur actuelle. Ensuite, vous appuyez sur le bouton "Copy". Cela active le script OnRelease du bouton qui change l'image du pointeur et définit la variable "PendingCommand" égale à "Copy". Enfin, une autre couleur est sélectionnée. Les valeurs des composantes rouge, verte et bleue de la première couleur sélectionnée sont alors copiées dans l'emplacement de la palette de la deuxième couleur sélectionnée. La copie réelle a lieu dans le script OnRelease du bouton "Palette". L'image du pointeur change après avoir appuyé sur le bouton "Copy" pour fournir un retour visuel indiquant qu'une action est en cours. L'image du pointeur est illustrée à la figure 4A. La commande "SetPointer" est utilisée pour afficher ce pointeur. Elle a un argument, une chaîne contenant le nom du fichier brosse contenant l'image du pointeur. Comme nous le verrons plus tard, le pointeur par défaut peut être restauré à l'aide de la commande "SetPointer" sans argument. ![]() Figure 4a Le bouton "Exchange" est utilisé pour échanger deux couleurs dans la palette. Ce bouton fonctionne de la même manière que le bouton "Copy". Une couleur est sélectionnée, on appuie sur le bouton "Exchange", et une autre couleur est sélectionnée. Les valeurs des composantes RVB des deux couleurs sont alors échangées. Le script OnRelease de ce bouton utilise la brosse illustrée à la figure 4B pour l'imagerie du pointeur. Il définit également la variable PendingCommand sur "Exchange". ![]() Figure 4b Le bouton "Spread" est utilisé pour créer des variations de couleurs douces entre deux couleurs de la palette. Ce bouton fonctionne de la même manière que les boutons "Copy" et "Exchange". Une couleur est sélectionnée, vous appuyez sur le bouton "Spread" et une autre couleur est sélectionnée. Les valeurs des composantes RVB de toutes les couleurs situées entre les deux couleurs sélectionnées sont modifiées pour assurer une transition douce entre elles. Le script OnRelease de ce bouton utilise la brosse illustrée à la figure 4C pour l'imagerie du pointeur. Il définit également la variable PendingCommand sur "Spread". ![]() Figure 4c Le bouton "Palette" sert de conteneur pour les nuanciers de couleurs représentant la palette actuelle. Lorsque le bouton est enfoncé, son script OnRelease est exécuté. Ce script appelle d'abord la routine "Box" pour écraser le rectangle autour de la couleur actuellement sélectionnée avec la couleur de fond, effaçant ainsi le rectangle qui était là auparavant. Ensuite, l'emplacement du pointeur est déterminé à partir des variables système "MouseX" et "MouseY". La position du pointeur est utilisée pour calculer la ligne et la colonne de la palette de couleurs sélectionnée, afin de pouvoir calculer le numéro de stylo de la couleur. Les valeurs de la composante RVB du stylo actuel, "PenA", sont enregistrées. À ce stade, le script détermine s'il y a une commande en attente en vérifiant la valeur de la variable "PendingCommand". Si sa valeur est "Copy", les valeurs de la composante RVB du stylo nouvellement sélectionné sont définies sur les valeurs du stylo actuel, ce qui entraîne une copie de la couleur. Si "PendingCommand" est égal à "Exchange", les valeurs de la composante RVB du stylo nouvellement sélectionné sont obtenues et les valeurs du stylo actuel leur sont égales. Ensuite, les valeurs de la composante RVB du stylo nouvellement sélectionné sont égales aux valeurs d'origine du stylo actuel, réalisant ainsi une permutation des couleurs. Si "PendingCommand" est égal à "Spread", les valeurs des composantes RVB de la couleur actuelle et de la couleur nouvellement sélectionnée sont déterminées. La différence entre chacune des trois valeurs composantes est calculée et un incrément est défini pour chacune d'elles en fonction du nombre de couleurs entre les deux couleurs sélectionnées. Ensuite, toutes les couleurs intermédiaires sont définies en fonction de ces incréments. Après avoir traité toutes les commandes en attente, le stylo nouvellement sélectionné devient le stylo actuel à l'aide de la commande "SetPen", PendingCommand est réinitialisé à "None", et le pointeur est réinitialisé à son image par défaut en lançant la commande "SetPointer" sans argument. Enfin, la grande palette de couleurs du bouton "CurrentColor" est mise à jour, les curseurs proportionnels sont ajustés et un rectangle est dessiné autour de la nouvelle palette de couleurs actuelle. Les curseurs proportionnels Il existe trois objets de type curseur proportionnel. Ils sont nommés "Red", "Green" et "Blue". Deux scripts, "OnNewPosition" et "OnRelease", sont associés à chaque curseur. OnNewPosition s'exécute lorsque le bouton d'un curseur est déplacé. Pour ce faire, il suffit de cliquer sur le bouton et de le faire glisser ou de cliquer dans le conteneur du curseur de chaque côté du bouton. Le script OnRelease s'exécute lorsque le bouton de la souris est relâché. Le script "OnNewPosition" détermine la nouvelle position du bouton du curseur. Les curseurs sont configurés pour varier de 0 à 255 (Figure 5). Cette plage correspond directement aux valeurs des composantes RVB des couleurs de la palette. ![]() Figure 5 - Réglage du curseur proportionnel La position d'un bouton de curseur est déterminée à l'aide de la commande "GetPropPosition". Le script "OnNewPosition" utilise cette valeur pour modifier la composante RVB appropriée de la couleur actuelle. En outre, la valeur du curseur est affichée à droite du curseur approprié en utilisant la couleur actuelle. Cela permet d'obtenir un retour d'information instantané sur la façon dont la couleur actuelle change en fonction du mouvement du bouton du curseur. Lorsque le bouton de la souris est relâché, le script "OnRelease" s'exécute. Il affiche la valeur finale du curseur. En outre, au cas où le curseur aurait été ajusté alors qu'une commande était en attente, PendingCommand est défini comme étant égal à "None". Enfin, l'imagerie par défaut du pointeur est restaurée. Le bouton Restore Le bouton "Restore" est utilisé pour réinitialiser la palette de couleurs à ses couleurs d'origine lorsque la carte a été activée. Son script OnRelease appelle la routine "ResetColors" pour accomplir cette tâche. En outre, la valeur de PendingCommand est égale à "None" et l'image par défaut du pointeur est restaurée. Le bouton OK Le bouton "OK" est utilisé pour accepter la palette actuelle avec toutes les modifications apportées, puis pour quitter le deck et rendre le contrôle au deck parent. Son script OnRelease envoie un message "Quit", à l'aide de la commande "SendToParentDeck", au deck parent, puis quitte. Le bouton Cancel Le bouton "Cancel" est utilisé pour rejeter la palette actuelle et quitter le deck, en rendant le contrôle au deck parent. Son script OnRelease exécute la routine "ResetColors", envoie un message "Quit" au deck parent, puis quitte. La fermeture J'espère que cet article vous aidera à mieux apprécier la puissance de CanDo. Lorsque j'ai conçu ce programme pour la première fois, je m'attendais à ce qu'il soit assez complexe. Cependant, plus j'ai codé, plus j'ai été étonné de la facilité avec laquelle il a été mis en oeuvre. Eh bien, d'ici la prochaine fois,.. cruc SendToAmazingComputingEditor "Quitter"
|