summaryrefslogtreecommitdiffstats
path: root/tools/printslides/slideview.cpp
blob: 2efee1f6ce6bfc609fe0b3f0e9eadce3b2086c98 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
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() {
    QImage pix = grabWindow();
    qDebug() << "Printing slide#" << m_printedSlides + 1 << "Resolution:" << pix.size();
    QSize targetSize = m_printer.pageRect().size();
    m_painter.drawImage(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");
}