use currentChanged slot instead of mouseReleaseEvent
[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.rspecwindow import RSpecWindow
12 from sface.screens.configscreen import ConfigScreen
13 from sface.screens.mainscreen import MainScreen
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.config = QLabel("", self)
24         self.config.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.main)
31         hlayout.addWidget(self.config)
32         self.setLayout(hlayout)
33
34     def setTitle(self, title):
35         self.title.setText(title)
36
37     def setLinks(self, main, config):
38         self.main.setText(main)
39         self.config.setText(config)
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
66 class MainWindow(QWidget):
67     def __init__(self, parent=None):
68         QWidget.__init__(self, parent)
69
70         self.logWindow = LogWindow(self)
71         self.rspecWindow = RSpecWindow(self)
72
73         self.pix = QLabel(self)
74         self.config_screen = ConfigScreen(self)
75         self.main_screen = MainScreen(self)
76
77         self.screens = QStackedWidget(self)
78         self.screens.addWidget(self.main_screen)
79         self.screens.addWidget(self.config_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.main_screen.getLinkText(),
86                           self.config_screen.getLinkText())
87
88         self.status = Status(self)
89         self.log = QLabel("<a href='showlog'>Show Log</a>", self)
90         self.rspec = QLabel("<a href='showlog'>Show RSpec</a>", self)
91
92         hlayout = QHBoxLayout()
93         hlayout.addWidget(self.status)
94         hlayout.addStretch()
95         hlayout.addWidget(self.rspec)
96         hlayout.addWidget(self.log)
97
98         layout = QVBoxLayout()
99         layout.addWidget(self.nav)
100         layout.addWidget(self.screens)
101         layout.addLayout(hlayout)
102         self.setLayout(layout)
103         self.resize(800, 600)
104
105         for link in (self.nav.main, self.nav.config):
106             self.connect(link, SIGNAL('linkActivated(QString)'),
107                          self.animateToScreen)
108
109         self.connect(self.log, SIGNAL('linkActivated(QString)'),
110                      self.showLogWindow)
111         self.connect(self.rspec, SIGNAL('linkActivated(QString)'),
112                      self.showRSpecWindow)
113
114     def redirectOutputToLog(self):
115         self.logWindow.redirectOutput()
116
117     def showLogWindow(self, link):
118         self.logWindow.show()
119         self.logWindow.resize(800, 400)
120         self.logWindow.raise_()
121         self.logWindow.activateWindow()
122
123     def showRSpecWindow(self, link):
124         self.rspecWindow.show()
125         self.rspecWindow.resize(500, 640)
126         self.rspecWindow.raise_()
127         self.rspecWindow.activateWindow()
128
129
130     def animatePixmap(self, y):
131         self.pix.move(0, y)
132
133     def animateToScreen(self, link):
134         if link == self.config_screen.name:
135             self.next_screen = self.config_screen
136         elif link == self.main_screen.name:
137             self.next_screen = self.main_screen
138
139         curr_screen = self.screens.currentWidget()
140
141         if self.next_screen == curr_screen:
142             self.setStatus("Already showing %s" % curr_screen.getTitleText(), timeout=1000)
143             return
144
145         pixmap = QPixmap(self.screens.size())
146         curr_screen.render(pixmap)
147         self.screens.setCurrentWidget(self.pix)
148         self.pix.setPixmap(pixmap)
149
150         timeLine = QTimeLine(500, self)
151         timeLine.setFrameRange(0, self.screens.height());
152         self.connect(timeLine, SIGNAL('frameChanged(int)'), self.animatePixmap)
153         self.connect(timeLine, SIGNAL('finished()'), self.toNextScreen)
154         timeLine.start()
155
156
157     def toNextScreen(self):
158         if self.next_screen == self.config_screen:
159             self.toConfigScreen()
160         elif self.next_screen == self.main_screen:
161             self.toMainScreen()
162
163     def toConfigScreen(self):
164         self.screens.setCurrentWidget(self.config_screen)
165         self.nav.setTitle(self.config_screen.getTitleText())
166
167     def toMainScreen(self):
168         self.screens.setCurrentWidget(self.main_screen)
169         self.nav.setTitle(self.main_screen.getTitleText())
170
171     def setStatus(self, msg, timeout):
172         self.status.set(msg, timeout)
173
174     def nodeSelectionChanged(self, hostname):
175         self.rspecWindow.showNode(hostname)