Set DoubleClickInterval very low!

Peter M. Brigham pmbrig at gmail.com
Wed Aug 3 22:14:05 EDT 2016


So I must not be understanding this. If you want something to happen on mouseup and something else to happen on mousedoubleup, then how do you do it?

If I put this into a button script:

on mousedown
   put "mousedown" & cr after fld "text"
end mousedown

on mouseUp
   put "mouseup" & cr after fld "text"
end mouseUp

on mousedoubledown
   put "mousedoubledown" & cr after fld "text"
end mousedoubledown

on mousedoubleup
   put "mousedoubleup" & cr after fld "text"
end mousedoubleup

and I then do a doubleclick, I get 

mousedown
mouseup
mousedoubledown
mousedoubleup

in fld "text". So far so good. if I comment out the actions in the mousedown and mouseup handlers, so they are effectively blocking those messages, I get

mousedoubledown
mousedoubleup

in the field. But how do I get

mousedown
mouseup

on a single click and *only*

mousedoubledown
mousedoubleup

on a doubleclick?

It seems to me that if a doubleclick always produces both a mousedown/up and mousedoubledown/up set of messages, there is no way of preventing the mousedown/up actions happening in addition to the mousedoubledown/up actions. To make it clearer:

on mouseup
   show grc "test1"
end mouseup

on mousedoubleup
   show grc "test2"
end mousedoubleup

the mousedoubleup action will always show both graphics, but I want it to only show grc "test2".

???

-- Peter

Peter M. Brigham
pmbrig at gmail.com

 

On Aug 3, 2016, at 7:55 PM, Mark Waddingham wrote:

> 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
> 
> _______________________________________________
> use-livecode mailing list
> use-livecode at lists.runrev.com
> Please visit this url to subscribe, unsubscribe and manage your subscription preferences:
> http://lists.runrev.com/mailman/listinfo/use-livecode





More information about the use-livecode mailing list