summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlan Ezust <ezust@ics.com>2012-11-03 08:26:21 -0700
committerAlan Ezust <ezust@ics.com>2012-11-03 08:26:21 -0700
commitb8b95050f49ebdd5015ebb453bc6c051b0263abf (patch)
tree1720aa96334708a2846c108901f845612ea9173b
parent766a43ca4190b32617e1361548d028271263378a (diff)
Added printslides program.
-rw-r--r--tools/printslides/README.txt16
-rw-r--r--tools/printslides/TODO.txt2
-rw-r--r--tools/printslides/main.cpp36
-rw-r--r--tools/printslides/printslides.pro7
-rw-r--r--tools/printslides/slideview.cpp95
-rw-r--r--tools/printslides/slideview.h49
6 files changed, 205 insertions, 0 deletions
diff --git a/tools/printslides/README.txt b/tools/printslides/README.txt
new file mode 100644
index 0000000..c2c6324
--- /dev/null
+++ b/tools/printslides/README.txt
@@ -0,0 +1,16 @@
+This program is a tool for printing slides that were
+built using the qt-labs qml-presentation-system
+
+https://qt.gitorious.org/qt-labs/qml-presentation-system
+
+Building requirements:
+
+Requires Qt 5.0.0
+
+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/TODO.txt b/tools/printslides/TODO.txt
new file mode 100644
index 0000000..2b2aa2e
--- /dev/null
+++ b/tools/printslides/TODO.txt
@@ -0,0 +1,2 @@
+Add page numbers and headers/footers?
+
diff --git a/tools/printslides/main.cpp b/tools/printslides/main.cpp
new file mode 100644
index 0000000..bdd9d5a
--- /dev/null
+++ b/tools/printslides/main.cpp
@@ -0,0 +1,36 @@
+/* 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;
+ 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..492070b
--- /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
+ git clone git://gitorious.org/qt-labs/qml-presentation-system.git
+*/
+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