b04e638af43f16651f1699c81aea7c6c680acb90
[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.screens.configscreen import ConfigScreen
12 from sface.screens.mainscreen import MainScreen
13 from sface.screens.rspecscreen import RSpecScreen
14
15 class Nav(QWidget):
16     def __init__(self, parent=None):
17         QWidget.__init__(self, parent)
18         
19         self.title = QLabel("", self)
20         self.main = QLabel("", self)
21         self.main.setAlignment(Qt.AlignRight)
22
23         self.rspec = QLabel("", self)
24         self.rspec.setAlignment(Qt.AlignRight)
25
26         self.config = QLabel("", self)
27         self.config.setAlignment(Qt.AlignRight)
28         
29         hlayout = QHBoxLayout()
30         hlayout.addWidget(self.title)
31         hlayout.addStretch()
32         hlayout.addWidget(QLabel("Go to: ", self))
33         hlayout.addWidget(self.main)
34         hlayout.addWidget(self.rspec)
35         hlayout.addWidget(self.config)
36         self.setLayout(hlayout)
37
38     def setTitle(self, title):
39         self.title.setText(title)
40
41     def setLinks(self, main, rspec, config):
42         self.main.setText(main)
43         self.rspec.setText(rspec)
44         self.config.setText(config)
45
46
47 class Status(QLabel):
48     def __init__(self, parent=None):
49         QLabel.__init__(self, "", parent)
50         self.sliceUpdateDate()
51
52     def set(self, msg, timeout):
53         self.setText(msg)
54         if timeout:
55             QTimer.singleShot(timeout, self.reset)
56
57     def sliceUpdateDate(self):
58         rspec_file = config.getSliceRSpecFile()
59         if not os.path.exists(rspec_file):
60             return
61
62         creation_time = os.stat(rspec_file).st_ctime
63         last_update = time.ctime(creation_time)
64         self.set("Slice data last updated on %s" % last_update, timeout=None)
65
66     def reset(self):
67         self.setText("")
68         QTimer.singleShot(1500, self.sliceUpdateDate)
69
70 class MainWindow(QWidget):
71     def __init__(self, parent=None):
72         QWidget.__init__(self, parent)
73
74         self.logWindow = LogWindow(self)
75
76         self.pix = QLabel(self)
77         self.config_screen = ConfigScreen(self)
78         self.main_screen = MainScreen(self)
79         self.rspec_screen = RSpecScreen(self)
80
81         self.screens = QStackedWidget(self)
82         self.screens.addWidget(self.main_screen)
83         self.screens.addWidget(self.config_screen)
84         self.screens.addWidget(self.rspec_screen)
85         self.screens.addWidget(self.pix)
86         self.next_screen = None
87
88         self.nav = Nav(self)
89         self.nav.setTitle(self.main_screen.getTitleText())
90         self.nav.setLinks(self.main_screen.getLinkText(),
91                           self.rspec_screen.getLinkText(),
92                           self.config_screen.getLinkText())
93
94         self.status = Status(self)
95         self.log = QLabel("<a href='showlog'>Show Log</a>", self)
96
97         hlayout = QHBoxLayout()
98         hlayout.addWidget(self.status)
99         hlayout.addStretch()
100         hlayout.addWidget(self.log)
101
102         layout = QVBoxLayout()
103         layout.addWidget(self.nav)
104         layout.addWidget(self.screens)
105         layout.addLayout(hlayout)
106         self.setLayout(layout)
107         self.resize(800, 600)
108
109         for link in (self.nav.main, self.nav.rspec, self.nav.config):
110             self.connect(link, SIGNAL('linkActivated(QString)'),
111                          self.animateToScreen)
112
113         self.connect(self.log, SIGNAL('linkActivated(QString)'),
114                      self.showLogWindow)
115
116     def redirectOutputToLog(self):
117         self.logWindow.redirectOutput()
118
119     def showLogWindow(self, link):
120         self.logWindow.show()
121         self.logWindow.resize(800, 400)
122         self.logWindow.raise_()
123         self.logWindow.activateWindow()
124
125     def animatePixmap(self, y):
126         self.pix.move(0, y)
127
128     def animateToScreen(self, link):
129         if link == self.config_screen.name:
130             self.next_screen = self.config_screen
131         elif link == self.main_screen.name:
132             self.next_screen = self.main_screen
133         elif link == self.rspec_screen.name:
134             self.next_screen = self.rspec_screen
135
136         curr_screen = self.screens.currentWidget()
137
138         if self.next_screen == curr_screen:
139             self.setStatus("Already showing %s" % curr_screen.getTitleText(), timeout=1000)
140             return
141
142         pixmap = QPixmap(self.screens.size())
143         curr_screen.render(pixmap)
144         self.screens.setCurrentWidget(self.pix)
145         self.pix.setPixmap(pixmap)
146
147         timeLine = QTimeLine(500, self)
148         timeLine.setFrameRange(0, self.screens.height());
149         self.connect(timeLine, SIGNAL('frameChanged(int)'), self.animatePixmap)
150         self.connect(timeLine, SIGNAL('finished()'), self.toNextScreen)
151         timeLine.start()
152
153
154     def toNextScreen(self):
155         if self.next_screen == self.config_screen:
156             self.toConfigScreen()
157         elif self.next_screen == self.main_screen:
158             self.toMainScreen()
159         elif self.next_screen == self.rspec_screen:
160             self.toRSpecScreen()
161
162     def toConfigScreen(self):
163         self.screens.setCurrentWidget(self.config_screen)
164         self.nav.setTitle(self.config_screen.getTitleText())
165
166     def toMainScreen(self):
167         self.screens.setCurrentWidget(self.main_screen)
168         self.nav.setTitle(self.main_screen.getTitleText())
169
170     def toRSpecScreen(self):
171         self.screens.setCurrentWidget(self.rspec_screen)
172         self.nav.setTitle(self.rspec_screen.getTitleText())
173
174     def setStatus(self, msg, timeout):
175         self.status.set(msg, timeout)
176