Example #1
0
 def nextId(self):
     """
     Overload of the QWizardPage nextId method.
     """
     # Route to Toolchain page if the user select advanced
     # or to Output page if the user select base
     if self.advanced:
         return self.wizard().pageIndex(BToolchainPage)
     else:
         cpu_info = self.projectInfo("CPU_INFOS")
         if cpu_info:
             target = cpu_info["TOOLCHAIN"]
             # Try to find a suitable toolchain automatically
             tm = ToolchainManager()
             suitable_toolchains = tm.suitableToolchains(target)
             if len(suitable_toolchains) == 1:
                 toolchain = suitable_toolchains.pop()
                 toolchain_info = tm._validateToolchain(toolchain)
                 toolchain_info["path"] = toolchain
                 self.setProjectInfo("TOOLCHAIN", toolchain_info)
                 return self.wizard().pageIndex(BCreationPage)
             else:
                 return self.wizard().pageIndex(BToolchainPage)
         else:
             # It seems that the nextId method is called before the
             # reloadData one (that is called after the page changing.
             #
             # TODO: fix this awful code lines
             target = None
             return self.wizard().pageIndex(BToolchainPage)
Example #2
0
 def nextId(self):
     """
     Overload of the QWizardPage nextId method.
     """
     # Route to Toolchain page if the user select advanced
     # or to Output page if the user select base
     if self.advanced:
         return self.wizard().pageIndex(BToolchainPage)
     else:
         cpu_info = self.projectInfo("CPU_INFOS")
         if cpu_info:
             target = cpu_info["TOOLCHAIN"]
             # Try to find a suitable toolchain automatically
             tm = ToolchainManager()
             suitable_toolchains = tm.suitableToolchains(target)
             if len(suitable_toolchains) == 1:
                 toolchain = suitable_toolchains.pop()
                 toolchain_info = tm._validateToolchain(toolchain)
                 toolchain_info["path"] = toolchain
                 self.setProjectInfo("TOOLCHAIN", toolchain_info)
                 return self.wizard().pageIndex(BCreationPage)
             else:
                 return self.wizard().pageIndex(BToolchainPage)
         else:
             # It seems that the nextId method is called before the
             # reloadData one (that is called after the page changing.
             #
             # TODO: fix this awful code lines
             target = None
             return self.wizard().pageIndex(BToolchainPage)
 def __init__(self):
     BWizardPage.__init__(self, UI_LOCATION + "/toolchain_select.ui")
     self.setTitle(self.tr("Select toolchain"))
     self.setSubTitle(self.tr("You can look for more toolchains in your system by pressing the \"Search\" button, or manually add them with the \"+\" button"))
     self._valid_items = []
     self._toolchain_manager = ToolchainManager()
