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