summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGunnar Sletta <gunnar.sletta@digia.com>2012-11-03 20:03:54 +0100
committerGunnar Sletta <gunnar.sletta@digia.com>2012-11-03 20:03:54 +0100
commit3d7068cbf7ace462d450cd6195fa8380b177cf48 (patch)
treed33bed8d863fa13272b43791ac82c75e3c17e20a
parentd87d7f545aba8d323961fe3c8f0377aca5c7a75a (diff)
parent1504561b3fd9f032dfbd5ad2ed89a2590aca6184 (diff)
Merge remote-tracking branch 'ezust/master'
-rw-r--r--tools/printslides/README.txt15
-rw-r--r--tools/printslides/main.cpp46
-rw-r--r--tools/printslides/printslides.pro7
-rw-r--r--tools/printslides/slideview.cpp95
-rw-r--r--tools/printslides/slideview.h49
5 files changed, 212 insertions, 0 deletions
diff --git a/tools/printslides/README.txt b/tools/printslides/README.txt
new file mode 100644
index 0000000..c1e375b
--- /dev/null
+++ b/tools/printslides/README.txt
@@ -0,0 +1,15 @@
+This program is a tool for printing slides that were
+created using the qt-labs qml-presentation-system
+
+Building requirements:
+
+ Requires Qt 5.0.0
+ qmake && make
+
+Instructions:
+ ./printslides /path/to/your/presentation.qml
+
+Example:
+ ./printslides ../../examples/tutorial/SlideDeck.qml
+
+Creates a "slides.pdf" file in your current directory.
diff --git a/tools/printslides/main.cpp b/tools/printslides/main.cpp
new file mode 100644
index 0000000..21f59f0
--- /dev/null
+++ b/tools/printslides/main.cpp
@@ -0,0 +1,46 @@
+/* DO WHAT THE FRAK YOU WANT TO PUBLIC LICENSE (WTFPL)
+ Version 4, October 2012
+ Based on the wtfpl: http://sam.zoy.org/wtfpl/
+
+ Copyright (C) 2012 Alan Ezust
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FRAK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FRAK YOU WANT TO.
+ 1. It is provided "as is" without any warranty whatsoever.
+*/
+
+#include <QtGui>
+#include "slideview.h"
+
+/** PrintSlides main program.
+ A program to print qt-labs qml-presentation-system Presentations.
+ @author ezust@ics.com
+*/
+int main (int argc, char* argv[]) {
+ QGuiApplication app(argc, argv);
+ app.setOrganizationDomain("com");
+ app.setOrganizationName("ics");
+ app.setApplicationName("printslides");
+ app.setApplicationVersion("0.2");
+ app.setApplicationDisplayName("QML Presentation Slide Printer");
+ SlideView mainView;
+ argc = app.arguments().length();
+ if ((argc != 2) || app.arguments()[1].endsWith("?")) {
+ QString progName = app.applicationName();
+ QString message = QString().arg(progName);
+ qFatal("%s usage: \n\t %s path/to/presentation.qml\n"
+ "Displays and prints each slides to slides.pdf\n",
+ progName.toLocal8Bit().constData(),
+ progName.toLocal8Bit().constData());
+ return 2;
+ }
+ mainView.setSource(app.arguments()[1]);
+ mainView.show();
+ return app.exec();
+}
diff --git a/tools/printslides/printslides.pro b/tools/printslides/printslides.pro
new file mode 100644
index 0000000..291fd35
--- /dev/null
+++ b/tools/printslides/printslides.pro
@@ -0,0 +1,7 @@
+QT += gui qml quick widgets printsupport
+DESTDIR=$$(PWD)
+
+SOURCES += main.cpp slideview.cpp
+HEADERS += slideview.h
+
+
diff --git a/tools/printslides/slideview.cpp b/tools/printslides/slideview.cpp
new file mode 100644
index 0000000..7f02340
--- /dev/null
+++ b/tools/printslides/slideview.cpp
@@ -0,0 +1,95 @@
+/* DO WHAT THE FRAK YOU WANT TO PUBLIC LICENSE (WTFPL)
+ Version 4, October 2012
+ Based on the wtfpl: http://sam.zoy.org/wtfpl/
+
+ Copyright (C) 2012 Alan Ezust
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FRAK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FRAK YOU WANT TO.
+ 1. It is provided "as is" without any warranty whatsoever.
+*/
+
+#include <QtQml>
+#include <QQuickItem>
+#include <QDebug>
+#include <QPixmap>
+#include <QScreen>
+#include "slideview.h"
+
+SlideView::SlideView(QWindow* parent): QQuickView(parent),
+m_slidesLeft(0), m_printedSlides(0) {
+ connect (this, SIGNAL(statusChanged(QQuickView::Status)),
+ this, SLOT(updateStatus(QQuickView::Status)));
+}
+
+void SlideView::updateStatus(QQuickView::Status status) {
+ if (m_slidesLeft > 0) return;
+ if (status != QQuickView::Ready) return;
+ QQuickItem *ri = rootObject();
+ QString superClass = ri->metaObject()->superClass()->className();
+ if (!superClass.startsWith("Presentation")) {
+ qWarning("Warning: Superclass appears to not be a Presentation: %s. ", superClass.toLocal8Bit().constData());
+ }
+ else qDebug() << "Found qml Presentation as rootObject";
+
+ QList<QVariant> slides = ri->property("slides").toList();
+ m_slidesLeft = slides.size();
+ qDebug() << "SlideCount: " << m_slidesLeft;
+ qDebug() << "Printer's Page rect size (and suggested resolution of your presentation): " << m_printer.pageRect().size();
+ m_printer.setOrientation(QPrinter::Landscape);
+ m_printer.setFullPage(true);
+ m_printer.setOutputFileName("slides.pdf");
+ m_painter.begin(&m_printer);
+
+ // it would be better if we used the printer resolution here and forced
+ // the presentation to be in the same resolution but when I try that,
+ // the timer doesn't work properly for some reason?
+
+ setHeight(ri->height());
+ setWidth(ri->width());
+
+ // Try uncommenting the below 4 lines and see what happens.
+ //setHeight(m_printer.pageRect().height());
+ //setWidth(m_printer.pageRect().width());
+ //ri->setHeight(height());
+ //ri->setWidth(width());
+
+ // start timer to print out pages once every 2 seconds.
+ m_tid = startTimer(2000);
+}
+
+void SlideView::timerEvent(QTimerEvent*) {
+ printCurrentSlide();
+ ++m_printedSlides;
+ --m_slidesLeft;
+ if (m_slidesLeft > 0) {
+ m_printer.newPage();
+ goToNextSlide();
+ }
+ else {
+ killTimer(m_tid);
+ m_painter.end();
+ qDebug() << "Printed to file: " << m_printer.outputFileName();
+ qApp->exit();
+ }
+
+}
+
+
+void SlideView::printCurrentSlide() {
+ QPixmap pix = screen()->grabWindow(winId());
+ qDebug() << "Printing slide#" << m_printedSlides + 1 << "Resolution:" << pix.size();
+ QSize targetSize = m_printer.pageRect().size();
+ m_painter.drawPixmap(m_printer.pageRect().x(), m_printer.pageRect().y(), pix.scaled(targetSize, Qt::KeepAspectRatio, Qt::SmoothTransformation) );
+}
+
+void SlideView::goToNextSlide() {
+ static const QMetaObject* meta = rootObject()->metaObject();
+ meta->invokeMethod(rootObject(), "goToNextSlide");
+}
diff --git a/tools/printslides/slideview.h b/tools/printslides/slideview.h
new file mode 100644
index 0000000..ffcca00
--- /dev/null
+++ b/tools/printslides/slideview.h
@@ -0,0 +1,49 @@
+/* DO WHAT THE FRAK YOU WANT TO PUBLIC LICENSE (WTFPL)
+ Version 4, October 2012
+ Based on the wtfpl: http://sam.zoy.org/wtfpl/
+
+ Copyright (C) 2012 Alan Ezust
+
+ Everyone is permitted to copy and distribute verbatim or modified
+ copies of this license document, and changing it is allowed as long
+ as the name is changed.
+
+ DO WHAT THE FRAK YOU WANT TO PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. You just DO WHAT THE FRAK YOU WANT TO.
+ 1. It is provided "as is" without any warranty whatsoever.
+*/
+
+#ifndef SLIDEVIEW_H
+#define SLIDEVIEW_H
+
+#include <QQuickView>
+#include <QPrinter>
+#include <QPainter>
+
+/** A class for viewing and printing a QML Presentation with Slides.
+ Assumes the root object of the QML file that was loaded is derived from
+ Presentation from qt-labs qml-presentation-system
+ @author Alan Ezust
+*/
+class SlideView : public QQuickView {
+ Q_OBJECT
+public:
+ SlideView(QWindow* parent=0);
+public slots:
+ void updateStatus(QQuickView::Status);
+ void timerEvent(QTimerEvent* evt);
+ void printCurrentSlide();
+ void goToNextSlide();
+
+private:
+ int m_slidesLeft;
+ int m_printedSlides;
+ int m_tid;
+
+ QPrinter m_printer;
+ QPainter m_painter;
+};
+
+#endif // #ifndef SLIDEVIEW_H