Remove the minimum size of the QWizard
[bertos.git] / wizard / BModulePage.py
index 7241c80e0a2a28ba93dbe5a0c977898b40c96978..5fd3abc8c074e676cf59a925b58fb8b15c815aef 100644 (file)
@@ -23,28 +23,34 @@ class BModulePage(BWizardPage):
     def __init__(self):
         BWizardPage.__init__(self, UI_LOCATION + "/module_select.ui")
         self.setTitle(self.tr("Configure the BeRTOS modules"))
-        self._controlGroup = QControlGroup()
+        self._control_group = QControlGroup()
         self._connectSignals()
     
     def reloadData(self):
+        QApplication.instance().setOverrideCursor(Qt.WaitCursor)
         self._setupUi()
         self._loadModuleData()
         self._fillModuleTree()
+        QApplication.instance().restoreOverrideCursor()
     
     def _setupButtonGroup(self):
-        self._buttonGroup = QButtonGroup()
-        self._buttonGroup.setExclusive(False)
-        self.connect(self._buttonGroup, SIGNAL("buttonClicked(int)"), self._moduleSelectionChanged)
+        self._button_group = QButtonGroup()
+        self._button_group.setExclusive(False)
+        self.connect(self._button_group, SIGNAL("buttonClicked(int)"), self._moduleSelectionChanged)
     
     def _loadModuleData(self):
-        try:
-            bertos_utils.loadModuleData(self._project())
-        except ModuleDefineException, e:
-            self._exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line))
-        except EnumDefineException, e:
-            self._exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line))
-        except ConfigurationDefineException, e:
-            self._exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line))
+        ## Load the module data only if it isn't already loaded
+        if self._projectInfoRetrieve("MODULES") == None \
+                and self._projectInfoRetrieve("LISTS") == None \
+                and self._projectInfoRetrieve("CONFIGURATIONS") == None:
+            try:
+                bertos_utils.loadModuleData(self._project())
+            except ModuleDefineException, e:
+                self._exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line))
+            except EnumDefineException, e:
+                self._exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line))
+            except ConfigurationDefineException, e:
+                self._exceptionOccurred(self.tr("Error parsing line '%2' in file %1").arg(e.path).arg(e.line))
     
     def _fillModuleTree(self):
         modules = self._projectInfoRetrieve("MODULES")
@@ -55,32 +61,40 @@ class BModulePage(BWizardPage):
             if information["category"] not in categories.keys():
                 categories[information["category"]] = []
             categories[information["category"]].append(module)
-        for category, modules in categories.items():
+        for category, module_list in categories.items():
             item = QTreeWidgetItem(QStringList([category]))
-            for module in modules:
-                moduleItem = QTreeWidgetItem(item, QStringList([module]))
-                moduleItem.setCheckState(0, Qt.Unchecked)
+            for module in module_list:
+                enabled = modules[module]["enabled"]
+                module_item = QTreeWidgetItem(item, QStringList([module]))
+                if enabled:
+                    module_item.setCheckState(0, Qt.Checked)
+                else:
+                    module_item.setCheckState(0, Qt.Unchecked)
             self.pageContent.moduleTree.addTopLevelItem(item)
+        self.pageContent.moduleTree.sortItems(0, Qt.AscendingOrder)
         
     
     def _fillPropertyTable(self):
         module = self._currentModule()
         if module is not None:
-            self._controlGroup.clear()
+            self._control_group.clear()
             configuration = self._projectInfoRetrieve("MODULES")[module]["configuration"]
-            moduleDescription = self._projectInfoRetrieve("MODULES")[module]["description"]
-            self.pageContent.moduleLabel.setText(moduleDescription)
+            module_description = self._projectInfoRetrieve("MODULES")[module]["description"]
+            self.pageContent.moduleLabel.setText(module_description)
             self.pageContent.moduleLabel.setVisible(True)
             self.pageContent.propertyTable.clear()
-            if len(configuration) > 0:
+            self.pageContent.propertyTable.setRowCount(0)
+            if configuration != "":
                 configurations = self._projectInfoRetrieve("CONFIGURATIONS")[configuration]
-                self.pageContent.propertyTable.setRowCount(len(configurations))
+                param_list = sorted(configurations["paramlist"])
                 index = 0
