Never done it, but I had a quick play ....

and found a way to do it - but whether it would count as "efficiently" or not is debatable :-(

It does about 4 lines of text per millisecond on my elderly MacBook Pro (with LC 9.0.0 DP6)

If you have a way of determining which line(s) are being changed, then you could run this only from that line onward to save some time ....


Here's the code snippet I was playing with; it assumes

field "F1" - the text

field "f2" - the line numbers, these two fields should have matching base, height, etc.

Basically, it runs through the original field finding the formatted height of each line. I can't find any way to get that except as the formattedHeight of an entire field, so it has to loop through each line in turn. The easy way to do that (simply adding each line) is painfully slow, so instead it loops through the lines, add each one in turn *as the second line*, so it get the height difference between that and a single line. [ hmmm - not very clear ! Feel free to ask me to explain myself better :-) ]

and finally restores the original field "F1"

Then it runs through the lines of field "F2" setting the 'spacebelow' of each line so that it matches the height of the styled & soft-wrapped line of the text field.

Like I said - it works (at least for my simple testing), but it ain't superfast ....

-- Alex.

local  sHeights
on mouseUp pK
   local tA, tB
   local temp, t1, t2, t3, tt, tBase

   put the millisecs into t1
   set the lockscreen to true
   set the textHeight of fld "f2" to 12
   put the styledtext of fld "f1" into tA
   put empty into tB
   put empty into sHeights
   put 0 into sHeights[0]
   put tA[1] into tB[1]
   -- and make it single line
   put empty into tB[1]["runs"]
   put "abc" into tB[1]["runs"][1]["text"]

   -- and then get the differential height of one simple line
   put tB[1] into tB[2]
   set the styledText of fld "f1" to tB
   put the  formattedHeight of fld "f1"  into tBase

   repeat with i = 1 to the number of lines in the keys of tA
      put tA[i] into tB[2]
      set the styledText of fld "f1" to tB
      put the  formattedHeight of fld "f1" into sHeights[i]
-- put i && the number of lines in fld "f1" && sHeights[i] &CR after msg
   end repeat
   set the styledText of fld "f1" to tA
   put empty into fld "f2"
   repeat with i = 1 to the number of lines in fld "f1"
      put i &CR after tt
   end repeat
   set the text of fld "f2" to tt
   put the millisecs into t2
   repeat with i = 1 to the number of lines in fld "f1"
      put sHeights[i] - tBase into temp
      if temp > 0 then
         set the spacebelow of line i of fld "f2" to temp
      end if
   end repeat
   put the millisecs into t3
   set the lockscreen to false
   put t2 - t1 && t3 - t2 && t3 - t1 &CR after msg
   --put sLineNum && the formattedheight of fld "f2" && tR

end mouseUp




On 25/03/2017 15:36, Richard Gaskin via use-livecode wrote:
I have an app that allows the user to write styled text, in which any portion of that text may have a variety of styles and sizes, and may be long enough to soft-wrap.

I'd like to add a line-number field next to it, but I haven't come up with an efficient way of setting up those line numbers so that they align vertically with the lines next to them.

Ideally the line numbers would reflect true lines, separated by CRs, as opposed to any soft-wrapped lines.

What I'm after is common in many apps that support line numbers for style text, but alas I don't have a ready solution.

Anyone here done this? Any tips you can share for doing this efficiently?



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

Reply via email to