Add the project editing functionality
[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 version needed"))
30
31     ## Overloaded QWizardPage methods ##
32     
33     def isComplete(self):
34         """
35         Overload of the QWizardPage isComplete method.
36         """
37         if self.pageContent.versionList.currentRow() != -1:
38             sources_path = qvariant_converter.getString(self.pageContent.versionList.currentItem().data(Qt.UserRole))
39             ## Remove the trailing slash
40             if sources_path.endswith(os.sep):
41                 sources_path = sources_path[:-1]
42             self.setProjectInfo("SOURCES_PATH", sources_path)
43             return True
44         else:
45             return False
46     
47     ####
48     
49     ## Overloaded BWizardPage methods ##
50
51     def connectSignals(self):
52         """
53         Overload of the BWizardPage connectSignals method.
54         """
55         self.connect(self.pageContent.versionList, SIGNAL("itemSelectionChanged()"), self.rowChanged)
56         self.connect(self.pageContent.addButton, SIGNAL("clicked()"), self.addVersion)
57         self.connect(self.pageContent.removeButton, SIGNAL("clicked()"), self.removeVersion)
58         # Fake signal connection for the update button
59         self.connect(self.pageContent.updateButton, SIGNAL("clicked()"), self.updateClicked)
60     
61     def reloadData(self):
62         """
63         Overload of the BWizardPage reloadData method.
64         """
65         self.pageContent.versionList.setCurrentRow(-1)
66         self.fillVersionList()
67     
68     ####
69     
70     ## Slots ##
71     
72     def addVersion(self):
73         """
74         Slot called when the user add a BeRTOS version.
75         """
76         directory = QFileDialog.getExistingDirectory(self, self.tr("Choose a directory"), "", QFileDialog.ShowDirsOnly | QFileDialog.DontResolveSymlinks)
77         if not directory.isEmpty():
78             self.storeVersion(unicode(directory))
79             self.pageContent.versionList.clear()
80             self.fillVersionList()
81             self.emit(SIGNAL("completeChanged()"))
82     
83     def removeVersion(self):
84         """
85         Slot called when the user remove a BeRTOS version.
86         """
87         item = self.pageContent.versionList.takeItem(self.pageContent.versionList.currentRow())
88         self.deleteVersion(qvariant_converter.getString(item.data(Qt.UserRole)))
89         self.emit(SIGNAL("completeChanged()"))
90     
91     def rowChanged(self):
92         """
93         Slot called when the user select an entry from the version list.
94         """
95         self.emit(SIGNAL("completeChanged()"))
96
97     def updateClicked(self):
98         """
99         Slot called when the user clicks on the 'update' button. It checks for
100         update (TO BE IMPLEMENTED).
101         """
102         pass    
103
104     ####
105     
106     def storeVersion(self, directory):
107         """
108         Stores the directory selected by the user in the QSettings.
109         """
110         versions = self.versions()
111         versions = set(versions + [directory])
112         self.setVersions(list(versions))
113     
114     def deleteVersion(self, directory):
115         """
116         Removes the given directory from the QSettings.
117         """
118         versions = self.versions()
119         versions.remove(directory)
120         self.setVersions(versions)
121         
122     def insertListElement(self, directory):
123         """
124         Inserts the given directory in the version list and returns the
125         inserted item.
126         """
127         if bertos_utils.isBertosDir(directory):
128             item = QListWidgetItem(QIcon(":/images/ok.png"), bertos_utils.bertosVersion(directory) + " (\"" + os.path.normpath(directory) + "\")")
129             item.setData(Qt.UserRole, qvariant_converter.convertString(directory))
130             self.pageContent.versionList.addItem(item)
131             return item
132         elif len(directory) > 0:
133             item = QListWidgetItem(QIcon(":/images/warning.png"), "UNKNOWN" + " (\"" + os.path.normpath(directory) + "\")")
134             item.setData(Qt.UserRole, qvariant_converter.convertString(directory))
135             self.pageContent.versionList.addItem(item)
136             return item
137     
138     def fillVersionList(self):
139         """
140         Fills the version list with all the BeRTOS versions founded in the QSettings.
141         """
142         versions = self.versions()
143         selected = self.projectInfo("SOURCES_PATH")
144         for directory in versions:
145             item = self.insertListElement(directory)
146             if not selected is None and selected == directory:
147                 self.setCurrentItem(item)
148     
149     def setCurrentItem(self, item):
150         """
151         Select the given item in the version list.
152         """
153         self.pageContent.versionList.setCurrentItem(item)