Tutorial AppleScript Studio #1

Prendendo spunto da alcuni vecchi progetti dal mio archivio personale cercherò di illustrare come utilizzare AppleScript e AppleScript Studio per creare delle piccole applicazioni per OS X.
Concentrandomi in questi tutorial sulla parte AppleScript Studio viene prese per scontato una certa domistichezza dell’utente con i concetti di base di AppleScript, farò comunque il mio meglio per spiegare e commentare il più possibile anche il codice AppleScript che farà da motore alle applicazioni.

Prima di cominciare vorrei ricordare che AppleScript di per sé non è un ambiente di programmazione. AppleScript è però un potentissimo mezzo di comunicazione per far dialogare diverse applicazioni fra di loro e combinare le forze di queste applicazioni per arrivare a risultati che una applicazione da sola non sarebbe in grado di ottenere. E “riassemblando” le classi e metodi delle applicazioni che sono scriptabile è anche possibile aggiungere a una applicazione delle funzionalità che i programmatori non avevano previsto.
L’insieme di questi elementi di comunicazione creati con AppleScript possono sì diventare dei programmi veri e propri, anche piuttosto complessi, e con l’aiuto di AppleScript Studio è inoltre possibile creare delle vere interfacce Cocoa che offrono il pieno “Look & Feel” dei programmi scritti per OS X.

Prima puntata: un playlist manager per il QuickTime Player

 

L’idea

Tutti noi utilizziamo QuickTime Player, il lettore multimediale che fa parte di ogni istallazione di OS X e che con l’aggiunta di alcuni plug-in, come ad esempio Perian, ormai è in grado di riprodurre quasi tutti i file multimediali che si possono trovare in internet. Al contrario di altri programmi come VLC, però, QuickTime Player non offre la possibilità di creare delle playlist, delle collezioni tematiche per ordinare e raggruppare i nostri brani e avere accesso immediato a delle collezioni precedentemente salvate.

Ecco un campo fertile per allargare le potenzialità di una applicazione già esistente utilizzando: 
a) AppleScript per pilotare QuickTime Player secondo le nostre esigenze, e
b) AppleScript Studio per creare una interfaccia in stile OS X

Gli strumenti di lavoro

Per scrivere la nostra applicazione servono come ambiente di sviluppo Xcode e InterfaceBuilder, entrambi fanno parte dei Developer Tools presenti sul dvd di installazione di OS X, altrimenti sono liberamente scaricabili nella sezione “Developer” di apple.com – ma che ve lo dico a fare? 😉 

L’interfaccia finale della nostra applicazione potrebbe essere simile a questa (gli strumenti messi a disposizione da Interface Builder vi permetteranno di applicare qualsiasi modifica e personalizzazione che vogliate):

01qtpl

 

Quindi una finestra che contiene

  • n. 1 tabella (table view) con i brani della playlist
  • n. 2 pulsanti “[+]” e “[-]” per aggiungere o eliminare brani dalla playlist
  • n. 1 pulsante “[Play]” per riprodurre i brani selezionati
  • n. 3 pulsanti “radio” per impostare la dimensione della riproduzione
  • qualche riga di testo con il titolo dellìapplicazione, un logo ecc…
  • non visualizzato nello screen shot: il menu dell’applicazione (e che non fa parte della finestra bensì dell’applicazione stessa)

Cominciamo!

Nota: il Mac con cui è stato scritto questo tutorial è un G5 con Tiger 10.4.11 e la versione di Xcode utilizzata è ancora la 2.5. Chi utilizza Leopard ha sicuramente anche installato una versione più aggiornata dei Developer Tools (appena arrivati alla versione 3.1.2) Nonostante ci siano notevoli differenze fra queste due versioni di Xcode, la parte che riguarda AppleScript Studio non ha subito molte variazioni e credo che utilizzando Xcode 3 non ci saranno problemi per seguire gli esempi di questo tutorial.

1. Creazione del progetto e dell’interfaccia

