Good stuff, Jeff.  Thanks for posting that.

In the olden days I had to be very careful about attempting to update things on scrollBarDrag because the performance hit was often quite noticeable, but on modern systems I must say I've been impressed with the combination of general system performance and the smart way the scrollBarDrag message is sent to support that sort of thing.

Not long ago I needed to draw a series of polygons with certain shapes and locations relative to positions of chunks of text in a scrolling field. After some experimentation I was delighted to find out well it worked to do that dynamically on the fly, calculating and rendering the polygons in response to scrollBarDrag.

But on that project I had one advantage I don't have with a script editor: the field I'm doing my calculations with is read-only, whereas a script editor's contents are dynamic.

I also had no choice: in Rev, objects are limited to 32,767 px in height, but of course for a field with a lot of content I could (and did) easily wind up needing a polygon much taller than that. This is similar to the problem Trevor's DataGrid solves, in which contents that would be prohibitively tall can be rendered dynamically if needed.

But since line numbers can be done in advance without difficulty it would not have occurred to me to render them dynamically.

How responsive do you find that algo with carriage returns?

If a script editor provides auto-indenting the returnInField message is already pretty well loaded with code, which is why I've been reluctant to add more to it with things like dynamic line numbers. Memory size is usually minimal with prefab line numbers since they generally take up a small fraction of the space of the script itself, and I would be reluctant to also page the script in an out of the field in response to scrollbarDrag for the complexity it adds and given that the engine's field buffering is some of the best in the biz.

But if your experience is favorable it may well be worth exploring that in my next revision.

Thanks again for the provocative take on this problem. One of the great things about Rev is the wide variety of ways a given problem can be solved.

--
 Richard Gaskin
 Fourth World
 Rev training and consulting: http://www.fourthworld.com
 Webzine for Rev developers: http://www.revjournal.com
 revJournal blog: http://revjournal.com/blog.irv


Jeff Massung wrote:

I gotta say, my name is Jeff Massung, and I disapprove of that solution. ;-)

I love everyone sharing their ideas, but this is one that's been a solved
problem, well... for a very long time, and with a little math there's no
performance issue what-so-ever, and there's no need to keep around a field
with thousands of numbers in it.

Think of what we know:

* The size of our editor.
* Where the scrollbar is.
* The size of the font we're using.

From this, there's very little we actually need to do. Even with the largest
monitor on the planet and using the smallest (readable) font, the number of
average lines visible to any user is well < 100. So, generally speaking, we
should never need to do much more than count to 100 at any given point in
time to update our "gutter" area containing line numbers.

So, here's a little script taking from my editor. It assumes that the the
gutter area is always sized to the same height as the editor, that the line
height is fixed (read: we're not embedding images or changing the font
size), and that the editor has line wrapping turned off. With a few tweaks
it could work just fine with those features on, but for the sake of this
discussion, we'll leave them off.

on updateGutter

   local tHeight

   local tTextHeight

   local tScroll

   local tFirstRow

   local tRows



   -- wipe the gutter clean

   put empty into fld "Line Numbers"



   -- snag what we care about from the editor

   put the vScroll of fld "Editor" into tScroll

   put the effective textHeight of fld "Editor" into tTextHeight

   put the height of fld "Editor" into tHeight



   -- calculate the first visible line and the total number of visible lines

   put tScroll div tTextHeight into tFirstRow

   put tHeight div tTextHeight into tRows



   -- fill in the gutter with the line numbers

   repeat with tLine = tFirstRow to tFirstRow + tRows

      put tLine + 1 & cr after fld "Line Numbers"

   end repeat



   -- scroll the gutter (every so slightly) to match the editor

   set the textSize of fld "Line Numbers" to the textSize of fld "Editor"

   set the textFont of fld "Line Numbers" to the textFont of fld "Editor"

   set the vScroll of fld "Line Numbers" to tScroll mod tTextHeight
end updateGutter

That's pretty much it. Now we need to know when to update the gutter area.
We need to update it when:

* on scrollbarDrag (the editor)
* when the we reset the editor to display something new
* when we resize the editor (and subsequently the gutter)

HTH,



_______________________________________________
use-revolution mailing list
use-revolution@lists.runrev.com
Please visit this url to subscribe, unsubscribe and manage your subscription 
preferences:
http://lists.runrev.com/mailman/listinfo/use-revolution

Reply via email to