diff options
| author | Adrien Tétar | 2015-10-03 21:40:29 +0200 | 
|---|---|---|
| committer | Adrien Tétar | 2015-10-03 21:40:29 +0200 | 
| commit | 73a86b36d1db31976ff10aab420ecebbcf55fde5 (patch) | |
| tree | 2e3ffd41feb64957c7907d914b39949f6d79b367 /Lib/defconQt/scriptingWindow.py | |
| parent | c898a4d61fbaf10d9f8a989b58c028ad3a271157 (diff) | |
| download | trufont-73a86b36d1db31976ff10aab420ecebbcf55fde5.tar.bz2 | |
meta: add scripting support & associated functionality support
Diffstat (limited to 'Lib/defconQt/scriptingWindow.py')
| -rw-r--r-- | Lib/defconQt/scriptingWindow.py | 94 | 
1 files changed, 94 insertions, 0 deletions
| diff --git a/Lib/defconQt/scriptingWindow.py b/Lib/defconQt/scriptingWindow.py new file mode 100644 index 0000000..2448d48 --- /dev/null +++ b/Lib/defconQt/scriptingWindow.py @@ -0,0 +1,94 @@ +from defconQt.baseCodeEditor import CodeEditor, CodeHighlighter +from keyword import kwlist +import traceback +from PyQt5.QtCore import Qt +from PyQt5.QtGui import QColor, QFont, QKeySequence, QTextCharFormat, QTextCursor +from PyQt5.QtWidgets import QApplication, QMainWindow, QMenu, QPlainTextEdit + +class MainScriptingWindow(QMainWindow): +    def __init__(self): +        super(MainScriptingWindow, self).__init__() + +        self.editor = PythonEditor(parent=self) +        self.resize(600, 500) + +        fileMenu = QMenu("&File", self) +        fileMenu.addAction("&Run…", self.runScript, "Ctrl+R") +        fileMenu.addSeparator() +        fileMenu.addAction("E&xit", self.close, QKeySequence.Quit) +        self.menuBar().addMenu(fileMenu) + +        self.setCentralWidget(self.editor) +        self.setWindowTitle("[*]Untitled.py") +        # arm `undoAvailable` to `setWindowModified` +        self.editor.undoAvailable.connect(self.setWindowModified) + +    def runScript(self): +        app = QApplication.instance() +        script = self.editor.toPlainText() +        global_vars = { +            "__builtins__": __builtins__, +            "AllFonts": app.allFonts, +            "CurrentFont": app.currentFont, +        } +        try: +            code = compile(script, "<string>", "exec") +            exec(code, global_vars) +        except: +            print(traceback.format_exc()) + +class PythonEditor(CodeEditor): +    autocomplete = { +        Qt.Key_ParenLeft: "()", +        Qt.Key_BracketLeft: "[]", +        Qt.Key_BraceLeft: "{}", +        Qt.Key_Apostrophe: "''", +        Qt.Key_QuoteDbl: '""', +    } + +    def __init__(self, text=None, parent=None): +        super(PythonEditor, self).__init__(text, parent) +        self.openBlockDelimiter = ":" +        self.highlighter = PythonHighlighter(self.document()) + +    def keyPressEvent(self, event): +        key = event.key() +        if key in self.autocomplete.keys(): +            super(PythonEditor, self).keyPressEvent(event) +            cursor = self.textCursor() +            cursor.insertText(self.autocomplete[key][-1]) +            cursor.movePosition(QTextCursor.PreviousCharacter) +            self.setTextCursor(cursor) +            event.accept() +            return +        elif key == Qt.Key_Backspace: +            cursor = self.textCursor() +            ok = cursor.movePosition(QTextCursor.PreviousCharacter) +            if ok: +                ok = cursor.movePosition(QTextCursor.NextCharacter, QTextCursor.KeepAnchor, 2) +                if ok and cursor.selectedText() in self.autocomplete.values(): +                    cursor.removeSelectedText() +                    event.accept() +                    return +        super(PythonEditor, self).keyPressEvent(event) + +class PythonHighlighter(CodeHighlighter): +    def __init__(self, parent=None): +        super(PythonHighlighter, self).__init__(parent) + +        keywordFormat = QTextCharFormat() +        keywordFormat.setForeground(QColor(34, 34, 34)) +        keywordFormat.setFontWeight(QFont.Bold) +        self.highlightingRules.append(("\\b(%s)\\b" % ("|".join(kwlist)), keywordFormat)) + +        singleLineCommentFormat = QTextCharFormat() +        singleLineCommentFormat.setForeground(Qt.darkGray) +        self.highlightingRules.append(("#[^\n]*", singleLineCommentFormat)) + +        classOrFnNameFormat = QTextCharFormat() +        classOrFnNameFormat.setForeground(QColor(96, 106, 161)) +        self.highlightingRules.append(("(?<=\\bclass\\s|def\\s\\b)\\s*(\\w+)", classOrFnNameFormat)) + +        quotationFormat = QTextCharFormat() +        quotationFormat.setForeground(QColor(223, 17, 68)) +        self.highlightingRules.append(("'.*'|[\"]{1,3}.*[\"]{1,3}", quotationFormat)) | 
