From b8b95050f49ebdd5015ebb453bc6c051b0263abf Mon Sep 17 00:00:00 2001 From: Alan Ezust Date: Sat, 3 Nov 2012 08:26:21 -0700 Subject: Added printslides program. --- tools/printslides/README.txt | 16 +++++++ tools/printslides/TODO.txt | 2 + tools/printslides/main.cpp | 36 +++++++++++++++ tools/printslides/printslides.pro | 7 +++ tools/printslides/slideview.cpp | 95 +++++++++++++++++++++++++++++++++++++++ tools/printslides/slideview.h | 49 ++++++++++++++++++++ 6 files changed, 205 insertions(+) create mode 100644 tools/printslides/README.txt create mode 100644 tools/printslides/TODO.txt create mode 100644 tools/printslides/main.cpp create mode 100644 tools/printslides/printslides.pro create mode 100644 tools/printslides/slideview.cpp create mode 100644 tools/printslides/slideview.h 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 +#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 +#include +#include +#include +#include +#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 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 +#include +#include + +/** 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 -- cgit v1.2.3