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