// Copyright (C) 2018-2019 Jakub Melka // // This file is part of PdfForQt. // // PdfForQt is free software: you can redistribute it and/or modify // it under the terms of the GNU Lesser General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // PdfForQt 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 Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License // along with PDFForQt. If not, see . #ifndef PDFDRAWWIDGET_H #define PDFDRAWWIDGET_H #include "pdfglobal.h" #include "pdfrenderer.h" #include #include #include namespace pdf { class PDFDocument; class PDFDrawWidget; class PDFDrawWidgetProxy; class IDrawWidget { public: virtual ~IDrawWidget() = default; virtual QWidget* getWidget() = 0; /// Returns page indices, which are currently displayed in the widget virtual std::vector getCurrentPages() const = 0; }; class PDFFORQTLIBSHARED_EXPORT PDFWidget : public QWidget { Q_OBJECT public: /// Constructs new PDFWidget. /// \param engine Rendering engine type /// \param samplesCount Samples count for rendering engine MSAA antialiasing explicit PDFWidget(RendererEngine engine, int samplesCount, QWidget* parent); virtual ~PDFWidget() override; using PageRenderingErrors = std::map>; /// Sets the document to be viewed in this widget. Document can be nullptr, /// in that case, widget contents are cleared. Optional content activity can be nullptr, /// if this occurs, no content is suppressed. /// \param document Document /// \param optionalContentActivity Optional content activity void setDocument(const PDFDocument* document, const PDFOptionalContentActivity* optionalContentActivity); /// Update rendering engine according the settings /// \param engine Engine type /// \param samplesCount Samples count for rendering engine MSAA antialiasing void updateRenderer(RendererEngine engine, int samplesCount); IDrawWidget* getDrawWidget() const { return m_drawWidget; } QScrollBar* getHorizontalScrollbar() const { return m_horizontalScrollBar; } QScrollBar* getVerticalScrollbar() const { return m_verticalScrollBar; } PDFDrawWidgetProxy* getDrawWidgetProxy() const { return m_proxy; } const PageRenderingErrors* getPageRenderingErrors() const { return &m_pageRenderingErrors; } int getPageRenderingErrorCount() const; signals: void pageRenderingErrorsChanged(PDFInteger pageIndex, int errorsCount); private: void updateRendererImpl(); void onRenderingError(PDFInteger pageIndex, const QList& errors); void onPageImageChanged(bool all, const std::vector& pages); IDrawWidget* createDrawWidget(RendererEngine rendererEngine, int samplesCount); IDrawWidget* m_drawWidget; QScrollBar* m_horizontalScrollBar; QScrollBar* m_verticalScrollBar; PDFDrawWidgetProxy* m_proxy; PageRenderingErrors m_pageRenderingErrors; }; template class PDFDrawWidgetBase : public BaseWidget, public IDrawWidget { public: explicit PDFDrawWidgetBase(PDFWidget* widget, QWidget* parent); virtual ~PDFDrawWidgetBase() override = default; /// Returns page indices, which are currently displayed in the widget virtual std::vector getCurrentPages() const override; virtual QSize minimumSizeHint() const override; virtual QWidget* getWidget() override { return this; } protected: virtual void keyPressEvent(QKeyEvent* event) override; virtual void mousePressEvent(QMouseEvent* event) override; virtual void mouseReleaseEvent(QMouseEvent* event) override; virtual void mouseMoveEvent(QMouseEvent* event) override; virtual void wheelEvent(QWheelEvent* event) override; PDFWidget* getPDFWidget() const { return m_widget; } private: enum class MouseOperation { None, Translate }; /// Performs the mouse operation (under the current mouse position) /// \param currentMousePosition Current position of the mouse void performMouseOperation(QPoint currentMousePosition); PDFWidget* m_widget; QPoint m_lastMousePosition; MouseOperation m_mouseOperation; }; class PDFOpenGLDrawWidget : public PDFDrawWidgetBase { Q_OBJECT private: using BaseClass = PDFDrawWidgetBase; public: explicit PDFOpenGLDrawWidget(PDFWidget* widget, int samplesCount, QWidget* parent); virtual ~PDFOpenGLDrawWidget() override; protected: virtual void resizeGL(int w, int h) override; virtual void initializeGL() override; virtual void paintGL() override; }; class PDFDrawWidget : public PDFDrawWidgetBase { Q_OBJECT private: using BaseClass = PDFDrawWidgetBase; public: explicit PDFDrawWidget(PDFWidget* widget, QWidget* parent); virtual ~PDFDrawWidget() override; protected: virtual void paintEvent(QPaintEvent* event) override; virtual void resizeEvent(QResizeEvent* event) override; }; extern template class PDFDrawWidgetBase; extern template class PDFDrawWidgetBase; } // namespace pdf #endif // PDFDRAWWIDGET_H