Setting tag sface-0.1-6
[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 from sface.screens.helpscreen import HelpScreen
15
16 class Nav(QWidget):
17     def __init__(self, parent=None):
18         QWidget.__init__(self, parent)
19         
20         self.title = QLabel("", self)
21         self.main = QLabel("", self)
22         self.main.setAlignment(Qt.AlignRight)
23
24         self.config = QLabel("", self)
25         self.config.setAlignment(Qt.AlignRight)
26         
27         self.help = QLabel("", self)
28         self.help.setAlignment(Qt.AlignRight)
29
30         hlayout = QHBoxLayout()
31         hlayout.addWidget(self.title)
32         hlayout.addStretch()
33         hlayout.addWidget(QLabel("Go to: ", self))
34         hlayout.addWidget(self.main)
35         hlayout.addWidget(self.config)
36         hlayout.addWidget(self.help)
37         self.setLayout(hlayout)
38
39     def setTitle(self, title):
40         self.title.setText(title)
41
42     def setLinks(self, main, config, help):
43         self.main.setText(main)
44         self.config.setText(config)
45         self.help.setText(help)
46
47
48 class Status(QLabel):
49     def __init__(self, parent=None):
50         QLabel.__init__(self, "", parent)
51         self.sliceUpdateDate()
52
53     def set(self, msg, timeout):
54         self.setText(msg)
55         if timeout:
56             QTimer.singleShot(timeout, self.reset)
57
58     def sliceUpdateDate(self):
59         rspec_file = config.getSliceRSpecFile()
60         if not os.path.exists(rspec_file):
61             return
62
63         creation_time = os.stat(rspec_file).st_ctime
64         last_update = time.ctime(creation_time)
65         self.set("Slice data last updated on %s" % last_update, timeout=None)
66
67     def reset(self):
68         self.setText("")
69         QTimer.singleShot(1500, self.sliceUpdateDate)
70
71
72 class MainWindow(QWidget):
73     def __init__(self, parent=None):
74         QWidget.__init__(self, parent)
75
76         self.logWindow = LogWindow(self)
77         self.rspecWindow = RSpecWindow(self)
78
79         self.pix = QLabel(self)
80         self.config_screen = ConfigScreen(self)
81         self.main_screen = MainScreen(self)
82         self.help_screen = HelpScreen(self)
83
84         self.screens = QStackedWidget(self)
85         self.screens.addWidget(self.main_screen)
86         self.screens.addWidget(self.config_screen)
87         self.screens.addWidget(self.help_screen)
88         self.screens.addWidget(self.pix)
89         self.next_screen = None
90
91         self.nav = Nav(self)
92         self.nav.setTitle(self.main_screen.getTitleText())
93         self.nav.setLinks(self.main_screen.getLinkText(),
94                           self.config_screen.getLinkText(),
95                           self.help_screen.getLinkText())
96
97         self.status = Status(self)
98         self.log = QLabel("<a href='showlog'>Show Log</a>", self)
99         self.rspec = QLabel("<a href='showlog'>Show RSpec</a>", self)
100
101         hlayout = QHBoxLayout()
102         hlayout.addWidget(self.status)
103         hlayout.addStretch()
104         hlayout.addWidget(self.rspec)
105         hlayout.addWidget(self.log)
106
107         layout = QVBoxLayout()
108         layout.addWidget(self.nav)
109         layout.addWidget(self.screens)
110         layout.addLayout(hlayout)
111         self.setLayout(layout)
112         self.resize(800, 500)
113
114         for link in (self.nav.main, self.nav.config, self.nav.help):
115             self.connect(link, SIGNAL('linkActivated(QString)'),
116                          self.animateToScreen)
117
118         self.connect(self.log, SIGNAL('linkActivated(QString)'),
119                      self.showLogWindow)
120         self.connect(self.rspec, SIGNAL('linkActivated(QString)'),
121                      self.showRSpecWindow)
122
123     def redirectOutputToLog(self):
124         self.logWindow.redirectOutput()
125
126     def showLogWindow(self, link):
127         self.logWindow.show()
128         self.logWindow.resize(800, 200)
129         self.logWindow.raise_()
130         self.logWindow.activateWindow()
131
132     def showRSpecWindow(self, link):
133         self.rspecWindow.show()
134         self.rspecWindow.resize(500, 640)
135         self.rspecWindow.raise_()
136         self.rspecWindow.activateWindow()
137
138
139     def animatePixmap(self, y):
140         self.pix.move(0, y)
141
142     def animateToScreen(self, link):
143         if link == self.config_screen.name:
144             self.next_screen = self.config_screen
145         elif link == self.main_screen.name:
146             self.next_screen = self.main_screen
147         elif link == self.help_screen.name:
148             self.next_screen = self.help_screen
149
150         curr_screen = self.screens.currentWidget()
151
152         if self.next_screen == curr_screen:
153             self.setStatus("Already showing %s" % curr_screen.getTitleText(), timeout=1000)
154             return
155
156         # This is an optimization to have a smoother animation. We
157         # render the widget into a pixmap and animate that instead of
158         # moving the whole widget around.
159         pixmap = QPixmap(self.screens.size())
160         curr_screen.render(pixmap)
161         self.screens.setCurrentWidget(self.pix)
162         self.pix.setPixmap(pixmap)
163
164         timeLine = QTimeLine(500, self)
165         timeLine.setFrameRange(0, self.screens.height());
166         self.connect(timeLine, SIGNAL('frameChanged(int)'), self.animatePixmap)
167         self.connect(timeLine, SIGNAL('finished()'), self.toNextScreen)
168         timeLine.start()
169
170
171     def toNextScreen(self):
172         if self.next_screen == self.config_screen:
173             self.toConfigScreen()
174         elif self.next_screen == self.main_screen:
175             self.toMainScreen()
176         elif self.next_screen == self.help_screen:
177             self.toHelpScreen()
178
179     def toConfigScreen(self):
180         self.screens.setCurrentWidget(self.config_screen)
181         self.nav.setTitle(self.config_screen.getTitleText())
182
183     def toHelpScreen(self):
184         self.screens.setCurrentWidget(self.help_screen)
185         self.nav.setTitle(self.help_screen.getTitleText())
186
187     def toMainScreen(self):
188         self.screens.setCurrentWidget(self.main_screen)
189         self.nav.setTitle(self.main_screen.getTitleText())
190
191     def setStatus(self, msg, timeout):
192         self.status.set(msg, timeout)
193
194     def nodeSelectionChanged(self, hostname):
195         if self.rspecWindow.isVisible():
196             self.rspecWindow.showNode(hostname)