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 "ProjectDjango", "APIs") |
56 "ProjectDjango", "APIs") |
55 apis = glob.glob(os.path.join(apisDir, '*.api')) |
57 apis = glob.glob(os.path.join(apisDir, '*.api')) |
74 def getConfigData(): |
78 def getConfigData(): |
75 """ |
79 """ |
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 """ |
83 @rtype dict |
80 try: |
84 """ |
81 usesDarkPalette = e5App().usesDarkPalette() |
85 usesDarkPalette = ericApp().usesDarkPalette() |
82 except AttributeError: |
|
83 from PyQt5.QtGui import QPalette |
|
84 palette = e5App().palette() |
|
85 lightness = palette.color(QPalette.Window).lightness() |
|
86 usesDarkPalette = lightness <= 128 |
|
87 iconSuffix = "dark" if usesDarkPalette else "light" |
86 iconSuffix = "dark" if usesDarkPalette else "light" |
88 |
87 |
89 return { |
88 return { |
90 "djangoPage": [ |
89 "djangoPage": [ |
91 QCoreApplication.translate("ProjectDjangoPlugin", "Django"), |
90 QCoreApplication.translate("ProjectDjangoPlugin", "Django"), |
172 |
169 |
173 self.__mainMenu = None |
170 self.__mainMenu = None |
174 self.__mainAct = None |
171 self.__mainAct = None |
175 self.__separatorAct = None |
172 self.__separatorAct = None |
176 |
173 |
177 self.__e5project = e5App().getObject("Project") |
174 self.__ericProject = ericApp().getObject("Project") |
178 |
175 |
179 self.__supportedVariants = [] |
176 self.__supportedVariants = [] |
180 |
177 |
181 def activate(self): |
178 def activate(self): |
182 """ |
179 """ |
183 Public method to activate this plugin. |
180 Public method to activate this plugin. |
184 |
181 |
185 @return tuple of None and activation status (boolean) |
182 @return tuple of None and activation status |
|
183 @rtype bool |
186 """ |
184 """ |
187 global djangoPluginObject |
185 global djangoPluginObject |
188 djangoPluginObject = self |
186 djangoPluginObject = self |
189 |
187 |
190 try: |
188 usesDarkPalette = ericApp().usesDarkPalette() |
191 usesDarkPalette = e5App().usesDarkPalette() |
|
192 except AttributeError: |
|
193 from PyQt5.QtGui import QPalette |
|
194 palette = e5App().palette() |
|
195 lightness = palette.color(QPalette.Window).lightness() |
|
196 usesDarkPalette = lightness <= 128 |
|
197 iconSuffix = "dark" if usesDarkPalette else "light" |
189 iconSuffix = "dark" if usesDarkPalette else "light" |
198 |
190 |
199 self.__object = Project(self, iconSuffix, self.__ui) |
191 self.__object = Project(self, iconSuffix, self.__ui) |
200 self.__object.initActions() |
192 self.__object.initActions() |
201 e5App().registerPluginObject("ProjectDjango", self.__object) |
193 ericApp().registerPluginObject("ProjectDjango", self.__object) |
202 |
194 |
203 self.__mainMenu = self.__object.initMenu() |
195 self.__mainMenu = self.__object.initMenu() |
204 |
196 |
205 self.__supportedVariants = self.__object.supportedPythonVariants() |
197 self.__supportedVariants = self.__object.supportedPythonVariants() |
206 |
198 |
207 if self.__supportedVariants: |
199 if self.__supportedVariants: |
208 self.__e5project.registerProjectType( |
200 self.__ericProject.registerProjectType( |
209 "Django", self.tr("Django"), |
201 "Django", self.tr("Django"), |
210 self.fileTypesCallback, |
202 self.fileTypesCallback, |
211 lexerAssociationCallback=self.lexerAssociationCallback, |
203 lexerAssociationCallback=self.lexerAssociationCallback, |
212 binaryTranslationsCallback=self.binaryTranslationsCallback, |
204 binaryTranslationsCallback=self.binaryTranslationsCallback, |
213 progLanguages=self.__supportedVariants[:]) |
205 progLanguages=self.__supportedVariants[:]) |
220 "Django", |
212 "Django", |
221 SourcesBrowserFlag | FormsBrowserFlag | |
213 SourcesBrowserFlag | FormsBrowserFlag | |
222 TranslationsBrowserFlag | OthersBrowserFlag, |
214 TranslationsBrowserFlag | OthersBrowserFlag, |
223 ) |
215 ) |
224 |
216 |
225 if self.__e5project.isOpen(): |
217 if self.__ericProject.isOpen(): |
226 self.__projectOpened() |
218 self.__projectOpened() |
227 self.__object.projectOpenedHooks() |
219 self.__object.projectOpenedHooks() |
228 |
220 |
229 e5App().getObject("Project").projectOpened.connect( |
221 ericApp().getObject("Project").projectOpened.connect( |
230 self.__projectOpened) |
222 self.__projectOpened) |
231 e5App().getObject("Project").projectClosed.connect( |
223 ericApp().getObject("Project").projectClosed.connect( |
232 self.__projectClosed) |
224 self.__projectClosed) |
233 e5App().getObject("Project").newProject.connect( |
225 ericApp().getObject("Project").newProject.connect( |
234 self.__projectOpened) |
226 self.__projectOpened) |
235 |
227 |
236 e5App().getObject("Project").projectOpenedHooks.connect( |
228 ericApp().getObject("Project").projectOpenedHooks.connect( |
237 self.__object.projectOpenedHooks) |
229 self.__object.projectOpenedHooks) |
238 e5App().getObject("Project").projectClosedHooks.connect( |
230 ericApp().getObject("Project").projectClosedHooks.connect( |
239 self.__object.projectClosedHooks) |
231 self.__object.projectClosedHooks) |
240 e5App().getObject("Project").newProjectHooks.connect( |
232 ericApp().getObject("Project").newProjectHooks.connect( |
241 self.__object.projectOpenedHooks) |
233 self.__object.projectOpenedHooks) |
242 |
234 |
243 e5App().getObject("Project").projectAboutToBeCreated.connect( |
235 ericApp().getObject("Project").projectAboutToBeCreated.connect( |
244 self.__object.startProjectOrApplication) |
236 self.__object.startProjectOrApplication) |
245 e5App().getObject("Project").newProject.connect( |
237 ericApp().getObject("Project").newProject.connect( |
246 self.__object.newProjectCreated) |
238 self.__object.newProjectCreated) |
247 |
239 |
248 return None, True |
240 return None, True |
249 |
241 |
250 def deactivate(self): |
242 def deactivate(self): |
251 """ |
243 """ |
252 Public method to deactivate this plugin. |
244 Public method to deactivate this plugin. |
253 """ |
245 """ |
254 e5App().unregisterPluginObject("ProjectDjango") |
246 ericApp().unregisterPluginObject("ProjectDjango") |
255 |
247 |
256 e5App().getObject("Project").projectOpened.disconnect( |
248 ericApp().getObject("Project").projectOpened.disconnect( |
257 self.__projectOpened) |
249 self.__projectOpened) |
258 e5App().getObject("Project").projectClosed.disconnect( |
250 ericApp().getObject("Project").projectClosed.disconnect( |
259 self.__projectClosed) |
251 self.__projectClosed) |
260 e5App().getObject("Project").newProject.disconnect( |
252 ericApp().getObject("Project").newProject.disconnect( |
261 self.__projectOpened) |
253 self.__projectOpened) |
262 |
254 |
263 e5App().getObject("Project").projectOpenedHooks.disconnect( |
255 ericApp().getObject("Project").projectOpenedHooks.disconnect( |
264 self.__object.projectOpenedHooks) |
256 self.__object.projectOpenedHooks) |
265 e5App().getObject("Project").projectClosedHooks.disconnect( |
257 ericApp().getObject("Project").projectClosedHooks.disconnect( |
266 self.__object.projectClosedHooks) |
258 self.__object.projectClosedHooks) |
267 e5App().getObject("Project").newProjectHooks.disconnect( |
259 ericApp().getObject("Project").newProjectHooks.disconnect( |
268 self.__object.projectOpenedHooks) |
260 self.__object.projectOpenedHooks) |
269 |
261 |
270 e5App().getObject("Project").projectAboutToBeCreated.disconnect( |
262 ericApp().getObject("Project").projectAboutToBeCreated.disconnect( |
271 self.__object.startProjectOrApplication) |
263 self.__object.startProjectOrApplication) |
272 e5App().getObject("Project").newProject.disconnect( |
264 ericApp().getObject("Project").newProject.disconnect( |
273 self.__object.newProjectCreated) |
265 self.__object.newProjectCreated) |
274 |
266 |
275 self.__e5project.unregisterProjectType("Django") |
267 self.__ericProject.unregisterProjectType("Django") |
276 |
268 |
277 self.__object.projectClosedHooks() |
269 self.__object.projectClosedHooks() |
278 self.__projectClosed() |
270 self.__projectClosed() |
279 |
271 |
280 self.__initialize() |
272 self.__initialize() |
291 translation = "django_{0}".format(loc) |
283 translation = "django_{0}".format(loc) |
292 translator = QTranslator(None) |
284 translator = QTranslator(None) |
293 loaded = translator.load(translation, locale_dir) |
285 loaded = translator.load(translation, locale_dir) |
294 if loaded: |
286 if loaded: |
295 self.__translator = translator |
287 self.__translator = translator |
296 e5App().installTranslator(self.__translator) |
288 ericApp().installTranslator(self.__translator) |
297 else: |
289 else: |
298 print("Warning: translation file '{0}' could not be" |
290 print("Warning: translation file '{0}' could not be" |
299 " loaded.".format(translation)) |
291 " loaded.".format(translation)) |
300 print("Using default.") |
292 print("Using default.") |
301 |
293 |
302 def __projectOpened(self): |
294 def __projectOpened(self): |
303 """ |
295 """ |
304 Private slot to handle the projectOpened signal. |
296 Private slot to handle the projectOpened signal. |
305 """ |
297 """ |
306 if self.__e5project.getProjectType() == "Django": |
298 if self.__ericProject.getProjectType() == "Django": |
307 projectToolsMenu = self.__ui.getMenu("project_tools") |
299 projectToolsMenu = self.__ui.getMenu("project_tools") |
308 if projectToolsMenu is not None: |
300 insertBeforeAct = projectToolsMenu.actions()[0] |
309 insertBeforeAct = projectToolsMenu.actions()[0] |
301 self.__mainAct = projectToolsMenu.insertMenu( |
310 self.__mainAct = projectToolsMenu.insertMenu( |
302 insertBeforeAct, self.__mainMenu) |
311 insertBeforeAct, self.__mainMenu) |
303 self.__separatorAct = projectToolsMenu.insertSeparator( |
312 self.__separatorAct = projectToolsMenu.insertSeparator( |
304 insertBeforeAct) |
313 insertBeforeAct) |
|
314 else: |
|
315 projectAct = self.__ui.getMenuBarAction("project") |
|
316 actions = self.__ui.menuBar().actions() |
|
317 insertBeforeAct = actions[actions.index(projectAct) + 1] |
|
318 self.__mainAct = self.__ui.menuBar().insertMenu( |
|
319 insertBeforeAct, self.__mainMenu) |
|
320 |
305 |
321 def __projectClosed(self): |
306 def __projectClosed(self): |
322 """ |
307 """ |
323 Private slot to handle the projectClosed signal. |
308 Private slot to handle the projectClosed signal. |
324 """ |
309 """ |
325 if self.__mainAct is not None: |
310 if self.__mainAct is not None: |
326 projectToolsMenu = self.__ui.getMenu("project_tools") |
311 projectToolsMenu = self.__ui.getMenu("project_tools") |
327 if projectToolsMenu is not None: |
312 projectToolsMenu.removeAction(self.__separatorAct) |
328 projectToolsMenu.removeAction(self.__separatorAct) |
313 projectToolsMenu.removeAction(self.__mainAct) |
329 projectToolsMenu.removeAction(self.__mainAct) |
314 self.__mainAct = None |
330 self.__mainAct = None |
315 self.__separatorAct = None |
331 self.__separatorAct = None |
|
332 else: |
|
333 self.__ui.menuBar().removeAction(self.__mainAct) |
|
334 self.__mainAct = None |
|
335 self.__object.projectClosed() |
316 self.__object.projectClosed() |
336 |
317 |
337 def fileTypesCallback(self): |
318 def fileTypesCallback(self): |
338 """ |
319 """ |
339 Public method get the filetype associations of the Django project type. |
320 Public method get the filetype associations of the Django project type. |
340 |
321 |
341 @return dictionary with file type associations |
322 @return dictionary with file type associations |
|
323 @rtype dict |
342 """ |
324 """ |
343 fileTypes = ( |
325 fileTypes = ( |
344 { |
326 { |
345 "*.html": "FORMS", |
327 "*.html": "FORMS", |
346 "*.htm": "FORMS", |
328 "*.htm": "FORMS", |
348 "*.pot": "TRANSLATIONS", |
330 "*.pot": "TRANSLATIONS", |
349 "*.po": "TRANSLATIONS", |
331 "*.po": "TRANSLATIONS", |
350 "*.mo": "TRANSLATIONS", |
332 "*.mo": "TRANSLATIONS", |
351 "*.py": "SOURCES", |
333 "*.py": "SOURCES", |
352 } |
334 } |
353 if self.__e5project.getProjectType() == "Django" else |
335 if self.__ericProject.getProjectType() == "Django" else |
354 {} |
336 {} |
355 ) |
337 ) |
356 return fileTypes |
338 return fileTypes |
357 |
339 |
358 def lexerAssociationCallback(self, filename): |
340 def lexerAssociationCallback(self, filename): |
359 """ |
341 """ |
360 Public method to get the lexer association of the Django project type |
342 Public method to get the lexer association of the Django project type |
361 for a file. |
343 for a file. |
362 |
344 |
363 @param filename name of the file (string) |
345 @param filename name of the file |
364 @return name of the lexer (string) (Pygments lexers are prefixed with |
346 @type str |
|
347 @return name of the lexer (Pygments lexers are prefixed with |
365 'Pygments|') |
348 'Pygments|') |
|
349 @rtype str |
366 """ |
350 """ |
367 for pattern, language in self.lexerAssociations.items(): |
351 for pattern, language in self.lexerAssociations.items(): |
368 if fnmatch.fnmatch(filename, pattern): |
352 if fnmatch.fnmatch(filename, pattern): |
369 return language |
353 return language |
370 |
354 |
373 def binaryTranslationsCallback(self, filename): |
357 def binaryTranslationsCallback(self, filename): |
374 """ |
358 """ |
375 Public method to determine the filename of a compiled translation file |
359 Public method to determine the filename of a compiled translation file |
376 given the translation source file. |
360 given the translation source file. |
377 |
361 |
378 @param filename name of the translation source file (string) |
362 @param filename name of the translation source file |
379 @return name of the binary translation file (string) |
363 @type str |
|
364 @return name of the binary translation file |
|
365 @rtype str |
380 """ |
366 """ |
381 if filename.endswith(".po"): |
367 if filename.endswith(".po"): |
382 filename = filename.replace(".po", ".mo") |
368 filename = filename.replace(".po", ".mo") |
383 return filename |
369 return filename |
384 |
370 |
385 def getPreferences(self, key): |
371 def getPreferences(self, key): |
386 """ |
372 """ |
387 Public method to retrieve the various settings. |
373 Public method to retrieve the various settings. |
388 |
374 |
389 @param key the key of the value to get |
375 @param key the key of the value to get |
390 @return the requested setting |
376 @type str |
|
377 @return value of the requested setting |
|
378 @rtype Any |
391 """ |
379 """ |
392 if key in ["RecentNumberApps", "RecentNumberTestData"]: |
380 if key in ["RecentNumberApps", "RecentNumberTestData"]: |
393 return int(Preferences.Prefs.settings.value( |
381 return int(Preferences.Prefs.settings.value( |
394 self.PreferencesKey + "/" + key, self.__defaults[key])) |
382 self.PreferencesKey + "/" + key, self.__defaults[key])) |
395 elif key in ["UseIPv6", "UseThreading", |
383 elif key in ["UseIPv6", "UseThreading", |
403 |
391 |
404 def setPreferences(self, key, value): |
392 def setPreferences(self, key, value): |
405 """ |
393 """ |
406 Public method to store the various settings. |
394 Public method to store the various settings. |
407 |
395 |
408 @param key the key of the setting to be set (string) |
396 @param key the key of the setting to be set |
409 @param value the value to be set |
397 @type str |
|
398 @param value value to be set |
|
399 @type Any |
410 """ |
400 """ |
411 Preferences.Prefs.settings.setValue( |
401 Preferences.Prefs.settings.setValue( |
412 self.PreferencesKey + "/" + key, value) |
402 self.PreferencesKey + "/" + key, value) |
413 |
403 |
414 if key in ["VirtualEnvironmentPy3", "VirtualEnvironmentNamePy3"]: |
404 if key in ["VirtualEnvironmentNamePy3"]: |
415 self.__reregisterProjectType() |
405 self.__reregisterProjectType() |
416 elif key == "TranslationsEditor" and self.__object: |
406 elif key == "TranslationsEditor" and self.__object: |
417 self.__object.registerOpenHook() |
407 self.__object.registerOpenHook() |
418 |
408 |
419 def __reregisterProjectType(self): |
409 def __reregisterProjectType(self): |
421 Private method to re-register the project type. |
411 Private method to re-register the project type. |
422 """ |
412 """ |
423 supportedVariants = self.__object.supportedPythonVariants() |
413 supportedVariants = self.__object.supportedPythonVariants() |
424 if supportedVariants != self.__supportedVariants: |
414 if supportedVariants != self.__supportedVariants: |
425 # step 1: unregister |
415 # step 1: unregister |
426 self.__e5project.unregisterProjectType("Django") |
416 self.__ericProject.unregisterProjectType("Django") |
427 |
417 |
428 # step 2: register again with new language settings |
418 # step 2: register again with new language settings |
429 self.__supportedVariants = supportedVariants |
419 self.__supportedVariants = supportedVariants |
430 if self.__supportedVariants: |
420 if self.__supportedVariants: |
431 self.__e5project.registerProjectType( |
421 self.__ericProject.registerProjectType( |
432 "Django", self.tr("Django"), |
422 "Django", self.tr("Django"), |
433 self.fileTypesCallback, |
423 self.fileTypesCallback, |
434 lexerAssociationCallback=self.lexerAssociationCallback, |
424 lexerAssociationCallback=self.lexerAssociationCallback, |
435 binaryTranslationsCallback=self.binaryTranslationsCallback, |
425 binaryTranslationsCallback=self.binaryTranslationsCallback, |
436 progLanguages=self.__supportedVariants[:]) |
426 progLanguages=self.__supportedVariants[:]) |