-                for property in configurations:
+                for i, property in param_list:
                     if "type" in configurations[property]["informations"] and configurations[property]["informations"]["type"] == "autoenabled":
                         ## Doesn't show the hidden fields
                         pass
                     else:
+                        ## Set the row count to the current index + 1
+                        self.pageContent.propertyTable.setRowCount(index + 1)
                         item = QTableWidgetItem(configurations[property]["brief"])
                         item.setData(Qt.UserRole, qvariant_converter.convertString(property))
                         self.pageContent.propertyTable.setItem(index, 0, item)
@@ -94,39 +108,45 @@ class BModulePage(BWizardPage):
                             # Not defined type, rendered as a text field
                             self.pageContent.propertyTable.setItem(index, 1, QTableWidgetItem(configurations[property]["value"]))
                         index += 1
-            else:
-                self.pageContent.propertyTable.setRowCount(0)
+            if self.pageContent.propertyTable.rowCount() == 0:
+                module_label = self.pageContent.moduleLabel.text()
+                module_label += "\n\nNo configuration needed."
+                self.pageContent.moduleLabel.setText(module_label)
     
     def _insertCheckBox(self, index, value):
         ## boolean property
-        checkBox = QCheckBox()
-        self.pageContent.propertyTable.setCellWidget(index, 1, checkBox)
+        check_box = QCheckBox()
+        self.pageContent.propertyTable.setCellWidget(index, 1, check_box)
         if value == "1":
-            checkBox.setChecked(True)
+            check_box.setChecked(True)
         else:
-            checkBox.setChecked(False)
-        self._controlGroup.addControl(index, checkBox)
+            check_box.setChecked(False)
+        self._control_group.addControl(index, check_box)
     
     def _insertComboBox(self, index, value, value_list):
         ## enum property
-        comboBox = QComboBox()
-        self.pageContent.propertyTable.setCellWidget(index, 1, comboBox)
-        enum = self._projectInfoRetrieve("LISTS")[value_list]
-        for i, element in enumerate(enum):
-            comboBox.addItem(element)
-            if element == value:
-                comboBox.setCurrentIndex(i)
-        self._controlGroup.addControl(index, comboBox)
+        try:
+            enum = self._projectInfoRetrieve("LISTS")[value_list]
+            combo_box = QComboBox()
+            self.pageContent.propertyTable.setCellWidget(index, 1, combo_box)
+            for i, element in enumerate(enum):
+                combo_box.addItem(element)
+                if element == value:
+                    combo_box.setCurrentIndex(i)
+            self._control_group.addControl(index, combo_box)
+        except KeyError:
+            self._exceptionOccurred(self.tr("Define list \"%1\" not found. Check definition files.").arg(value_list))
+            self.pageContent.propertyTable.setItem(index, 1, QTableWidgetItem(value))
     
     def _insertSpinBox(self, index, value, informations):
         ## int, long or undefined type property
-        spinBox = None
+        spin_box = None
         if bertos_utils.isLong(informations) or bertos_utils.isUnsignedLong(informations):
-            spinBox = QDoubleSpinBox()
-            spinBox.setDecimals(0)
+            spin_box = QDoubleSpinBox()
+            spin_box.setDecimals(0)
         else:
-            spinBox = QSpinBox()
-        self.pageContent.propertyTable.setCellWidget(index, 1, spinBox)
+            spin_box = QSpinBox()
+        self.pageContent.propertyTable.setCellWidget(index, 1, spin_box)
         minimum = -32768
         maximum = 32767
         suff = ""
@@ -146,17 +166,17 @@ class BModulePage(BWizardPage):
             minimum = int(informations["min"])
         if "max" in informations.keys():
             maximum = int(informations["max"])
-        spinBox.setRange(minimum, maximum)
-        spinBox.setSuffix(suff)
-        spinBox.setValue(int(value.replace("L", "").replace("U", "")))
-        self._controlGroup.addControl(index, spinBox)
+        spin_box.setRange(minimum, maximum)
+        spin_box.setSuffix(suff)
+        spin_box.setValue(int(value.replace("L", "").replace("U", "")))
+        self._control_group.addControl(index, spin_box)
         
     
     def _currentModule(self):
-        currentModule = self.pageContent.moduleTree.currentItem()
+        current_module = self.pageContent.moduleTree.currentItem()
         # return only the child items
