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 [email protected] 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 [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/leo-editor/75d12014-aea5-4a1b-a9fa-7cd10b530956n%40googlegroups.com.