OK, here is a simple demonstration of part of the feature I am interested in.
When run with an image in the (global) clipboard, it saves this to a local timestamped file (under ~/tmp), and indicates how a markdown reference to that file could be inserted. There's plenty more needed but this is the QClipboard part, I think. import os import time def unique_png_fname(): """ return a unique (timestamped) filename to use """ FORMAT="%Y-%m-%d-%H-%M-%S.png" return time.strftime(FORMAT) def link_string_md(fname): """ get markdown format to insert a filename """ return "![[%s]]" % fname def main(): # get clipboard contents - default mode is global clipboard cb = g.app.gui.qtApp.clipboard() # is it in image format? img = cb.image() if not img.isNull(): basefiledir = os.path.expanduser("~/tmp") fqfilepath = os.path.join(basefiledir, unique_png_fname()) img.save(fqfilepath, "PNG") g.es("wrote clipboard to:", fqfilepath) g.es("could insert:", link_string_md(fqfilepath)) else: g.es("clipboard not in image format") main() On Monday, March 11, 2024 at 8:23:42 PM UTC jkn wrote: > Doh! should have read the documentation better. > > you have to test for a 'null image' using eg. img.isnull() > > on with my trivial experiments... > > > On Monday, March 11, 2024 at 8:10:03 PM UTC jkn wrote: > >> Has anyone played much with class QClipboard? I did a couple of trivial >> experiments but I must be misunderstanding something. >> >> for instance, QClipboard.image() returns a non-null value even if the >> clipboard does not contain an image. >> >> J^n >> >> >> On Monday, March 11, 2024 at 4:33:23 PM UTC tbp1...@gmail.com wrote: >> >>> It turns out that to get the relative path conversion w have to remove >>> any quotation marks around the path before running os.relpath(). So the >>> script becomes: >>> >>> """Insert RsT code at cursor to display an image. >>> >>> The path to the image file will come from a file dialog. >>> This action is undoable. >>> """ >>> PATH = g.app.gui.runOpenFileDialog(c, >>> title="Import File", >>> filetypes=[("All files", "*"),], >>> defaultextension=".*", >>> multiple=False) >>> >>> if PATH: >>> from os.path import relpath >>> PATH = PATH.replace('"', '').replace("'", '') >>> PATH = relpath(PATH) >>> PATH = PATH.replace('\\', '/') >>> >>> IMAGE_TEMPLATE = f''' >>> >>> .. figure:: {PATH} >>> :scale: 50% >>> >>> ''' >>> >>> w = c.frame.body.wrapper >>> p = c.p >>> s = p.b >>> u = c.undoer >>> >>> start, _ = w.getSelectionRange() >>> >>> undoType = 'insert-rst-image-code' >>> undoData = u.beforeChangeNodeContents(p) >>> >>> head, tail = s[:start], s[start:] >>> p.b = head + IMAGE_TEMPLATE + tail >>> >>> c.setChanged() >>> p.setDirty() >>> u.afterChangeNodeContents(p, undoType, undoData) >>> c.redraw() >>> >>> On Saturday, March 9, 2024 at 2:04:19 PM UTC-5 Thomas Passin wrote: >>> >>>> We can't directly insert an image into a standard Leo node because they >>>> are text-only. I find this very annoying sometimes, especially when I am >>>> writing a note and want to include an image. >>>> >>>> But we can do the next best thing - insert an ReStructuredText (RsT) >>>> instruction to display an image so that we can view it with the >>>> viewrendered3 plugin (VR3). The instruction is short and easy, but it's >>>> still annoying to type and I usually forget the exact details. I have a >>>> button that toggles VR3 on and off so that it's easy to view an embedded >>>> image once the RsT instruction is there. An embedding command would make >>>> embedding with Leo as easy as embedding an image in a word processor. >>>> Aha, this is Leo, let's write a script! >>>> >>>> Here is a script that pops up a file dialog and inserts a relative path >>>> to the chosen file. There are several small variations which I discuss >>>> after the code. >>>> >>>> """Insert RsT code at cursor to display an image. >>>> >>>> The path to the image file will come from a file dialog. >>>> This action is undoable. >>>> """ >>>> PATH = g.app.gui.runOpenFileDialog(c, >>>> title="Import File", >>>> filetypes=[("All files", "*"),], >>>> defaultextension=".*", >>>> multiple=False) >>>> >>>> if PATH: >>>> from os.path import relpath >>>> PATH = relpath(PATH) >>>> PATH = PATH.replace('\\', '/').replace('"', '').replace("'", '') >>>> IMAGE_TEMPLATE = f''' >>>> >>>> .. figure:: {PATH} >>>> :scale: 50% >>>> >>>> ''' >>>> w = c.frame.body.wrapper >>>> p = c.p >>>> s = p.b >>>> u = c.undoer >>>> >>>> start, _ = w.getSelectionRange() >>>> >>>> undoType = 'insert-rst-image-code' >>>> undoData = u.beforeChangeNodeContents(p) >>>> >>>> head, tail = s[:start], s[start:] >>>> p.b = head + IMAGE_TEMPLATE + tail >>>> >>>> c.setChanged() >>>> p.setDirty() >>>> u.afterChangeNodeContents(p, undoType, undoData) >>>> c.redraw() >>>> >>>> Variations: >>>> 1. If you want an absolute path instead of a relative path, delete the >>>> lines >>>> from os.path import relpath >>>> PATH = relpath(PATH) >>>> with >>>> >>>> 2. If you want to get the path from the clipboard instead of a file >>>> dialog, replace the lines >>>> >>>> PATH = g.app.gui.runOpenFileDialog(c, >>>> title="Import File", >>>> filetypes=[("All files", "*"),], >>>> defaultextension=".*", >>>> multiple=False) >>>> >>>> with the line >>>> >>>> PATH = g.app.gui.getTextFromClipboard() >>>> >>>> 3. If you want the embedded image to be full width instead of 50%, >>>> delete the line >>>> >>>> :scale: 50% >>>> >>>> 4. You can make this work with Markdown or Asciidoc by using their >>>> embedding instruction in the TEMPLATE instead of the RsT one. >>>> >>>> I have added the command to my own local menu. VR3 can open in a tab >>>> in the log pane; the command for toggling in a tab is >>>> *vr3-toggle-tab. * I usually like opening it in the log pane instead >>>> of in its own separate pane. >>>> >>>> If you would like to create a local menu of your own and don't know >>>> how, it's easy. Just ask and I'll show what to add to myLeoSettings,leo. >>>> >>> -- 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/75d12014-aea5-4a1b-a9fa-7cd10b530956n%40googlegroups.com.