diff options
author | Gunnar Sletta <gunnar.sletta@digia.com> | 2012-11-03 20:03:54 +0100 |
---|---|---|
committer | Gunnar Sletta <gunnar.sletta@digia.com> | 2012-11-03 20:03:54 +0100 |
commit | 3d7068cbf7ace462d450cd6195fa8380b177cf48 (patch) | |
tree | d33bed8d863fa13272b43791ac82c75e3c17e20a | |
parent | d87d7f545aba8d323961fe3c8f0377aca5c7a75a (diff) | |
parent | 1504561b3fd9f032dfbd5ad2ed89a2590aca6184 (diff) |
Merge remote-tracking branch 'ezust/master'
-rw-r--r-- | tools/printslides/README.txt | 15 | ||||
-rw-r--r-- | tools/printslides/main.cpp | 46 | ||||
-rw-r--r-- | tools/printslides/printslides.pro | 7 | ||||
-rw-r--r-- | tools/printslides/slideview.cpp | 95 | ||||
-rw-r--r-- | tools/printslides/slideview.h | 49 |
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 |