Artifact f8e5cd215b3efa72fdf38b6b0ebe4e7b4772d563:

  • File src/Page.hxx — part of check-in [275237a784] at 2022-03-21 09:49:47 on branch trunk — Reformat sources (user: fifr size: 4281) [more...]

/*
 * Copyright (c) 2018-2021 Frank Fischer <frank-fischer@shadow-soft.de>
 *
 * 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 3 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/>
 */

#ifndef __FOTOKOPIERER_PAGE_HXX__
#define __FOTOKOPIERER_PAGE_HXX__

#include <QtCore/QDateTime>
#include <QtCore/QDir>
#include <QtCore/QObject>
#include <QtGui/QImage>
#include <memory>

class Document;
class ScanImage;

/// A single scanned page.
class Page : public QObject
{
    Q_OBJECT

    Q_PROPERTY(QDateTime creationTime READ creationTime NOTIFY creationTimeChanged)
    Q_PROPERTY(QString original READ original NOTIFY originalChanged)
    Q_PROPERTY(QString thumbnail READ thumbnail NOTIFY thumbnailChanged)
    Q_PROPERTY(QString result READ result NOTIFY resultChanged)
    Q_PROPERTY(QUrl resultUrl READ resultUrl NOTIFY resultChanged)
    Q_PROPERTY(Status status READ status NOTIFY statusChanged)

public:
    static const int ThumbnailSize = 500;

    enum Status {
        Ready,       ///< the page is ready
        Generating,  ///< the page is being generated
        Loading,     ///< the page is being loaded
        Thumbnail,   ///< the thumbnail is being created
        Invalid,     ///< the page is invalid
    };

    Q_ENUM(Status)

public:
    explicit Page();

    Page(const Page&) = delete;
    Page(Page&&) = delete;
    Page& operator=(const Page&) = delete;
    Page& operator=(Page&&) = delete;

    ~Page() override;

    QDateTime creationTime() const;

    QString thumbnail();

    QString original() const;

    QString result() const;

    QUrl resultUrl() const;

    Status status() const;

    /// Initialize this page from the results of a Scanner.
    ///
    /// The page files are stored in the document directory `dir`.
    void newFromImage(const QDir& dir, const std::shared_ptr<ScanImage>& scanImage);

    /// Initialize this page from the results of a Scanner.
    ///
    /// The page files reuse (and overwrite) the current files.
    void updateFromImage(const std::shared_ptr<ScanImage>& scanImage);

    /// Make this page a copy of another page.
    ///
    /// The page is copied to directory `dir`.
    void initCopy(const QDir& dir, Document* sourceDoc, Page* source, bool move = false);

    bool write(QJsonObject& json, const QDir& docpath) const;

    bool read(const QJsonObject& json, const QDir& docpath);

    /// Return the filter settings of this page.
    QJsonObject settings() const;

public slots:
    /// Delete all files associated with this page.
    void remove();

private:
    void updateImage(const std::shared_ptr<ScanImage>& scanImage,
                     const QString& original_path,
                     const QString& result_path,
                     const QDateTime& creation_time);

    QString updateThumbnail(const QString& filename);

private slots:
    void onGenerationFinished(const QString& original_path, const QString& result_path);

    void onThumbnailFinished(const QString& thumbnail_path);

    void setStatus(Page::Status status);

    void setOriginal(const QString& original);

    void setResult(const QString& result);

    void setThumbnail(const QString& thumbnail);

    void setCreationTime(const QDateTime& creation_time);

signals:
    void originalChanged();

    void resultChanged();

    void thumbnailChanged();

    void creationTimeChanged();

    void statusChanged();

    void deleteSourcePage(Document* sourceDoc, Page* source);

    void generationFinished(const QString& original_path, const QString& result_path);

    void thumbnailFinished(const QString& thumbnail_path);

    /// An error occurred.
    void error(const QString& errorMessage);

private:
    struct Data;
    std::unique_ptr<Data> d;
};

#endif