f3115a52059b177eaebe68f14e63b7df14776380
[sface.git] / sface / mainwindow.py
1
2 import os
3 import time
4
5 from PyQt4.QtCore import *
6 from PyQt4.QtGui import *
7
8 from sface.config import config
9 from sface.screens.configscreen import ConfigScreen
10 from sface.screens.mainscreen import MainScreen
11
12 class Nav(QWidget):
13     def __init__(self, parent=None):
14         QWidget.__init__(self, parent)
15         
16         self.title = QLabel("", self)
17         self.link = QLabel("", self)
18         self.link.setAlignment(Qt.AlignRight)
19         
20         hlayout = QHBoxLayout()
21         hlayout.addWidget(self.title)
22         hlayout.addStretch()
23         hlayout.addWidget(self.link)
24         self.setLayout(hlayout)
25
26     def setTitle(self, title):
27         self.title.setText(title)
28
29     def setLink(self, link):
30         self.link.setText(link)
31
32
33 class Status(QLabel):
34     def __init__(self, parent=None):
35         QLabel.__init__(self, "", parent)
36         self.sliceUpdateDate()
37
38     def set(self, msg, timeout):
39         self.setText(msg)
40         if timeout:
41             QTimer.singleShot(timeout, self.reset)
42
43     def sliceUpdateDate(self):
44         rspec_file = config.getSliceRSpecFile()
45         if not os.path.exists(rspec_file):
46             return
47
48         creation_time = os.stat(rspec_file).st_ctime
49         last_update = time.ctime(creation_time)
50         self.set("Slice data last updated on %s" % last_update, timeout=None)
51
52     def reset(self):
53         self.setText("")
54         QTimer.singleShot(1500, self.sliceUpdateDate)
55
56 class MainWindow(QWidget):
57     def __init__(self, parent=None):
58         QWidget.__init__(self, parent)
59
60         self.pix = QLabel(self)
61         self.config_screen = ConfigScreen(self)
62         self.main_screen = MainScreen(self)
63
64         self.screens = QStackedWidget(self)
65         self.screens.addWidget(self.main_screen)
66         self.screens.addWidget(self.config_screen)
67         self.screens.addWidget(self.pix)
68         self.next_screen = None
69
70         self.nav = Nav(self)
71         self.nav.setTitle(self.main_screen.getTitleText())
72         self.nav.setLink(self.config_screen.getLinkText())
73
74         self.status = Status(self)
75
76         layout = QVBoxLayout()
77         layout.addWidget(self.nav)
78         layout.addWidget(self.screens)
79         layout.addWidget(self.status)
80         self.setLayout(layout)
81         self.resize(800, 600)
82
83         self.connect(self.nav.link, SIGNAL('linkActivated(QString)'),
84                      self.animateToScreen)
85
86
87     def animatePixmap(self, y):
88         self.pix.move(0, y)
89
90     def animateToScreen(self, link):
91         if link == self.config_screen.name:
92             self.next_screen = self.config_screen
93         elif link == self.main_screen.name:
94             self.next_screen = self.main_screen
95         
96         pixmap = QPixmap(self.screens.size())
97         self.screens.currentWidget().render(pixmap)
98         self.screens.setCurrentWidget(self.pix)
99         self.pix.setPixmap(pixmap)
100
101         timeLine = QTimeLine(500, self)
102         timeLine.setFrameRange(0, self.screens.height());
103         self.connect(timeLine, SIGNAL('frameChanged(int)'), self.animatePixmap)
104         self.connect(timeLine, SIGNAL('finished()'), self.toNextScreen)
105         timeLine.start()
106
107
108     def toNextScreen(self):
109         if self.next_screen == self.config_screen:
110             self.toConfigScreen()
111         elif self.next_screen == self.main_screen:
112             self.toMainScreen()
113
114     def toConfigScreen(self):
115         self.screens.setCurrentWidget(self.config_screen)
116         self.nav.setLink(self.main_screen.getLinkText())
117         self.nav.setTitle(self.config_screen.getTitleText())
118
119     def toMainScreen(self):
120         self.screens.setCurrentWidget(self.main_screen)
121         self.nav.setLink(self.config_screen.getLinkText())
122         self.nav.setTitle(self.main_screen.getTitleText())
123
124     def setStatus(self, msg, timeout):
125         self.status.set(msg, timeout)