Autore Topic: Interfacce e comportamento pulsanti  (Letto 7253 volte)

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3497
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Interfacce e comportamento pulsanti
« il: 17 Agosto 2011, 12:26:16 »
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
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: Interfacce e comportamento pulsanti
« Risposta #1 il: 17 Agosto 2011, 19:03:17 »
Ti secchi se spengo un po' il cervello e ci rifletto non appena sono più tranquillo e riposato?

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5293
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Interfacce e comportamento pulsanti
« Risposta #2 il: 17 Agosto 2011, 19:07:36 »
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...
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3497
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: Interfacce e comportamento pulsanti
« Risposta #3 il: 17 Agosto 2011, 21:46:17 »
@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)
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.
Si, si questo è palese :)

Una tipica creazione di un pulsante senza specificare tante opzioni è:
Codice: [Seleziona]
mygad = HGui.Gadget:new(#HGUI_BUTTON_GADGET, { caption = { "BUTTON", "YEAH!" },
                                               actions = { onpushed = EventTester },
                                               name = "MyGADGET",
                                               window = mywin3 })
<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
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5293
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Interfacce e comportamento pulsanti
« Risposta #4 il: 18 Agosto 2011, 13:52:21 »
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).
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3497
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: Interfacce e comportamento pulsanti
« Risposta #5 il: 18 Agosto 2011, 14:02:36 »
Quindi got focus e lost focus sono scatenati solo dalla tastiera? Quando il pulsante viene attivato da tastiera genera un evento click?

Scusa se ti tartasso ma sono un po' a digiuno di eventi Windows :-)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5293
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Interfacce e comportamento pulsanti
« Risposta #6 il: 18 Agosto 2011, 14:11:53 »
Sono scatenati dal focus :D

Quindi sia da tastiera che da mouse.
Non deve spaventarti lo scatenamento simultaneo di più eventi. Anzi, è bene che gli eventi complessi siano suddivisi in più sottoeventi semplici.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3497
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: Interfacce e comportamento pulsanti
« Risposta #7 il: 18 Agosto 2011, 14:15:56 »
No no, non mi spaventa affatto è che non ho ben chiara la differenza fra get focus e mouse over, a meno che la differenza stia solo nel fatto che il mouse over sia generato solo ed esclusivamente del mouse ma per il resto siano identici :-)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5293
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Interfacce e comportamento pulsanti
« Risposta #8 il: 18 Agosto 2011, 14:29:56 »
mouse over ti dice SOLO che il puntatore è sopra il pulsante, quindi è un evento grafico.

got focus, invece, ti dice che il pulsante corrente è interessato (cioè è un target) a ricevere gli eventi correnti provenienti dall'utente. Tali eventi sono quelli di scrolling, click, gli eventi della tastiera, ecc...

Guarda ad esempio Google Chrome. Quando invii un messaggio su questo forum, noterai che il riquadro selezionato ha un bordo arancione, e tale riquadro cattura gli eventi dalla tastiera. Puoi dare il focus ad un altro riquadro cliccandoci o premendo ripetutamente il tasto Tab o Shift + Tab. Il focus dice quale elemento riceve gli eventi dell'utente, mentre il mouse over è limitato all'interazione con il mouse, ed è solo un evento grafico, utile ad esempio per far cambiare un colore o far spuntare un tooltip.

La tua libreria quindi dovrà sapere in ogni momento qual è l'oggetto che detiene il focus, per inviargli correttamente gli eventi, e tale oggetto dovrà essere avvisato quando acquista o perde tale focus.
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3497
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: Interfacce e comportamento pulsanti
« Risposta #9 il: 18 Agosto 2011, 14:33:36 »
Ok, ok, tutto chiaro adesso :-)
E' che sto caldo mi rallenta la "brocca", grazie per la spiegazione  :)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3497
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: Interfacce e comportamento pulsanti
« Risposta #10 il: 19 Agosto 2011, 16:01:57 »
Nessuno mi ha ancora detto se secondo voi questo comportamento è corretto:
Citazione
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
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline TheKaneB

  • Human Debugger
  • *****
  • Post: 5293
  • Karma: +20/-23
    • Mostra profilo
    • http://www.antoniobarba.org
Re: Interfacce e comportamento pulsanti
« Risposta #11 il: 19 Agosto 2011, 16:39:59 »
don't know
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: Interfacce e comportamento pulsanti
« Risposta #12 il: 19 Agosto 2011, 20:09:05 »
Citazione da: "Allanon"
Nessuno mi ha ancora detto se secondo voi questo comportamento è corretto:
Citazione
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
Non è corretto. Il punto 3) impedisce di generare eventi per il pulsante, perché l'azione non è iniziata nella sua area.

L'unica cosa può essere generata è l'evento di mouse over quando sei nel punto 4. Nient'altro.

Offline Allanon

  • Administrator
  • Synthetic Voodoo
  • *****
  • Post: 3497
  • Karma: +17/-4
    • Mostra profilo
    • http://www.a-mc.biz
Re: Interfacce e comportamento pulsanti
« Risposta #13 il: 19 Agosto 2011, 21:36:58 »
Infatti io avevo proprio questo dubbio, quindi è un bug. Ho fatto ulteriori prove e mi si verifica solo con PSPad (un text editor), per la precisione con la sua toolbar.
Grazie per la conferma, adesso vado più tranquillo :)
« Ultima modifica: 01 Gennaio 1970, 02:00:00 da Guest »

Offline cdimauro

  • Human Debugger
  • *****
  • Post: 4291
  • Karma: +7/-95
    • Mostra profilo
Re: Interfacce e comportamento pulsanti
« Risposta #14 il: 19 Agosto 2011, 22:36:59 »
E' un bug sicuramente, perché se prendi una finestra di Windows che ha un pulsante (chessò, le Proprietà di un disco rigido) e provi a eseguire le operazioni che hai descritto, ti rendi conto che non funziona così.

Tra parentesi, uso anch'io PSPad (ma di un paio di versioni fa. Le ultime due hanno strani bug che corrompono la memoria del processo), ma non ho mai fatto caso a questo comportamento anomalo.

Tags: