X-Git-Url: https://codewiz.org/gitweb?a=blobdiff_plain;f=wizard%2FBProjectPresets.py;h=40e7cbd8f7aa474de6a0e6dff76b4ff9d3554f96;hb=b30ca67e54f665181d85a49bff3af2862e86601e;hp=c0381a5c33df001949b7c23001832480456de348;hpb=afbcef7c7b408083dbcd77bc4697513dc10ea58d;p=bertos.git diff --git a/wizard/BProjectPresets.py b/wizard/BProjectPresets.py index c0381a5c..40e7cbd8 100644 --- a/wizard/BProjectPresets.py +++ b/wizard/BProjectPresets.py @@ -1,7 +1,7 @@ #!/usr/bin/env python # encoding: utf-8 # -# This file is part of slimqc. +# This file is part of BeRTOS. # # Bertos is free software; you can redistribute it and/or modify # it under the terms of the GNU General Public License as published by @@ -28,7 +28,6 @@ # # Copyright 2010 Develer S.r.l. (http://www.develer.com/) # -# $Id$ # # Author: Lorenzo Berni # @@ -42,6 +41,14 @@ from PyQt4.QtGui import * from BWizardPage import BWizardPage +from BCreationPage import BCreationPage +from BToolchainPage import BToolchainPage + +from DefineException import ModuleDefineException + +from bertos_utils import _cmp +from toolchain_manager import ToolchainManager + import const import qvariant_converter @@ -60,13 +67,12 @@ class BProjectPresetsPage(QWidget): def setupUi(self): self.pageContent.presetList.clear() - def _cmp(x, y): - return cmp(x["info"].get('ord', 0), y["info"].get('ord', 0)) + self.pageContent.categoryDescription.setText(self.preset_data["info"].get("description", "")) for preset in sorted(self.preset_data["children"].values(), _cmp): item_name = preset["info"].get("name", preset["info"]["filename"]) item_icon = os.path.join(preset["info"]["path"], const.PREDEFINED_BOARD_ICON_FILE) if not os.path.exists(item_icon): - item_icon = const.PREDEFINED_BOARD_DEFAULT_ICON + item_icon = const.PREDEFINED_BOARD_DEFAULT_PROJECT_ICON item_icon = QIcon(item_icon) item = QListWidgetItem(item_icon, item_name) item.setData(Qt.UserRole, qvariant_converter.convertString(preset["info"]["path"])) @@ -75,18 +81,17 @@ class BProjectPresetsPage(QWidget): self.updateUi() def connectSignals(self): - self.connect(self.pageContent.presetList, SIGNAL("itemSelectionChanged()"), self.updateUi) - self.connect(self.pageContent.presetList, SIGNAL("itemSelectionChanged()"), self, SIGNAL("completeChanged()")) + self.connect(self.pageContent.presetList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self.updateUi) + self.connect(self.pageContent.presetList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self, SIGNAL("completeChanged()")) def updateUi(self): if self.selected: preset_path = qvariant_converter.getString(self.selected.data(Qt.UserRole)) preset = self.preset_data["children"][preset_path] - self.pageContent.descriptionLabel.setText(preset["info"].get("description", "")) - image = os.path.join(preset["info"]["path"], const.PREDEFINED_BOARD_IMAGE_FILE) - if not os.path.exists(image): - image = const.PREDEFINED_BOARD_DEFAULT_IMAGE - self.pageContent.imageLabel.setPixmap(QPixmap(image)) + description = preset["info"].get("description", "") + path = unicode(QUrl.fromLocalFile(preset_path).toString()) + description = description.replace("$path", path) + self.pageContent.descriptionArea.setHtml(description) @property def selected(self): @@ -100,31 +105,76 @@ class BProjectPresets(BWizardPage): ## Overloaded QWizardPage methods ## def isComplete(self): - current_widget = self.pageContent.boardTabWidget.currentWidget() - preset_path = None - if current_widget: - current_item = current_widget.pageContent.presetList.currentItem() - if current_item: - preset_path = current_item.data(Qt.UserRole) - preset_path = qvariant_converter.getString(preset_path) + preset_path = self.selected_path if preset_path: self.setProjectInfo("PROJECT_PRESET", preset_path) + self.setProjectInfo("BASE_MODE", not self.advanced) return True else: self.setProjectInfo("PROJECT_PRESET", None) return False + + def validatePage(self): + """ + This hack permits to load the preset once, when the user go press the + Next button. + """ + preset_path = self.selected_path + try: + QApplication.instance().setOverrideCursor(Qt.WaitCursor) + try: + self.project.loadProjectFromPreset(preset_path) + except ModuleDefineException, e: + self.exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line)) + self.setProjectInfo("PRESET_LOADED", True) + finally: + QApplication.instance().restoreOverrideCursor() + # Return always True, this is a fake validation. + return True + + 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) + #### ## Overloaded BWizardPage methods ## - def reloadData(self): - preset_path = self.projectInfo("PROJECT_BOARD") - preset_tree = self.projectInfo("PRESET_TREE") - preset_list = preset_tree["children"][preset_path]["children"] - def _cmp(x, y): - return cmp(x["info"].get('ord', 0), y["info"].get('ord', 0)) - preset_list = sorted(preset_list.values(), _cmp) - self.setupTabs(preset_list) + def reloadData(self, previous_id=None): + if not self.projectInfo("PRESET_LOADED"): + preset_path = self.projectInfo("PROJECT_BOARD") + preset_tree = self.projectInfo("PRESET_TREE") + preset_list = preset_tree["children"][preset_path]["children"] + preset_list = sorted(preset_list.values(), _cmp) + self.setTitle(self.tr("Select the project template for %1").arg(preset_tree["children"][preset_path]["info"].get("name", preset_tree["children"][preset_path]["info"]["filename"]))) + self.setupTabs(preset_list) def connectSignals(self): self.connect(self.pageContent.boardTabWidget, SIGNAL("currentChanged(int)"), self, SIGNAL("completeChanged()")) @@ -143,4 +193,30 @@ class BProjectPresets(BWizardPage): self.pageContent.boardTabWidget.addTab(preset_page, QIcon(icon), preset["info"].get("name", preset["info"]["filename"])) else: self.pageContent.boardTabWidget.addTab(preset_page, preset["info"].get("name", preset["info"]["filename"])) - self.connect(preset_page, SIGNAL("completeChanged()"), self, SIGNAL("completeChanged()")) \ No newline at end of file + self.connect(preset_page, SIGNAL("completeChanged()"), self, SIGNAL("completeChanged()")) + + @property + def advanced(self): + if self.selected_data: + return self.selected_data["info"].get("advanced", False) + else: + return None + + @property + def selected_path(self): + current_widget = self.pageContent.boardTabWidget.currentWidget() + preset_path = None + if current_widget: + current_item = current_widget.pageContent.presetList.currentItem() + if current_item: + preset_path = current_item.data(Qt.UserRole) + preset_path = qvariant_converter.getString(preset_path) + return preset_path + + @property + def selected_data(self): + if self.selected_path: + current_widget = self.pageContent.boardTabWidget.currentWidget() + return current_widget.preset_data["children"][self.selected_path] + else: + return None