@ekr asked me to see about getting Leo's body editor to highlight the 
current line.  This was in response to a request in Issue 2150 
<https://github.com/leo-editor/leo-editor/issues/2150>.  I've made some 
progress, which I report here.  I'd say it's about 3/4 of the way there.

I have a working script that, when run, highlights the cursor line in the 
visible node's body.  Here's what is left to do:

1. The highlight color isn't visible for very dark or very light background 
colors.  Currently the highlight color is a modification of the text 
background color as specified in the theme's stylesheet.  The way this 
color is arrived at needs to be improved .  And I'm not yet sure how to 
handle the case where no theme at all is in use (some people have tweaked 
Leo's colors without using a theme).

The highlight color scheme works well with the three tbp_xxx_solarized.leo 
themes.

2. The code needs to have a proper home.  Presumably this will be in the 
qt_text.py plugin.

3. The code needs to be hooked up to the body's cursor events so that the 
highlight code knows that it has to change lines.

Also, as a longer term matter, the code does not use any wrappers or 
abstractions, so it will only work for Qt-based Guis.  This can be 
addressed later, if it appears that there might be a viable non-Qt Gui 
version of Leo.

I've attached the current version of the code.  Open it in Leo.  Select a 
line in the top node.  Run the script by pressing CTRL-b.  The current line 
should highlight, although you may not be able to see it if you are using a 
very dark or light theme, including Leo's default theme.  Put the cursor on 
a different line in the same body.  Press CTRL-b again.  The highlight 
should shift to the new cursor line.

Please let me know if you find any problems (apart from the actual 
highlight color).

-- 
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/3fc61574-907e-4fc3-b5d7-761a8e1098ddn%40googlegroups.com.
<?xml version="1.0" encoding="utf-8"?>
<!-- Created by Leo: http://leoeditor.com/leo_toc.html -->
<leo_file xmlns:leo="http://leoeditor.com/namespaces/leo-python-editor/1.1"; >
<leo_header file_format="2"/>
<vnodes>
<v t="tom.20210825084838.1"><vh>Leo Text Editor Widget</vh>
<v t="tom.20210826153508.1"><vh>css_parser</vh></v>
<v t="tom.20210826153820.1"><vh>highlightCurrentLine</vh></v>
</v>
</vnodes>
<tnodes>
<t tx="tom.20210825084838.1">@language python
from leo.core.leoQt import QtGui, QtWidgets
QColor = QtGui.QColor
QTextFormat = QtGui.QTextFormat
QTextEdit = QtWidgets.QTextEdit
ExtraSelection = QTextEdit.ExtraSelection

w = c.frame.body.wrapper
host_editor = w.widget

ssm = c.styleSheetManager
sheet = ssm.expand_css_constants(c.active_stylesheet)

@others

highlightCurrentLine(host_editor, sheet)</t>
<t tx="tom.20210826153508.1">@language python
def css_parser(css_string, clas=''):
    """Parses colors from a css stylesheet string. 
    
    This is an extremely simple-minded function. It assumes
    that no quotation marks are being used, and that the
    first block in braces is the controlling css for our
    widget
    
    Returns a tuple of strings (foregound, background).
    """
    # Get first block with name matching "class' And delimited by braces
    #block = css_string.split('{', 1)
    block = css_string.split(clas, 1)
    block = block[1].split('{', 1)
    block = block[1].split('}', 1)

    # Split into styles separated by ";"
    styles = block[0].split(';')

    # Split into fields separated by ":"
    fields = [style.split(':') for style in styles if style.strip()]

    # Only use fields whose names are "color" and "background"
    color = bg = ''
    for style, val in fields:
        style = style.strip()
        if style == 'color':
            color = val.strip()
        elif style == 'background':
            bg = val.strip()
    return color, bg

</t>
<t tx="tom.20210826153820.1">@language python
def highlightCurrentLine(ed, css):

    fg, bg = css_parser(css, 'QTextEdit')
    bg_color = QColor(bg).lighter(160)
    #g.es(QColor(bg).getRgb(), bg_color.getRgb())

    selection = ExtraSelection()
    selection.format.setBackground(bg_color)

    selection.format.setProperty(QTextFormat.FullWidthSelection, True)
    selection.cursor = ed.textCursor()
    selection.cursor.clearSelection()

    ed.setExtraSelections([selection])

</t>
</tnodes>
</leo_file>

Reply via email to