4 # This file is part of BeRTOS.
6 # Bertos is free software; you can redistribute it and/or modify
7 # it under the terms of the GNU General Public License as published by
8 # the Free Software Foundation; either version 2 of the License, or
9 # (at your option) any later version.
11 # This program is distributed in the hope that it will be useful,
12 # but WITHOUT ANY WARRANTY; without even the implied warranty of
13 # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 # GNU General Public License for more details.
16 # You should have received a copy of the GNU General Public License
17 # along with this program; if not, write to the Free Software
18 # Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
20 # As a special exception, you may use this file as part of a free software
21 # library without restriction. Specifically, if other files instantiate
22 # templates or use macros or inline functions from this file, or you compile
23 # this file and link it with other files to produce an executable, this
24 # file does not by itself cause the resulting executable to be covered by
25 # the GNU General Public License. This exception does not however
26 # invalidate any other reasons why the executable file might be covered by
27 # the GNU General Public License.
29 # Copyright 2008 Develer S.r.l. (http://www.develer.com/)
32 # Author: Lorenzo Berni <duplo@develer.com>
38 from BWizardPage import *
39 from BCreationPage import BCreationPage
41 import BToolchainSearch
43 import qvariant_converter
45 from toolchain_manager import ToolchainManager
49 class BToolchainPage(BWizardPage):
51 Page of the wizard that permits to choose the toolchain to use for the
56 BWizardPage.__init__(self, UI_LOCATION + "/toolchain_select.ui")
57 self.setTitle(self.tr("Select toolchain"))
58 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"))
59 self._valid_items = []
60 self._toolchain_manager = ToolchainManager()
62 ## Overloaded QWizardPage methods. ##
66 Overload of the QWizard isComplete method.
68 if self.pageContent.toolchainList.currentRow() != -1:
69 self.setProjectInfo("TOOLCHAIN",
70 qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole)))
77 Overload of the QWizardPage nextId method.
79 # Route to Output page if it's a predefined easy project.
80 if self.projectInfo("PROJECT_FROM_PRESET") and self.projectInfo("BASE_MODE"):
81 return self.wizard().pageIndex(BCreationPage)
83 return QWizardPage.nextId(self)
87 ## Overloaded BWizardPage methods. ##
91 Sets up the user interface.
93 self.pageContent.infoLabel.setVisible(False)
95 def connectSignals(self):
97 Connects the signals with the related slots.
99 self.connect(self.pageContent.toolchainList, SIGNAL("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), self.selectionChanged)
100 self.connect(self.pageContent.addButton, SIGNAL("clicked()"), self.addToolchain)
101 self.connect(self.pageContent.removeButton, SIGNAL("clicked()"), self.removeToolchain)
102 self.connect(self.pageContent.searchButton, SIGNAL("clicked()"), self.searchToolchain)
103 self.connect(self.pageContent.checkButton, SIGNAL("clicked()"), self.validateAllToolchains)
105 def reloadData(self, previous_id=None):
107 Overload of the BWizard reloadData method.
109 if previous_id is None or previous_id < self.wizard().currentId():
112 self._populateToolchainList()
113 if len(self._valid_items) >= 1:
114 self.pageContent.toolchainList.setCurrentItem(self._valid_items[0])
120 def selectionChanged(self):
122 Slot called when the user click on an entry of the toolchain list.
124 if self.pageContent.toolchainList.currentRow() != -1:
125 infos = collections.defaultdict(lambda: unicode("not defined"))
126 infos.update(qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole)))
127 self.pageContent.infoLabel.setText("GCC " + infos["version"] + " (" + infos["build"] + ")\nTarget: " + infos["target"] + "\nPath: " + os.path.normpath(infos["path"]))
128 self.pageContent.infoLabel.setVisible(True)
129 if self.isDefaultToolchain(infos):
130 self.disableRemoveButton()
132 self.enableRemoveButton()
133 self.emit(SIGNAL("completeChanged()"))
135 def addToolchain(self):
137 Slot called when the user adds manually a toolchain.
139 sel_toolchain = unicode(QFileDialog.getOpenFileName(self, self.tr("Choose the toolchain"), ""))
140 if sel_toolchain != "":
141 item = QListWidgetItem(sel_toolchain)
142 item.setData(Qt.UserRole, qvariant_converter.convertStringDict({"path": sel_toolchain}))
143 self.pageContent.toolchainList.addItem(item)
144 self._toolchain_manager.addToolchain(sel_toolchain)
146 def removeToolchain(self):
148 Slot called when the user removes manually a toolchain.
150 if self.pageContent.toolchainList.currentRow() != -1:
151 item = self.pageContent.toolchainList.takeItem(self.pageContent.toolchainList.currentRow())
152 toolchain = qvariant_converter.getStringDict(item.data(Qt.UserRole))["path"]
153 self._toolchain_manager.removeToolchain(toolchain)
155 def searchToolchain(self):
157 Slot called when the user clicks on the 'search' button. It opens the
158 toolchain search dialog.
160 search = BToolchainSearch.BToolchainSearch()
161 self.connect(search, SIGNAL("accepted()"), self._search)
164 def validateAllToolchains(self):
166 Slot called when the user clicks on the validate button. It starts the
167 toolchain validation procedure for all the toolchains.
170 QApplication.instance().setOverrideCursor(Qt.WaitCursor)
171 for i in range(self.pageContent.toolchainList.count()):
172 self.validateToolchain(i)
174 QApplication.instance().restoreOverrideCursor()
178 def _populateToolchainList(self):
180 Fills the toolchain list with the toolchains stored in the QSettings.
182 self.pageContent.toolchainList.clear()
183 self._valid_items = []
184 toolchains = self._toolchain_manager.predefined_toolchains + self._toolchain_manager.toolchains
185 sel_toolchain = self.projectInfo("TOOLCHAIN")
186 for key, value in toolchains:
187 if os.path.exists(key):
188 item = QListWidgetItem(key)
189 item_data = {"path":key}
191 item_data.update(value)
192 item.setData(Qt.UserRole, qvariant_converter.convertStringDict(item_data))
193 self.pageContent.toolchainList.addItem(item)
194 if sel_toolchain and sel_toolchain["path"] == key:
195 self.pageContent.toolchainList.setCurrentItem(item)
196 if value is not None:
197 self.validateToolchain(self.pageContent.toolchainList.row(item))
199 def currentToolchain(self):
200 selected_toolchain = qvariant_converter.getStringDict(self.pageContent.toolchainList.currentItem().data(Qt.UserRole))
201 return selected_toolchain
203 def _clearList(self):
205 Removes all the toolchain from the list.
207 self.pageContent.toolchainList.clear()
211 Searches for toolchains in the stored directories, and stores them in the
214 dir_list = self.searchDirList()
215 if self.pathSearch():
216 dir_list += [element for element in bertos_utils.getSystemPath()]
217 _toolchain_dict = self._toolchain_manager.storedToolchainDict()
218 toolchain_list = bertos_utils.findToolchains(dir_list)
219 for toolchain in toolchain_list:
220 self._toolchain_manager.addToolchain(toolchain, _toolchain_dict.get(toolchain, False))
221 self._populateToolchainList()
222 self.showMessage(self.tr("Toolchain search result."), self.tr("%1 toolchains found").arg(len(toolchain_list)))
224 def _validItem(self, index, infos):
226 Sets the item at index as a valid item and associates the given info to it.
228 item = self.pageContent.toolchainList.item(index)
229 new_data = qvariant_converter.getStringDict(self.pageContent.toolchainList.item(index).data(Qt.UserRole))
230 new_data.update(infos)
231 item.setData(Qt.UserRole, qvariant_converter.convertStringDict(new_data))
232 needed = self.projectInfo("CPU_INFOS")
233 if "target" in infos and infos["target"].find(needed["TOOLCHAIN"]) != -1:
234 item.setIcon(QIcon(":/images/ok.png"))
235 self._valid_items.append(item)
237 item.setIcon(QIcon(":/images/warning.png"))
238 if "version" in infos and "target" in infos:
239 item.setText("GCC " + infos["version"] + " - " + infos["target"].strip())
241 def _invalidItem(self, index):
243 Sets the item at index as an invalid item.
245 item = self.pageContent.toolchainList.item(index)
246 item.setIcon(QIcon(":/images/error.png"))
248 def validateToolchain(self, i):
250 Toolchain validation procedure.
252 filename = qvariant_converter.getStringDict(self.pageContent.toolchainList.item(i).data(Qt.UserRole))["path"]
253 info = self._toolchain_manager.validateToolchain(filename)
255 # Add the item in the list with the appropriate associate data.
257 self._validItem(i, info)
261 def isDefaultToolchain(self, toolchain):
263 Returns True if the given toolchain is one of the default toolchains.
265 return toolchain["path"] in self._toolchain_manager._predefined_toolchain_set
267 def disableRemoveButton(self):
269 Disable the remove button.
271 self.pageContent.removeButton.setEnabled(False)
273 def enableRemoveButton(self):
275 Enable the remove button.
277 self.pageContent.removeButton.setEnabled(True)
279 def currentItem(self):
280 return self.pageContent.toolchainList.currentItem()