class BToolchainPage(BWizardPage):
    """
    Page of the wizard that permits to choose the toolchain to use for the
    project.
    """

    def __init__(self):
        BWizardPage.__init__(self, UI_LOCATION + "/toolchain_select.ui")
        self.setTitle(self.tr("Select toolchain"))
        self.setSubTitle(self.tr("You can look for more toolchains in your system by pressing the \"Search\" button, or manually add them with the \"+\" button"))
        self._valid_items = []
        self._toolchain_manager = ToolchainManager()

    ## Overloaded QWizardPage methods. ##

    def isComplete(self):
        """
        Overload of the QWizard isComplete method.
        """
        if self.pageContent.toolchainList.currentRow() != -1:
            self.setProjectInfo("TOOLCHAIN",
                qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole)))
            return True
        else:
            return False

    def nextId(self):
        """
        Overload of the QWizardPage nextId method.
        """
        # Route to Output page if it's a predefined easy project.
        if self.projectInfo("PROJECT_FROM_PRESET") and self.projectInfo("BASE_MODE"):
            return self.wizard().pageIndex(BCreationPage)
        else:
            return QWizardPage.nextId(self)

    ####

    ## Overloaded BWizardPage methods. ##

    def setupUi(self):
        """
        Sets up the user interface.
        """
        self.pageContent.infoLabel.setVisible(False)

    def connectSignals(self):
        """
        Connects the signals with the related slots.
        """
        self.connect(self.pageContent.toolchainList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self.selectionChanged)
        self.connect(self.pageContent.addButton, SIGNAL("clicked()"), self.addToolchain)
        self.connect(self.pageContent.removeButton, SIGNAL("clicked()"), self.removeToolchain)
        self.connect(self.pageContent.searchButton, SIGNAL("clicked()"), self.searchToolchain)
        self.connect(self.pageContent.checkButton, SIGNAL("clicked()"), self.validateAllToolchains)

    def reloadData(self, previous_id=None):
        """
        Overload of the BWizard reloadData method.
        """
        if previous_id is None or previous_id < self.wizard().currentId():
            self._clearList()
            self.setupUi()
            self._populateToolchainList()
            if len(self._valid_items) >= 1:
                self.pageContent.toolchainList.setCurrentItem(self._valid_items[0])

    ####

    ## Slots ##

    def selectionChanged(self):
        """
        Slot called when the user click on an entry of the toolchain list.
        """
        if self.pageContent.toolchainList.currentRow() != -1:
            infos = collections.defaultdict(lambda: unicode("not defined"))
            infos.update(qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole)))
            self.pageContent.infoLabel.setText("GCC " + infos["version"] + " (" + infos["build"] + ")\nTarget: " + infos["target"] + "\nPath: " + os.path.normpath(infos["path"]))
            self.pageContent.infoLabel.setVisible(True)
            if self.isDefaultToolchain(infos):
                self.disableRemoveButton()
            else:
                self.enableRemoveButton()
            self.emit(SIGNAL("completeChanged()"))

    def addToolchain(self):
        """
        Slot called when the user adds manually a toolchain.
        """
        sel_toolchain = unicode(QFileDialog.getOpenFileName(self, self.tr("Choose the toolchain"), ""))
        if sel_toolchain != "":
            item = QListWidgetItem(sel_toolchain)
            item.setData(Qt.UserRole, qvariant_converter.convertStringDict({"path": sel_toolchain}))
            self.pageContent.toolchainList.addItem(item)
            self._toolchain_manager.addToolchain(sel_toolchain)

    def removeToolchain(self):
        """
        Slot called when the user removes manually a toolchain.
        """
        if self.pageContent.toolchainList.currentRow() != -1:
            item = self.pageContent.toolchainList.takeItem(self.pageContent.toolchainList.currentRow())
            toolchain = qvariant_converter.getStringDict(item.data(Qt.UserRole))["path"]
            self._toolchain_manager.removeToolchain(toolchain)

    def searchToolchain(self):
        """
        Slot called when the user clicks on the 'search' button. It opens the
        toolchain search dialog.
        """
        search = BToolchainSearch.BToolchainSearch()
        self.connect(search, SIGNAL("accepted()"), self._search)
        search.exec_()

    def validateAllToolchains(self):
        """
        Slot called when the user clicks on the validate button. It starts the
        toolchain validation procedure for all the toolchains.
        """
        try:
            QApplication.instance().setOverrideCursor(Qt.WaitCursor)
            for i in range(self.pageContent.toolchainList.count()):
                data = qvariant_converter.getStringDict(self.pageContent.toolchainList.item(i).data(Qt.UserRole))
                self.validateToolchain(data["path"])
            self._populateToolchainList()
        finally:
            QApplication.instance().restoreOverrideCursor()

    ####

    def _populateToolchainList(self):
        """
        Fills the toolchain list with the toolchains stored in the QSettings.
        """
        self.pageContent.toolchainList.clear()
        self._valid_items = []
        toolchains = self._toolchain_manager.predefined_toolchains + self._toolchain_manager.toolchains
        toolchain_dict = {
            'valid': [],
            'non-valid': [],
            'unknown': [],
            'unverified': [],
        }
        for key, value in toolchains:
            if os.path.exists(key):
                item_data = {"path":key}
                if value:
                    item_data.update(value)
                if value is not None:
                    k, data = self.validateToolchain(key)
                    item_data.update(data)
                    toolchain_dict[k].append(item_data)
                else:
                    toolchain_dict["unverified"].append(item_data)
        self._processItems(toolchain_dict["valid"], self._validItem)
        self._processItems(toolchain_dict["non-valid"], self._invalidItem)
        self._processItems(toolchain_dict["unknown"], self._unknownItem)
        self._processItems(toolchain_dict["unverified"])

    def _processItems(self, item_list, procedure=lambda x: None):
        sel_toolchain = self.projectInfo("TOOLCHAIN")
        for item_data in item_list:
            item = QListWidgetItem(item_data["path"])
            item.setData(Qt.UserRole, qvariant_converter.convertStringDict(item_data))
            self.pageContent.toolchainList.addItem(item)
            procedure(item)
            if sel_toolchain and sel_toolchain["path"] == item_data["path"]:
                self.pageContent.toolchainList.setCurrentItem(item)

    def currentToolchain(self):
        selected_toolchain = qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole))
        return selected_toolchain

    def _clearList(self):
        """
        Removes all the toolchain from the list.
        """
        self.pageContent.toolchainList.clear()

    def _search(self):
        """
        Searches for toolchains in the stored directories, and stores them in the
        QSettings.
        """
        dir_list = self.searchDirList()
        if self.pathSearch():
            dir_list += [element for element in bertos_utils.getSystemPath()]
        _toolchain_dict = self._toolchain_manager.storedToolchainDict()
        toolchain_list = bertos_utils.findToolchains(dir_list)
        for toolchain in toolchain_list:
            self._toolchain_manager.addToolchain(toolchain, _toolchain_dict.get(toolchain, False))
        self._populateToolchainList()
        self.showMessage(self.tr("Toolchain search result."), self.tr("%1 toolchains found").arg(len(toolchain_list)))

    def _validItem(self, item):
        """
        Sets the item at index as a valid item and associates the given info to it.
        """
        data = qvariant_converter.getStringDict(item.data(Qt.UserRole))
        item.setIcon(QIcon(":/images/ok.png"))
        self._valid_items.append(item)
        if "version" in data and "target" in data:
            item.setText("GCC " + data["version"] + " - " + data["target"].strip())

    def _invalidItem(self, item):
        data = qvariant_converter.getStringDict(item.data(Qt.UserRole))
        item.setIcon(QIcon(":/images/warning.png"))
        if "version" in data and "target" in data:
            item.setText("GCC " + data["version"] + " - " + data["target"].strip())

    def _unknownItem(self, item):
        """
        Sets the item at index as an invalid item.
        """
        item.setIcon(QIcon(":/images/error.png"))

    def validateToolchain(self, filename):
        """
        Toolchain validation procedure.
        """
        info = self._toolchain_manager.validateToolchain(filename)
        if info:
            needed = self.projectInfo("CPU_INFOS")
            if "target" in info and info["target"].find(needed["TOOLCHAIN"]) != -1:
                return 'valid', info
            else:
                return 'non-valid', info
        else:
            return 'unknown', {'path': filename}
    
    def isDefaultToolchain(self, toolchain):
        """
        Returns True if the given toolchain is one of the default toolchains.
        """
        return toolchain["path"] in self._toolchain_manager._predefined_toolchain_set
    
    def disableRemoveButton(self):
        """
        Disable the remove button.
        """
        self.pageContent.removeButton.setEnabled(False)
    
    def enableRemoveButton(self):
        """
        Enable the remove button.
        """
        self.pageContent.removeButton.setEnabled(True)
        
    def currentItem(self):
        return self.pageContent.toolchainList.currentItem()