Meshroom/meshroom/ui/components/scriptEditor.py

60 lines
2.1 KiB
Python

from PySide6.QtCore import QObject, Slot
from io import StringIO
from contextlib import redirect_stdout
class ScriptEditorManager(QObject):
def __init__(self, parent=None):
super(ScriptEditorManager, self).__init__(parent=parent)
self._history = []
self._index = -1
self._globals = {}
self._locals = {}
@Slot(str, result=str)
def process(self, script):
""" Execute the provided input script, capture the output from the standard output, and return it. """
stdout = StringIO()
with redirect_stdout(stdout):
try:
exec(script, self._globals, self._locals)
except Exception as exception:
# Format and print the exception to stdout, which will be captured
print("{}: {}".format(type(exception).__name__, exception))
result = stdout.getvalue().strip()
# Add the script to the history and move up the index to the top of history stack
self._history.append(script)
self._index = len(self._history)
return result
@Slot()
def clearHistory(self):
""" Clear the list of executed scripts and reset the index. """
self._history = []
self._index = -1
@Slot(result=str)
def getNextScript(self):
""" Get the next entry in the history of executed scripts and update the index adequately.
If there is no next entry, return an empty string. """
if self._index + 1 < len(self._history) and len(self._history) > 0:
self._index = self._index + 1
return self._history[self._index]
return ""
@Slot(result=str)
def getPreviousScript(self):
""" Get the previous entry in the history of executed scripts and update the index adequately.
If there is no previous entry, return an empty string. """
if self._index - 1 >= 0 and self._index - 1 < len(self._history):
self._index = self._index - 1
return self._history[self._index]
elif self._index == 0 and len(self._history):
return self._history[self._index]
return ""