File indexing completed on 2024-04-21 09:45:15

0001 /**
0002  * SPDX-FileCopyrightText: 2015 by Kåre Särs <kare.sars@iki .fi>
0003  * SPDX-FileCopyrightText: 2021 by Alexander Stippich <a.stippich@gmx.net>
0004  *
0005  * SPDX-License-Identifier: GPL-2.0-only OR GPL-3.0-only OR LicenseRef-KDE-Accepted-GPL
0006  */
0007 
0008 #ifndef SKANPAGE_H
0009 #define SKANPAGE_H
0010 
0011 #include <QObject>
0012 #include <QString>
0013 #include <QImage>
0014 
0015 #include <KActionCollection>
0016 
0017 #include <KSaneCore/Interface>
0018 #include <KSaneCore/DeviceInformation>
0019 
0020 #include <memory>
0021 
0022 #include "SkanpageUtils.h"
0023 #include "skanpage_config.h"
0024 #include "skanpage_state.h"
0025 #include "DocumentModel.h"
0026 #include "OCRLanguageModel.h"
0027 #include "FilteredOptionsModel.h"
0028 #include "FormatModel.h"
0029 #include "DevicesModel.h"
0030 class SkanpagePrivate;
0031 
0032 class Skanpage : public QObject
0033 {
0034     Q_OBJECT
0035 
0036     Q_PROPERTY(int progress READ progress NOTIFY progressChanged)
0037     Q_PROPERTY(int countDown READ countDown NOTIFY countDownChanged)
0038     Q_PROPERTY(DocumentModel *documentModel READ documentModel CONSTANT)
0039     Q_PROPERTY(DevicesModel *devicesModel READ devicesModel CONSTANT)
0040     Q_PROPERTY(FormatModel *formatModel READ formatModel CONSTANT)
0041     Q_PROPERTY(FilteredOptionsModel *optionsModel READ optionsModel CONSTANT)
0042     Q_PROPERTY(OCRLanguageModel *languageModel READ languageModel CONSTANT)
0043     Q_PROPERTY(SkanpageConfiguration *configuration READ configuration CONSTANT)
0044     Q_PROPERTY(SkanpageState *stateConfiguration READ stateConfiguration CONSTANT)
0045     Q_PROPERTY(ApplicationState applicationState READ applicationState NOTIFY applicationStateChanged)
0046 
0047     Q_PROPERTY(QString deviceVendor READ deviceVendor NOTIFY deviceInfoUpdated)
0048     Q_PROPERTY(QString deviceModel READ deviceModel NOTIFY deviceInfoUpdated)
0049     Q_PROPERTY(QString deviceName READ deviceName NOTIFY deviceInfoUpdated)
0050 
0051     Q_PROPERTY(QRectF scanArea READ scanArea WRITE setScanArea NOTIFY scanAreaChanged)
0052     Q_PROPERTY(ScanSplit scanSplit READ scanSplit WRITE setScanSplit NOTIFY scanSplitChanged)
0053     Q_PROPERTY(QList<QRectF> scanSubAreas READ scanSubAreas NOTIFY scanSubAreasChanged)
0054     Q_PROPERTY(QImage previewImage READ previewImage NOTIFY previewImageChanged)
0055 
0056 public:
0057 
0058     enum ApplicationState {
0059         ScanInProgress,
0060         ReadyForScan,
0061         DeviceSelection,
0062         SearchingForDevices,
0063         NoDeviceOpened
0064     };
0065     Q_ENUM(ApplicationState)
0066 
0067     enum ScanSplit {
0068         ScanNotSplit,
0069         ScanIsSplitH,
0070         ScanIsSplitV
0071     };
0072     Q_ENUM(ScanSplit)
0073 
0074     explicit Skanpage(const QString &deviceName, QObject *parent = nullptr);
0075     ~Skanpage();
0076 
0077     QString deviceVendor() const;
0078     QString deviceModel() const;
0079     QString deviceName() const;
0080 
0081     QRectF scanArea() const;
0082     void setScanArea(QRectF area);
0083     ScanSplit scanSplit() const;
0084     void setScanSplit(ScanSplit split);
0085     const QList<QRectF> &scanSubAreas();
0086     QImage previewImage() const;
0087 
0088     int progress() const;
0089     int countDown() const;
0090     ApplicationState applicationState() const;
0091 
0092     DocumentModel *documentModel() const;
0093     DevicesModel *devicesModel() const;
0094     FormatModel *formatModel() const;
0095     FilteredOptionsModel *optionsModel() const;
0096     OCRLanguageModel *languageModel() const;
0097     KSaneCore::Interface *ksaneInterface() const;
0098     SkanpageConfiguration *configuration() const;
0099     SkanpageState *stateConfiguration() const;
0100 
0101     Q_INVOKABLE void preview();
0102     Q_INVOKABLE void startScan();
0103     Q_INVOKABLE void cancelScan();
0104     Q_INVOKABLE void reloadDevicesList();
0105     Q_INVOKABLE bool openDevice(const QString &deviceName, const QString &deviceVendor = QString(), const QString &deviceModel = QString());    
0106     Q_INVOKABLE bool OCRavailable() const;
0107     Q_INVOKABLE void print();
0108     Q_INVOKABLE void registerAction(QObject* item, QObject* shortcuts, const QString &iconText);
0109     Q_INVOKABLE void showShortcutsDialog();
0110     Q_INVOKABLE void clearSubAreas();
0111     Q_INVOKABLE void eraseSubArea(int index);
0112     Q_INVOKABLE bool appendSubArea(QRectF area);
0113     Q_INVOKABLE void selectSubArea(int index);
0114 
0115 Q_SIGNALS:
0116     void progressChanged(int progress);
0117     void countDownChanged(int remainingSeconds);
0118     void optionsChanged();
0119     void applicationStateChanged(ApplicationState state);
0120     void deviceInfoUpdated();
0121     void scanAreaChanged(const QRectF &area);
0122     void scanSplitChanged(ScanSplit split);
0123     void scanSubAreasChanged(const QList<QRectF> &subAreas);
0124     void previewImageChanged(const QImage& preview);
0125     void newUserMessage(const QVariant &level, const QVariant &message);
0126 
0127 private Q_SLOTS:
0128 
0129     void imageReady(const QImage &image);
0130     void availableDevices(const QList<KSaneCore::DeviceInformation *> &deviceList);
0131     void showKSaneMessage(KSaneCore::Interface::ScanStatus type, const QString &strStatus);
0132     void showUserMessage(SkanpageUtils::MessageLevel level, const QString &strStatus);
0133     void progressUpdated(int progress);
0134     void batchModeCountDown(int remainingSeconds);
0135     void scanningFinished(KSaneCore::Interface::ScanStatus status, const QString &strStatus);
0136     void imageTemporarilySaved();
0137 
0138 private:
0139     void finishOpeningDevice(const QString &deviceName, const QString &deviceVendor, const QString &deviceModel);
0140     void loadScannerOptions();
0141     void saveScannerOptions();
0142     void checkFinish();
0143     void finishPreview();
0144     void setupScanningBounds();
0145     void signalErrorMessage(const QString &text);
0146 
0147     std::unique_ptr<SkanpagePrivate> d;
0148 };
0149 
0150 #endif // SKANPAGE_H