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