def __registerDocumentations(self, fileNames):
        """
        Private method to register a given list of documentations.
        
        @param fileNames list of documentation files to be registered
        @type list of str
        """
        for fileName in fileNames:
            ns = QHelpEngineCore.namespaceName(fileName)
            if not ns:
                E5MessageBox.warning(
                    self, self.tr("Add Documentation"),
                    self.tr("""The file <b>{0}</b> is not a valid"""
                            """ Qt Help File.""").format(fileName))
                continue

            if len(self.documentsList.findItems(ns, Qt.MatchFixedString)):
                E5MessageBox.warning(
                    self, self.tr("Add Documentation"),
                    self.tr(
                        """The namespace <b>{0}</b> is already registered.""").
                    format(ns))
                continue

            self.__engine.registerDocumentation(fileName)
            self.documentsList.addItem(ns)
            self.__registeredDocs.append(ns)
            if ns in self.__unregisteredDocs:
                self.__unregisteredDocs.remove(ns)

        self.__initFiltersTab()
示例#2
0
    def __installEric6Doc(self, engine):
        """
        Private method to install/update the eric6 help documentation.
        
        @param engine reference to the help engine (QHelpEngineCore)
        @return flag indicating success (boolean)
        """
        versionKey = "eric6_ide"
        info = engine.customValue(versionKey, "")
        lst = info.split('|')

        dt = QDateTime()
        if len(lst) and lst[0]:
            dt = QDateTime.fromString(lst[0], Qt.ISODate)

        qchFile = ""
        if len(lst) == 2:
            qchFile = lst[1]

        docsPath = QDir(getConfig("ericDocDir") + QDir.separator() + "Help")

        files = docsPath.entryList(["*.qch"])
        if not files:
            engine.setCustomValue(versionKey,
                                  QDateTime().toString(Qt.ISODate) + '|')
            return False

        for f in files:
            if f == "source.qch":
                fi = QFileInfo(docsPath.absolutePath() + QDir.separator() + f)
                namespace = QHelpEngineCore.namespaceName(
                    fi.absoluteFilePath())
                if not namespace:
                    continue

                if (dt.isValid()
                        and namespace in engine.registeredDocumentations()
                        and (fi.lastModified().toString(Qt.ISODate)
                             == dt.toString(Qt.ISODate))
                        and qchFile == fi.absoluteFilePath()):
                    return False

                if namespace in engine.registeredDocumentations():
                    engine.unregisterDocumentation(namespace)

                if not engine.registerDocumentation(fi.absoluteFilePath()):
                    self.errorMessage.emit(
                        self.tr(
                            """<p>The file <b>{0}</b> could not be"""
                            """ registered. <br/>Reason: {1}</p>""").format(
                                fi.absoluteFilePath, engine.error()))
                    return False

                engine.setCustomValue(
                    versionKey,
                    fi.lastModified().toString(Qt.ISODate) + '|' +
                    fi.absoluteFilePath())
                return True

        return False
    def on_addButton_clicked(self):
        """
        Private slot to add documents to the help database.
        """
        fileNames = E5FileDialog.getOpenFileNames(
            self, self.tr("Add Documentation"), "",
            self.tr("Qt Compressed Help Files (*.qch)"))
        if not fileNames:
            return

        for fileName in fileNames:
            ns = QHelpEngineCore.namespaceName(fileName)
            if not ns:
                E5MessageBox.warning(
                    self, self.tr("Add Documentation"),
                    self.tr("""The file <b>{0}</b> is not a valid"""
                            """ Qt Help File.""").format(fileName))
                continue

            if len(self.documentsList.findItems(ns, Qt.MatchFixedString)):
                E5MessageBox.warning(
                    self, self.tr("Add Documentation"),
                    self.tr(
                        """The namespace <b>{0}</b> is already registered.""").
                    format(ns))
                continue

            self.__engine.registerDocumentation(fileName)
            self.documentsList.addItem(ns)
            self.__registeredDocs.append(ns)
            if ns in self.__unregisteredDocs:
                self.__unregisteredDocs.remove(ns)