-        if currentModule is not None and currentModule.parent() is not None:
-            return unicode(currentModule.text(0))
+        if current_module is not None and current_module.parent() is not None:
+            return unicode(current_module.text(0))
         else:
             return None
     
@@ -178,11 +198,11 @@ class BModulePage(BWizardPage):
     
     def _resetPropertyDescription(self):
         for index in range(self.pageContent.propertyTable.rowCount()):
-            propertyName = qvariant_converter.getString(self.pageContent.propertyTable.item(index, 0).data(Qt.UserRole))
+            property_name = qvariant_converter.getString(self.pageContent.propertyTable.item(index, 0).data(Qt.UserRole))
             # Awful solution! Needed because if the user change the module, the selection changed...
-            if propertyName not in self._currentModuleConfigurations().keys():
+            if property_name not in self._currentModuleConfigurations().keys():
                 break
-            self.pageContent.propertyTable.item(index, 0).setText(self._currentModuleConfigurations()[propertyName]['brief'])
+            self.pageContent.propertyTable.item(index, 0).setText(self._currentModuleConfigurations()[property_name]['brief'])
     
     def _showPropertyDescription(self):
         self._resetPropertyDescription()
@@ -207,7 +227,7 @@ class BModulePage(BWizardPage):
         self.connect(self.pageContent.moduleTree, SIGNAL("itemPressed(QTreeWidgetItem*, int)"), self._fillPropertyTable)
         self.connect(self.pageContent.moduleTree, SIGNAL("itemChanged(QTreeWidgetItem*, int)"), self._dependencyCheck)
         self.connect(self.pageContent.propertyTable, SIGNAL("itemSelectionChanged()"), self._showPropertyDescription)
-        self.connect(self._controlGroup, SIGNAL("stateChanged"), self._saveValue)
+        self.connect(self._control_group, SIGNAL("stateChanged"), self._saveValue)
     
     def _saveValue(self, index):
         property = qvariant_converter.getString(self.pageContent.propertyTable.item(index, 0).data(Qt.UserRole))
@@ -226,7 +246,7 @@ class BModulePage(BWizardPage):
     
     def _moduleSelectionChanged(self, index):
         module = unicode(self.pageContent.moduleTable.item(index, 1).text())
-        if self._buttonGroup.button(index).isChecked():
+        if self._button_group.button(index).isChecked():
             self._moduleSelected(module)
         else:
             self._moduleUnselected(module)
@@ -238,6 +258,7 @@ class BModulePage(BWizardPage):
             self._moduleSelected(module)
         else:
             self._moduleUnselected(module)
+            self.removeFileDependencies(module)
     
     def _moduleSelected(self, selectedModule):
         modules = self._projectInfoRetrieve("MODULES")
@@ -281,11 +302,18 @@ class BModulePage(BWizardPage):
     def selectDependencyCheck(self, module):
         unsatisfied = set()
         modules = self._projectInfoRetrieve("MODULES")
+        files = self._projectInfoRetrieve("FILES")
         for dependency in modules[module]["depends"]:
-            if not modules[dependency]["enabled"]:
+            if dependency in modules and not modules[dependency]["enabled"]:
                 unsatisfied |= set([dependency])
                 if dependency not in unsatisfied:
                     unsatisfied |= self.selectDependencyCheck(dependency)
+            if dependency not in modules:
+                if dependency in files:
+                    files[dependency] += 1
+                else:
+                    files[dependency] = 1
+        self._projectInfoStore("FILES", files)
         return unsatisfied
     
     def unselectDependencyCheck(self, dependency):
@@ -297,6 +325,17 @@ class BModulePage(BWizardPage):
                 if dependency not in unsatisfied:
                     unsatisfied |= self.unselectDependencyCheck(module)
         return unsatisfied
+    
+    def removeFileDependencies(self, module):
+        modules = self._projectInfoRetrieve("MODULES")
+        files = self._projectInfoRetrieve("FILES")
+        dependencies = modules[module]["depends"]
+        for dependency in dependencies:
+            if dependency in files:
+                files[dependency] -= 1
+                if files[dependency] == 0:
+                    del files[dependency]
+        self._projectInfoStore("FILES", files)
 
 class QControlGroup(QObject):
     def __init__(self):