added items in TODO
[sface.git] / sface / mainwindow.py
1
2 import os
3 import sys
4 import time
5
6 from PyQt4.QtCore import *
7 from PyQt4.QtGui import *
8
9 from sface.config import config
10 from sface.logwindow import LogWindow
11 from sface.xmlwindow import XmlWindow
12 from sface.screens.configscreen import ConfigScreen
13 from sface.screens.mainscreen import MainScreen
14
15 class Nav(QWidget):
16     def __init__(self, parent=None):
17         QWidget.__init__(self, parent)
18         
19         self.title = QLabel("", self)
20         self.link = QLabel("", self)
21         self.link.setAlignment(Qt.AlignRight)
22         
23         hlayout = QHBoxLayout()
24         hlayout.addWidget(self.title)
25         hlayout.addStretch()
26         hlayout.addWidget(self.link)
27         self.setLayout(hlayout)
28
29     def setTitle(self, title):
30         self.title.setText(title)
31
32     def setLink(self, link):
33         self.link.setText(link)
34
35
36 class Status(QLabel):
37     def __init__(self, parent=None):
38         QLabel.__init__(self, "", parent)
39         self.sliceUpdateDate()
40
41     def set(self, msg, timeout):
42         self.setText(msg)
43         if timeout:
44             QTimer.singleShot(timeout, self.reset)
45
46     def sliceUpdateDate(self):
47         rspec_file = config.getSliceRSpecFile()
48         if not os.path.exists(rspec_file):
49             return
50
51         creation_time = os.stat(rspec_file).st_ctime
52         last_update = time.ctime(creation_time)
53         self.set("Slice data last updated on %s" % last_update, timeout=None)
54
55     def reset(self):
56         self.setText("")
57         QTimer.singleShot(1500, self.sliceUpdateDate)
58
59 class MainWindow(QWidget):
60     def __init__(self, parent=None):
61         QWidget.__init__(self, parent)
62
63         self.logWindow = LogWindow(self)
64         self.xmlWindow = XmlWindow(self)
65
66         self.pix = QLabel(self)
67         self.config_screen = ConfigScreen(self)
68         self.main_screen = MainScreen(self)
69
70         self.screens = QStackedWidget(self)
71         self.screens.addWidget(self.main_screen)
72         self.screens.addWidget(self.config_screen)
73         self.screens.addWidget(self.pix)
74         self.next_screen = None
75
76         self.nav = Nav(self)
77         self.nav.setTitle(self.main_screen.getTitleText())
78         self.nav.setLink(self.config_screen.getLinkText())
79
80         self.status = Status(self)
81         self.log = QLabel("<a href='showlog'>Show Log</a>", self)
82         self.xml = QLabel("<a href='showrspec'>Show RSpec</a>", self)
83
84         hlayout = QHBoxLayout()
85         hlayout.addWidget(self.status)
86         hlayout.addStretch()
87         hlayout.addWidget(self.log)
88         hlayout.addWidget(self.xml)
89
90         layout = QVBoxLayout()
91         layout.addWidget(self.nav)
92         layout.addWidget(self.screens)
93         layout.addLayout(hlayout)
94         self.setLayout(layout)
95         self.resize(800, 600)
96
97         self.connect(self.nav.link, SIGNAL('linkActivated(QString)'),
98                      self.animateToScreen)
99         self.connect(self.log, SIGNAL('linkActivated(QString)'),
100                      self.showLogWindow)
101         self.connect(self.xml, SIGNAL('linkActivated(QString)'),
102                      self.showXmlWindow)
103
104     def redirectOutputToLog(self):
105         self.logWindow.redirectOutput()
106
107     def showLogWindow(self, link):
108         self.logWindow.show()
109         self.logWindow.resize(500, 500)
110         self.logWindow.raise_()
111         self.logWindow.activateWindow()
112
113     def showXmlWindow(self, link):
114         self.xmlWindow.show()
115         self.xmlWindow.resize(500, 500)
116         self.xmlWindow.raise_()
117         self.xmlWindow.activateWindow()
118
119     def animatePixmap(self, y):
120         self.pix.move(0, y)
121
122     def animateToScreen(self, link):
123         if link == self.config_screen.name:
124             self.next_screen = self.config_screen
125         elif link == self.main_screen.name:
126             self.next_screen = self.main_screen
127         
128         pixmap = QPixmap(self.screens.size())
129         self.screens.currentWidget().render(pixmap)
130         self.screens.setCurrentWidget(self.pix)
131         self.pix.setPixmap(pixmap)
132
133         timeLine = QTimeLine(500, self)
134         timeLine.setFrameRange(0, self.screens.height());
135         self.connect(timeLine, SIGNAL('frameChanged(int)'), self.animatePixmap)
136         self.connect(timeLine, SIGNAL('finished()'), self.toNextScreen)
137         timeLine.start()
138
139
140     def toNextScreen(self):
141         if self.next_screen == self.config_screen:
142             self.toConfigScreen()
143         elif self.next_screen == self.main_screen:
144             self.toMainScreen()
145
146     def toConfigScreen(self):
147         self.screens.setCurrentWidget(self.config_screen)
148         self.nav.setLink(self.main_screen.getLinkText())
149         self.nav.setTitle(self.config_screen.getTitleText())
150
151     def toMainScreen(self):
152         self.screens.setCurrentWidget(self.main_screen)
153         self.nav.setLink(self.config_screen.getLinkText())
154         self.nav.setTitle(self.main_screen.getTitleText())
155
156     def setStatus(self, msg, timeout):
157         self.status.set(msg, timeout)