示例#4
0
 def __installEric6Doc(self, engine):
     """
     Private method to install/update the eric6 help documentation.
     
     @param engine reference to the help engine (QHelpEngineCore)
     @return flag indicating success (boolean)
     """
     versionKey = "eric6_ide"
     info = engine.customValue(versionKey, "")
     lst = info.split('|')
     
     dt = QDateTime()
     if len(lst) and lst[0]:
         dt = QDateTime.fromString(lst[0], Qt.ISODate)
     
     qchFile = ""
     if len(lst) == 2:
         qchFile = lst[1]
     
     docsPath = QDir(getConfig("ericDocDir") + QDir.separator() + "Help")
     
     files = docsPath.entryList(["*.qch"])
     if not files:
         engine.setCustomValue(
             versionKey, QDateTime().toString(Qt.ISODate) + '|')
         return False
     
     for f in files:
         if f == "source.qch":
             fi = QFileInfo(docsPath.absolutePath() + QDir.separator() + f)
             if dt.isValid() and \
                fi.lastModified().toString(Qt.ISODate) == \
                 dt.toString(Qt.ISODate) and \
                qchFile == fi.absoluteFilePath():
                 return False
             
             namespace = QHelpEngineCore.namespaceName(
                 fi.absoluteFilePath())
             if not namespace:
                 continue
             
             if namespace in engine.registeredDocumentations():
                 engine.unregisterDocumentation(namespace)
             
             if not engine.registerDocumentation(fi.absoluteFilePath()):
                 self.errorMessage.emit(
                     self.tr(
                         """<p>The file <b>{0}</b> could not be"""
                         """ registered. <br/>Reason: {1}</p>""")
                     .format(fi.absoluteFilePath, engine.error())
                 )
                 return False
             
             engine.setCustomValue(
                 versionKey,
                 fi.lastModified().toString(Qt.ISODate) + '|' +
                 fi.absoluteFilePath())
             return True
     
     return False
示例#5
0
    def run(self):
        """
        Public method executed by the thread.
        """
        engine = QHelpEngineCore(self.__collection)
        engine.setupData()
        changes = False

        qt4Docs = ["designer", "linguist", "qt"]
        qt5Docs = [
            "activeqt", "qdoc", "qmake", "qt3d", "qt3drenderer",
            "qtandroidextras", "qtassistant", "qtbluetooth", "qtcanvas3d",
            "qtconcurrent", "qtcore", "qtdbus", "qtdesigner", "qtdoc",
            "qtenginio", "qtenginiooverview", "qtenginoqml",
            "qtgraphicaleffects", "qtgui", "qthelp", "qtimageformats",
            "qtlabscontrols", "qtlinguist", "qtlocation", "qtmaxextras",
            "qtmultimedia", "qtmultimediawidgets", "qtnetwork", "qtnfc",
            "qtopengl", "qtplatformheaders", "qtpositioning", "qtprintsupport",
            "qtqml", "qtquick", "qtquickcontrols", "qtquickdialogs",
            "qtquickextras", "qtquicklayouts", "qtscript", "qtscripttools",
            "qtsensors", "qtserialbus", "qtserialport", "qtsql", "qtsvg",
            "qttestlib", "qtuitools", "qtwebchannel", "qtwebengine",
            "qtwebenginewidgets", "qtwebkit", "qtwebkitexamples",
            "qtwebsockets", "qtwebview", "qtwidgets", "qtwinextras",
            "qtx11extras", "qtxml", "qtxmlpatterns"
        ]
        for qtDocs, version in [(qt4Docs, 4), (qt5Docs, 5)]:
            for doc in qtDocs:
                changes |= self.__installQtDoc(doc, version, engine)
                self.__mutex.lock()
                if self.__abort:
                    engine = None
                    self.__mutex.unlock()
                    return
                self.__mutex.unlock()

        changes |= self.__installEric6Doc(engine)
        engine = None
        del engine
        self.docsInstalled.emit(changes)
