@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>
