#ifndef __COMIC_H #define __COMIC_H #include #include #include #include #include #include "extract_delegate.h" #include "bookmarks.h" #ifndef NO_PDF #include "pdf_comic.h" #endif // NO_PDF class ComicDB; // #define EXTENSIONS_LITERAL << ".jpg" << ".jpeg" << ".png" << ".gif" << ".tiff" << ".tif" << ".bmp" //Comic::getSupportedImageLiteralFormats() class Comic : public QObject { Q_OBJECT protected: // Comic pages, one QPixmap for each file. QVector _pages; QVector _loadedPages; // QVector _sizes; QStringList _fileNames; QMap _newOrder; QList _order; int _index; QString _path; bool _loaded; int _cfi; // open the comic at this point int _firstPage; bool _isPDF; bool _invalidated; bool _errorOpening; public: static const QStringList imageExtensions; static const QStringList literalImageExtensions; static const QStringList comicExtensions; static const QStringList literalComicExtensions; Bookmarks *bm; // Constructors Comic(); Comic(const QString &pathFile, int atPage = -1); ~Comic(); void setup(); // Load pages from file virtual bool load(const QString &path, int atPage = -1) = 0; virtual bool load(const QString &path, const ComicDB &comic); /*void loadFromFile(const QString & pathFile); void loadFromDir(const QString & pathDir); void loadFromPDF(const QString & pathPDF);*/ int nextPage(); int previousPage(); void setIndex(unsigned int index); unsigned int getIndex() { return _index; }; unsigned int numPages() { return _pages.size(); } // QPixmap * currentPage(); bool loaded(); // QPixmap * operator[](unsigned int index); QVector *getRawData() { return &_pages; } QByteArray getRawPage(int page); bool pageIsLoaded(int page); // check if the comic has failed loading bool hasBeenAnErrorOpening(); static QStringList getSupportedImageFormats(); static QStringList getSupportedImageLiteralFormats(); static bool fileIsComic(const QString &path); static QList findValidComicFiles(const QList &list); static QList findValidComicFilesInFolder(const QString &path); public slots: void loadFinished(); void setBookmark(); void removeBookmark(); void saveBookmarks(); void checkIsBookmark(int index); void updateBookmarkImage(int); void setPageLoaded(int page); void invalidate(); virtual void process() { }; signals: void invalidated(); void destroyed(); void imagesLoaded(); void imageLoaded(int index); void imageLoaded(int index, const QByteArray &image); void pageChanged(int index); void openAt(int index); void numPages(unsigned int numPages); void errorOpening(); void errorOpening(QString); void crcErrorFound(QString); void isBookmark(bool); void bookmarksUpdated(); void isCover(); void isLast(); }; class FileComic : public Comic, public ExtractDelegate { Q_OBJECT private: QList> getSections(int §ionIndex); public: FileComic(); FileComic(const QString &path, int atPage = -1); ~FileComic(); bool load(const QString &path, int atPage = -1); bool load(const QString &path, const ComicDB &comic); static QList filter(const QList &src); // ExtractDelegate void fileExtracted(int index, const QByteArray &rawData); void crcError(int index); void unknownError(int index); bool isCancelled(); public slots: void process(); }; class FolderComic : public Comic { Q_OBJECT private: // void run(); public: FolderComic(); FolderComic(const QString &path, int atPage = -1); ~FolderComic(); bool load(const QString &path, int atPage = -1); public slots: void process(); }; #ifndef NO_PDF class PDFComic : public Comic { Q_OBJECT private: // pdf #if defined Q_OS_MACOS && defined USE_PDFKIT std::unique_ptr pdfComic; #elif defined USE_PDFIUM std::unique_ptr pdfComic; #else std::unique_ptr pdfComic; #endif void renderPage(int page); // void run(); public: PDFComic(); PDFComic(const QString &path, int atPage = -1); ~PDFComic(); bool load(const QString &path, int atPage = -1); bool load(const QString &path, const ComicDB &comic); public slots: void process(); }; #endif // NO_PDF class FactoryComic { public: static Comic *newComic(const QString &path); }; #endif