2017-11-01 10:41:27 +01:00
|
|
|
from __future__ import absolute_import
|
|
|
|
|
from __future__ import division
|
2016-11-28 17:00:32 +01:00
|
|
|
from __future__ import print_function
|
|
|
|
|
|
2016-11-24 13:57:42 +01:00
|
|
|
import os
|
|
|
|
|
import sys
|
|
|
|
|
import logging
|
|
|
|
|
|
|
|
|
|
from code import InteractiveConsole
|
2016-11-28 17:00:32 +01:00
|
|
|
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
|
2017-11-06 09:10:28 +01:00
|
|
|
|
|
|
|
|
|
2016-11-28 17:00:32 +01:00
|
|
|
class StdoutRedirector(object):
|
2016-11-24 13:57:42 +01:00
|
|
|
|
|
|
|
|
'''A class for redirecting stdout to this Text widget.'''
|
2016-11-28 17:00:32 +01:00
|
|
|
|
2016-11-24 13:57:42 +01:00
|
|
|
def __init__(self, widget):
|
2017-11-06 09:10:28 +01:00
|
|
|
self.widget = widget
|
|
|
|
|
self.isError = False
|
2016-11-28 17:00:32 +01:00
|
|
|
|
2017-11-06 09:10:28 +01:00
|
|
|
def write(self, str):
|
2016-11-24 13:57:42 +01:00
|
|
|
self.widget.moveCursor(QtGui.QTextCursor.End)
|
|
|
|
|
if self.isError:
|
|
|
|
|
self.widget.setTextColor(QtCore.Qt.red)
|
|
|
|
|
else:
|
2016-11-28 17:00:32 +01:00
|
|
|
self.widget.setTextColor(QtCore.Qt.white)
|
2016-11-24 13:57:42 +01:00
|
|
|
self.widget.insertPlainText(str)
|
|
|
|
|
self.widget.moveCursor(QtGui.QTextCursor.End)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
class code_edit(QtGui.QWidget):
|
|
|
|
|
|
2016-11-28 17:00:32 +01:00
|
|
|
class Console(InteractiveConsole):
|
|
|
|
|
def __init__(*args):
|
|
|
|
|
InteractiveConsole.__init__(*args)
|
2016-11-24 13:57:42 +01:00
|
|
|
|
|
|
|
|
def enter(self, source):
|
|
|
|
|
self.runcode(source)
|
|
|
|
|
|
|
|
|
|
def runCode(self):
|
|
|
|
|
sys.stdout = StdoutRedirector(self.output)
|
2016-11-28 17:00:32 +01:00
|
|
|
sys.stderr = StdoutRedirector(self.output)
|
2017-11-06 09:10:28 +01:00
|
|
|
sys.stderr.isError = True
|
2016-11-24 13:57:42 +01:00
|
|
|
|
|
|
|
|
if not self.model:
|
2016-11-28 17:00:32 +01:00
|
|
|
print("please load a model first", file=sys.stderr)
|
2016-11-24 13:57:42 +01:00
|
|
|
else:
|
|
|
|
|
self.c.enter(str(self.editor.toPlainText()))
|
2017-11-06 09:10:28 +01:00
|
|
|
|
2016-11-24 13:57:42 +01:00
|
|
|
sys.stdout = sys.__stdout__
|
|
|
|
|
sys.stderr = sys.__stderr__
|
|
|
|
|
|
2017-11-06 09:10:28 +01:00
|
|
|
def select(self, product):
|
|
|
|
|
self.c = self.Console({'model': self.model, 'viewer': self.viewer, 'selection': product})
|
|
|
|
|
|
|
|
|
|
def __init__(self, viewer, snippets=None):
|
2016-11-24 13:57:42 +01:00
|
|
|
|
2017-11-06 09:10:28 +01:00
|
|
|
self.model = None
|
2016-11-24 13:57:42 +01:00
|
|
|
self.viewer = viewer
|
|
|
|
|
QtGui.QWidget.__init__(self)
|
2017-11-06 09:10:28 +01:00
|
|
|
self.layout = QtGui.QVBoxLayout(self)
|
2016-11-24 13:57:42 +01:00
|
|
|
self.setLayout(self.layout)
|
|
|
|
|
self.c = None
|
2017-11-06 09:10:28 +01:00
|
|
|
|
2016-11-28 17:00:32 +01:00
|
|
|
self.tools = QtGui.QHBoxLayout(self)
|
|
|
|
|
self.layout.addLayout(self.tools)
|
2017-11-06 09:10:28 +01:00
|
|
|
|
2016-11-28 17:00:32 +01:00
|
|
|
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)
|
2017-11-06 09:10:28 +01:00
|
|
|
|
2016-11-24 13:57:42 +01:00
|
|
|
editor = CodeEdit()
|
2016-11-28 17:00:32 +01:00
|
|
|
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;')
|
2016-11-24 13:57:42 +01:00
|
|
|
|
|
|
|
|
self.editor = editor
|
|
|
|
|
self.snippets = snippets
|
2016-11-28 17:00:32 +01:00
|
|
|
if self.snippets:
|
2016-11-24 13:57:42 +01:00
|
|
|
self.list = QtWidgets.QComboBox(self)
|
2016-11-28 17:00:32 +01:00
|
|
|
self.replace_snippet(0)
|
2016-11-24 13:57:42 +01:00
|
|
|
for snip_name in self.snippets.keys():
|
|
|
|
|
self.list.addItem(snip_name)
|
2016-11-28 17:00:32 +01:00
|
|
|
self.tools.addWidget(self.list)
|
2016-11-24 13:57:42 +01:00
|
|
|
QtCore.QObject.connect(self.list, QtCore.SIGNAL("currentIndexChanged(int)"), self.replace_snippet)
|
|
|
|
|
|
|
|
|
|
self.layout.addWidget(self.editor)
|
|
|
|
|
|
|
|
|
|
self.output = QtGui.QTextEdit()
|
2016-11-28 17:00:32 +01:00
|
|
|
self.output.setReadOnly(True)
|
|
|
|
|
self.output.setStyleSheet('font-size: 10pt; font-family: Consolas, Courier; background-color: #444;')
|
2016-11-24 13:57:42 +01:00
|
|
|
self.layout.addWidget(self.output)
|
|
|
|
|
|
2016-11-28 17:00:32 +01:00
|
|
|
def replace_snippet(self, number=None):
|
|
|
|
|
snip = list(self.snippets.values())[number]
|
|
|
|
|
if has_pyqode:
|
|
|
|
|
self.editor.setPlainText(snip, "", "")
|
|
|
|
|
else:
|
|
|
|
|
self.editor.setPlainText(snip)
|
2016-11-24 13:57:42 +01:00
|
|
|
|
|
|
|
|
def load_file(self, f, **kwargs):
|
|
|
|
|
output = []
|
|
|
|
|
sys.stdout = StdoutRedirector(self.output)
|
|
|
|
|
self.model = f
|
2017-11-06 09:10:28 +01:00
|
|
|
self.c = self.Console({'model': self.model, 'selection': None, 'viewer': self.viewer})
|
2016-11-28 17:00:32 +01:00
|
|
|
sys.stdout = sys.__stdout__
|