Lanciate Xcode e create un nuovo progetto (Menu -> File -> New Project…) – oppure con la combinazione di tasti [Cmd+Shift+N]. Dalla lista dei modelli per il nuovo progetto selezionate “AppleScript Application” e confermate. Scegliete un nome (il nome assegnato durante la creazione del progetto sarà anche quello dell’applicazione finale. Anche se è possibile, ma un po’ macchinoso, modificare questi settaggi di seguito, conviene dare subito un nome significativo al progetto) e il luogo in cui salvare il progetto e i suoi files e  confermate anche questo. Per il nostro tutorial ho scelto “QTPL” (per QuickTime Playlist) e userò questo nome di seguito in tutti i riferimenti, ma siete liberi di dare un titolo a vostro piacere.
Il nuovo progetto si presenterà con una finestra come la seguente:

02progetto

 

Il Project Window elenca tutte le risorse della nostra applicazione, fra cui i framework incorporati, i file .plist che contengono le informazioni utilizzate, fra altro, nella finestra Info del Finder, e QTPL.app: la nostra applicazione che non è mai stata compilata e perciò viene evidenziata in rosso.
Non c’è lo spazio qui per spiegare in dettaglio tutti i files che fanno parte del progetto, troverete delle informazioni precise nella documentazione di Xcode, sotto la voce “Menu -> Help -> Xcode Help”.

Delle risorse elencate al momento ci interessano solo due:

  1. MainMenu.nib (English) – il file dell’interfaccia che modificheremo fra poco con Interface Builder
  2. QTPL.applescript – lo script che conterrà tutto il codice della nostra applicazione

Con un doppio click su MainMenu.nib si apre Interface Builder e possiamo cominciare a disegnare l’interfaccia di QTPL.

Nota: la lingua di default di Xcode è l’inglese, e infatti il file .nib su cui lavoreremo si chiama MainMenu.nib (English). In questo esempio però creeremo una applicazione in lingua italiana. Facendo i precisini e seguendo il design multilinguale dei programmi Cocoa dovremmo creare un secondo file .nib (ed eventualmente anche un secondo applescript) per la  localizzazione italiana, ma per pigrizia useremo il file .nib inglese per l’italiano. In un’altra puntata applicheremo la procedura standard per creare una applicazione che userà quattro lingue.

Interface Builder ci mostra una serie di finestre:

  1. “Main Menu.Nib”, una specie di centrale di commando con gli elementi che di default fanno parte di ogni programma Cocoa.
  2. una finestra intitolata “Window” che rappresenterà la finestra principale della nostra applicazione e sulla quale disegneremo gli elementi di interfaccia di cui avremo bisogno
  3. il “MainMenu”, un modello prefabbricato per il menu dell’applicazione
  4. Una finestra che raggruppa in vari panelli tutti gli elementi e controlli che possiamo collegare all’interfaccia del programma (a partire da Xcode 3.0 questa palette offre un pratico campo di ricerca per trovare velocemente determinati elementi, con Xcode 2.5 bisogna abituarsi a pescare gli elementi nel panello giusto)
  5. Un panello “Inspector” con il quale si possono impostare le proprietà di ogni singolo elemento di interfaccia. Eventualmente questa finestra non si è aperta automaticamento all’avvio di Interface Builder – ci serve subito, quindi attivatela tramite Menu -> Tools -> Show Inspector, oppure [Cmd+Shift+1])

 

Impostazioni della finestra principale:

Cliccate sulla finestra che attualmente si chiama ancora “Window” e selezionate nel panello Inspector dal menu delle opzioni la voce Attributes, [Cmd+1] tramite tastiera.
Titolo: Noi vogliamo che durante l’utilizzo della nostra applicazione il titolo della finestra rappresenti il nome della playlist attiva – creato direttamente dal codice AppleScript – e non un generico “Window”. Quindi entrate nel campo Window Title dell’Inspector e cancellate il testo predefinito “Window”.
Dimensioni: impostiamo come misure 360 pixel di larghezza x 460 pixel di altezza. Potremmo redimensionare la finestra utilizzando il triangolino di redimensionamento in basso a destra, ma questo è un metodo poco preciso, meglio impostare le dimensioni esatte. Selezionate nel panello Inspector dal menu delle opzioni la voce Size, [Cmd+3] tramite tastiera, e inserite i valori 360 e 460 nei campi w (width) e h (height).

