Scroll increment

John john at onechip.com
Tue Dec 31 20:31:22 EST 2013


Paul,

   I was using a text field without a scroll bar, perhaps that is the difference.  I added a separate scrollbar next to the field and set its thumb position separately.  That seems to be less jerky with my setup.

   The following code seems to work better than the previous code and mimics the correct behavior with a click wheel mouse and magic mouse.  The one exception is the deceleration.  It works by measuring the time interval between key down events and then averages them for a smooth scrolling behavior with acceleration.  It works better for me with large fields.  The code can be tweaked depending on the length of the field and the desired acceleration.

   Set up a field without a scroll bar and add one next to it called “scroll position”.  In the field script add:


local timeCount, valueToAvg, theTimes
on rawKeyDown pKey
   local theAverage
   
   if pKey = "65308" or pKey = "65309" then  -- if it is the scroll wheel
      
      if the milliseconds - timeCount < 100 then -- the user is activly scrolling
         
         add 1 to valueToAvg    -- the index of the value in an array
         if valueToAvg is 11 then put 1 into valueToAvg  -- roll over the index when it reaches 10
         put 100 - (the milliseconds - timeCount) into theTimes[valueToAvg]  -- the number of milliseconds between events
         put 0 into theAverage 
         repeat with i = 1 to 10   -- add the last 10 values
            add theTimes[i] to theAverage
         end repeat
         divide theAverage by ten  -- now find thier average
         
         if pKey = "65308" then set the vScroll of me to the vScroll of me + the round of theAverage -- Scrolls down
         if pKey = "65309" then set the vScroll of me to the vScroll of me - the round of theAverage -- Scrolls Up
         
         -- set the scroll bar next to the field
         set the thumbPosition of scrollbar "scroll position" to (the endValue of scrollbar "scroll position") \
               *(the vscroll of me / (the textheightsum of me - the height of me))
        
      else  -- the user is scrolling very slowly
         
         put empty into theTimes   -- clear the value array 
         -- now scrolll one pixel
         if pKey = "65308" then set the vScroll of me to the vScroll of me + 1 -- Scrolls down
         if pKey = "65309" then set the vScroll of me to the vScroll of me - 1 -- Scrolls Up
         
         -- set the scroll bar next to the field
         set the thumbPosition of scrollbar "scroll position" to (the endValue of scrollbar "scroll position") \
               *(the vscroll of me / (the textheightsum of me - the height of me))
         
      end if
      
      put the milliseconds into timeCount
      
   end if
   
  pass rawKeyDown -- if you wan to be able to type in the field
end rawKeyDown



Thanks,
John

On Dec 31, 2013, at 4:58 PM, Paul Hibbert <paulhibbert at mac.com> wrote:

