Incorporate console into main app, fallback to QPlainTextEdit, some styling

This commit is contained in:
Thomas Krijnen
2016-11-28 17:00:32 +01:00
parent 90e4f21f29
commit c94ed73b8d
4 changed files with 224 additions and 210 deletions
@@ -1,162 +1,152 @@
from __future__ import print_function
import os
import sys
import logging
from pyqode.core.panels import CheckerPanel
logging.basicConfig(level=logging.CRITICAL)
from pyqode.qt import QtCore, QtGui, QtWidgets
print('Qt version:%s' % QtCore.__version__)
from code import InteractiveConsole
from pyqode.core import api
from pyqode.core import modes
from pyqode.core import panels
from pyqode.core.api import CodeEdit, ColorScheme
from pyqode.python.modes import PyAutoIndentMode, PythonSH
from pyqode.python.backend import server
from pyqode.python import modes as pymodes, panels as pypanels, widgets
from pyqode.python.widgets import PyInteractiveConsole
from PyQt4 import QtCore, QtGui
try:
from PyQt4 import QtWidgets
except:
QtWidgets = QtGui
try:
from pyqode.core.panels import CheckerPanel
from pyqode.core import api
from pyqode.core import modes
from pyqode.core import panels
from pyqode.core.api import CodeEdit, ColorScheme
from pyqode.python.modes import PyAutoIndentMode, PythonSH
from pyqode.python.backend import server
from pyqode.python import modes as pymodes, panels as pypanels, widgets
from pyqode.python.widgets import PyInteractiveConsole
has_pyqode = True
except:
has_pyqode = False
CodeEdit = QtWidgets.QPlainTextEdit
class StdoutRedirector(object):
class StdoutRedirector(QtGui.QTextEdit):
'''A class for redirecting stdout to this Text widget.'''
def __init__(self, widget):
self.widget=widget
self.isError = False
def write(self,str):
# print(str)
# self.widget.append(str)
self.widget.moveCursor(QtGui.QTextCursor.End)
if self.isError:
self.widget.setTextColor(QtCore.Qt.red)
else:
self.widget.setTextColor(QtCore.Qt.black)
self.widget.setTextColor(QtCore.Qt.white)
self.widget.insertPlainText(str)
self.widget.moveCursor(QtGui.QTextCursor.End)
# scroll = self.widget.verticalScrollBar()
# scroll.setValue(scroll.maximum())
class code_edit(QtGui.QWidget):
class Console(InteractiveConsole):
def __init__(*args): InteractiveConsole.__init__(*args)
class Console(InteractiveConsole):
def __init__(*args):
InteractiveConsole.__init__(*args)
def enter(self, source):
source = self.preprocess(source)
self.runcode(source)
@staticmethod
def preprocess(source): return source
def runCode(self):
c =self.Console({'model':self.files[0]})
c.enter("print (model.by_type('IfcDoor')")
def runCode(self):
sys.stdout = StdoutRedirector(self.output)
err_redirect= StdoutRedirector(self.output)
err_redirect.isError=True
sys.stderr = err_redirect
sys.stderr = StdoutRedirector(self.output)
sys.stderr.isError=True
if not self.model:
print("please load a model first")
if not self.c:
self.c = self.Console({'model':self.model, 'viewer':self.viewer})
print("please load a model first", file=sys.stderr)
else:
# self.console.start_process(sys.executable,args= [ os.path.join(os.getcwd(), 'interactive_process.py')],env={'model':self.model})
self.c.enter(str(self.editor.toPlainText()))
sys.stdout = sys.__stdout__
sys.stderr = sys.__stderr__
def select(self,product):
self.c = self.Console({'model':self.model, 'viewer':self.viewer, 'selection':product})
self.c.enter
def __init__(self,viewer,snippets=None):
logging.basicConfig(level=logging.CRITICAL)
self.model=None
self.viewer = viewer
QtGui.QWidget.__init__(self)
self.layout= QtGui.QVBoxLayout(self)
self.setLayout(self.layout)
self.c = None
self.tools = QtGui.QHBoxLayout(self)
self.layout.addLayout(self.tools)
self.runbutton = QtGui.QPushButton("Run")
width = self.runbutton.fontMetrics().boundingRect("Run").width() + 20
self.runbutton.setMaximumWidth(width)
self.tools.addWidget(self.runbutton)
self.runbutton.clicked.connect(self.runCode)
editor = CodeEdit()
# start the backend as soon as possible
# editor.backend.start('server.py')
editor.backend.start(server.__file__)
#--- core panels
editor.panels.append(panels.FoldingPanel())
editor.panels.append(panels.LineNumberPanel())
# editor.panels.append(panels.CheckerPanel())
editor.panels.append(panels.SearchAndReplacePanel(),
panels.SearchAndReplacePanel.Position.BOTTOM)
editor.panels.append(panels.EncodingPanel(), api.Panel.Position.TOP)
# add a context menu separator between editor's
# builtin action and the python specific actions
editor.add_separator()
#--- python specific panels
editor.panels.append(pypanels.QuickDocPanel(), api.Panel.Position.BOTTOM)
sh = editor.modes.append(PythonSH(editor.document()))
# sh.color_scheme = ColorScheme('monokai')
#--- core modes
editor.modes.append(modes.CaretLineHighlighterMode())
editor.modes.append(modes.CodeCompletionMode())
editor.modes.append(modes.ExtendedSelectionMode())
editor.modes.append(modes.FileWatcherMode())
editor.modes.append(modes.OccurrencesHighlighterMode())
editor.modes.append(modes.RightMarginMode())
editor.modes.append(modes.SmartBackSpaceMode())
editor.modes.append(modes.SymbolMatcherMode())
editor.modes.append(modes.ZoomMode())
#--- python specific modes
editor.modes.append(pymodes.CommentsMode())
editor.modes.append(pymodes.CalltipsMode())
auto = pymodes.PyAutoCompleteMode()
auto.logger.setLevel(logging.CRITICAL)
editor.modes.append(auto)
editor.modes.append(pymodes.PyAutoIndentMode())
editor.modes.append(pymodes.PyIndenterMode())
editor.show()
if has_pyqode:
editor.backend.start(server.__file__)
editor.panels.append(panels.FoldingPanel())
editor.panels.append(panels.LineNumberPanel())
editor.panels.append(panels.SearchAndReplacePanel(),
panels.SearchAndReplacePanel.Position.BOTTOM)
editor.panels.append(panels.EncodingPanel(), api.Panel.Position.TOP)
editor.add_separator()
editor.panels.append(pypanels.QuickDocPanel(), api.Panel.Position.BOTTOM)
sh = editor.modes.append(PythonSH(editor.document()))
editor.modes.append(modes.CaretLineHighlighterMode())
editor.modes.append(modes.CodeCompletionMode())
editor.modes.append(modes.ExtendedSelectionMode())
editor.modes.append(modes.FileWatcherMode())
editor.modes.append(modes.OccurrencesHighlighterMode())
editor.modes.append(modes.RightMarginMode())
editor.modes.append(modes.SmartBackSpaceMode())
editor.modes.append(modes.SymbolMatcherMode())
editor.modes.append(modes.ZoomMode())
editor.modes.append(pymodes.CommentsMode())
editor.modes.append(pymodes.CalltipsMode())
auto = pymodes.PyAutoCompleteMode()
auto.logger.setLevel(logging.CRITICAL)
editor.modes.append(auto)
editor.modes.append(pymodes.PyAutoIndentMode())
editor.modes.append(pymodes.PyIndenterMode())
editor.show()
else:
editor.setStyleSheet('font-size: 10pt; font-family: Consolas, Courier;')
self.editor = editor
self.snippets = snippets
if not self.snippets:
self.editor.setPlainText("""print('hello from console')
for w in model.by_type('IfcWall'):
print ("wall with GlobalId " + str(w.GlobalId))
""","","")
else:
self.editor.setPlainText(self.snippets.values()[0],"","")
if self.snippets:
self.list = QtWidgets.QComboBox(self)
self.replace_snippet(0)
for snip_name in self.snippets.keys():
self.list.addItem(snip_name)
self.layout.addWidget(self.list)
self.tools.addWidget(self.list)
QtCore.QObject.connect(self.list, QtCore.SIGNAL("currentIndexChanged(int)"), self.replace_snippet)
# self.textedit = QtGui.QTextEdit()
# self.scrollLayout.addWidget(self.textedit)
self.layout.addWidget(self.editor)
self.output = QtGui.QTextEdit()
self.output.setReadOnly(False)
self.output.setStyleSheet('font-size: 10pt; font-family: Consolas,Courier;')
self.output.setReadOnly(True)
self.output.setStyleSheet('font-size: 10pt; font-family: Consolas, Courier; background-color: #444;')
self.layout.addWidget(self.output)
def replace_snippet (self,number):
self.editor.setPlainText(self.snippets[self.list.currentText()],"","")
def replace_snippet(self, number=None):
snip = list(self.snippets.values())[number]
if has_pyqode:
self.editor.setPlainText(snip, "", "")
else:
self.editor.setPlainText(snip)
def load_file(self, f, **kwargs):
output = []
sys.stdout = StdoutRedirector(self.output)
self.model = f
self.c = self.Console({'model':self.model})
# c.enter("print (model.by_type('IfcWall'))")
sys.stdout = sys.__stdout__
self.c = self.Console({'model':self.model, 'selection':None, 'viewer':self.viewer})
sys.stdout = sys.__stdout__