BlogAs
Le blog des As...

Astuces



Choose From List...
08/03/09 08:36 PM -
Il arrive souvent que l'exécution d'un script nécessite une interaction avec l'utilisateur pour, par exemple, lui demander de choisir un fichier, valider une option de traitement, nommer un objet, etc. Parfois, face à un ensemble de possibilités, il est nécessaire de demander à l'utilisateur de faire un choix, ou plusieurs, dans une liste d'éléments.

Par exemple, si, lors d'un traitement automatique sur un ensemble de fichiers, nous désirons "marquer" certains documents en leur attribuant une étiquette de couleur particulière, en modifiant la propriété "label index" des fichiers concernés (voir class "item" du dictionnaire AppleScript du "Finder"), il peut être utile de demander à l'utilisateur quelle étiquette utiliser parmi les 7 couleurs disponibles, à savoir : "Rouge", "Orange", "Jaune", "Vert", "Bleu", "Violet" et "Gris" (voir : Finder => Préférences => Étiquettes).



Il est évident qu'une boîte de dialogue normale serait inappropriée dans ce cas de figure, puisqu'elle ne peut afficher qu'un maximum de 3 boutons à la fois et que le champ de saisie serait trop permissif pour pouvoir s'assurer d'une réponse valable... donc, le mieux, dans cette situation, est d'utiliser un dialogue de choix à partir d'une liste, par la commande "choose from list" (voir le dictionnaire du complément de pilotage "StandardAdditions").

Voyons comment afficher ce dialogue afin de choisir l'étiquette de couleur avec laquelle on va marquer les fichiers :

Ouvrez ce code dans l'Éditeur de Scripts...

-- La liste de couleurs d'étiquettes proposées par défaut par le Finder
set theColorList to {"Rouge", "Orange", "Jaune", "Vert", "Bleu", "Violet", "Gris"}
-- Choix d'une couleur par l'utilisateur
set theChoix to choose from list theColorList with prompt "Choisissez une couleur :"
-- Si aucun élément sélectionné, alors on arrête le script
if (theChoix is false) then error "Annulation utilisateur..." number -128
-- Sinon, on continue le traitement (pour l'instant on retourne la valeur choisie)
return theChoix --> {"Bleu"}

Ce qui donnerait à l'exécution un dialogue comme celui-ci :



Comme nous le voyons dans cet exemple, lorsque l'utilisateur choisi un élément et clique sur le bouton de validation, on obtient en retour une liste avec les valeurs choisis, ici c'est : {"Bleu"}.

Ce fonctionnement et le résultat obtenu conviennent la plupart du temps et peuvent s'avérer très utiles dans de nombreuses situations.

Seulement, dans l'exemple qui nous occupe, le résultat obtenu ne convient pas car la propriété "label index" du fichier réclame un argument de type nombre, tel que précisé dans le dictionnaire du "Finder" et comme l'illustre l'exemple suivant, qui permet d'appliquer à un fichier une couleur choisie de manière aléatoire dans une liste de numéros allant de 1 à 7 :

Ouvrez ce code dans l'Éditeur de Scripts...

tell application "Finder"
  set label index of (choose file without invisibles) to (some item of {1, 2, 3, 4, 5, 6, 7})
end tell

Alors, revenant à notre dialogue "choose from list", pour obtenir ce nombre, rien de plus simple, il suffit de connaître le numéro de la couleur sélectionnée suivant sa place relative dans la liste des couleurs, autrement dit : le numéro 1 est pour le Rouge, le 2 pour l'Orange, le 3 pour le Jaune et ainsi de suite...

Pour obtenir ce nombre suivant le choix de l'utilisateur, voici donc une première approche, plutôt classique, par l'utilisation d'une boucle :

Ouvrez ce code dans l'Éditeur de Scripts...

-- La liste de couleurs d'étiquettes proposées par défaut par le Finder
set theColorList to {"Rouge", "Orange", "Jaune", "Vert", "Bleu", "Violet", "Gris"}
-- Choix d'une couleur par l'utilisateur
set theChoix to choose from list theColorList with prompt "Choisissez une couleur :"
-- Si aucun élément sélectionné, alors on arrête le script
if (theChoix is false) then error "Annulation utilisateur..." number -128
-- Sinon, on continue le traitement en récupérant le numéro de l'élément choisi
-- On compare chaque élément de la liste au choix de l'utilisteur
-- Dès que la correspondance est avérée alors on arrête la boucle
repeat with theNro from 1 to (count theColorList)
  if (item theNro of theColorList) is (theChoix as string) then exit repeat
end repeat
-- Résultat
return {theChoix, theNro} -->{{"Bleu"}, 5}

Voilà... nous arrivons donc à notre astuce... (enfin ;-)

Il se trouve qu'on peut éviter d'avoir recours à une boucle pour connaître le numéro de l'élément choisi, et, pour ce faire, il suffit d'inscrire ce numéro directement dans la liste d'items, devant chaque élément en notant son numéro de place dans la liste, du coup, une simple instruction permet de récupérer ce nombre :

Ouvrez ce code dans l'Éditeur de Scripts...

-- La liste de couleurs d'étiquettes proposées par défaut par le Finder
set theColorList to {"1. Rouge", "2. Orange", "3. Jaune", "4. Vert", "5. Bleu", "6. Violet", "7. Gris"}
-- Choix d'une couleur par l'utilisateur
set theChoix to choose from list theColorList with prompt "Choisissez une couleur :"
-- Si aucun élément sélectionné, alors on arrête le script
if (theChoix is false) then error "Annulation utilisateur..." number -128
-- Sinon, on continue le traitement en récupérant le numéro de l'élément choisi
set theNro to (first word of (theChoix as string)) as number
-- Résultat
return {theChoix, theNro} -->{{"5. Bleu"}, 5}

Ce qui donne :



Voilà... en préparant la liste avec les numéros correspondants aux différents items, plus besoin de boucle pour connaître la place de l'élément choisi... sympa non ? :-)

Avec cette astuce, le code de notre exemple serait donc :

Ouvrez ce code dans l'Éditeur de Scripts...

-- La liste de couleurs d'étiquettes proposées par défaut par le Finder
set theColorList to {"1. Rouge", "2. Orange", "3. Jaune", "4. Vert", "5. Bleu", "6. Violet", "7. Gris"}
-- Choix d'une couleur par l'utilisateur
set theChoix to choose from list theColorList with prompt "Choisissez une couleur :"
-- Si aucun élément sélectionné, alors on arrête le script
if (theChoix is false) then error "Annulation utilisateur..." number -128
-- Sinon, on continue le traitement en récupérant le numéro de l'élément choisi
set theNro to (first word of (theChoix as string)) as number
-- Choix du fichier et application de la couleur choisie
tell application "Finder" to set label index of (choose file without invisibles) to theNro





Dialogue avec icône personnalisée...
27/11/08 03:24 AM -
Voici une petite astuce pour afficher des icônes personnalisées dans les dialogues de vos scripts.

Pour commencer, il faut trouver un endroit facile d'accès pour ranger les différentes icônes qu'on désire pouvoir afficher. Le plus simple, c'est de créer un dossier "Icons" (nommé en anglais, afin d'éviter d'éventuels problèmes avec les accents) dans le dossier "Bibliothèque" ("Library") de votre dossier utilisateur, le chemin complet serait donc : "DisqueDur:Users:VotreNom:Library:Icons:".

Il suffit de placer les icônes qu'on souhaite utiliser dans ce dossier, en prenant soin de les nommer de manière simple et explicite afin de faciliter leur utilisation dans les scripts (là aussi, il vaut mieux éviter les noms avec des accents ou des caractères spéciaux).

Admettons qu'on souhaite utiliser l'icône suivante :

Si vous avez les "Developper Tools" installés chez vous, vous pouvez la trouver à l'adresse suivante : "DisqueDur:Developer:Applications:Utilities:PackageMaker.app:Contents:Resources:Assistant.icns".

Donc, une fois que le fichier de l'icône, "Assistant.icns", est bien placé dans le dossier "Icons", nous pouvons nous en servir de la manière suivante :

Ouvrez ce code dans l'Éditeur de Scripts...

set theIcon to ("" & (path to library folder from user domain) & "Icons:Assistant.icns") as alias
display dialog "Bonjour, ceci est un beau petit dialogue de bienvenue..." with icon theIcon

Et voici le résultat :



Pas mal non ? :-)



