PluginProjectFlask.py

branch
eric7
changeset 64
0ee58185b8df
parent 61
fe1e8783a95f
child 66
0d3168d0e310
equal deleted inserted replaced
63:7c05cbc8b3e5 64:0ee58185b8df
9 9
10 import os 10 import os
11 import glob 11 import glob
12 import fnmatch 12 import fnmatch
13 13
14 from PyQt5.QtCore import QCoreApplication, QObject, QTranslator 14 from PyQt6.QtCore import QCoreApplication, QObject, QTranslator
15 15
16 from E5Gui.E5Application import e5App 16 from EricWidgets.EricApplication import ericApp
17 17
18 import Preferences 18 import Preferences
19 19
20 from Globals import isWindowsPlatform, isMacPlatform 20 from Globals import isWindowsPlatform, isMacPlatform
21 21
24 # Start-of-Header 24 # Start-of-Header
25 name = "Flask Project Plugin" 25 name = "Flask Project Plugin"
26 author = "Detlev Offenbach <detlev@die-offenbachs.de>" 26 author = "Detlev Offenbach <detlev@die-offenbachs.de>"
27 autoactivate = True 27 autoactivate = True
28 deactivateable = True 28 deactivateable = True
29 version = "1.3.0" 29 version = "1.0.0"
30 className = "ProjectFlaskPlugin" 30 className = "ProjectFlaskPlugin"
31 packageName = "ProjectFlask" 31 packageName = "ProjectFlask"
32 shortDescription = "Project support for Flask projects." 32 shortDescription = "Project support for Flask projects."
33 longDescription = ( 33 longDescription = (
34 """This plugin implements project support for Flask projects.""" 34 """This plugin implements project support for Flask projects."""
44 44
45 def apiFiles(language): 45 def apiFiles(language):
46 """ 46 """
47 Module function to return the API files made available by this plugin. 47 Module function to return the API files made available by this plugin.
48 48
49 @param language language to get APIs for (string) 49 @param language language to get APIs for
50 @return list of API filenames (list of string) 50 @type str
51 @return list of API filenames
52 @rtype list of str
51 """ 53 """
52 if language in ["Python3"]: 54 if language in ["Python3"]:
53 apisDir = os.path.join(os.path.dirname(__file__), 55 apisDir = os.path.join(os.path.dirname(__file__),
54 "ProjectFlask", "APIs") 56 "ProjectFlask", "APIs")
55 apis = glob.glob(os.path.join(apisDir, '*.api')) 57 apis = glob.glob(os.path.join(apisDir, '*.api'))
61 def createFlaskPage(configDlg): 63 def createFlaskPage(configDlg):
62 """ 64 """
63 Module function to create the Flask configuration page. 65 Module function to create the Flask configuration page.
64 66
65 @param configDlg reference to the configuration dialog 67 @param configDlg reference to the configuration dialog
68 @type ConfigurationWidget
66 @return reference to the configuration page 69 @return reference to the configuration page
70 @rtype FlaskPage
67 """ 71 """
68 global flaskPluginObject 72 global flaskPluginObject
69 from ProjectFlask.ConfigurationPage.FlaskPage import FlaskPage 73 from ProjectFlask.ConfigurationPage.FlaskPage import FlaskPage
70 page = FlaskPage(flaskPluginObject) 74 page = FlaskPage(flaskPluginObject)
71 return page 75 return page
76 Module function returning data as required by the configuration dialog. 80 Module function returning data as required by the configuration dialog.
77 81
78 @return dictionary containing the relevant data 82 @return dictionary containing the relevant data
79 @rtype dict 83 @rtype dict
80 """ 84 """
81 try: 85 usesDarkPalette = ericApp().usesDarkPalette()
82 usesDarkPalette = e5App().usesDarkPalette()
83 except AttributeError:
84 from PyQt5.QtGui import QPalette
85 palette = e5App().palette()
86 lightness = palette.color(QPalette.Window).lightness()
87 usesDarkPalette = lightness <= 128
88 iconSuffix = "dark" if usesDarkPalette else "light" 86 iconSuffix = "dark" if usesDarkPalette else "light"
89 87
90 return { 88 return {
91 "flaskPage": [ 89 "flaskPage": [
92 QCoreApplication.translate("ProjectFlaskPlugin", "Flask"), 90 QCoreApplication.translate("ProjectFlaskPlugin", "Flask"),
119 def __init__(self, ui): 117 def __init__(self, ui):
120 """ 118 """
121 Constructor 119 Constructor
122 120
123 @param ui reference to the user interface object 121 @param ui reference to the user interface object
124 @type UI.UserInterface 122 @type UserInterface
125 """ 123 """
126 QObject.__init__(self, ui) 124 QObject.__init__(self, ui)
127 self.__ui = ui 125 self.__ui = ui
128 self.__initialize() 126 self.__initialize()
129 127
157 155
158 self.__mainMenu = None 156 self.__mainMenu = None
159 self.__mainAct = None 157 self.__mainAct = None
160 self.__separatorAct = None 158 self.__separatorAct = None
161 159
162 self.__e5project = e5App().getObject("Project") 160 self.__ericProject = ericApp().getObject("Project")
163 161
164 self.__supportedVariants = [] 162 self.__supportedVariants = []
165 163
166 def activate(self): 164 def activate(self):
167 """ 165 """
168 Public method to activate this plugin. 166 Public method to activate this plugin.
169 167
170 @return tuple of None and activation status 168 @return tuple of None and activation status
171 @rtype bool 169 @rtype tuple of (None, bool)
172 """ 170 """
173 global flaskPluginObject 171 global flaskPluginObject
174 flaskPluginObject = self 172 flaskPluginObject = self
175 173
176 try: 174 usesDarkPalette = ericApp().usesDarkPalette()
177 usesDarkPalette = e5App().usesDarkPalette()
178 except AttributeError:
179 from PyQt5.QtGui import QPalette
180 palette = e5App().palette()
181 lightness = palette.color(QPalette.Window).lightness()
182 usesDarkPalette = lightness <= 128
183 iconSuffix = "dark" if usesDarkPalette else "light" 175 iconSuffix = "dark" if usesDarkPalette else "light"
184 176
185 self.__object = Project(self, iconSuffix, self.__ui) 177 self.__object = Project(self, iconSuffix, self.__ui)
186 self.__object.initActions() 178 self.__object.initActions()
187 e5App().registerPluginObject("ProjectFlask", self.__object) 179 ericApp().registerPluginObject("ProjectFlask", self.__object)
188 180
189 self.__mainMenu = self.__object.initMenu() 181 self.__mainMenu = self.__object.initMenu()
190 182
191 self.__supportedVariants = self.__object.supportedPythonVariants() 183 self.__supportedVariants = self.__object.supportedPythonVariants()
192 184
193 if self.__supportedVariants: 185 if self.__supportedVariants:
194 self.__e5project.registerProjectType( 186 self.__ericProject.registerProjectType(
195 "Flask", self.tr("Flask"), 187 "Flask", self.tr("Flask"),
196 self.fileTypesCallback, 188 self.fileTypesCallback,
197 lexerAssociationCallback=self.lexerAssociationCallback, 189 lexerAssociationCallback=self.lexerAssociationCallback,
198 binaryTranslationsCallback=self.binaryTranslationsCallback, 190 binaryTranslationsCallback=self.binaryTranslationsCallback,
199 progLanguages=self.__supportedVariants[:]) 191 progLanguages=self.__supportedVariants[:])
206 "Flask", 198 "Flask",
207 SourcesBrowserFlag | FormsBrowserFlag | 199 SourcesBrowserFlag | FormsBrowserFlag |
208 TranslationsBrowserFlag | OthersBrowserFlag, 200 TranslationsBrowserFlag | OthersBrowserFlag,
209 ) 201 )
210 202
211 if self.__e5project.isOpen(): 203 if self.__ericProject.isOpen():
212 self.__projectOpened() 204 self.__projectOpened()
213 self.__object.projectOpenedHooks() 205 self.__object.projectOpenedHooks()
214 206
215 e5App().getObject("Project").projectOpened.connect( 207 ericApp().getObject("Project").projectOpened.connect(
216 self.__projectOpened) 208 self.__projectOpened)
217 e5App().getObject("Project").projectClosed.connect( 209 ericApp().getObject("Project").projectClosed.connect(
218 self.__projectClosed) 210 self.__projectClosed)
219 e5App().getObject("Project").newProject.connect( 211 ericApp().getObject("Project").newProject.connect(
220 self.__projectOpened) 212 self.__projectOpened)
221 213
222 e5App().getObject("Project").projectOpenedHooks.connect( 214 ericApp().getObject("Project").projectOpenedHooks.connect(
223 self.__object.projectOpenedHooks) 215 self.__object.projectOpenedHooks)
224 e5App().getObject("Project").projectClosedHooks.connect( 216 ericApp().getObject("Project").projectClosedHooks.connect(
225 self.__object.projectClosedHooks) 217 self.__object.projectClosedHooks)
226 e5App().getObject("Project").newProjectHooks.connect( 218 ericApp().getObject("Project").newProjectHooks.connect(
227 self.__object.projectOpenedHooks) 219 self.__object.projectOpenedHooks)
228 220
229 return None, True 221 return None, True
230 222
231 def deactivate(self): 223 def deactivate(self):
232 """ 224 """
233 Public method to deactivate this plugin. 225 Public method to deactivate this plugin.
234 """ 226 """
235 e5App().unregisterPluginObject("ProjectFlask") 227 ericApp().unregisterPluginObject("ProjectFlask")
236 228
237 e5App().getObject("Project").projectOpened.disconnect( 229 ericApp().getObject("Project").projectOpened.disconnect(
238 self.__projectOpened) 230 self.__projectOpened)
239 e5App().getObject("Project").projectClosed.disconnect( 231 ericApp().getObject("Project").projectClosed.disconnect(
240 self.__projectClosed) 232 self.__projectClosed)
241 e5App().getObject("Project").newProject.disconnect( 233 ericApp().getObject("Project").newProject.disconnect(
242 self.__projectOpened) 234 self.__projectOpened)
243 235
244 e5App().getObject("Project").projectOpenedHooks.disconnect( 236 ericApp().getObject("Project").projectOpenedHooks.disconnect(
245 self.__object.projectOpenedHooks) 237 self.__object.projectOpenedHooks)
246 e5App().getObject("Project").projectClosedHooks.disconnect( 238 ericApp().getObject("Project").projectClosedHooks.disconnect(
247 self.__object.projectClosedHooks) 239 self.__object.projectClosedHooks)
248 e5App().getObject("Project").newProjectHooks.disconnect( 240 ericApp().getObject("Project").newProjectHooks.disconnect(
249 self.__object.projectOpenedHooks) 241 self.__object.projectOpenedHooks)
250 242
251 self.__e5project.unregisterProjectType("Flask") 243 self.__ericProject.unregisterProjectType("Flask")
252 244
253 self.__object.projectClosedHooks() 245 self.__object.projectClosedHooks()
254 self.__projectClosed() 246 self.__projectClosed()
255 247
256 self.__initialize() 248 self.__initialize()
267 translation = "flask_{0}".format(loc) 259 translation = "flask_{0}".format(loc)
268 translator = QTranslator(None) 260 translator = QTranslator(None)
269 loaded = translator.load(translation, locale_dir) 261 loaded = translator.load(translation, locale_dir)
270 if loaded: 262 if loaded:
271 self.__translator = translator 263 self.__translator = translator
272 e5App().installTranslator(self.__translator) 264 ericApp().installTranslator(self.__translator)
273 else: 265 else:
274 print("Warning: translation file '{0}' could not be" 266 print("Warning: translation file '{0}' could not be"
275 " loaded.".format(translation)) 267 " loaded.".format(translation))
276 print("Using default.") 268 print("Using default.")
277 269
278 def __projectOpened(self): 270 def __projectOpened(self):
279 """ 271 """
280 Private slot to handle the projectOpened signal. 272 Private slot to handle the projectOpened signal.
281 """ 273 """
282 if self.__e5project.getProjectType() == "Flask": 274 if self.__ericProject.getProjectType() == "Flask":
283 projectToolsMenu = self.__ui.getMenu("project_tools") 275 projectToolsMenu = self.__ui.getMenu("project_tools")
284 if projectToolsMenu is not None: 276 insertBeforeAct = projectToolsMenu.actions()[0]
285 insertBeforeAct = projectToolsMenu.actions()[0] 277 self.__mainAct = projectToolsMenu.insertMenu(
286 self.__mainAct = projectToolsMenu.insertMenu( 278 insertBeforeAct, self.__mainMenu)
287 insertBeforeAct, self.__mainMenu) 279 self.__separatorAct = projectToolsMenu.insertSeparator(
288 self.__separatorAct = projectToolsMenu.insertSeparator( 280 insertBeforeAct)
289 insertBeforeAct)
290 else:
291 projectAct = self.__ui.getMenuBarAction("project")
292 actions = self.__ui.menuBar().actions()
293 insertBeforeAct = actions[actions.index(projectAct) + 1]
294 self.__mainAct = self.__ui.menuBar().insertMenu(
295 insertBeforeAct, self.__mainMenu)
296 281
297 def __projectClosed(self): 282 def __projectClosed(self):
298 """ 283 """
299 Private slot to handle the projectClosed signal. 284 Private slot to handle the projectClosed signal.
300 """ 285 """
301 if self.__mainAct is not None: 286 if self.__mainAct is not None:
302 projectToolsMenu = self.__ui.getMenu("project_tools") 287 projectToolsMenu = self.__ui.getMenu("project_tools")
303 if projectToolsMenu is not None: 288 projectToolsMenu.removeAction(self.__separatorAct)
304 projectToolsMenu.removeAction(self.__separatorAct) 289 projectToolsMenu.removeAction(self.__mainAct)
305 projectToolsMenu.removeAction(self.__mainAct) 290 self.__mainAct = None
306 self.__mainAct = None 291 self.__separatorAct = None
307 self.__separatorAct = None
308 else:
309 self.__ui.menuBar().removeAction(self.__mainAct)
310 self.__mainAct = None
311 self.__object.projectClosed() 292 self.__object.projectClosed()
312 293
313 def fileTypesCallback(self): 294 def fileTypesCallback(self):
314 """ 295 """
315 Public method get the filetype associations of the Django project type. 296 Public method get the filetype associations of the Django project type.
323 "*.html": "FORMS", 304 "*.html": "FORMS",
324 "*.htm": "FORMS", 305 "*.htm": "FORMS",
325 "*.pot": "TRANSLATIONS", 306 "*.pot": "TRANSLATIONS",
326 "*.po": "TRANSLATIONS", 307 "*.po": "TRANSLATIONS",
327 "*.mo": "TRANSLATIONS", } 308 "*.mo": "TRANSLATIONS", }
328 if self.__e5project.getProjectType() == "Flask" else 309 if self.__ericProject.getProjectType() == "Flask" else
329 {} 310 {}
330 ) 311 )
331 return fileTypes 312 return fileTypes
332 313
333 def lexerAssociationCallback(self, filename): 314 def lexerAssociationCallback(self, filename):
409 Private method to re-register the project type. 390 Private method to re-register the project type.
410 """ 391 """
411 supportedVariants = self.__object.supportedPythonVariants() 392 supportedVariants = self.__object.supportedPythonVariants()
412 if supportedVariants != self.__supportedVariants: 393 if supportedVariants != self.__supportedVariants:
413 # step 1: unregister 394 # step 1: unregister
414 self.__e5project.unregisterProjectType("Flask") 395 self.__ericProject.unregisterProjectType("Flask")
415 396
416 # step 2: register again with new language settings 397 # step 2: register again with new language settings
417 self.__supportedVariants = supportedVariants 398 self.__supportedVariants = supportedVariants
418 if self.__supportedVariants: 399 if self.__supportedVariants:
419 self.__e5project.registerProjectType( 400 self.__ericProject.registerProjectType(
420 "Flask", 401 "Flask",
421 self.tr("Flask"), self.fileTypesCallback, 402 self.tr("Flask"), self.fileTypesCallback,
422 lexerAssociationCallback=self.lexerAssociationCallback, 403 lexerAssociationCallback=self.lexerAssociationCallback,
423 binaryTranslationsCallback=self.binaryTranslationsCallback, 404 binaryTranslationsCallback=self.binaryTranslationsCallback,
424 progLanguages=self.__supportedVariants[:]) 405 progLanguages=self.__supportedVariants[:])

eric ide

mercurial