Set DoubleClickInterval very low!

Mark Waddingham mark at livecode.com
Wed Aug 3 19:55:31 EDT 2016


On 2016-08-04 01:32, Sannyasin Brahmanathaswami wrote:
> How is it a bug? logically the engine must wait for the double click
> interval before responding or double clicks could never be passed?
> N'est ce pas?

No - that isn't how double clicks work in LiveCode.

On the first mouseDown the engine:

   1) Stores the time of the mouseDown (last-click-time)
   2) Stores the location of the mouseDown (last-click-loc)
   3) Dispatches mouseDown

On a subsequent mouseDown the engine does the following:

   if current-click-time - last-click-time < doubleClickInterval and \
        abs(current-click-loc.x - click-loc.x) < doubleClickDelta and \
           abs(current-click-loc.y - click-loc.y) < doubleClickDelta then
       dispatch mouseDoubleDown
   else
       dispatch mouseDown
   end if

i.e. If a click is within the doubleClickInterval time-wise since the 
last click, and within the doubleClickDelta distance since the last 
click a mouseDoubleDown message is sent instead of mouseDown.

(Note that if a mouse down event results in a mouseDown message, then 
you will receive a mouseUp message when the mouse is released, and if a 
mouse down even results in a mouseDoubleDown message, then you will 
receive a mouseDoubleUp message when the mouse is released).

What you are seeing is the fact that if you tap quickly (i.e. each one 
within the doubleClickInterval and close to each other on the screen) 
then you will receive:

   mouseDown
   mouseUp
   mouseDoubleDown
   mouseDoubleUp
   mouseDown
   mouseUp
   mouseDoubleDown
   mouseDoubleUp

i.e. You will get an alternating sequence of down/up and 
doubleDown/doubleUp pairs.

Solution: If you don't need to handle double clicks do:

   on mouseDoubleDown
     mouseDown
   end mouseDoubleDown

   on mouseDoubleUp
     mouseUp
   end mouseDoubleUp

This is a long standing (i.e. forever!) 'the way things work' in 
LiveCode - although I think there is a way it could be a great deal 
better, and more intuitive.

The only use of multi-click 'gestures' (which is what 'double clicks' 
are) which makes sense from a UI interaction point of view is where each 
click builds upon the action of the previous one.

e.g. In Finder:

   1) The first click selects a file
   2) The second click runs the file (which is already selected at this 
point)

e.g. In Text Editors:

   1) The first click places the caret
   2) The second click selects the word the caret is in
   3) The third click selects the line the word is in

Thus, one possible improvement would be to ditch the 'double' messages 
entirely, and add a 'clickCount' event property (a bit like the 
clickLoc) which returns the number of subsequent clicks. This would mean 
that (in a mouseDown / Up) handler you just choose what you do based on 
the clickCount. This means you can easily handle single, double or 
triple click sequences (which, I think is pretty much as far as you can 
stretch that particular bit of physical interaction - unless you want to 
cause the user significant problems in using your UI). i.e. In a double 
click scenario you would get:

   mouseDown (clickCount == 1)
   mouseUp (clickCount == 1)
   mouseDown (clickCount == 2)
   mouseUp (clickCount == 2)

This can be further built upon by introducing the idea of gestures. A 
'click' is actually a gesture, not an event - i.e. it is a precise 
sequence of events which can be interpreted as a specific type of 
action. Introducing gestures you'd get the following message sequence:

   mouseDown (clickCount == 1)
   mouseUp (clickCount == 1)
   click (clickCount == 1)
   mouseDown (clickCount == 2)
   mouseUp (clickCount == 2)
   doubleClick (clickCount == 2)
     if passed then click (clickCount == 2)

For what its worth, LiveCode Builder uses the clickCount model (i.e. no 
double messages) - although we haven't added 'gestures' there yet.

Warmest Regards,

Mark.

-- 
Mark Waddingham ~ mark at livecode.com ~ http://www.livecode.com/
LiveCode: Everyone can create apps




More information about the use-livecode mailing list