Set DoubleClickInterval very low!

Peter M. Brigham pmbrig at gmail.com
Thu Aug 4 10:43:45 EDT 2016


That's what I thought. The engine is certainly not clairvoyant. I can script around this. I was hoping that the newer LC versions had somehow made it easier to do different things with single and double clicks, since I'm not sure why you would ever want a doubleclick to default to including the single click action too. Your ideas for fixing this with the clickcount method sound good, as it would allow the engine to sort out the clicks so as to obviate the need for additional scripting.

-- Peter

Peter M. Brigham
pmbrig at gmail.com


On Aug 4, 2016, at 3:02 AM, Mark Waddingham wrote:

> In order for you to be able to do completely different things on click and double click you need to wait and see if a double click occurs before the doubleClickInterval and if it does not *then* do the single click action. After all, the engine is not clairvoyant.
> 
> This is why click then double click should always be an incremental and related action - unless you want a pause in processing the single click.
> 
> Mark.
> 
> Sent from my iPhone
> 
>> On 4 Aug 2016, at 03:14, Peter M. Brigham <pmbrig at gmail.com> wrote:
>> 
>> 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
>> 
>> 
>> _______________________________________________
>> 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
> 
> _______________________________________________
> 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