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