Inoltre non vogliamo complicarci la vita con il redimensionamento della finestra durante l’esecuzione del programma: la finestra avrà sempre queste dimensioni. Sempre nel panello Size cliccate su “Current” a fianco dei campi Min w/h e Max w/h.
Visto che la finestra avrà sempre le stesse dimensioni possiamo anche deattivare il “pallino verde” che nei programmi Cocoa “zooma” la finestra attiva alle massime dimensioni consentite. Per fare ciò tornate in Attributes e deselezionate la voce
“Zoom (and resize)”. 

Salvate il lavoro finora svolto, la finestra dell’applicazione dovrebbe presentarsi così:

03finestrainib1

 

Possiamo anche testare l’interfaccia per vedere come si comporterà durante l’esecuzione del programma: dal Menu di Interface Builder scegliete File -> Test Interface, [Cmd+R]. Il risultato è poco interessante ma vedete comunque che la finestra – come impostato prima – non offre nessuna possibilità per essere ridimensionato.
Ok, chiudete questo anteprima –
Quit NewApplication, [Cmd+Q] – andiamo avanti.

Aggiunta degli elementi di interfaccia

La tabella: L’elemento più importante è la tabella in cui verranno visualizzati i brani della playlist. In Interface Builder selezionate nella finestra degli elementi di interfaccia il panello Cocoa-Data. Da questa finestra trascinate l’elemento NSTableView sulla finestra della nostra applicazione (durante il trascinamento noterete delle guide blu che aiutano a posizionare l’elemento secondo i criteri stabiliti per le interfacce di programmi Cocoa). Una volta piazzato tirate “la maniglia” in basso a destra per allargare la tabella verso il basso e verso destra in modo che le 9 righe della tabella siano ben leggibili e che il bordo destro si agganci alla guida che appare a destra. Trascinate poi tutta la tabella un po’ verso il basso per creare spazio per una riga di testo, il titolo dell’applicazione. Potete fare questo spostamento anche utilizzando i tasti “freccia”.

Il titolo: Dal panello Cocoa-Text trascinate l’elemento SystemFontText nella finestra dell’applicazione e piazzatelo sopra la tabella appena creata.

I pulsanti: Dal panello Cocoa-Controls trascinate tre NSButton sulla nostra finestra. La classe NSButton offre pulsanti di vari tipi e potete scegliere quelli che preferite. La forma del pulsante può anche essere modificata di seguito tramite il panello Attributes dell’Inspector. Per l’esempio utilizzerò due pulsanti di tipo SquareTexturedButton e uno tondo del tipo RoundedBevelButton (sul quale dopo verrà “appiccicata” l’icona Play, presa in prestito direttamente da QuickTime Player) 
Piazzatene due direttamente sotto la tabella e uno centrato sotto di essi.
I pulsanti radio: Sempre da Cocoa-Controls trascite l’elemento NSMatrix sulla finestra e piazzatelo sotto l’ultimo pulsante.

Salvate il lavoro, la nostra interfaccia si presenta (per il momento) in questo modo bruttino:

04rawinterface

 

Mettiamoci subito a renderla più piacevole e a darle delle impostazioni che serviranno poi a renderla utilizzabile.

Cominciamo dal basso, con i pulsanti radio. In Interface Builder selezionate la matrice con i due pulsanti e aprite il panello Attributes dell’Inspector. Vogliamo ottenere tre pulsanti radio su una riga invece dei due attualmente visualizzati. Impostate quindi il campo Rows a 1 e Colums a 3. Allargate la matrice tirando la maniglia a destra in modo che si possano vedere tutti i tre pulsanti. 

Come etichetta dei tre pulsanti impostiamo i tre modi di visualizzazione dei brani in QuickTime Player, “Normale”, “Doppio” e “Schermo”. Per fare ciò basta fare un doppio click sull’etichetta vecchia e sostituire la scritta “Radio” con queste voci.

Per illustrare meglio la funzione dei tre pulsanti sarebbe utile anche una etichetta descrittiva davanti a loro. Ma eventualmente lo spazio a disposizione sarà troppo stretto. Impostiamo quindi un font più piccolo per le tre etichette selezionando la paletta dei caratteri Menu -> Format -> Font -> Show Fonts, oppure [Cmd+T] e selezioniamo nel popup menu Small System Font invece di System Font. Adesso possiamo stringere la matrice con i tre pulsanti, spostarla a destra (e anche verso il basso) facendo spazio per un altro elemento Small System Font Text che va trascinato dal panello Cocoa-Text nella nostra finestra. Il suo testo va sostituito con “Visualizza:”.
Il risultato dell’operazione sarà simile a questo: 

