Update preset.
[bertos.git] / wizard / BProjectPresets.py
index efb04d546c83ef6fcaa142a443bc910baf1a6bf2..40e7cbd8f7aa474de6a0e6dff76b4ff9d3554f96 100644 (file)
@@ -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 <duplo@develer.com>
 #
@@ -42,7 +41,13 @@ 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
@@ -62,6 +67,7 @@ class BProjectPresetsPage(QWidget):
 
     def setupUi(self):
         self.pageContent.presetList.clear()
+        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)
@@ -75,20 +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 os.path.exists(image):
-                self.pageContent.imageLabel.setPixmap(QPixmap(image))
-                self.pageContent.imageLabel.setVisible(True)
-            else:
-                self.pageContent.imageLabel.setVisible(False)
+            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):
@@ -102,29 +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"]
-        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