Krita Source Code Documentation
Loading...
Searching...
No Matches
uicontroller.py
Go to the documentation of this file.
1"""
2SPDX-FileCopyrightText: 2017 Eliakin Costa <eliakim170@gmail.com>
3
4SPDX-License-Identifier: GPL-2.0-or-later
5"""
6try:
7 from PyQt6.QtCore import Qt, QObject, QFileInfo, QRect
8 from PyQt6.QtGui import QTextCursor, QPalette
9 from PyQt6.QtWidgets import (QToolBar, QMenuBar, QTabWidget,
10 QLabel, QVBoxLayout, QMessageBox,
11 QSplitter, QSizePolicy)
12except:
13 from PyQt5.QtCore import Qt, QObject, QFileInfo, QRect
14 from PyQt5.QtGui import QTextCursor, QPalette
15 from PyQt5.QtWidgets import (QToolBar, QMenuBar, QTabWidget,
16 QLabel, QVBoxLayout, QMessageBox,
17 QSplitter, QSizePolicy)
18from .ui_scripter.syntax import syntax, syntaxstyles
19from .ui_scripter.editor import pythoneditor
20from . import scripterdialog, utils
21import importlib
22from builtins import i18n
23
24from scripter import resources_rc # Loads the icons qrc
25
26KEY_GEOMETRY = "geometry"
27DEFAULT_GEOMETRY = QRect(600, 200, 400, 500)
28# essentially randomly placed
29
30
31class Elided_Text_Label(QLabel):
32 mainText = str()
33
34 def __init__(self, parent=None):
35 super(QLabel, self).__init__(parent)
36
37 self.setMinimumWidth(self.fontMetrics().horizontalAdvance("..."))
38 self.setSizePolicy(QSizePolicy.Policy.Expanding, QSizePolicy.Policy.Minimum)
39
40 def setMainText(self, text=str()):
41 self.mainText = text
42 self.elideText()
43
44 def elideText(self):
45 self.setText(self.fontMetrics().elidedText(self.mainText, Qt.TextElideMode.ElideRight, self.width()))
46
47 def resizeEvent(self, event):
48 self.elideText()
49
50
51class UIController(object):
52 documentModifiedText = ""
53 documentStatusBarText = "untitled"
54
55 def __init__(self):
57 self.actionToolbar = QToolBar('toolBar', self.mainWidget)
58 self.menu_bar = QMenuBar(self.mainWidget)
59
60 self.actionToolbar.setObjectName('toolBar')
61 self.menu_bar.setObjectName('menuBar')
62
63 self.actions = []
64
65 self.mainWidget.setWindowModality(Qt.WindowModality.NonModal)
66
67 def initialize(self, scripter):
68 self.editor = pythoneditor.CodeEditor(scripter)
69 self.tabWidget = QTabWidget()
71 self.statusBar.setMainText('untitled')
72 self.splitter = QSplitter()
73 self.splitter.setOrientation(Qt.Orientation.Vertical)
74 self.highlight = syntax.PythonHighlighter(self.editor.document(), syntaxstyles.DefaultSyntaxStyle())
75 p = self.editor.palette()
76 p.setColor(QPalette.ColorRole.Base, syntaxstyles.DefaultSyntaxStyle()['background'].foreground().color())
77 p.setColor(QPalette.ColorRole.Text, syntaxstyles.DefaultSyntaxStyle()['foreground'].foreground().color())
78 self.editor.setPalette(p)
79
80 utils.setNeedDarkIcon(self.mainWidget.palette().window().color())
81 self.scripter = scripter
82
83 self.loadMenus()
84 self.loadWidgets()
85 self.loadActions()
86 self._readSettings() # sets window size
87
88 vbox = QVBoxLayout(self.mainWidget)
89 vbox.addWidget(self.menu_bar)
90 vbox.addWidget(self.actionToolbar)
91 self.splitter.addWidget(self.editor)
92 self.splitter.addWidget(self.tabWidget)
93 vbox.addWidget(self.splitter)
94 vbox.addWidget(self.statusBar)
95
96 self.mainWidget.setWindowTitle(i18n("Scripter"))
97 self.mainWidget.setSizeGripEnabled(True)
98 self.mainWidget.show()
99 self.mainWidget.activateWindow()
100
101 self.editor.undoAvailable.connect(self.setStatusModifiedsetStatusModified)
102
103 def loadMenus(self):
104 self.addMenu(i18n('File'), i18n('File'))
105
106 def addMenu(self, menuName, parentName):
107 parent = self.menu_bar.findChild(QObject, parentName)
108 self.newMenu = None
109
110 if parent:
111 self.newMenu = parent.addMenu(menuName)
112 else:
113 self.newMenu = self.menu_bar.addMenu(menuName)
114
115 self.newMenu.setObjectName(menuName)
116
117 return self.newMenu
118
119 def loadActions(self):
120 module_path = 'scripter.ui_scripter.actions'
121 actions_module = importlib.import_module(module_path)
122 modules = []
123
124 for class_path in actions_module.action_classes:
125 _module = class_path[:class_path.rfind(".")]
126 _klass = class_path[class_path.rfind(".") + 1:]
127 modules.append(dict(module='{0}.{1}'.format(module_path, _module),
128 klass=_klass))
129
130 for module in modules:
131 m = importlib.import_module(module['module'])
132 action_class = getattr(m, module['klass'])
133 obj = action_class(self.scripter)
134 obj_parent = obj.parent
135 for name in obj_parent:
136 parent = self.mainWidget.findChild(QObject, i18n(name))
137 self.actions.append(dict(action=obj, parent=parent))
138
139 for action in self.actions:
140 action['parent'].addAction(action['action'])
141
142 def loadWidgets(self):
143 modulePath = 'scripter.ui_scripter.tabwidgets'
144 widgetsModule = importlib.import_module(modulePath)
145 modules = []
146
147 for class_path in widgetsModule.widgetClasses:
148 _module = class_path[:class_path.rfind(".")]
149 _klass = class_path[class_path.rfind(".") + 1:]
150 modules.append(dict(module='{0}.{1}'.format(modulePath, _module),
151 klass=_klass))
152
153 for module in modules:
154 m = importlib.import_module(module['module'])
155 widgetClass = getattr(m, module['klass'])
156 obj = widgetClass(self.scripter)
157 self.tabWidget.addTab(obj, obj.objectName())
158
159 def invokeAction(self, actionName):
160 for action in self.actions:
161 if action['action'].objectName() == actionName:
162 method = getattr(action['action'], actionName)
163 if method:
164 return method()
165
166 def findTabWidget(self, widgetName, childName=''):
167 for index in range(self.tabWidget.count()):
168 widget = self.tabWidget.widget(index)
169 if widget.objectName() == widgetName:
170 if childName:
171 widget = widget.findChild(QObject, childName)
172 return widget
173
174 def showException(self, exception):
175 QMessageBox.critical(self.editor, i18n("Error Running Script"), str(exception))
176
177 def setDocumentEditor(self, document):
178 self.editor.clear()
179 self.editor.moveCursor(QTextCursor.MoveOperation.Start)
180 self.editor._documentModified = False
181 self.editor.setPlainText(document.data)
182 self.editor.moveCursor(QTextCursor.MoveOperation.End)
183
190 if (self.editor._documentModified is True):
193
194 def setActiveWidget(self, widgetName):
195 widget = self.findTabWidget(widgetName)
196
197 if widget:
198 self.tabWidget.setCurrentWidget(widget)
199
200 def setStepped(self, status):
201 self.editor.setStepped(status)
202
203 def clearEditor(self):
204 self.editor.clear()
205
208
209 def closeScripter(self):
210 self.mainWidget.close()
211
212 def _writeSettings(self):
213 """ _writeSettings is a method invoked when the scripter starts, making
214 control inversion. Actions can implement a writeSettings method to
215 save your own settings without this method to know about it. """
216
217 self.scripter.settings.beginGroup('scripter')
218
219 document = self.scripter.documentcontroller.activeDocument
220 if document:
221 self.scripter.settings.setValue('activeDocumentPath', document.filePath)
222 else:
223 self.scripter.settings.setValue('activeDocumentPath', '')
224
225 self.scripter.settings.setValue('editorFontSize', self.editor.fontInfo().pointSize())
226
227 for action in self.actions:
228 writeSettings = getattr(action['action'], "writeSettings", None)
229 if callable(writeSettings):
230 writeSettings()
231
232 # Window Geometry
233 rect = self.mainWidget.geometry()
234 self.scripter.settings.setValue(KEY_GEOMETRY, rect)
235
236 self.scripter.settings.endGroup()
237
238 def _readSettings(self):
239 """ It's similar to _writeSettings, but reading the settings when the ScripterDialog is closed. """
240
241 self.scripter.settings.beginGroup('scripter')
242
243 activeDocumentPath = self.scripter.settings.value('activeDocumentPath', '')
244
245 if activeDocumentPath:
246 if QFileInfo(activeDocumentPath).exists():
247 document = self.scripter.documentcontroller.openDocument(activeDocumentPath)
248 self.setStatusBar(document.filePath)
249 self.setDocumentEditor(document)
250
251 for action in self.actions:
252 readSettings = getattr(action['action'], "readSettings", None)
253 if callable(readSettings):
254 readSettings()
255
256 pointSize = self.scripter.settings.value('editorFontSize', str(self.editor.fontInfo().pointSize()))
257 self.editor.setFontSize(int(pointSize))
258
259 # Window Geometry
260 rect = self.scripter.settings.value(KEY_GEOMETRY, DEFAULT_GEOMETRY)
261 self.mainWidget.setGeometry(rect)
262
263 self.scripter.settings.endGroup()
264
265 def _saveSettings(self):
266 self.scripter.settings.sync()
findTabWidget(self, widgetName, childName='')
addMenu(self, menuName, parentName)
setStatusBar(self, value='untitled')
rgba palette[MAX_PALETTE]
Definition palette.c:35