Nombre occurrences...
25/11/08 04:17 AM -
Voici une petite astuce pour compter le nombre d'occurrences d'un caractère à l'intérieur d'un texte.

Pour ce type de traitements, nous pourrions faire une simple boucle qui, isolant chaque caractère du texte, permettrait de le comparer à celui qu'on désire dénombrer, ce qui donnerait le code suivant :

Ouvrez ce code dans l'Éditeur de Scripts...

set la_recherche to "u"
set le_texte to "Inter quae verbum emicuit si forte decorum, et si versus paulo concinnior unus et alter, iniuste totum ducit venditque poema."
set le_nombre to 0
repeat with le_numero from 1 to (length of le_texte)
  if ((character le_numero of le_texte) is la_recherche) then set le_nombre to le_nombre + 1
end repeat
return le_nombre -- 12

Mais, si notre texte venait à être beaucoup, beaucoup plus long, cette méthode serait assez lente, très lente même, car le script doit tester chaque caractère individuellement, sur des textes de quelques milliers de caractères, ce serait très long...

Voici donc une autre technique, bien plus rapide ("y'a pas photo" comme on dit ;-), utilisant les fameux "text item delimiters" d'AppleScript.

Il s'agit de découper le texte, avec le caractère recherché, pour en faire une liste, il suffit alors de compter le nombre d'éléments présents dans cette liste et lui soustraire 1 pour connaître le nombre d'occurrences du caractère recherché, voici le code :

Ouvrez ce code dans l'Éditeur de Scripts...

set la_recherche to "u"
set le_texte to "Inter quae verbum emicuit si forte decorum, et si versus paulo concinnior unus et alter, iniuste totum ducit venditque poema."
set text item delimiters of AppleScript to la_recherche
set la_liste to text items of le_texte
set text item delimiters of AppleScript to ""
return (count la_liste) - 1 -- 12