Sat, 26 Apr 2014 15:53:13 +0200
Released as stable.
# -*- coding: utf-8 -*- # Copyright (c) 2013 - 2014 Detlev Offenbach <detlev@die-offenbachs.de> # """ Module implementing the PySide to PyQt4 (and vice versa) plug-in. """ from __future__ import unicode_literals import os from PyQt4.QtCore import QObject, QTranslator from E5Gui.E5Application import e5App # Start-Of-Header name = "PySide to PyQt4 (and vice versa) Plug-in" author = "Detlev Offenbach <detlev@die-offenbachs.de>" autoactivate = True deactivateable = True version = "1.0.0" className = "PySide2PyQtPlugin" packageName = "PySide2PyQt" shortDescription = "Convert PySide file to PyQt4 and vice versa" longDescription = \ """This plug-in implements a tool to convert a PySide file""" \ """ to PyQt4 and vice versa. It works with the text of the""" \ """ current editor.""" needsRestart = False pyqtApi = 2 python2Compatible = True # End-Of-Header error = "" class PySide2PyQtPlugin(QObject): """ Class implementing the PySide to PyQt4 (and vice versa) plugin. """ def __init__(self, ui): """ Constructor @param ui reference to the user interface object (UI.UserInterface) """ QObject.__init__(self, ui) self.__ui = ui self.__translator = None self.__loadTranslator() self.__editors = {} def activate(self): """ Public method to activate this plugin. @return tuple of None and activation status (boolean) """ global error error = "" # clear previous error self.__ui.showMenu.connect(self.__populateMenu) e5App().getObject("ViewManager").editorOpenedEd.connect( self.__editorOpened) e5App().getObject("ViewManager").editorClosedEd.connect( self.__editorClosed) for editor in e5App().getObject("ViewManager").getOpenEditors(): self.__editorOpened(editor) return None, True def deactivate(self): """ Public method to deactivate this plugin. """ self.__ui.showMenu.disconnect(self.__populateMenu) e5App().getObject("ViewManager").editorOpenedEd.disconnect( self.__editorOpened) e5App().getObject("ViewManager").editorClosedEd.disconnect( self.__editorClosed) for editor, acts in self.__editors.items(): menu = editor.getMenu("Tools") if menu is not None: for act in acts: menu.removeAction(act) self.__editors = {} def __loadTranslator(self): """ Private method to load the translation file. """ if self.__ui is not None: loc = self.__ui.getLocale() if loc and loc != "C": locale_dir = os.path.join( os.path.dirname(__file__), "PySide2PyQt", "i18n") translation = "pyside2pyqt_{0}".format(loc) translator = QTranslator(None) loaded = translator.load(translation, locale_dir) if loaded: self.__translator = translator e5App().installTranslator(self.__translator) else: print("Warning: translation file '{0}' could not be" " loaded.".format(translation)) print("Using default.") def __populateMenu(self, name, menu): """ Private slot to populate the tools menu with our entries. @param name name of the menu (string) @param menu reference to the menu to be populated (QMenu) """ if name != "Tools": return editor = e5App().getObject("ViewManager").activeWindow() if not menu.isEmpty(): menu.addSeparator() menu.addAction(self.tr("PySide to PyQt4"), self.__pyside2Pyqt)\ .setEnabled(editor is not None) menu.addAction(self.tr("PyQt4 to PySide"), self.__pyqt2Pyside)\ .setEnabled(editor is not None) def __editorOpened(self, editor): """ Private slot called, when a new editor was opened. @param editor reference to the new editor (QScintilla.Editor) """ menu = editor.getMenu("Tools") if menu is not None: self.__editors[editor] = [] if not menu.isEmpty(): act = menu.addSeparator() self.__editors[editor].append(act) act = menu.addAction(self.tr("PySide to PyQt4"), self.__pyside2Pyqt) self.__editors[editor].append(act) act = menu.addAction(self.tr("PyQt4 to PySide"), self.__pyqt2Pyside) self.__editors[editor].append(act) def __editorClosed(self, editor): """ Private slot called, when an editor was closed. @param editor reference to the editor (QScintilla.Editor) """ try: del self.__editors[editor] except KeyError: pass def __pyside2Pyqt(self): """ Private slot to convert the code of the current editor from PySide to PyQt4. """ editor = e5App().getObject("ViewManager").activeWindow() if editor is None: return text = editor.text() newText = (text .replace("PySide", "PyQt4") .replace("Signal", "pyqtSignal") .replace("Slot", "pyqtSlot") .replace("Property", "pyqtProperty") .replace("pyside-uic", "pyuic4") .replace("pyside-rcc", "pyrcc4") .replace("pyside-lupdate", "pylupdate4") ) if newText != text: editor.beginUndoAction() editor.selectAll() editor.replaceSelectedText(newText) editor.endUndoAction() def __pyqt2Pyside(self): """ Private slot to convert the code of the current editor from PyQt4 to PySide. """ editor = e5App().getObject("ViewManager").activeWindow() if editor is None: return text = editor.text() newText = (text .replace("PyQt4", "PySide") .replace("pyqtSignal", "Signal") .replace("pyqtSlot", "Slot") .replace("pyqtProperty", "Property") .replace("pyuic4", "pyside-uic") .replace("pyrcc4", "pyside-rcc") .replace("pylupdate4", "pyside-lupdate") ) if newText != text: editor.beginUndoAction() editor.selectAll() editor.replaceSelectedText(newText) editor.endUndoAction()