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/)
33 # Author: Lorenzo Berni <duplo@develer.com>
38 from PyQt4.QtGui import *
39 from BWizardPage import *
41 import qvariant_converter
45 class BVersionPage(BWizardPage):
47 Page of the wizard that permits to choose which BeRTOS version the user wants
48 to use. This page show some pieces of information about the version.
51 def __init__(self, edit=False):
53 BWizardPage.__init__(self, UI_LOCATION + "/bertos_versions.ui")
54 self.setTitle(self.tr("Select the BeRTOS directory"))
55 self.setSubTitle(self.tr("The project created will be based on the BeRTOS version found"))
57 ## Overloaded QWizardPage methods ##
61 Overload of the QWizardPage isComplete method.
63 if self.pageContent.versionList.currentRow() != -1:
64 sources_path = qvariant_converter.getString(self.pageContent.versionList.currentItem().data(Qt.UserRole))
65 # Remove the trailing slash
66 if sources_path.endswith(os.sep):
67 sources_path = sources_path[:-1]
68 self.setProjectInfo("SOURCES_PATH", sources_path)
75 Overload of the QWizard nextId method.
77 # Pick up the class stored into the project in the 'folder' step
78 page_class = self.projectInfo("ROUTE")
79 return self.wizard().pageIndex(page_class)
83 ## Overloaded BWizardPage methods ##
85 def connectSignals(self):
87 Overload of the BWizardPage connectSignals method.
89 self.connect(self.pageContent.versionList, SIGNAL("itemSelectionChanged()"), self.rowChanged)
90 self.connect(self.pageContent.addButton, SIGNAL("clicked()"), self.addVersion)
91 self.connect(self.pageContent.removeButton, SIGNAL("clicked()"), self.removeVersion)
92 # Fake signal connection for the update button
93 self.connect(self.pageContent.updateButton, SIGNAL("clicked()"), self.updateClicked)
97 Overload of the BWizardPage reloadData method.
99 self.resetVersionList()
100 self.pageContent.versionList.setCurrentRow(-1)
101 self.fillVersionList()
105 Overload of the BWizardPage setupUi method.
107 self.pageContent.updateButton.setVisible(False)
113 def addVersion(self):
115 Slot called when the user add a BeRTOS version.
117 directory = QFileDialog.getExistingDirectory(self, self.tr("Choose a directory"), "", QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)
118 if not directory.isEmpty():
119 self.storeVersion(unicode(directory))
120 self.pageContent.versionList.clear()
121 self.fillVersionList()
122 self.emit(SIGNAL("completeChanged()"))
124 def removeVersion(self):
126 Slot called when the user remove a BeRTOS version.
128 item = self.pageContent.versionList.takeItem(self.pageContent.versionList.currentRow())
130 self.deleteVersion(qvariant_converter.getString(item.data(Qt.UserRole)))
131 self.emit(SIGNAL("completeChanged()"))
133 def rowChanged(self):
135 Slot called when the user select an entry from the version list.
137 if self.isDefaultVersion(self.currentVersion()):
138 self.disableRemoveButton()
140 self.enableRemoveButton()
141 self.emit(SIGNAL("completeChanged()"))
143 def updateClicked(self):
145 Slot called when the user clicks on the 'update' button. It checks for
146 update (TO BE IMPLEMENTED).
152 def storeVersion(self, directory):
154 Stores the directory selected by the user in the QSettings.
156 versions = self.versions()
157 versions = set(versions + [directory])
158 self.setVersions(list(versions))
160 def deleteVersion(self, directory):
162 Removes the given directory from the QSettings.
164 versions = [os.path.normpath(path) for path in self.versions()]
165 versions.remove(os.path.normpath(directory))
166 self.setVersions(versions)
168 def resetVersionList(self):
170 Remove all the version entries from the list.
172 self.pageContent.versionList.clear()
174 def insertListElement(self, directory):
176 Inserts the given directory in the version list and returns the
179 if bertos_utils.isBertosDir(directory):
180 item = QListWidgetItem(QIcon(":/images/ok.png"), bertos_utils.bertosVersion(directory) + " (\"" + os.path.normpath(directory) + "\")")
181 item.setData(Qt.UserRole, qvariant_converter.convertString(directory))
182 self.pageContent.versionList.addItem(item)
184 elif len(directory) > 0:
185 item = QListWidgetItem(QIcon(":/images/warning.png"), "UNKNOWN" + " (\"" + os.path.normpath(directory) + "\")")
186 item.setData(Qt.UserRole, qvariant_converter.convertString(directory))
187 self.pageContent.versionList.addItem(item)
190 def fillVersionList(self):
192 Fills the version list with all the BeRTOS versions founded in the QSettings.
196 versions.add(self.projectInfo("SOURCES_PATH"))
198 import winreg_importer
199 versions |= set([os.path.normpath(dir) for dir in winreg_importer.getBertosDirs()])
200 versions |= set([os.path.normpath(dir) for dir in self.versions()])
201 selected = self.projectInfo("SOURCES_PATH")
202 for directory in versions:
203 item = self.insertListElement(directory)
204 if selected and selected == directory:
205 self.setCurrentItem(item)
207 latest_version_item = self.latestVersionItem()
208 if latest_version_item:
209 self.setCurrentItem(latest_version_item)
211 def disableRemoveButton(self):
213 Disable the Remove button.
215 self.pageContent.removeButton.setEnabled(False)
217 def enableRemoveButton(self):
219 Enable the Remove button.
221 self.pageContent.removeButton.setEnabled(True)
223 def latestVersionItem(self):
225 Returns the latest BeRTOS version founded.
227 latest_version_item = None
228 for index in range(self.pageContent.versionList.count()):
229 item = self.pageContent.versionList.item(index)
230 if not latest_version_item:
231 latest_version_item = item
232 version = item.text().split(" (")[0]
233 latest = latest_version_item.text().split(" (")[0]
234 if version != "UNKNOWN" and version > latest:
235 latest_version_item = item
236 return latest_version_item
238 def setCurrentItem(self, item):
240 Select the given item in the version list.
242 self.pageContent.versionList.setCurrentItem(item)
244 def currentItem(self):
246 Returns the current selected item.
248 return self.pageContent.versionList.currentItem()
250 def currentVersion(self):
252 Return the path of the selected version.
254 current = self.currentItem()
256 return qvariant_converter.getString(current.data(Qt.UserRole))
260 def isDefaultVersion(self, version):
262 Returns True if the given version is one of the default versions.
265 import winreg_importer
266 if version in winreg_importer.getBertosDirs():