Dialogs

I Dialogs permettono di creare finestre personalizzate con bottoni, caselle di testo, checkbox, radio button, liste, tab e menu - per chiedere input all'utente o costruire piccole interfacce dentro uno script. Copertura completa della documentazione ufficiale mIRC, con alcune semplificazioni dichiarate esplicitamente qui sotto.

Limite architetturale importante: nel vero mIRC, $dialog() (a differenza di /dialog -m) è modale: blocca l'esecuzione dello script finché l'utente non chiude il dialogo, e ne restituisce il risultato come valore di ritorno. Il nostro motore di script gira in modo sincrono su un unico thread JavaScript (il motore di Yoake, non un vero interprete mIRC) e non può sospendersi in mezzo a una riga in attesa di un click dell'utente senza congelare l'intera interfaccia - è un limite della piattaforma, non qualcosa aggirabile con più lavoro. Qui $dialog() apre comunque il dialogo (con un overlay che scurisce il resto dell'app, per dare comunque un'idea "modale"), ma lo script prosegue subito - il risultato dei campi va letto nell'evento on dialog:...:close, o nella %variabile collegata al controllo con lo stile result, non dal valore restituito da $dialog() (che qui restituisce solo il nome del dialogo appena aperto).

La tabella dialog

Si definisce con il prefisso dialog, in aliases.ini/remote.ini/popups.ini come un alias o un evento on:

dialog nomeTabella {
  title "Titolo finestra"
  size -1 -1 300 200
  option pixels

  text "Nome:", 1, 10 10 60 20
  edit "", 2, 80 10 150 20
  button "OK", 3, 10 170 60 20, ok default
  button "Annulla", 4, 80 170 60 20, cancel
}

-1 -1 come x y centra il dialogo. id è un numero che identifica univocamente ogni controllo (usato poi da /did/$did()/eventi). Il prefisso -l (dialog -l nome {...}, "tabella locale") è accettato per compatibilità di sintassi ma ignorato: qui alias/eventi/popup/tabelle dialog vivono già tutti in un unico spazio condiviso.

Controlli disponibili

ControlloSintassiNote
texttext "testo", id, x y w h, styleEtichetta statica. Stili: left/right/center, nowrap.
editedit "testo", id, x y w h, styleCasella di testo. Stili: left/right/center, multi (multi-riga), pass (password), read (sola lettura), limit N (lunghezza massima).
buttonbutton "testo", id, x y w h, styleStili: ok/cancel (chiude il dialogo al click), default (bottone predefinito).
checkcheck "testo", id, x y w h, styleCheckbox. Stile 3state: tre stati (off/on/indeterminato) invece di due.
radioradio "testo", id, x y w h, styleRadio button. Stile group: inizia un nuovo gruppo (i radio successivi, fino al prossimo group, sono mutuamente esclusivi tra loro).
boxbox "testo", id, x y w h, styleRiquadro con etichetta (group box).
scrollscroll "", id, x y w h, range N N, pos N, page NSlider. Renderizzato come <input type=range> orizzontale (l'orientamento verticale del vero mIRC non è riprodotto).
listlist id, x y w h, styleLista. Stili: sort (ordina alfabeticamente ad ogni modifica), multsel/extsel (selezione multipla con Ctrl/Shift), check (checkbox per riga), radio (radio per riga). Popolata via /did -a/-i/-o/-d, non ha testo iniziale.
combocombo id, x y w h, styleMenu a tendina. Stile edit: editabile (con suggerimenti); senza, è una tendina fissa. Popolato via /did come la lista.
iconicon id, x y w h, percorso, index, styleMostra un'immagine dal percorso indicato. index (per file con più icone, tipico di .exe/.dll Windows) non è supportato, ignorato. Stile noborder toglie il bordo.
linklink "testo", id, x y w hTesto stile link. Al click scatena l'evento sclick come qualunque altro controllo - non apre automaticamente un URL, per restare interamente sotto il controllo dello script.
tabtab "testo", id, x y w h (prima) / tab "testo", id (successive)Crea una barra di schede. Associa un controllo a una scheda con lo stile tab <id> (l'id di UNA riga tab specifica) - quel controllo è visibile solo quando quella scheda è attiva.
menu/itemmenu "testo", menuid [, menuid-padre] / item "testo", id [, menuid] / item break, id [, menuid]Barra dei menu del dialogo. Se il campo dopo l'id di un item è ok/cancel invece di un numero, quella voce chiude il dialogo come il bottone corrispondente (visto nell'esempio ufficiale del menu File dell'editor mIRC).

Altri stili (validi su qualsiasi controllo)

StileEffetto
disableDisabilita il controllo.
hideLo nasconde.
groupInizia un nuovo gruppo (soprattutto per i radio button).
resultIl valore di questo controllo diventa il "risultato" del dialogo ($dialog(name).result).

%variabili

Se il campo testo di un controllo è una %variabile (es. edit "%nome", 2, ...), quella %variabile viene impostata con il contenuto del controllo quando il dialogo si chiude - con qualunque bottone o con /dialog -x.

Aprire un dialogo

/dialog -m <nome> <tabella>              ; apre (modeless) usando la tabella
/dialog -m -d <nome> <tabella>           ; apre sul desktop
%risultato = $dialog(nome,tabella)         ; apre (stile "modale", vedi avviso sopra)

nome è l'identificatore con cui riferirsi POI a questa istanza aperta (con /did, $did(), negli eventi on dialog) - non è detto coincida col nome della tabella.

Switch di /dialog

SwitchCosa fa
-m <nome> <tabella>Apre un nuovo dialogo.
-d(con -m) apre "sul desktop" - qui equivalente, nessuna vera distinzione dalle altre finestre.
-a(con -m) usa la finestra attualmente attiva come parent - accettato, non ha un effetto visibile qui (non gestiamo una vera gerarchia di finestre padre/figlio).
-x <nome>Chiude un dialogo SENZA scatenare l'evento close (le %variabili collegate vengono comunque scritte).
-t <nome> <testo>Cambia il titolo.
-s <nome> x y w hCambia dimensione/posizione (x y = -1 -1 per centrare).
-r <nome>Centra il dialogo.
-o <nome> / -n <nome>Imposta/rimuove "sempre in primo piano".
-k <nome> / -c <nome>Simula un click sul bottone ok/cancel (se presente) - chiude il dialogo scatenando gli eventi normalmente.
-v <nome>Porta il dialogo in primo piano.
-i <nome> / -e <nome>Minimizza / ripristina.
-g <nome> <nuovonome>Rinomina un dialogo già aperto.
Switch -h (lega il dialogo alla connessione attiva) e -b/-l/-p (forza dbu/map/pixel su una singola chiamata -s) accettati per compatibilità di sintassi, con effetto minimo o nullo qui: non gestiamo connessioni multiple per dialogo, e "map"/"pixels" coincidono già nel nostro modello semplificato (vedi "Dbu e pixel" più sotto).

L'evento on dialog

on 1:dialog:nome:evento:id: {
  echo $dname $devent $did
}

nome è il nome del dialogo (quello passato a /dialog -m o $dialog(), non il nome della tabella), id è l'id del controllo coinvolto. Entrambi accettano * come jolly; id accetta anche liste/intervalli come 1-3,5,7,9,15-20. Dentro il blocco, $dname/$devent/$did (senza parentesi) restituiscono nome/evento/id senza doverli riscrivere.

EventoQuando scatta
initSubito dopo la creazione del dialogo, prima che sia visibile - id è 0.
closeQuando il dialogo si chiude (non con /dialog -x, che lo salta apposta) - id è 0.
sclickClick su un bottone, check/radio, riga di lista/combo, voce di tab.
dclickDoppio click su una riga di lista/combo.
editTesto cambiato in una casella di testo o in un combo editabile.
scrollPosizione dello scroll/slider cambiata.
menuVoce di menu selezionata.
Non supportati: gli eventi mouse generici non legati a un controllo specifico (mouse, uclick, rclick, drop del vero mIRC) - richiederebbero di tracciare posizione/click del mouse su tutta l'area del dialogo indipendentemente dai controlli, una superficie di complessità sproporzionata rispetto al beneficio pratico in un client di chat.
Cliccando un bottone ok/cancel il dialogo si chiude DOPO aver scatenato "sclick" - se lo script di quell'evento esegue halt, la chiusura automatica viene bloccata (stesso comportamento del vero mIRC).

/did - modificare i controlli

/did -switch nome id [n] [testo|percorso]

Con più id separati da virgola/intervallo (es. 2,12-16,20) applica lo switch a tutti insieme.

SwitchCosa fa
-fDà il focus al controllo. Su una tab: la attiva (equivale a cliccarla).
-tLo imposta come bottone predefinito.
-e / -bAbilita / disabilita.
-v / -hMostra / nasconde. Su una tab: mostra/nasconde l'INTERA barra di schede (tutte le tab e i controlli associati), qualunque id di tab venga usato per lanciarlo - come da documentazione ufficiale.
-n / -mAbilita / disabilita una editbox.
-cSu check/radio: seleziona. Su list/combo (con [n]): seleziona la riga N. Su una editbox (con [n] start end): seleziona un intervallo di caratteri.
-uDeseleziona check/radio/riga di lista. -c e -u insieme su un check 3state lo mettono in stato indeterminato.
-k(con -c su una lista) mantiene le altre righe selezionate, invece di sostituirle.
-s / -lSpunta / togli la spunta dalla checkbox di una riga (liste con stile check).
-rSvuota tutto il testo/le righe.
-aSu list/combo/editbox: aggiunge una riga in fondo (o imposta il testo, su una editbox a riga singola). Su un menu (quando l'id indicato non corrisponde a nessun controllo, ma a un menuid): /did -a nome menuid nuovoid testo aggiunge una voce in fondo a quel menu.
-dElimina la riga N.
-iSu list/combo/editbox: inserisce testo alla riga N. Su un menu: /did -i nome id nuovoid testo inserisce una nuova voce subito prima della voce con quell'id (nello stesso menu che la contiene).
-oSovrascrive la riga N.
-gSu un controllo icona: /did -g nome id percorso cambia l'immagine mostrata.
-zSu uno scroll: /did -z nome id min max cambia l'intervallo. Su una lista: nessun effetto qui (nel vero mIRC ridimensiona la scrollbar orizzontale).
-jAzzera lo stato "modificato" di una editbox ($did().edited torna a 0).

$did(nome,id[,N]).proprietà

Dentro un evento on dialog, nome è opzionale: $did(id) si riferisce già al dialogo corrente. Senza proprietà (es. $did(nome,id)) equivale a .text.

ProprietàCosa restituisce
textIl testo del controllo, o la riga N se indicata (default).
lenLunghezza di .text.
linesNumero di righe (liste/combo/editbox multi-riga).
selNumero della riga selezionata (con N: 1/0 a seconda che la riga N sia selezionata).
seltextTesto selezionato (editbox) o prima riga selezionata (lista).
selstart / selendInizio/fine della selezione di testo in una editbox.
edited1/0 a seconda che il testo sia stato modificato dall'utente.
state0=off, 1=on, 2=indeterminato (check/radio).
next / prevId del controllo successivo/precedente nell'ordine di dichiarazione nella tabella (approssima l'ordine di tabulazione).
visible / enabled1/0.
isid1/0 a seconda che quell'id esista nel dialogo.
csel(liste con stile check) numero di righe spuntate, o riga N-esima spuntata se N > 0.
cstate(liste con stile check, con N) 1/0 a seconda che la riga N sia spuntata.

$dialog(...) - le altre forme

FormaCosa fa
$dialog(0)Numero di dialoghi aperti.
$dialog(N)Nome dell'N-esimo dialogo aperto.
$dialog(nome).proprietàx/y/w/h/cw/ch/title/modal/table/ok/cancel/result/focus/tab/mapw/maph/active/hwnd del dialogo aperto nome.

Altri identificatori/comandi

Identificatore/comandoCosa fa
$didtok(nome,id,C)Le righe di un controllo unite dal separatore ascii C (come $gettok ecc.).
/didtok nome id C testoSostituisce le righe di un controllo con testo diviso sul separatore ascii C.
$didwm(nome,id,wildtext,N)Numero della prima riga (a partire da N) che soddisfa un pattern con */?. 0 se nessuna.
$didreg(nome,id,regex,N)Come $didwm ma con un'espressione regolare.
$dbuw / $dbuhFattore di conversione dbu→pixel (fisso, vedi sotto - nel vero mIRC dipende dal font di sistema).

Dbu e pixel

Con option dbu nella tabella, le coordinate x/y/w/h sono in Dialog Base Units invece che pixel - qui convertite con un fattore FISSO (1 dbu ≈ 1.5px orizzontale, ≈ 1.8px verticale), non calcolato dal font di sistema come nel vero mIRC: un'approssimazione visiva, non una misura precisa. Senza option dbu ("pixels", il default, o "map") le coordinate sono pixel diretti, nessuna conversione.

Cosa NON è supportato