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 BeRTOS version"))
55 self.setSubTitle(self.tr("Your project will be created with the specified BeRTOS version"))
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("BERTOS_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("currentItemChanged(QListWidgetItem *, QListWidgetItem*)"), 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)
87 def reloadData(self, previous_id=None):
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 import winreg_importer
189 versions |= set([os.path.normpath(dir) for dir in winreg_importer.getBertosDirs()])
190 versions |= set([os.path.normpath(dir) for dir in self.versions()])
191 selected = self.projectInfo("BERTOS_PATH")
192 for directory in versions:
193 item = self.insertListElement(directory)
194 if selected and selected == directory:
195 self.setCurrentItem(item)
197 latest_version_item = self.latestVersionItem()
198 if latest_version_item:
199 self.setCurrentItem(latest_version_item)
201 def disableRemoveButton(self):
203 Disable the Remove button.
205 self.pageContent.removeButton.setEnabled(False)
207 def enableRemoveButton(self):
209 Enable the Remove button.
211 self.pageContent.removeButton.setEnabled(True)
213 def latestVersionItem(self):
215 Returns the latest BeRTOS version founded.
217 latest_version_item = None
218 for index in range(self.pageContent.versionList.count()):
219 item = self.pageContent.versionList.item(index)
220 if not latest_version_item:
221 latest_version_item = item
222 version = item.text().split(" (")[0]
223 latest = latest_version_item.text().split(" (")[0]
224 if version != "UNKNOWN" and version > latest:
225 latest_version_item = item
226 return latest_version_item
228 def setCurrentItem(self, item):
230 Select the given item in the version list.
232 self.pageContent.versionList.setCurrentItem(item)
234 def currentItem(self):
236 Returns the current selected item.
238 return self.pageContent.versionList.currentItem()
240 def currentVersion(self):
242 Return the path of the selected version.
244 current = self.currentItem()
246 return qvariant_converter.getString(current.data(Qt.UserRole))
250 def isDefaultVersion(self, version):
252 Returns True if the given version is one of the default versions.
255 import winreg_importer
256 if version in winreg_importer.getBertosDirs():