I would like to better understand the 'philosophy' here ... (eg. of the 
widget wrappers within Leo in general...), but I have something that will 
do for me now, thanks

    J^n

On Sunday, July 28, 2024 at 4:59:59 PM UTC+1 tbp1...@gmail.com wrote:

> The wrapper, w = c.frame.body.wrapper, is a member of c, not of the 
> body.  When you select a node, w gets filled with that node's body text.  
> So you have to transfer that modified text back to the node's body before 
> switching to a new node.
>
> On Sunday, July 28, 2024 at 10:40:49 AM UTC-4 jkn wrote:
>
>> indeed, I could do "get current body text/append to it /set new body 
>> text". But I am trying to learn the way that Leo does it, ie. the 
>> 'cleanest' way.
>>
>> On Sunday, July 28, 2024 at 3:18:43 PM UTC+1 tbp1...@gmail.com wrote:
>>
>>> "you" here is code in Leo's core. It's not mine.  I think the code is 
>>> changing text in the wrapper, w, and then retrieving all the text from the 
>>> wrapper and assigning it to p.b.  It seems a little strange to me too.  I 
>>> will say that I have never had text vanish when I assign it directly to p.b 
>>> so maybe that's the idea here.
>>>
>>> With that in mind you could also get p.b and do insertions on it using 
>>> ordinary string methods, then assign it back to p.b:
>>>
>>> i = 12  # insertion point
>>> original = p.b
>>> s = 'this is the insert'
>>> tail = original[i:]
>>> head = original[:i]
>>> new = head + s + tail
>>> p.b = new
>>>
>>> There's some difference regarding updating between assigning to p.b and 
>>> p.v.b but I forget what it is. It's mentioned somewhere in the docs.  
>>> Edward will probably chime in here with more definitive information.
>>>
>>> On Sunday, July 28, 2024 at 9:59:09 AM UTC-4 jkn wrote:
>>>
>>>> well ... yes, I have previously just totally **set** the body text (ie. 
>>>> I am creating a totally new node), and as you say this 'sticks'. For this 
>>>> new command, I want to add to any body text which is already there.
>>>>
>>>> But I am puzzled about what seems to be a mixture in this example:
>>>>
>>>> - you get the insertion point and then use w.insert() to write your 
>>>> text to ... the wrapper for the body?? 
>>>> - but then you do p.v.b = w.getAllText() to ... set the body text to 
>>>> ... that which you have just set for the body wrapper?
>>>>
>>>> I am missing something in the paradigm here...
>>>>
>>>>     J^n
>>>>
>>>>
>>>> On Sunday, July 28, 2024 at 2:52:47 PM UTC+1 tbp1...@gmail.com wrote:
>>>>
>>>>> I think I forgot that the recommended way to do unto/redo has been 
>>>>> changed since I wrote that script. Also, you can directly set p.b or 
>>>>> p.v.b 
>>>>> and those changes will stick.  Here's one I found in Leo's code base that 
>>>>> does that and uses the newer undo system:
>>>>>
>>>>> def insertBodyTime(self: Self, event: LeoKeyEvent = None) -> None:
>>>>>     """Insert a time/date stamp at the cursor."""
>>>>>     c, p, u = self, self.p, self.undoer
>>>>>     w = c.frame.body.wrapper
>>>>>     undoType = 'Insert Body Time'
>>>>>     if g.app.batchMode:
>>>>>         c.notValidInBatchMode(undoType)
>>>>>         return
>>>>>     bunch = u.beforeChangeBody(p)
>>>>>     w.deleteTextSelection()
>>>>>     s = self.getTime(body=True)
>>>>>     i = w.getInsertPoint()
>>>>>     w.insert(i, s)
>>>>>     p.v.b = w.getAllText()
>>>>>     u.afterChangeBody(p, undoType, bunch)
>>>>>
>>>>> On Sunday, July 28, 2024 at 9:17:45 AM UTC-4 jkn wrote:
>>>>>
>>>>>> Thanks. Hmm, looks like I was wrong about onBodyChanged being 
>>>>>> outdated - there seem to be hardly any uses in Leo's source, which 
>>>>>> perhaps 
>>>>>> misled me.
>>>>>>
>>>>>> I removed my undo code from my example... ;-)
>>>>>>
>>>>>>     Regards
>>>>>>     J^n
>>>>>>
>>>>>>
>>>>>> On Sunday, July 28, 2024 at 1:58:07 PM UTC+1 tbp1...@gmail.com wrote:
>>>>>>
>>>>>>> Here's one I use and it works fine.  You should set up for undoing 
>>>>>>> after an insert, and this script does that too:
>>>>>>>
>>>>>>> """Insert a node with id and creation timestamp strings"""
>>>>>>>
>>>>>>> c.doCommandByName('insert-node')
>>>>>>> undoType = 'xx-insert-node'
>>>>>>> p.moveToNext()
>>>>>>> w = c.frame.body.wrapper
>>>>>>>
>>>>>>> oldSel = w.getSelectionRange()
>>>>>>> w.deleteTextSelection()
>>>>>>> w.setInsertPoint(0)
>>>>>>>
>>>>>>> id_label = f':id: {p.gnx}\n'
>>>>>>> time_string = ':created: ' + c.getTime(body=True) + '\n'
>>>>>>> i = w.getInsertPoint()
>>>>>>> w.insert(i, f'{id_label}{time_string}')
>>>>>>>
>>>>>>> c.frame.body.onBodyChanged(undoType, oldSel=oldSel)
>>>>>>> c.bodyWantsFocusNow()
>>>>>>>
>>>>>>> On Sunday, July 28, 2024 at 8:40:32 AM UTC-4 jkn wrote:
>>>>>>>
>>>>>>>> I'm being a bit dim here, but:
>>>>>>>>
>>>>>>>> I am writing a simple command to append text to the body of a node. 
>>>>>>>> The only commands I have written before set the entire body text to 
>>>>>>>> some 
>>>>>>>> value.
>>>>>>>>
>>>>>>>> What do I have to call after using w.insert() etc. to make these 
>>>>>>>> changes persistent.?
>>>>>>>>
>>>>>>>> c.redraw() does not seem to do the trick.
>>>>>>>>
>>>>>>>> The (outdated?) scripting miscellany: 
>>>>>>>> https://leo-editor.github.io/leo-editor/scripting-miscellany.html
>>>>>>>>
>>>>>>>> suggests that c.frame.body.onBodyChanged should be called; but it 
>>>>>>>> looks like this is not longer the case.
>>>>>>>>
>>>>>>>> A trivial example (that I do not seem to be able to find) would be 
>>>>>>>> helpful - thanks.
>>>>>>>>
>>>>>>>> w = c.frame.body.wrapper
>>>>>>>> for line in range(10):
>>>>>>>>     w.appendText("%d\n" % line)
>>>>>>>>
>>>>>>>> # now what?
>>>>>>>>
>>>>>>>>     J^n
>>>>>>>>
>>>>>>>>

-- 
You received this message because you are subscribed to the Google Groups 
"leo-editor" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to leo-editor+unsubscr...@googlegroups.com.
To view this discussion on the web visit 
https://groups.google.com/d/msgid/leo-editor/3337ac03-7275-4903-b43c-2de200e69c97n%40googlegroups.com.

Reply via email to