From c8fce20166e3c987d9740a87554b5d9f0656b8f6 Mon Sep 17 00:00:00 2001 From: David Boddie Date: Wed, 26 Aug 2009 15:44:52 +0200 Subject: Ported to PyQt. --- s5runner/s5runner.py | 193 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 193 insertions(+) create mode 100755 s5runner/s5runner.py diff --git a/s5runner/s5runner.py b/s5runner/s5runner.py new file mode 100755 index 0000000..21e0598 --- /dev/null +++ b/s5runner/s5runner.py @@ -0,0 +1,193 @@ +#!/usr/bin/env python + +############################################################################# +## +## Copyright (C) 2009 Nokia Corporation and/or its subsidiary(-ies). +## Contact: Qt Software Information (qt-info@nokia.com) +## +## This file is part of the Graphics Dojo project on Qt Labs. +## +## This file may be used under the terms of the GNU General Public +## License version 2.0 or 3.0 as published by the Free Software Foundation +## and appearing in the file LICENSE.GPL included in the packaging of +## this file. Please review the following information to ensure GNU +## General Public Licensing requirements will be met: +## http://www.fsf.org/licensing/licenses/info/GPLv2.html and +## http://www.gnu.org/copyleft/gpl.html. +## +## If you are unsure which license is appropriate for your use, please +## contact the sales department at qt-sales@nokia.com. +## +## This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE +## WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. +## +############################################################################# + +import os, sys +from PyQt4.QtCore import * +from PyQt4.QtGui import * +from PyQt4.QtWebKit import * + +if QT_VERSION < 0x0040500: + sys.stderr.write("You need Qt 4.5 or newer to run this example.\n") + sys.exit(1) + +class S5Runner(QWebView): + + def __init__(self, parent = None): + + QWebView.__init__(self, parent) + timer = QTimer(self) + + self.overlay = QColor(Qt.transparent) + self.invert = False + self.minutes = 30 + + self.titleChanged.connect(self.setWindowTitle) + + timer.timeout.connect(self.tick) + timer.start(60*1000) + + def tick(self): + + self.minutes -= 1 + self.update() + + def paintEvent(self, event): + + if self.overlay.alpha() != 0: + p = QPainter() + p.begin(self) + p.fillRect(event.rect(), self.overlay) + p.end() + + else: + QWebView.paintEvent(self, event) + p = QPainter() + p.begin(self) + + if self.page().isContentEditable(): + opts = QTextOption(Qt.AlignCenter) + p.save() + p.setOpacity(0.5) + p.setPen(Qt.white) + p.drawText(QRectF(0, 0, self.width(), 25), "Edit Mode", opts) + p.restore() + + if self.invert: + p.setCompositionMode(QPainter.CompositionMode_Difference) + p.fillRect(event.rect(), Qt.white) + + if True: + opts = QTextOption(Qt.AlignCenter) + corner = QRectF(self.width() - 100, self.height() - 50, 50, 50) + f = QFont(self.font()) + f.setPixelSize(30) + p.setFont(f) + p.setOpacity(0.6) + p.drawText(corner, str(self.minutes), opts) + + p.end() + + def keyPressEvent(self, event): + + # Esc resets everything + if event.key() == Qt.Key_Escape: + self.page().setContentEditable(False) + self.overlay = QColor(Qt.transparent) + self.showNormal() + self.update() + event.accept() + return + + # F5 reloads the web content + if event.key() == Qt.Key_F5: + self.reload() + event.accept() + return + + # F3 allows editing + if event.key() == Qt.Key_F3: + self.page().setContentEditable(not self.page().isContentEditable()) + self.update() + event.accept() + return + + # F toggles full-screen + if not self.page().isContentEditable() and event.key() == Qt.Key_F: + if self.isFullScreen(): + self.showNormal() + else: + self.showFullScreen() + event.accept() + return + + # B sets the screen to black + if not self.page().isContentEditable() and event.key() == Qt.Key_B: + if self.overlay == Qt.black: + self.overlay = QColor(Qt.transparent) + else: + self.overlay = QColor(Qt.black) + self.update() + event.accept() + return + + # W sets the screen to white + if not self.page().isContentEditable() and event.key() == Qt.Key_W: + if self.overlay == Qt.white: + self.overlay = QColor(Qt.transparent) + else: + self.overlay = QColor(Qt.white) + self.update() + event.accept() + return + + # N toggles night-mode + if not self.page().isContentEditable() and event.key() == Qt.Key_N: + self.invert = not self.invert + self.update() + event.accept() + return + + # Navigation keys + if not self.page().isContentEditable(): + sendkey = -1 + if event.key() == Qt.Key_Left: + sendkey = 37 + elif event.key() == Qt.Key_Right: + sendkey = 39 + + if sendkey > 0: + f = self.page().mainFrame() + trigger = QString("var k = { which: %1 } keys(k)").arg(sendkey) + f.evaluateJavaScript(trigger) + event.accept() + + else: + QWebView.keyPressEvent(self, event) + + +if __name__ == "__main__": + + try: + QX11Info + QApplication.setGraphicsSystem("raster") + except NameError: + pass + + app = QApplication(sys.argv) + + if len(sys.argv) == 2: + fname = QString.fromLocal8Bit(os.path.abspath(sys.argv[1])) + else: + fname = QFileDialog.getOpenFileName(None, "Open Presentation") + + if fname.isEmpty(): + sys.exit() + + w = S5Runner() + w.resize(800, 600) + w.load(QUrl.fromLocalFile(fname)) + w.show() + + sys.exit(app.exec_()) -- cgit v1.2.3