6 from PyQt4.QtCore import *
7 from PyQt4.QtGui 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 self.main = QLabel("", self)
22 self.main.setAlignment(Qt.AlignRight)
24 self.config = QLabel("", self)
25 self.config.setAlignment(Qt.AlignRight)
27 self.help = QLabel("", self)
28 self.help.setAlignment(Qt.AlignRight)
30 hlayout = QHBoxLayout()
31 hlayout.addWidget(self.title)
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)
39 def setTitle(self, title):
40 self.title.setText(title)
42 def setLinks(self, main, config, help):
43 self.main.setText(main)
44 self.config.setText(config)
45 self.help.setText(help)
49 def __init__(self, parent=None):
50 QLabel.__init__(self, "", parent)
51 self.sliceUpdateDate()
53 def set(self, msg, timeout):
56 QTimer.singleShot(timeout, self.reset)
58 def sliceUpdateDate(self):
59 rspec_file = config.getSliceRSpecFile()
60 if not os.path.exists(rspec_file):
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)
69 QTimer.singleShot(1500, self.sliceUpdateDate)
72 class MainWindow(QWidget):
73 def __init__(self, parent=None):
74 QWidget.__init__(self, parent)
76 self.logWindow = LogWindow(self)
77 self.rspecWindow = RSpecWindow(self)
79 self.pix = QLabel(self)
80 self.config_screen = ConfigScreen(self)
81 self.main_screen = MainScreen(self)
82 self.help_screen = HelpScreen(self)
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
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())
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)
101 hlayout = QHBoxLayout()
102 hlayout.addWidget(self.status)
104 hlayout.addWidget(self.rspec)
105 hlayout.addWidget(self.log)
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)
114 for link in (self.nav.main, self.nav.config, self.nav.help):
115 self.connect(link, SIGNAL('linkActivated(QString)'),
116 self.animateToScreen)
118 self.connect(self.log, SIGNAL('linkActivated(QString)'),
120 self.connect(self.rspec, SIGNAL('linkActivated(QString)'),
121 self.showRSpecWindow)
123 def redirectOutputToLog(self):
124 self.logWindow.redirectOutput()
126 def showLogWindow(self, link):
127 self.logWindow.show()
128 self.logWindow.resize(800, 200)
129 self.logWindow.raise_()
130 self.logWindow.activateWindow()
132 def showRSpecWindow(self, link):
133 self.rspecWindow.show()
134 self.rspecWindow.resize(500, 640)
135 self.rspecWindow.raise_()
136 self.rspecWindow.activateWindow()
139 def animatePixmap(self, y):
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
150 curr_screen = self.screens.currentWidget()
152 if self.next_screen == curr_screen:
153 self.setStatus("Already showing %s" % curr_screen.getTitleText(), timeout=1000)
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)
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)
171 def toNextScreen(self):
172 if self.next_screen == self.config_screen:
173 self.toConfigScreen()
174 elif self.next_screen == self.main_screen:
176 elif self.next_screen == self.help_screen:
179 def toConfigScreen(self):
180 self.screens.setCurrentWidget(self.config_screen)
181 self.nav.setTitle(self.config_screen.getTitleText())
183 def toHelpScreen(self):
184 self.screens.setCurrentWidget(self.help_screen)
185 self.nav.setTitle(self.help_screen.getTitleText())
187 def toMainScreen(self):
188 self.screens.setCurrentWidget(self.main_screen)
189 self.nav.setTitle(self.main_screen.getTitleText())
191 def setStatus(self, msg, timeout):
192 self.status.set(msg, timeout)
194 def nodeSelectionChanged(self, hostname):
195 if self.rspecWindow.isVisible():
196 self.rspecWindow.showNode(hostname)