5 from PyQt4.QtCore import *
6 from PyQt4.QtGui import *
7 from PyQt4.QtOpenGL import *
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
17 def __init__(self, parent=None):
18 QWidget.__init__(self, parent)
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)
29 self.config = QLabel("", self)
30 self.config.setAlignment(Qt.AlignRight)
32 self.help = QLabel("", self)
33 self.help.setAlignment(Qt.AlignRight)
35 hlayout = QHBoxLayout()
36 hlayout.addWidget(self.logoview)
37 hlayout.addWidget(self.title)
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)
45 def setTitle(self, title):
46 self.title.setText(title)
48 def setLinks(self, main, config, help):
49 self.main.setText(main)
50 self.config.setText(config)
51 self.help.setText(help)
55 def __init__(self, parent=None):
56 QLabel.__init__(self, "", parent)
57 self.sliceUpdateDate()
59 def set(self, msg, timeout):
62 QTimer.singleShot(timeout, self.reset)
64 def sliceUpdateDate(self):
65 rspec_file = config.getSliceRSpecFile()
66 if not os.path.exists(rspec_file):
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)
75 QTimer.singleShot(1500, self.sliceUpdateDate)
78 class MainWindow(QWidget):
79 def __init__(self, parent=None):
80 QWidget.__init__(self, parent)
82 self.logWindow = LogWindow(self)
83 self.rspecWindow = RSpecWindow(self)
85 self.pix = QLabel(self)
86 self.config_screen = ConfigScreen(self)
87 self.main_screen = MainScreen(self)
88 self.help_screen = HelpScreen(self)
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
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())
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)
107 hlayout = QHBoxLayout()
108 hlayout.addWidget(self.status)
110 hlayout.addWidget(self.rspec)
111 hlayout.addWidget(self.log)
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)
120 for link in (self.nav.main, self.nav.config, self.nav.help):
121 self.connect(link, SIGNAL('linkActivated(QString)'),
122 self.animateToScreen)
124 self.connect(self.log, SIGNAL('linkActivated(QString)'),
126 self.connect(self.rspec, SIGNAL('linkActivated(QString)'),
127 self.showRSpecWindow)
129 def redirectOutputToLog(self):
130 self.logWindow.redirectOutput()
132 def showLogWindow(self, link):
133 self.logWindow.show()
134 self.logWindow.resize(800, 200)
135 self.logWindow.raise_()
136 self.logWindow.activateWindow()
138 def showRSpecWindow(self, link):
139 self.rspecWindow.show()
140 self.rspecWindow.resize(500, 640)
141 self.rspecWindow.raise_()
142 self.rspecWindow.activateWindow()
145 def animatePixmap(self, y):
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
156 curr_screen = self.screens.currentWidget()
158 if self.next_screen == curr_screen:
159 self.setStatus("Already showing %s" % curr_screen.getTitleText(), timeout=1000)
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)
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)
177 def toNextScreen(self):
178 if self.next_screen == self.config_screen:
179 self.toConfigScreen()
180 elif self.next_screen == self.main_screen:
182 elif self.next_screen == self.help_screen:
185 def toConfigScreen(self):
186 self.screens.setCurrentWidget(self.config_screen)
187 self.nav.setTitle(self.config_screen.getTitleText())
189 def toHelpScreen(self):
190 self.screens.setCurrentWidget(self.help_screen)
191 self.nav.setTitle(self.help_screen.getTitleText())
193 def toMainScreen(self):
194 self.screens.setCurrentWidget(self.main_screen)
195 self.nav.setTitle(self.main_screen.getTitleText())
197 def setStatus(self, msg, timeout):
198 self.status.set(msg, timeout)
200 def nodeSelectionChanged(self, hostname):
201 if self.rspecWindow.isVisible():
202 self.rspecWindow.showNode(hostname)