4 # Copyright 2009 Develer S.r.l. (http://www.develer.com/)
9 # Author: Lorenzo Berni <duplo@develer.com>
14 from PyQt4.QtGui import *
15 from BWizardPage import *
19 class BModulePage(BWizardPage):
22 BWizardPage.__init__(self, "module_select.ui")
23 self.setTitle(self.tr("Configure the BeRTOS modules"))
25 self._connectSignals()
28 self._setupButtonGroup()
29 self._loadModuleData()
30 self._fillModuleTable()
32 def _setupButtonGroup(self):
33 self._buttonGroup = QButtonGroup()
34 self._buttonGroup.setExclusive(False)
35 self.connect(self._buttonGroup, SIGNAL("buttonClicked(int)"), self._moduleSelectionChanged)
37 def _loadModuleData(self):
38 modules = bertos_utils.loadModuleInfosDict(self._projectInfoRetrieve("SOURCES_PATH"))
39 lists = bertos_utils.loadDefineListsDict(self._projectInfoRetrieve("SOURCES_PATH"))
41 for module, informations in modules.items():
42 configurations[informations["configuration"]] = bertos_utils.loadConfigurationInfos(self._projectInfoRetrieve("SOURCES_PATH") +
43 "/" + informations["configuration"])
44 self._projectInfoStore("MODULES", modules)
45 self._projectInfoStore("LISTS", lists)
46 self._projectInfoStore("CONFIGURATIONS", configurations)
48 def _fillModuleTable(self):
49 modules = self._projectInfoRetrieve("MODULES")
50 self.pageContent.moduleTable.setRowCount(len(modules))
51 for index, module in enumerate(modules):
52 self.pageContent.moduleTable.setItem(index, 1, QTableWidgetItem(module))
53 checkBox = QCheckBox()
54 self._buttonGroup.addButton(checkBox, index)
55 self.pageContent.moduleTable.setCellWidget(index, 0, checkBox)
56 checkBox.setChecked(modules[module]["enabled"])
58 def _fillPropertyTable(self):
59 module = self._currentModule()
60 configuration = self._projectInfoRetrieve("MODULES")[module]["configuration"]
61 configurations = self._projectInfoRetrieve("CONFIGURATIONS")[configuration]
62 self.pageContent.propertyTable.clear()
63 self.pageContent.propertyTable.setRowCount(len(configurations))
64 for index, property in enumerate(configurations):
65 item = QTableWidgetItem(property)
66 item.setData(Qt.UserRole, qvariant_converter.convertString(property))
67 self.pageContent.propertyTable.setItem(index, 0, item)
68 if "type" in configurations[property]["informations"].keys() and configurations[property]["informations"]["type"] == "boolean":
70 checkBox = QCheckBox()
71 self.pageContent.propertyTable.setCellWidget(index, 1, checkBox)
72 if configurations[property]["value"] == "1":
73 checkBox.setChecked(True)
75 checkBox.setChecked(False)
76 elif "type" in configurations[property]["informations"].keys() and configurations[property]["informations"]["type"] == "enum":
78 comboBox = QComboBox()
79 self.pageContent.propertyTable.setCellWidget(index, 1, comboBox)
80 enum = self._projectInfoRetrieve("LISTS")[configurations[property]["informations"]["value_list"]]
82 comboBox.addItem(element)
84 ## int, long or undefined type property
86 self.pageContent.propertyTable.setCellWidget(index, 1, spinBox)
87 if "min" in configurations[property]["informations"].keys():
88 minimum = int(configurations[property]["informations"]["min"])
91 spinBox.setMinimum(minimum)
92 if "max" in configurations[property]["informations"].keys():
93 maximum = int(configurations[property]["informations"]["max"])
96 spinBox.setMaximum(maximum)
97 if "long" in configurations[property]["informations"].keys() and configurations[property]["informations"]["long"] == "True":
98 spinBox.setSuffix("L")
99 spinBox.setValue(int(configurations[property]["value"].replace("L", "")))
101 def _currentModule(self):
102 return unicode(self.pageContent.moduleTable.item(self.pageContent.moduleTable.currentRow(), 1).text())
104 def _currentModuleConfigurations(self):
105 return self._projectInfoRetrieve("MODULES")[self._currentModule()]["configuration"]
107 def _currentProperty(self):
108 return qvariant_converter.getString(self.pageContent.propertyTable.item(self.pageContent.propertyTable.currentRow(), 0).data(Qt.UserRole))
110 def _currentPropertyItem(self):
111 return self.pageContent.propertyTable.item(self.pageContent.propertyTable.currentRow(), 0)
113 def _resetPropertyDescription(self):
114 for index in range(self.pageContent.propertyTable.rowCount()):
115 propertyName = qvariant_converter.getString(self.pageContent.propertyTable.item(index, 0).data(Qt.UserRole))
116 self.pageContent.propertyTable.item(index, 0).setText(propertyName)
118 def _showPropertyDescription(self):
119 self._resetPropertyDescription()
120 description = self._projectInfoRetrieve("CONFIGURATIONS")[self._currentModuleConfigurations()][self._currentProperty()]["description"]
121 name = self._currentProperty()
122 self._currentPropertyItem().setText(name + "\n" + description)
125 self.pageContent.moduleTable.horizontalHeader().setResizeMode(QHeaderView.ResizeToContents)
126 self.pageContent.moduleTable.horizontalHeader().setStretchLastSection(True)
127 self.pageContent.moduleTable.horizontalHeader().setVisible(False)
128 self.pageContent.moduleTable.verticalHeader().setResizeMode(QHeaderView.ResizeToContents)
129 self.pageContent.moduleTable.verticalHeader().setVisible(False)
130 self.pageContent.moduleTable.setColumnCount(2)
131 self.pageContent.moduleTable.setRowCount(0)
132 self.pageContent.propertyTable.horizontalHeader().setResizeMode(QHeaderView.Stretch)
133 self.pageContent.propertyTable.horizontalHeader().setVisible(False)
134 self.pageContent.propertyTable.verticalHeader().setResizeMode(QHeaderView.ResizeToContents)
135 self.pageContent.propertyTable.verticalHeader().setVisible(False)
136 self.pageContent.propertyTable.setColumnCount(2)
137 self.pageContent.propertyTable.setRowCount(0)
139 def _connectSignals(self):
140 self.connect(self.pageContent.moduleTable, SIGNAL("itemSelectionChanged()"), self._fillPropertyTable)
141 self.connect(self.pageContent.propertyTable, SIGNAL("itemSelectionChanged()"), self._showPropertyDescription)
143 def _moduleSelectionChanged(self, index):
144 module = unicode(self.pageContent.moduleTable.item(index, 1).text())
145 if self._buttonGroup.button(index).isChecked():
146 self._moduleSelected(module)
148 self._moduleUnselected(module)
150 def _moduleSelected(self, selectedModule):
151 modules = self._projectInfoRetrieve("MODULES")
152 modules[selectedModule]["enabled"] = True
153 self._projectInfoStore("MODULES", modules)
154 depends = self._projectInfoRetrieve("MODULES")[selectedModule]["depends"]
155 unsatisfied = self.selectDependencyCheck(selectedModule)
156 if len(unsatisfied) > 0:
157 self._selectionDependencyFail(selectedModule, unsatisfied)
159 def _moduleUnselected(self, unselectedModule):
160 modules = self._projectInfoRetrieve("MODULES")
161 modules[unselectedModule]["enabled"] = False
162 self._projectInfoStore("MODULES", modules)
163 unsatisfied = self.unselectDependencyCheck(unselectedModule)
164 if len(unsatisfied) > 0:
165 self._unselectionDependencyFail(unselectedModule, unsatisfied)
167 def _selectionDependencyFail(self, selectedModule, unsatisfiedModules):
168 messageString = "The module " + selectedModule + " needs the following modules:\n" + \
169 ", ".join(unsatisfiedModules) + ".\nDo you want to resolve autmatically the prolem?"
170 messageBox = QMessageBox()
171 messageBox.setIcon(QMessageBox.Warning)
172 messageBox.setText(self.tr("Dependency fail"))
173 messageBox.setInformativeText(self.tr(messageString))
174 messageBox.addButton(QMessageBox.Yes)
175 messageBox.addButton(QMessageBox.No)
178 def _unselectionDependencyFail(self, unselectedModule, unsatisfiedModules):
179 messageString = "The module " + unselectedModule + " is needed by the following modules:\n" + \
180 ", ".join(unsatisfiedModules) + ".\nDo you want to resolve autmatically the prolem?"
181 messageBox = QMessageBox()
182 messageBox.setIcon(QMessageBox.Warning)
183 messageBox.setText(self.tr("Dependency fail"))
184 messageBox.setInformativeText(self.tr(messageString))
185 messageBox.addButton(QMessageBox.Yes)
186 messageBox.addButton(QMessageBox.No)
189 def selectDependencyCheck(self, module):
191 modules = self._projectInfoRetrieve("MODULES")
192 for dependency in modules[module]["depends"]:
193 if not modules[dependency]["enabled"]:
194 unsatisfied.append(dependency)
195 unsatisfied += self.selectDependencyCheck(dependency)
198 def unselectDependencyCheck(self, dependency):
200 modules = self._projectInfoRetrieve("MODULES")
201 for module, informations in modules.items():
202 if dependency in informations["depends"] and informations["enabled"]:
203 unsatisfied.append(module)
204 unsatisfied += self.unselectDependencyCheck(module)