示例#6
0
 def run(self):
     """
     Public method executed by the thread.
     """
     engine = QHelpEngineCore(self.__collection)
     engine.setupData()
     changes = False
     
     qt4Docs = ["designer", "linguist", "qt"]
     qt5Docs = [
         "activeqt", "qdoc", "qmake", "qt3d", "qt3drenderer",
         "qtandroidextras", "qtassistant", "qtbluetooth", "qtcanvas3d",
         "qtconcurrent", "qtcore", "qtdbus", "qtdesigner", "qtdoc",
         "qtenginio", "qtenginiooverview", "qtenginoqml",
         "qtgraphicaleffects", "qtgui", "qthelp", "qtimageformats",
         "qtlinguist", "qtlocation", "qtmaxextras", "qtmultimedia",
         "qtmultimediawidgets", "qtnetwork", "qtnfc", "qtopengl",
         "qtplatformheaders", "qtpositioning", "qtprintsupport", "qtqml",
         "qtquick", "qtquickcontrols", "qtquickdialogs", "qtquickextras",
         "qtquicklayouts", "qtscript", "qtscripttools", "qtsensors",
         "qtserialport", "qtsql", "qtsvg", "qttestlib", "qtuitools",
         "qtwebchannel", "qtwebengine", "qtwebenginewidgets", "qtwebkit",
         "qtwebkitexamples", "qtwebsockets", "qtwidgets", "qtwinextras",
         "qtx11extras", "qtxml", "qtxmlpatterns"]
     for qtDocs, version in [(qt4Docs, 4), (qt5Docs, 5)]:
         for doc in qtDocs:
             changes |= self.__installQtDoc(doc, version, engine)
             self.__mutex.lock()
             if self.__abort:
                 engine = None
                 self.__mutex.unlock()
                 return
             self.__mutex.unlock()
     
     changes |= self.__installEric6Doc(engine)
     engine = None
     del engine
     self.docsInstalled.emit(changes)
 def on_addButton_clicked(self):
     """
     Private slot to add documents to the help database.
     """
     fileNames = E5FileDialog.getOpenFileNames(
         self,
         self.tr("Add Documentation"),
         "",
         self.tr("Qt Compressed Help Files (*.qch)"))
     if not fileNames:
         return
     
     for fileName in fileNames:
         ns = QHelpEngineCore.namespaceName(fileName)
         if not ns:
             E5MessageBox.warning(
                 self,
                 self.tr("Add Documentation"),
                 self.tr(
                     """The file <b>{0}</b> is not a valid"""
                     """ Qt Help File.""").format(fileName)
             )
             continue
         
         if len(self.documentsList.findItems(ns, Qt.MatchFixedString)):
             E5MessageBox.warning(
                 self,
                 self.tr("Add Documentation"),
                 self.tr(
                     """The namespace <b>{0}</b> is already registered.""")
                 .format(ns)
             )
             continue
         
         self.__engine.registerDocumentation(fileName)
         self.documentsList.addItem(ns)
         self.__registeredDocs.append(ns)
         if ns in self.__unregisteredDocs:
             self.__unregisteredDocs.remove(ns)
    def __init__(self, engine, parent=None):
        """
        Constructor
        
        @param engine reference to the help engine (QHelpEngine)
        @param parent reference to the parent widget (QWidget)
        """
        super(QtHelpFiltersDialog, self).__init__(parent)
        self.setupUi(self)

        self.removeButton.setEnabled(False)
        self.removeAttributeButton.setEnabled(False)

        self.__engine = engine

        self.filtersList.clear()
        self.attributesList.clear()

        help = QHelpEngineCore(self.__engine.collectionFile())
        help.setupData()

        self.__removedFilters = []
        self.__filterMap = {}
        self.__filterMapBackup = {}
        self.__removedAttributes = []

        for filter in help.customFilters():
            atts = help.filterAttributes(filter)
            self.__filterMapBackup[filter] = atts
            if filter not in self.__filterMap:
                self.__filterMap[filter] = atts

        self.filtersList.addItems(sorted(self.__filterMap.keys()))
        for attr in help.filterAttributes():
            QTreeWidgetItem(self.attributesList, [attr])
        self.attributesList.sortItems(0, Qt.AscendingOrder)

        if self.__filterMap:
            self.filtersList.setCurrentRow(0)
