Krita Source Code Documentation
Loading...
Searching...
No Matches
mainwindow.py
Go to the documentation of this file.
2# SPDX-License-Identifier: GPL-3.0-or-later
3#
4
5try:
6 from PyQt6.QtCore import pyqtSlot, Qt
7 from PyQt6.QtGui import QCloseEvent
8 from PyQt6.QtWidgets import (QApplication, QFileDialog, QMainWindow,
9 QMessageBox, QSplitter, QTabWidget)
10except:
11 from PyQt5.QtCore import pyqtSlot, Qt
12 from PyQt5.QtGui import QCloseEvent
13 from PyQt5.QtWidgets import (QApplication, QFileDialog, QMainWindow,
14 QMessageBox, QSplitter, QTabWidget)
15
16from widget import PythonEditorWidget, QtQmlEditorWidget, SaveDialog
17from console import PythonConsole, QtQmlConsole
18from mainwindow_ui import Ui_ScriptEditor
19
20
21import traceback
22import os
23
24template_py = """\
25# -*- coding: utf-8 -*-
26from __future__ import with_statement
27
28"""
29
30
31class EditorMainWindow(QMainWindow):
32
33 def __init__(self, parent=None):
34 QMainWindow.__init__(self, parent)
36 self.ui.setupUi(self)
37 # self.ui.actionExit.triggered.connect(self.exit)
38 self.splitter = QSplitter(Qt.Orientation.Vertical, self)
39 self.setCentralWidget(self.splitter)
40 self.edit_tab = QTabWidget(self.splitter)
41 self.console_tab = QTabWidget(self.splitter)
43 self.console_tab.addTab(self.py_console, "&Python console")
45 self.console_tab.addTab(self.js_console, "&QtQml console")
46 self.editors = []
48
49 @pyqtSlot()
50 def closeEvent(self, event):
51 while(self.editors.__len__()):
52 edit = self.edit_tab.currentWidget()
53 if edit:
54 if(edit.isModified()):
55 saveBox = SaveDialog("You have unsaved script. Save it now?")
56 prompt = saveBox.exec()
57 if(prompt == QMessageBox.StandardButton.Save):
58 event.ignore()
59 self.save(True)
60 elif(prompt == QMessageBox.StandardButton.Cancel):
61 event.ignore()
62 return
63 elif(prompt == QMessageBox.StandardButton.Discard):
64 event.accept()
65 i = self.edit_tab.indexOf(edit)
66 self.edit_tab.removeTab(i)
67 self.editors.remove(edit)
68 event.accept()
69
70 @pyqtSlot()
72 while(self.editors.__len__()):
73 edit = self.edit_tab.currentWidget()
74 if edit:
75 if(edit.isModified()):
76 saveBox = SaveDialog("You have unsaved script. Save it now?")
77 prompt = saveBox.exec()
78 if(prompt == QMessageBox.StandardButton.Save):
79 self.save(True)
80 elif(prompt == QMessageBox.StandardButton.Cancel):
81 return
82 elif(prompt == QMessageBox.StandardButton.Discard):
83 pass
84 i = self.edit_tab.indexOf(edit)
85 self.edit_tab.removeTab(i)
86 self.editors.remove(edit)
87 self.close()
88
89 @pyqtSlot()
91 pyedit = PythonEditorWidget(self.edit_tab)
92 pyedit.setPlainText(template_py)
93 self.edit_tab.addTab(pyedit, "Python")
94 self.edit_tab.setCurrentWidget(pyedit)
95 self.editors.append(pyedit)
96 self.py_console.attach()
97 self.console_tab.setCurrentIndex(0)
98 pyedit.setFocus()
99 pyedit.view.setFocus()
100
101 @pyqtSlot()
103 jsedit = QtQmlEditorWidget(self.edit_tab)
104 self.edit_tab.addTab(jsedit, "QtQml")
105 self.edit_tab.setCurrentWidget(jsedit)
106 self.editors.append(jsedit)
107 self.js_console.attach()
108 self.console_tab.setCurrentIndex(1)
109
110 @pyqtSlot()
112 edit = self.edit_tab.currentWidget()
113 if edit:
114 if(edit.isModified()):
115 saveBox = SaveDialog("Do you want to save this Script?")
116 prompt = saveBox.exec()
117 if(prompt == QMessageBox.StandardButton.Save):
118 self.save(True)
119 elif(prompt == QMessageBox.StandardButton.Cancel):
120 return
121 elif(prompt == QMessageBox.StandardButton.Discard):
122 pass
123 i = self.edit_tab.indexOf(edit)
124 self.edit_tab.removeTab(i)
125 self.editors.remove(edit)
126
127 @pyqtSlot()
129 # edit = self.edit_tab.currentWidget()
130 # edit.setPlainText(template_py)
131 self.py_console.clear()
132
133 @pyqtSlot()
135 self.save()
136
137 @pyqtSlot()
139 self.save(True)
140
141 # Path of the script file in each tab will be stored in tabToolTip
142 def save(self, Update=False):
143 edit = self.edit_tab.currentWidget()
144 contents = str(edit.toPlainText())
145 if((Update == False) or (self.edit_tab.tabText(self.edit_tab.currentIndex()) == "Python")):
146 # Save in its first invocation and Save As will enter
147 filename = QFileDialog.getSaveFileName(self, "Save File", "", "*.spy")
148 fil = open(filename, 'w')
149 if(filename and self.edit_tab.tabText(self.edit_tab.currentIndex()) == "Python"):
150 # Script hasn't been saved before and user specifies a valid filename
151 self.edit_tab.setTabToolTip(self.edit_tab.currentIndex(), filename + '.spy')
152 self.edit_tab.setTabText(self.edit_tab.currentIndex(), os.path.basename(str(filename + '.spy')))
153 else:
154 # filename = self.edit_tab.tabText(self.edit_tab.currentIndex())
155 filename = self.edit_tab.tabToolTip(self.edit_tab.currentIndex())
156 fil = open(filename, 'w')
157 fil.write(contents)
158 fil.close()
159 edit.setModified(False)
160
161 @pyqtSlot()
163 filename = QFileDialog.getOpenFileName(self, "Open File", "", "*.spy")
164 try:
165 fil = open(filename, 'r')
166 except IOError:
167 return
168 code = fil.read()
169 edit = self.edit_tab.currentWidget()
170 self.edit_tab.setTabText(self.edit_tab.currentIndex(), os.path.basename(str(filename)))
171 self.edit_tab.setTabToolTip(self.edit_tab.currentIndex(), filename)
172 edit.setPlainText(code)
173 fil.close()
174
175 @pyqtSlot()
177 self.run()
178
179 @pyqtSlot()
181 self.run(True)
182
183 def run(self, console=False):
184 edit = self.edit_tab.currentWidget()
185 code = str(edit.toPlainText())
186 if isinstance(edit, PythonEditorWidget):
187 self.py_console.attach()
188 self.console_tab.setCurrentIndex(0)
189 if console:
190 namespace = self.py_console.namespace
191 else:
192 namespace = {}
193 try:
194 exec(code, namespace)
195 except Exception as e:
196 traceback.print_exc()
197 try:
198 Scripter.activeWindow.redraw = True
199 Scripter.activeWindow.update()
200 except:
201 pass
202 else:
203 self.js_console.attach()
204 self.console_tab.setCurrentIndex(1)
205 if console:
206 self.js_console.inter.execute(code)
207 else:
208 self.js_console.inter.execute_code(code)
209
210
211if __name__ == "__main__":
212 import sys
213 app = QApplication(sys.argv)
215 win.resize(640, 480)
216 win.show()
217 app.exec()