SOFTWARE > Linguaggi di programmazione e scripting

Interfacce e comportamento pulsanti

(1/10) > >>

Allanon:
Sto lavorando ad una nuova versione della scuilib e stavo riproducendo il comportamento dei pulsanti, in pratica ho reimplementato il comportamento:

1. Premo il pulsante (senza rilasciare il LMB) -> disegno il pulsante in stato premuto
2. Mantenendo il LMB premuto esco dall'area del pulsante -> disegno il pulsante in stato normale
3. Sempre mantenendo il LMB premuto rientro nell'area -> disegno il pulsante in stato premuto

E fin qui tutto bene... poi mi sono messo ad osservare il comportamento della gui di seven (ma sicuramente sarà il medesimo di tutte le altre versioni di windows) e mi sono accorto che:

1. Premo il LMB in un'area non attiva
2. Trascino il mouse sempre con il LMB premuto su un pulsante -> windows disegna il pulsante evidenziato
E' giusto? Oppure non dovrebbe disegnare nulla dal momento che il mouse è stato premuto fuori dall'area attiva?

Altro dubbio:
1. Premo il LMB su un pulsante e mantengo premuto -> windows disegna il pulsante premuto
2. Esco dall'area sempre son il LMB premuto -> windows disegna il pulsante normale
3. Rientro nel pulsante sempre con il LMB premuto e poi lo lascio -> windows disegna il pulsante premuto e poi parte l'evento
e qui va bene però se...

1. Premo il LMB su un pulsante e mantengo premuto -> windows disegna il pulsante premuto
2. Esco dall'area sempre son il LMB premuto -> windows disegna il pulsante normale
3. Lascio il LMB, e poi lo ripremo in un'area non attiva
4. sempre mantenendo il LMB premuto entro sul pulsante del punto 1 -> windows mi disegna il pulsante evidenziato
5. Lascio il LMB -> windows lancia l'evento
A me questo comportamento non sembra proprio corretto, primo percè ho lasciato il LMB fuori dal pulsante e poi perchè mi lancia l'evento su un rilascio del LMB in seguito ad un evento di evidenziazione e non di pressione...

Ditemi voi, forse sono io che prendo un abbaglio ma se devo riprodurre questi comportamenti è bene che sappia precisamente cosa è giusto e cosa no  :D

cdimauro:
Ti secchi se spengo un po' il cervello e ci rifletto non appena sono più tranquillo e riposato?

TheKaneB:
Windows lancia i seguenti eventi:

- Alla ricezione del focus (che può essere dato da tastiera, premendo TAB)
- Alla perdita del focus
- Alla presenza del puntatore (mouse over)
- All'uscita del puntatore (mouse leave)
- All'inizio della pressione
- Alla fine della pressione
- Al click (combinazione di pressione + fine pressione + delay > di N ms, anche lasciando il focus, il delay dipende dalle impostazioni di doppio click dell'OS)
- Al doppio click (combinazione di pressione + fine pressione + delay < di N ms + pressione + fine pressione)
NB: Se non è agganciato alcun listener per l'evento doppio click, puoi omettere il delay nel click in modo da rendere più reattiva la GUI.

Il codice che agganci a tali eventi dipende dalla particolare applicazione, quindi da scelte che stanno al di fuori della libreria della GUI.

Una libreria di GUI dovrebbe rilasciare questi eventi, e dare al programmatore il compito di scegliere se scatenare del codice al click oppure alla pressione, oppure al mouse over, ecc...

Allanon:
@cdimauro
figurati, fai con comodo :)

@TheKaneB

--- Citazione ---- Alla ricezione del focus (che può essere dato da tastiera, premendo TAB)
- Alla perdita del focus
- Alla presenza del puntatore (mouse over)
- All'uscita del puntatore (mouse leave)
- All'inizio della pressione
- Alla fine della pressione
- Al click (combinazione di pressione + fine pressione + delay > di N ms, anche lasciando il focus, il delay dipende dalle impostazioni di doppio click dell'OS)
- Al doppio click (combinazione di pressione + fine pressione + delay < di N ms + pressione + fine pressione)

--- Termina citazione ---
Ma la ricezione del focus non è equivalente all'evento mouse over? Quando il mouse va su un pulsante questo non riceve anche il focus?
Stesso discorso per perdita focus & mouse out
Per il resto ho implementato:
- Mouse Over
- Mouse Out
- On Pushed (che poi è l'evento standard quando il pulsante viene rilasciato)
- On Down (lancia l'evento appena il pulsante viene premuto e non al suo rilascio)
- On Drag (se il gadget prevede il dragging l'evento viene scatenato al termine del dragging)
- On Drag Out (sempre se il gadget lo prevede l'evento viene scatenato se il dragging termina al di fuori della finestra di appartenenza)


--- Citazione ---Il codice che agganci a tali eventi dipende dalla particolare applicazione, quindi da scelte che stanno al di fuori della libreria della GUI.

--- Termina citazione ---
Si, si questo è palese :)

Una tipica creazione di un pulsante senza specificare tante opzioni è:

--- Codice: ---mygad = HGui.Gadget:new(#HGUI_BUTTON_GADGET, { caption = { "BUTTON", "YEAH!" },
                                               actions = { onpushed = EventTester },
                                               name = "MyGADGET",
                                               window = mywin3 })

--- Termina codice ---
<EventTester> è la funzione fuori dalla libreria Gui che il programmatore aggancia all'evento.

Cmq più che altro chiedevo un chiarimento riguardo il "behaviour" che ho descritto, perchè a me sinceramente quel comportamento sembra più una roba buggata, e non vorrei riprodurre anche i bug nella mia Gui library  :D



Piccolo test compilato per windows:

Box, Group, Label, Vertical Divider, Horizontal Divider, Button
Il tutto già con il ridimensionamento e il sistema dei pesi "alla MUI" funzionante :P

TheKaneB:
Il Focus non coincide quasi mai con il mouse over, ma con il mouse press.

In Windows un pulsante con focus è circondato da un rettangolo tratteggiato. Puoi cambiare il focus anche da tastiera. Inoltre gli stati del mouse dovrebbero essere separati dagli stati del pulsante, quindi devi prevedere sia il mouse press che il get focus, in modo da consentire lo sviluppo di interfacce senza mouse (ad esempio usando un touchscreen o un telecomando).

Navigazione

[0] Indice dei post

[#] Pagina successiva

Vai alla versione completa