summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorDavid Boddie <dboddie@trolltech.com>2009-08-26 15:44:52 +0200
committerDavid Boddie <dboddie@trolltech.com>2009-08-26 15:44:52 +0200
commitc8fce20166e3c987d9740a87554b5d9f0656b8f6 (patch)
treee06d82c8d411f393b077eac9150b8756c859d635
parent702ffe024f7f735e5690c5d6acff3f5d3139a55b (diff)
Ported to PyQt.
-rwxr-xr-xs5runner/s5runner.py193
1 files changed, 193 insertions, 0 deletions
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_())