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.