示例#9
0
 def __init__(self, engine, parent=None):
     """
     Constructor
     
     @param engine reference to the help engine (QHelpEngine)
     @param parent reference to the parent widget (QWidget)
     """
     super(QtHelpFiltersDialog, self).__init__(parent)
     self.setupUi(self)
     
     self.removeButton.setEnabled(False)
     self.removeAttributeButton.setEnabled(False)
     
     self.__engine = engine
     
     self.filtersList.clear()
     self.attributesList.clear()
     
     help = QHelpEngineCore(self.__engine.collectionFile())
     help.setupData()
     
     self.__removedFilters = []
     self.__filterMap = {}
     self.__filterMapBackup = {}
     self.__removedAttributes = []
     
     for filter in help.customFilters():
         atts = help.filterAttributes(filter)
         self.__filterMapBackup[filter] = atts
         if filter not in self.__filterMap:
             self.__filterMap[filter] = atts
     
     self.filtersList.addItems(sorted(self.__filterMap.keys()))
     for attr in help.filterAttributes():
         QTreeWidgetItem(self.attributesList, [attr])
     self.attributesList.sortItems(0, Qt.AscendingOrder)
     
     if self.__filterMap:
         self.filtersList.setCurrentRow(0)
示例#10
0
    def __installQtDoc(self, name, version, engine):
        """
        Private method to install/update a Qt help document.
        
        @param name name of the Qt help document (string)
        @param version Qt version of the help documens (integer)
        @param engine reference to the help engine (QHelpEngineCore)
        @return flag indicating success (boolean)
        """
        versionKey = "qt_version_{0}@@{1}".format(version, name)
        info = engine.customValue(versionKey, "")
        lst = info.split('|')

        dt = QDateTime()
        if len(lst) and lst[0]:
            dt = QDateTime.fromString(lst[0], Qt.ISODate)

        qchFile = ""
        if len(lst) == 2:
            qchFile = lst[1]

        if version == 4:
            docsPath = QDir(
                QLibraryInfo.location(QLibraryInfo.DocumentationPath) +
                QDir.separator() + "qch")
        elif version == 5:
            docsPath = QLibraryInfo.location(QLibraryInfo.DocumentationPath)
            if (not os.path.isdir(docsPath)
                    or len(QDir(docsPath).entryList(["*.qch"])) == 0):
                # Qt installer is a bit buggy; it's missing a symbolic link
                docsPathList = QDir.fromNativeSeparators(docsPath).split("/")
                docsPath = os.sep.join(
                    docsPathList[:-3] +
                    ["Docs", "Qt-{0}.{1}".format(*qVersionTuple())])
            docsPath = QDir(docsPath)
        else:
            # unsupported Qt version
            return False

        files = docsPath.entryList(["*.qch"])
        if not files:
            engine.setCustomValue(versionKey,
                                  QDateTime().toString(Qt.ISODate) + '|')
            return False

        for f in files:
            if f.startswith(name + "."):
                fi = QFileInfo(docsPath.absolutePath() + QDir.separator() + f)
                namespace = QHelpEngineCore.namespaceName(
                    fi.absoluteFilePath())
                if not namespace:
                    continue

                if (dt.isValid()
                        and namespace in engine.registeredDocumentations()
                        and (fi.lastModified().toString(Qt.ISODate)
                             == dt.toString(Qt.ISODate))
                        and qchFile == fi.absoluteFilePath()):
                    return False

                if namespace in engine.registeredDocumentations():
                    engine.unregisterDocumentation(namespace)

                if not engine.registerDocumentation(fi.absoluteFilePath()):
                    self.errorMessage.emit(
                        self.tr(
                            """<p>The file <b>{0}</b> could not be"""
                            """ registered. <br/>Reason: {1}</p>""").format(
                                fi.absoluteFilePath, engine.error()))
                    return False

                engine.setCustomValue(
                    versionKey,
                    fi.lastModified().toString(Qt.ISODate) + '|' +
                    fi.absoluteFilePath())
                return True

        return False
    def __initFiltersTab(self):
        """
        Private method to initialize the filters tab.
        """
        self.removeFiltersButton.setEnabled(False)
        self.removeAttributesButton.setEnabled(False)

        # save the current and selected filters
        currentFilter = self.filtersList.currentItem()
        if currentFilter:
            currentFilterText = currentFilter.text()
        else:
            currentFilterText = ""
        selectedFiltersText = [
            itm.text() for itm in self.filtersList.selectedItems()
        ]

        # save the selected attributes
        selectedAttributesText = [
            itm.text(0) for itm in self.attributesList.selectedItems()
        ]

        self.filtersList.clear()
        self.attributesList.clear()

        helpEngineCore = QHelpEngineCore(self.__engine.collectionFile())

        self.__removedFilters = []
        self.__filterMap = {}
        self.__filterMapBackup = {}
        self.__removedAttributes = []

        for customFilter in helpEngineCore.customFilters():
            atts = helpEngineCore.filterAttributes(customFilter)
            self.__filterMapBackup[customFilter] = atts
            if customFilter not in self.__filterMap:
                self.__filterMap[customFilter] = atts

        self.filtersList.addItems(sorted(self.__filterMap.keys()))
        for attr in helpEngineCore.filterAttributes():
            QTreeWidgetItem(self.attributesList, [attr])
        self.attributesList.sortItems(0, Qt.AscendingOrder)

        if selectedFiltersText or currentFilterText or selectedAttributesText:
            # restore the selected filters
            for txt in selectedFiltersText:
                items = self.filtersList.findItems(txt, Qt.MatchExactly)
                for itm in items:
                    itm.setSelected(True)
            # restore the current filter
            if currentFilterText:
                items = self.filtersList.findItems(currentFilterText,
                                                   Qt.MatchExactly)
                if items:
                    self.filtersList.setCurrentItem(
                        items[0], QItemSelectionModel.NoUpdate)
            # restore the selected attributes
            for txt in selectedAttributesText:
                items = self.attributesList.findItems(txt, Qt.MatchExactly, 0)
                for itm in items:
                    itm.setSelected(True)
        elif self.__filterMap:
            self.filtersList.setCurrentRow(0)