> John,
> 
> That seems to work pretty well, except the pass rawKeyDown was over-riding the effect for me, but adding an else condition to the first if statement cured the problem here…
> 
>   …end if
> 
>   else
>      pass rawKeyDown -- if you wan to be able to type in the field
>   end if
> end rawKeyDown
> 
> This stops the rawKeyDown message from being sent if the scroll wheel (touch) is in use, but not if you type in the field.
> 
> Paul
> 
> 
> On 2013-12-31, at 4:01 PM, John <john at onechip.com> wrote:
> 
>>  I inadvertently left in a line for debug in my previous posting.  The cleaner version of it is:
>> 
>> local keyCount, startMilliSec
>> on rawKeyDown pKey
>>  local accel
>> 
>>  if pKey = "65308" or pKey = "65309" then  -- if it is the scroll wheel
>> 
>>     if startMilliSec + 75 < the milliseconds then -- if our timer has expired scroll the field
>>        put the milliseconds into startMilliSec    -- get a new time value
>> 
>>        put item keycount of "1,2,4,7,25,50,150,250,400,800" into accel -- calculate an accel curve
>> 
>>        if pKey = "65308" then set the vScroll of me to the vScroll of me + accel -- Scrolls down
>>        if pKey = "65309" then set the vScroll of me to the vScroll of me - accel -- Scrolls Up
>> 
>>        -- If there is a scroll bar sitting next to the field that should be updated
>>        set the thumbPosition of scrollbar "scroll position" to (the endValue of scrollbar "scroll position") \
>>        *(the vscroll of me / (the textheightsum of me - the height of me))
>> 
>>        put 0 into keyCount -- reset the 'frequency' counter
>>     end if
>> 
>>     if startMilliSec + 75 > the milliseconds then -- if we are in our timerperiod
>>        add 1 to keycount  -- sum the the number of events
>>     end if
>> 
>>  end if
>> 
>>  pass rawKeyDown -- if you wan to be able to type in the field
>> end rawKeyDown
>> 
>> Thanks,
>> John
>> 
>> On Dec 31, 2013, at 12:38 PM, John <John at OneChip.com> wrote:
>> 
>>> I was hoping there was something I was missing (a property for instance) that set the “scroll increment” but it looks there isn’t.  I will try to roll my own to try and get closer to a native feel.  If it works out I will report back to the list.
>>> 
>>> Jaque,
>>> 
>>> I am using a magic mouse as well.  It wasn’t how fast the field scrolled (that is proportional to my finger speed), it was how finely grained the scrolling is.  When moving my finger slowly on a tall field (1000 px high) the field jumps in 10 text line increments.  On a short field (100 px high) the field jumps one line at a time.  Using a native app (Preview for instance) there is no “jumping” behavior at all.  Testing with a “click wheel” mouse on a native app does result in discrete jumps, one for every click.
>>> 
>>> 
>>> Paul,
>>> 
>>> Thanks much for the head start, I will start with what you have and see if I can add accelerated scrolling in the like.
>>> 
>>> 
>>> Thanks,
>>> John
>>> 
>>> 
>>> On Dec 31, 2013, at 11:19 AM, Paul Hibbert <paulhibbert at mac.com> wrote:
>>> 
>>>> Jacque,
>>>> 
>>>> Same issues with different mice (here at least).
>>>> 
>>>> John,
>>>> 
>>>> You could try setting the scroll rate yourself, I tried the following scripts and it worked, but I didn't have time to figure out the accelerated scrolling that users may expect…
>>>> 
>>>> -- Add this command to the script of each scrolling field
>>>> on rawKeyDown pKey
>>>> put the long name of me into tField
>>>> scrollRatePref pKey,tField
>>>> end rawKeyDown
>>>> 
>>>> -- Add this command to your stack or card script
>>>> command scrollRatePref pKey,pField
>>>> -- Add a temporary scrollBar to make testing easier, then just hard code tScrollRate
>>>> -- when you find the value that suits you, or set it up as a user preference. Try a value of 8 for starters.
>>>> 
>>>> put the thumbPos of sb "tempScrollRate" into tScrollRate
>>>> 
>>>> if pKey = "65308" then set the vScroll of pField to the vScroll of pField + tScrollRate -- Scrolls down
>>>> if pKey = "65309" then set the vScroll of pField to the vScroll of pField - tScrollRate -- Scrolls Up
>>>> 
>>>> end scrollRatePref
>>>> 
>>>> If your field scrolls horizontally, 65310 scrolls right & 65311 scrolls left.
>>>> 
>>>> There are probably many better ways and lots more options, but this demonstrates the point.
>>>> 
>>>> Paul
>>>> 
>>>> 
>>>> On 2013-12-31, at 10:39 AM, J. Landman Gay <jacque at hyperactivesw.com> wrote:
>>>> 
>>>>> On 12/30/13 11:52 PM, John wrote:
>>>>>> 
>>>>>> The standard scrolling field in liveCode supports the a mouse scroll
>>>>>> wheel.  What is a bit unusual is that the height of the field
>>>>>> dictates how far the field “hops” as you scroll. In short fields (50
>>>>>> high) the field “jumps” in ½ character height increments (assuming
>>>>>> the default font and size are used).  In 100 high fields it is one
>>>>>> line at a time increasing to 10 lines at a time when the field is
>>>>>> 1000 high.
>>>>> 
>>>>> I think this may depend on your mouse and the OS. On my Mac using a magic mouse the amount of scroll depends on how fast I move my finger. On a mouse with a fixed scroll wheel it's probably different and may depend on the number of messages the scroll wheel sends for each change.
>>>>> 
>>>>> I'm just guessing, so it would be interesting to see if you get different results with a different mouse.
>>>>> 
>>>>> -- 
>>>>> Jacqueline Landman Gay         |     jacque at hyperactivesw.com
>>>>> HyperActive Software           |     http://www.hyperactivesw.com
>>>>> 
>>>>> 
>>>>> _______________________________________________
>>>>> 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
>> 
>> 
>> _______________________________________________
>> 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