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 ## Overloaded BWizardPage methods ##
77 def connectSignals(self):
79 Overload of the BWizardPage connectSignals method.
81 self.connect(self.pageContent.versionList, SIGNAL("itemSelectionChanged()"), self.rowChanged)
82 self.connect(self.pageContent.addButton, SIGNAL("clicked()"), self.addVersion)
83 self.connect(self.pageContent.removeButton, SIGNAL("clicked()"), self.removeVersion)
84 # Fake signal connection for the update button
85 self.connect(self.pageContent.updateButton, SIGNAL("clicked()"), self.updateClicked)
89 Overload of the BWizardPage reloadData method.
91 self.resetVersionList()
92 self.pageContent.versionList.setCurrentRow(-1)
93 self.fillVersionList()
97 Overload of the BWizardPage setupUi method.
99 self.pageContent.updateButton.setVisible(False)
105 def addVersion(self):
107 Slot called when the user add a BeRTOS version.
109 directory = QFileDialog.getExistingDirectory(self, self.tr("Choose a directory"), "", QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)
110 if not directory.isEmpty():
111 self.storeVersion(unicode(directory))
112 self.pageContent.versionList.clear()
113 self.fillVersionList()
114 self.emit(SIGNAL("completeChanged()"))
116 def removeVersion(self):
118 Slot called when the user remove a BeRTOS version.
120 item = self.pageContent.versionList.takeItem(self.pageContent.versionList.currentRow())
122 self.deleteVersion(qvariant_converter.getString(item.data(Qt.UserRole)))
123 self.emit(SIGNAL("completeChanged()"))
125 def rowChanged(self):
127 Slot called when the user select an entry from the version list.
129 if self.isDefaultVersion(self.currentVersion()):
130 self.disableRemoveButton()
132 self.enableRemoveButton()
133 self.emit(SIGNAL("completeChanged()"))
135 def updateClicked(self):
137 Slot called when the user clicks on the 'update' button. It checks for
138 update (TO BE IMPLEMENTED).
144 def storeVersion(self, directory):
146 Stores the directory selected by the user in the QSettings.
148 versions = self.versions()
149 versions = set(versions + [directory])
150 self.setVersions(list(versions))
152 def deleteVersion(self, directory):
154 Removes the given directory from the QSettings.
156 versions = [os.path.normpath(path) for path in self.versions()]
157 versions.remove(os.path.normpath(directory))
158 self.setVersions(versions)
160 def resetVersionList(self):
162 Remove all the version entries from the list.
164 self.pageContent.versionList.clear()
166 def insertListElement(self, directory):
168 Inserts the given directory in the version list and returns the
171 if bertos_utils.isBertosDir(directory):
172 item = QListWidgetItem(QIcon(":/images/ok.png"), bertos_utils.bertosVersion(directory) + " (\"" + os.path.normpath(directory) + "\")")
173 item.setData(Qt.UserRole, qvariant_converter.convertString(directory))
174 self.pageContent.versionList.addItem(item)
176 elif len(directory) > 0:
177 item = QListWidgetItem(QIcon(":/images/warning.png"), "UNKNOWN" + " (\"" + os.path.normpath(directory) + "\")")
178 item.setData(Qt.UserRole, qvariant_converter.convertString(directory))
179 self.pageContent.versionList.addItem(item)
182 def fillVersionList(self):
184 Fills the version list with all the BeRTOS versions founded in the QSettings.
188 versions.add(self.projectInfo("SOURCES_PATH"))
190 import winreg_importer
191 versions |= set([os.path.normpath(dir) for dir in winreg_importer.getBertosDirs()])
192 versions |= set([os.path.normpath(dir) for dir in self.versions()])
193 selected = self.projectInfo("SOURCES_PATH")
194 for directory in versions:
195 item = self.insertListElement(directory)
196 if selected and selected == directory:
197 self.setCurrentItem(item)
199 latest_version_item = self.latestVersionItem()
200 if latest_version_item:
201 self.setCurrentItem(latest_version_item)
203 def disableRemoveButton(self):
205 Disable the Remove button.
207 self.pageContent.removeButton.setEnabled(False)
209 def enableRemoveButton(self):
211 Enable the Remove button.
213 self.pageContent.removeButton.setEnabled(True)
215 def latestVersionItem(self):
217 Returns the latest BeRTOS version founded.
219 latest_version_item = None
220 for index in range(self.pageContent.versionList.count()):
221 item = self.pageContent.versionList.item(index)
222 if not latest_version_item:
223 latest_version_item = item
224 version = item.text().split(" (")[0]
225 latest = latest_version_item.text().split(" (")[0]
226 if version != "UNKNOWN" and version > latest:
227 latest_version_item = item
228 return latest_version_item
230 def setCurrentItem(self, item):
232 Select the given item in the version list.
234 self.pageContent.versionList.setCurrentItem(item)
236 def currentItem(self):
238 Returns the current selected item.
240 return self.pageContent.versionList.currentItem()
242 def currentVersion(self):
244 Return the path of the selected version.
246 current = self.currentItem()
248 return qvariant_converter.getString(current.data(Qt.UserRole))
252 def isDefaultVersion(self, version):
254 Returns True if the given version is one of the default versions.
257 import winreg_importer
258 if version in winreg_importer.getBertosDirs():