/************************************************************************
 *
 * Copyright 2011 Jonatan Liljedahl <lijon@kymatica.com>
 *
 * This file is part of SuperCollider Qt GUI.
 *
 * This program is free software: you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation, either version 2 of the License, or
 * (at your option) any later version.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program.  If not, see <http://www.gnu.org/licenses/>.
 *
 ************************************************************************/

#pragma once

#include "../painting.h"
#include "../debug.h"
#include <QPrintDialog>
#include <QPrinter>
#include <QPainter>

class QcPenPrinter : public QObject {
    Q_OBJECT
    Q_PROPERTY(QRect pageRect READ pageRect);
    Q_PROPERTY(QRect paperRect READ paperRect);
    Q_PROPERTY(int fromPage READ fromPage);
    Q_PROPERTY(int toPage READ toPage);

public:
    QcPenPrinter(): dialog(0) {}

    ~QcPenPrinter() { delete dialog; }

    QRect pageRect() const { return printer.pageLayout().paintRectPixels(printer.resolution()); }
    QRect paperRect() const { return printer.pageLayout().fullRectPixels(printer.resolution()); }
    int fromPage() const { return printer.fromPage(); }
    int toPage() const { return printer.toPage(); }

Q_SIGNALS:

    void dialogDone(int);
    void printFunc();

private Q_SLOTS:

    void show() {
        if (!dialog) {
            dialog = new QPrintDialog(&printer);
            dialog->setWindowTitle(QStringLiteral("Print Document"));
            dialog->setOptions(QAbstractPrintDialog::PrintToFile | QAbstractPrintDialog::PrintPageRange
                               | QAbstractPrintDialog::PrintShowPageSize);
            connect(dialog, SIGNAL(finished(int)), this, SIGNAL(dialogDone(int)));
        }
        if (dialog->isVisible())
            qcWarningMsg("WARNING: Print dialog already open.");
        else
            dialog->exec();
    }

    void print() {
        QPainter painter;
        painter.begin(&printer);
        QtCollider::beginPainting(&painter);
        Q_EMIT(printFunc());
        painter.end();
        QtCollider::endPainting();
    }

    void newPage() { printer.newPage(); }

private:
    QPrinter printer;
    QPrintDialog* dialog;
};