05matrice

Ora lasciate la matrice e selezionate gli altri tre pulsanti NSButton che avete creato prima e avvicinateli ai tre pulsantini radio trascinandoli verso il basso. Adesso selezionato il pulsante più a sinistra e nel campo Title del tab Attributes dell’Inspector sostituite il suo titolo con “+“, mentre l’altro, che servirà a eliminare titoli dalla playlist, verrà intitolato “-“. (Invece di utilizzare l’Inspector potete anche doppioclickare il pulsante: verrà evidenziato il titolo e potete sovrascrivere quello vecchio direttamente sul pulsante.)

Sarebbe pratico poi poter utilizzare anche delle scorciatoie da tastiera per eseguire le istruzioni di cui si occuperanno i due pulsanti. Selezionato il pulsante “+” e osservate la voce Key Equiv. del tab Attributes. E’ proprio qui che va definito il tasto che equivale alla pressione del pulsante. Qui potete scegliere quale tasto definire e se volete attivarlo con una combinazione dei tasti [Cmd], [Shift] o [Alt]. Per questo esempio scegliamo la combinazione [Cmd+Più], scrivendo “+” nel campo Key Equiv. e selezionando l’opzione [Cmd] dei tasti modificatori.

Facciamo la stessa cosa per il pulsante “-” scegliendo [Cmd+Meno] come combinazione da tastiera.
Il terzo pulsante, che sarà il pulsante Play dell’applicazione per il momento rimane com’è. 

Facciamo un altro test dell’interfaccia [Cmd+R]: si possono clickare tutti i pulsanti e si vede che “+” e “-” reagiscono anche alle nostre scorciatoie di tastiera, ma ovviamente non succede ancora nient’altro. Chiudete la simulazione e salvate.

Un compito facile facile, prima di occuparci della tabella: sostituite la stringa “System Font Text” nel titolo con qualcosa più significativo come “QuickTime Playlist Manager”, ingrandite il font e allineate la scritta a destra (a sinistra piazzeremo un bel giorno il nostro logo)

La tabella: di default Interface Builder ha creato un tableView con due colonne. Ci va bene, per la nostra applicazione ci servono due colonne, una per il nome del brano nella playlist, una a titolo informativo per il tipo di filmato, dobbiamo solo modificare la larghezza delle due colonne secondo queste esigenze. Fate un doppio click sulla tabella e passate con il mouse sopra i bordi dei campi di intestazione. Vedrete che il cursor cambia in una specie di croce che vi permette di allargare o restringere le colonne.

Allargate quindi la prima colonna a circa tre quarti della tabella. Clickando dentro l’intestazione delle colonne vedete che il panello Attributes vi offre il campo Header Title per dare dei titoli alle due intestazioni. Chiamiamo la prima colonna “Brano” e la seconda “Tipo”.
Cambiamo inoltre il font per tutta la tabella in Small System Font (che corrisponde a Lucida Grande 11 pt), selezioniamo nell’Inspector la voce Use Alternating Row Background e creiamo spazio per eventuali playlist lunghe tirando la maniglia in basso verso i nostri pulsanti.

Ecco il risultato di tutte queste operazioni:

06layoutfinito

 

Per il momento abbiamo finito i lavori di design, ci torneremo più tardi per i tocchi finali. Ma prima di poter chiudere Interface Builder dobbiamo occuparci di alcuni settaggi che sono indispensabili per far funzionare il codice che scriveremo fra poco. Per far sì che la nsotra applicazione sarà in grado di comunicare con gli elementi disegnati, reagire ai click dei pulsanti, visualizzare delle informationi nella tabella ecc. dobbiamo collegare gli elementi dell’interfaccia con il codice del programma, nel nostro caso l’applescript “QTPL.applescript” che abbiamo visto all’inizio fra i files del Project Window.

2. Collegare l’interfaccia con lo script

Come distinguerà lo script durante l’esecuzione del programma i vari elementi dell’interfaccia? Come saprà che è stato clickato un certo pulsante piuttosto di un altro? Facile, ogni singolo elemento avrà il suo nome univoco. 

