Disable the remove button if the selected version is one of the default versions
[bertos.git] / wizard / BVersionPage.py
1 #!/usr/bin/env python
2 # encoding: utf-8
3 #
4 # Copyright 2008 Develer S.r.l. (http://www.develer.com/)
5 # All rights reserved.
6 #
7 # $Id$
8 #
9 # Author: Lorenzo Berni <duplo@develer.com>
10 #
11
12 import os
13
14 from PyQt4.QtGui import *
15 from BWizardPage import *
16 import bertos_utils
17 import qvariant_converter
18
19 from const import *
20
21 class BVersionPage(BWizardPage):
22     """
23     Page of the wizard that permits to choose which BeRTOS version the user wants
24     to use. This page show some pieces of information about the version.
25     """
26     
27     def __init__(self):
28         BWizardPage.__init__(self, UI_LOCATION + "/bertos_versions.ui")
29         self.setTitle(self.tr("Select the BeRTOS directory"))
30         self.setSubTitle(self.tr("The project created will be based on the BeRTOS version found"))
31
32     ## Overloaded QWizardPage methods ##
33     
34     def isComplete(self):
35         """
36         Overload of the QWizardPage isComplete method.
37         """
38         if self.pageContent.versionList.currentRow() != -1:
39             sources_path = qvariant_converter.getString(self.pageContent.versionList.currentItem().data(Qt.UserRole))
40             # Remove the trailing slash
41             if sources_path.endswith(os.sep):
42                 sources_path = sources_path[:-1]
43             self.setProjectInfo("SOURCES_PATH", sources_path)
44             return True
45         else:
46             return False
47     
48     ####
49     
50     ## Overloaded BWizardPage methods ##
51
52     def connectSignals(self):
53         """
54         Overload of the BWizardPage connectSignals method.
55         """
56         self.connect(self.pageContent.versionList, SIGNAL("itemSelectionChanged()"), self.rowChanged)
57         self.connect(self.pageContent.addButton, SIGNAL("clicked()"), self.addVersion)
58         self.connect(self.pageContent.removeButton, SIGNAL("clicked()"), self.removeVersion)
59         # Fake signal connection for the update button
60         self.connect(self.pageContent.updateButton, SIGNAL("clicked()"), self.updateClicked)
61     
62     def reloadData(self):
63         """
64         Overload of the BWizardPage reloadData method.
65         """
66         self.resetVersionList()
67         self.pageContent.versionList.setCurrentRow(-1)
68         self.fillVersionList()
69     
70     def setupUi(self):
71         """
72         Overload of the BWizardPage setupUi method.
73         """
74         self.pageContent.updateButton.setVisible(False)
75     
76     ####
77     
78     ## Slots ##
79     
80     def addVersion(self):
81         """
82         Slot called when the user add a BeRTOS version.
83         """
84         directory = QFileDialog.getExistingDirectory(self, self.tr("Choose a directory"), "", QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)
85         if not directory.isEmpty():
86             self.storeVersion(unicode(directory))
87             self.pageContent.versionList.clear()
88             self.fillVersionList()
89             self.emit(SIGNAL("completeChanged()"))
90     
91     def removeVersion(self):
92         """
93         Slot called when the user remove a BeRTOS version.
94         """
95         item = self.pageContent.versionList.takeItem(self.pageContent.versionList.currentRow())
96         self.deleteVersion(qvariant_converter.getString(item.data(Qt.UserRole)))
97         self.emit(SIGNAL("completeChanged()"))
98     
99     def rowChanged(self):
100         """
101         Slot called when the user select an entry from the version list.
102         """
103         if self.isDefaultVersion(self.currentVersion()):
104             self.disableRemoveButton()
105         else:
106             self.enableRemoveButton()
107         self.emit(SIGNAL("completeChanged()"))
108
109     def updateClicked(self):
110         """
111         Slot called when the user clicks on the 'update' button. It checks for
112         update (TO BE IMPLEMENTED).
113         """
114         pass    
115
116     ####
117     
118     def storeVersion(self, directory):
119         """
120         Stores the directory selected by the user in the QSettings.
121         """
122         versions = self.versions()
123         versions = set(versions + [directory])
124         self.setVersions(list(versions))
125     
126     def deleteVersion(self, directory):
127         """
128         Removes the given directory from the QSettings.
129         """
130         versions = self.versions()
131         versions.remove(directory)
132         self.setVersions(versions)
133     
134     def resetVersionList(self):
135         """
136         Remove all the version entries from the list.
137         """
138         self.pageContent.versionList.clear()
139     
140     def insertListElement(self, directory):
141         """
142         Inserts the given directory in the version list and returns the
143         inserted item.
144         """
145         if bertos_utils.isBertosDir(directory):
146             item = QListWidgetItem(QIcon(":/images/ok.png"), bertos_utils.bertosVersion(directory) + " (\"" + os.path.normpath(directory) + "\")")
147             item.setData(Qt.UserRole, qvariant_converter.convertString(directory))
148             self.pageContent.versionList.addItem(item)
149             return item
150         elif len(directory) > 0:
151             item = QListWidgetItem(QIcon(":/images/warning.png"), "UNKNOWN" + " (\"" + os.path.normpath(directory) + "\")")
152             item.setData(Qt.UserRole, qvariant_converter.convertString(directory))
153             self.pageContent.versionList.addItem(item)
154             return item
155     
156     def fillVersionList(self):
157         """
158         Fills the version list with all the BeRTOS versions founded in the QSettings.
159         """
160         versions = set([])
161         if os.name == "nt":
162             import winreg_importer
163             versions |= set(winreg_importer.getBertosDirs())
164         versions |= set(self.versions())
165         selected = self.projectInfo("SOURCES_PATH")
166         for directory in versions:
167             item = self.insertListElement(directory)
168             if selected and selected == directory:
169                 self.setCurrentItem(item)
170         if not selected:
171             self.setCurrentItem(self.latestVersionItem())
172     
173     def disableRemoveButton(self):
174         """
175         Disable the Remove button.
176         """
177         self.pageContent.removeButton.setEnabled(False)
178
179     def enableRemoveButton(self):
180         """
181         Enable the Remove button.
182         """
183         self.pageContent.removeButton.setEnabled(True)
184     
185     def latestVersionItem(self):
186         """
187         Returns the latest BeRTOS version founded.
188         """
189         latest_version_item = QTableWidgetItem("")
190         for index in range(self.pageContent.versionList.count()):
191             item = self.pageContent.versionList.item(index)
192             version = item.text().split(" (")[0]
193             latest = latest_version_item.text().split(" (")[0]
194             if version != "UNKNOWN" and version > latest:
195                 latest_version_item = item
196         return latest_version_item
197     
198     def setCurrentItem(self, item):
199         """
200         Select the given item in the version list.
201         """
202         self.pageContent.versionList.setCurrentItem(item)
203     
204     def currentItem(self):
205         """
206         Returns the current selected item.
207         """
208         return self.pageContent.versionList.currentItem()
209     
210     def currentVersion(self):
211         """
212         Return the path of the selected version.
213         """
214         current = self.currentItem()
215         return qvariant_converter.getString(current.data(Qt.UserRole))
216     
217     def isDefaultVersion(self, version):
218         """
219         Returns True if the given version is one of the default versions.
220         """
221         if os.name == "nt":
222             import winreg_importer
223             if version in winreg_importer.getBertosDirs():
224                 return True
225         return False