File indexing completed on 2024-03-24 05:57:09
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