cadquery-freecad-module/Libs/pyqode/python/widgets/console.py

82 lines
3.2 KiB
Python

"""
This module provides a python console widgets based on the pyqode.core's OutputWindow.
"""
import sys
from pyqode.qt import QtWidgets, QtGui
from pyqode.core import modes as modes
from pyqode.core.api import ColorScheme
from pyqode.core.widgets import output_window
from pyqode.python import modes as pymodes
from pyqode.python.backend import server
class SyntaxHighlighter(pymodes.PythonSH):
"""
Extends the base syntax highlighter to only highlight code that is entered after a python prompt
"""
def highlight_block(self, text, block):
if text.startswith('>>>') or text.startswith('...'):
super(SyntaxHighlighter, self).highlight_block(text, block)
else:
match = self.editor.link_regex.search(text)
if match:
start, end = match.span('url')
fmt = QtGui.QTextCharFormat()
fmt.setForeground(QtWidgets.qApp.palette().highlight().color())
fmt.setUnderlineStyle(fmt.SingleUnderline)
self.setFormat(start, end - start, fmt)
class CodeCompletionMode(modes.CodeCompletionMode):
"""
Extend base code completion mode to insert the completion in the user buffer of the
input handler
"""
pass
class PyConsole(output_window.OutputWindow):
"""
Extends the OutputWindow to run a python interpreter with all the bells and whistles of a python code
editor (code completion!).
"""
def __init__(self, parent=None, interpreter=sys.executable, backend=server.__file__,
color_scheme='qt'):
self._pygment_color_scheme = color_scheme
super(PyConsole, self).__init__(parent=parent, input_handler=output_window.BufferedInputHandler(),
backend=backend)
self.start_process(interpreter.replace('pythonw', 'python'),
arguments=['-i'], print_command=False, use_pseudo_terminal=True)
def change_interpreter(self, interpreter=sys.executable):
self.stop_process()
self.start_process(interpreter.replace('pythonw', 'python'),
arguments=['-i'], print_command=False, use_pseudo_terminal=True)
def _init_code_edit(self, backend):
self.modes.append(modes.SymbolMatcherMode())
self.modes.append(CodeCompletionMode())
self.modes.append(pymodes.PyAutoCompleteMode())
self.modes.append(modes.IndenterMode())
super(PyConsole, self)._init_code_edit(backend)
self.modes.append(SyntaxHighlighter(self.document(), color_scheme=ColorScheme(self._pygment_color_scheme)))
try:
self.panels.remove('ReadOnlyPanel')
except KeyError:
pass
self.update_terminal_colors()
def update_terminal_colors(self):
"""
Update terminal color scheme based on the pygments color scheme colors
"""
self.color_scheme = self.create_color_scheme(
background=self.syntax_highlighter.color_scheme.background,
foreground=self.syntax_highlighter.color_scheme.formats['normal'].foreground().color())
def terminate_process(self):
self._process.write(b'exit()')
self._process.waitForBytesWritten()