示例#12
0
    def __installQtDoc(self, name, version, engine):
        """
        Private method to install/update a Qt help document.
        
        @param name name of the Qt help document (string)
        @param version Qt version of the help documens (integer)
        @param engine reference to the help engine (QHelpEngineCore)
        @return flag indicating success (boolean)
        """
        versionKey = "qt_version_{0}@@{1}".format(version, name)
        info = engine.customValue(versionKey, "")
        lst = info.split("|")

        dt = QDateTime()
        if len(lst) and lst[0]:
            dt = QDateTime.fromString(lst[0], Qt.ISODate)

        qchFile = ""
        if len(lst) == 2:
            qchFile = lst[1]

        if version == 4:
            docsPath = QDir(QLibraryInfo.location(QLibraryInfo.DocumentationPath) + QDir.separator() + "qch")
        elif version == 5:
            docsPath = QDir(QLibraryInfo.location(QLibraryInfo.DocumentationPath))
        else:
            # unsupported Qt version
            return False

        files = docsPath.entryList(["*.qch"])
        if not files:
            engine.setCustomValue(versionKey, QDateTime().toString(Qt.ISODate) + "|")
            return False

        for f in files:
            if f.startswith(name):
                fi = QFileInfo(docsPath.absolutePath() + QDir.separator() + f)
                namespace = QHelpEngineCore.namespaceName(fi.absoluteFilePath())
                if not namespace:
                    continue

                if (
                    dt.isValid()
                    and namespace in engine.registeredDocumentations()
                    and fi.lastModified().toString(Qt.ISODate) == dt.toString(Qt.ISODate)
                    and qchFile == fi.absoluteFilePath()
                ):
                    return False

                if namespace in engine.registeredDocumentations():
                    engine.unregisterDocumentation(namespace)

                if not engine.registerDocumentation(fi.absoluteFilePath()):
                    self.errorMessage.emit(
                        self.tr(
                            """<p>The file <b>{0}</b> could not be""" """ registered. <br/>Reason: {1}</p>"""
                        ).format(fi.absoluteFilePath, engine.error())
                    )
                    return False

                engine.setCustomValue(versionKey, fi.lastModified().toString(Qt.ISODate) + "|" + fi.absoluteFilePath())
                return True

        return False