Selezionate il pulsante “+” della nostra interfaccia e scegliete nell’Inspector il panello AppleScript [Cmd+8].

Nel campo Name inserite come nome per il pulsante “aggiungi”.

Nota: vedete a fianco al campo Name la scritta Index: e un numero che è stato assegnato automaticamente da Interface Builder al nostro pulsante. Infatti, si potrebbe anche rinunciare ai nomi e identificare ogni elemento all’interno dello script con questo numero indice, ma è un metodo poco intuitivo e nel caso di molti elementi di interfaccia diventerebbe complicato tenere il conto di tutti questi numeri.

Sotto il campo Name trovate un elenco di tutti gli eventi a cui sa rispondere l’oggetto NSButton, la classe dalla quale deriva il nostro pulsante “+”. Quello meno sorprendente è sicuramente clicked, e per il momento ci interessa proprio questa azione, selezionatela. In basso trovate invece gli applescript a disposizone per essere collegati al nostro oggetto. Di default ne esiste solo uno, ma nulla ci vieta di utilizzare più script all’interno dello stesso progetto (ad esempio per una localizzazione in un’altra lingua). Selezionate l’unico script a disposizone, ovvero “QTPL.applescript”.
Nel momento in cui avete selezionato lo script si è svegliato il piccolo pulsante Edit che prima, in mancanza di uno script di riferimento, era stato disattivato. Togliamoci lo svizio e clickiamo questo pulsante:
Tadaa… lo ScriptEditor di Xcode aprirà “QTPL.applescript” e ci mostra queste poche righe: 

QTPL.applescript
QTPL
  Created by Farid Mezaber on 30-11-2008.
  Copyright 2008 __MyCompanyName__. All rights reserved.

on clicked theObject
(*Add your script here.*)
end clicked

 

Si tratta di poco più di uno scheletro per un Handler “on clicked” generico. Toccherà poi a noi sostituire la riga (*Add your script here.*) con delle istruzioni precise su che cosa deve succedere quando verranno clickati i pulsanti della nostra applicazione.

Lo faremo nella prossima puntata! Chiudete lo ScriptEditor e tornate a Interface Builder, dobbiamo collegare ancora gli altri elementi dell’interfaccia:

Pulsante “-” : dategli il nome “elimina” e, come avete fatto per il pulsante “+”, attivate l’evento clicked e collegate l’oggetto allo stesso script “QTPL.applescript”  

07collegamenti

Pulsante “senza titolo”: dategli il nome “play” e collegatelo come prima.

Matrice con i tre pulsanti radio: dategli il nome “dimensione” e collegatela come prima.

Tabella: datele il nome “elencoFilmati”, non scegliete ancora degli eventi, ne utilizzeremo poi più di uno, ma collegatela lo stesso con lo script.
Attenzione di selezionare la tabella stessa e non solo il suo contenitore! Il titolo della finestra dell’Inspector dev’essere NSTableView Inspector e non NSScrollView Inspector. Uno ScrollView è la cornice intorno a una tabella che si occupa di operazioni come lo scrolling nel caso di elenchi lunghi. E’ un elemento che viene creato automaticamente quando create una tabella.

Alla fine di questa lunga puntata abbiamo così creato l’interfaccia bella e pronta della nostra applicazione che però finora non farà ancora nulla perché non abbiamo scritto una singola riga di codice. Abbiamo creato una specie di carrozzeria, una scocca vuota di un automobile. Nella prossima puntata monteremo il motore per mettere in marcia la nostra macchina.

Se volete eventualmente confrontare il vostro lavoro con il mio progetto Xcode, il codice sorgente di questa puntata è scaricaribile qui.  

Tags: , ,

Shortlink: http://www.tevac.com/?p=513

Trackbacks/Pingbacks

  1. Tutorial AppleScript Studio #2 | Tevac - 21 giugno 2009

    […] finito la prima puntata della realizzazone di un playlist manager per il QuickTime Player con AppleScript Stud…, creando una interfaccia per il nostro programma che dovrebbe dovrebbe avere più o meno questo […]

Lascia un commento

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.

%d blogger hanno fatto clic su Mi Piace per questo: