Il JSL originale non si adatta oltre le due scatole e sarebbe molto difficile farlo funzionare, generico o meno, per più di due a causa del presupposto che "l'altra scatola" abbia causato il trascinamento.C'è un commento all'inizio del codice che spiega perché MouseBox utilizza il metodo di traccia (il mouse si muove ma il pulsante non viene premuto) piuttosto che i metodi di clic o trascinamento... sia il clic che il trascinamento impedirebbero al ListBox di effettuare una selezione (e quindi procurarsi la resistenza).Il JSL originale è una soluzione alternativa per qualcosa che ListBox attualmente non fa.
Senza modifiche al supporto interno del ListBox, non penso che troverai un modo completamente soddisfacente per trascinare tra tre o più listbox.Dovresti essere in grado di creare più coppie di scatole, penso, usando il codice originale; esiste un test di diafonia (controllare che la selezione dell'altra casella corrisponda al testo trascinato) che rileverà la maggior parte dei tentativi di abuso.
Se non è necessario rimuovere l'elemento selezionato dal ListBox di origine, il problema è molto più semplice.Usa il testo rilasciato per creare un clone e non preoccuparti nemmeno di trovare l'altra scatola poiché non è necessario rimuovere l'oggetto.
----
Puoi creare delle GUI drag'n'drop davvero interessanti w con i messaggi << .Una delle chiavi per usarli è fare in modo che dragBegin fornisca una stringa per il suo codice di ritorno.Questa è la stringa che dropCommit riceverà.L'indice di scripting per MouseBox setDropTrack ha un esempio di 15 puzzle con questo JSL:
dragBegin = Funzione( {questo, clickPt},
{x, y} = questo << getUserData;
Se(successivo allo spazio vuoto( x, y ),
((this << child) << child) << getText/* il messaggio è il contenuto della casella di testo */
, /* altro */
0 /* sopprime il trascinamento */
);
);/* funzione per rimuovere il carattere dalla cella sorgente, ma solo se il rilascio è andato a buon fine */
Le linee in grassetto mostrano due modi per utilizzare il valore restituito: ignorare il tentativo di trascinamento quando il pezzo da 15 puzzle non può essere spostato o restituire la lettera se può essere spostato.L'esempio ha anche altre funzionalità, come userData che aiuta a capire quali quadrati sono adiacenti.
Craige
Ciao Craige, sto cercando di rendere le tue caselle di riepilogo più generali perché le adoro, ma mi piacerebbe crearne un numero qualsiasi e metterle ovunque.Funziona ma sembra davvero complicato con la selezione.C'è qualcosa che ti viene in mente per cambiare la sensibilità o qualcosa del mousebox?Non voglio dover fare affidamento sulle relazioni figlio/genitore.
Nomi Predefinito qui ( 1 );
collegato = Funzione ({elenco}, {},
Scatola del mouse (
<< ImpostaDragAbilita ( 1 ),
//<
<< SetDropEnable ( 1 ),
<< Imposta l'inizio del trascinamento (
Funzione ({questo, clickPt},
questo<< Imposta Abilita rilascio ( 0 );
)
),
/*<
Funzione({questo, clickPt},
questo << Imposta DropEnable(0);
sel = (questo << figlio)<
questo << SetUserData(sel)
)
),
<
Funzione({questo, clickPt},
{destbox, sourcebox, lb, elementi, i, lb_source, lb_dest, indice},
destbox = this << OttieniDestBox;
sourcebox = questo << GetSourceBox;
mostra(scatola delle fonti);
/*lb_source = sourcebox <
sel = lb_source << Ottieni la selezione;
lb_dest = casella di destinazione <
articoli = lb_source << Ottieni articoli;
for(i = 1, i<=nitems(sel), i++,
indice = Contiene(lb_source< );
lb_source << Rimuovi elemento(indice);
lb_dest << Aggiungi(sel );
);
show(destbox, sel, testo, lb, indice, elementi);
sourcebox << Imposta Abilita rilascio (1);
1;*/
)
),*/
<< Imposta la fine del trascinamento (
Funzione ({questo, clickPt, come},
questo<< Imposta Abilita rilascio ( 1 );
)
),
<< SetDropCommit (
Funzione ({questo, clickPt, testo},
{destbox, sourcebox, lb, elementi, i, lb_source, lb_dest, indice},
casella di destinazione = questo << OttieniDestBox ;
sourcebox = questo << GetSourceBox ;
spettacolo (scatola delle fonti);
lb_source = casella di origine << bambino ;
sel = lb_sorgente << Fatti selezionare ;
lb_dest = casella di destinazione << bambino ;
elementi = lb_source << Ottieni oggetti ;
per (io= 1 , io<= nitems (sel), i++,
indice = Contiene (lb_sorgente<< Ottieni oggetti , sel );
lb_origine << Rimuovi oggetto (indice);
lb_dest << Aggiungere (sel )
);
spettacolo (destbox, sel, testo, lb, indice, elementi);
casella di origine << Imposta Abilita rilascio ( 1 );
1 ;
)
),
casella di riepilogo (elenco)
)
);
nuova finestra ( "Test" ,
Casella di riepilogo (
collegato({ "1" , "2" , "3" }),
collegato({ "4" , "5" , "6" }),
collegato({ "8" , "9" , "14" })
)
);
nuova finestra ( "Altra finestra" , //non sono ancora sicuro se questa sia una cosa positiva o negativa
collegato({ "test" , "altri questi" , "cose" })
);
Penso di averlo sistemato... Non sono sicuro che possa essere utile a qualcuno, ma lo scrivo qui per ogni evenienza...
Tiene traccia degli indici selezionati e poi li riseleziona dopo che sono stati riposizionati.
/*
* Changes position of selected list items, moving them up in rank
*/
On Move Up = function({this},
selectedList = listBoxBoxVariable << Get Selected;
selectedIndices = listBoxBoxVariable << Get Selected Indices;
myNewIndices = List();
listBoxBoxVariable << Remove Selected;
<BR />
For Each({index, i}, selectedIndices,
tempName = selectedList[i];
newInsertIndex = Max(i-1,index-2);
listBoxBoxVariable << Insert(tempName, newInsertIndex);
Insert Into(myNewIndices, newInsertIndex+1);
);
For Each({index, i}, myNewIndices,
listBoxBoxVariable << Set Selected(index);
);
);
/*
* Changes position of selected list items, moving them down in rank
*/
On Move Down = function({this},
selectedList = listBoxBoxVariable << Get Selected;
selectedIndices = listBoxBoxVariable << Get Selected Indices;
myNewIndices = List();
listBoxBoxVariable << Remove Selected;
For Each({index, i}, selectedIndices,
tempName = selectedList[i];
newInsertIndex = Min(Length(TagListBox << Get Items),index);
listBoxBoxVariable << Insert(tempName, newInsertIndex);
Insert Into(myNewIndices, newInsertIndex+1);
);
For Each({index, i}, myNewIndices,
listBoxBoxVariable << Set Selected(index);
);
);