Warning, file /graphics/glaxnimate/src/gui/widgets/canvas.hpp was not indexed or was modified since last indexation (in which case cross-reference links may be missing, inaccurate or erroneous).

0001 /*
0002  * SPDX-FileCopyrightText: 2019-2023 Mattia Basaglia <dev@dragon.best>
0003  *
0004  * SPDX-License-Identifier: GPL-3.0-or-later
0005  */
0006 
0007 #pragma once
0008 
0009 #include <QGraphicsView>
0010 #include <QMimeData>
0011 
0012 #include <memory>
0013 
0014 #include "widgets/dialogs/selection_manager.hpp"
0015 
0016 namespace glaxnimate::gui::tools {
0017 class Tool;
0018 } // namespace glaxnimate::gui::tools
0019 
0020 namespace glaxnimate::gui {
0021 
0022 
0023 class Canvas : public QGraphicsView
0024 {
0025     Q_OBJECT
0026 
0027 public:
0028     Canvas(QWidget* parent = nullptr);
0029     ~Canvas();
0030 
0031 public:
0032     /**
0033      *  \brief Get the global zoom factor
0034      *
0035      *  \return A value representing the scaling factor, 1 = 100%
0036     */
0037     qreal get_zoom_factor() const;
0038 
0039 
0040     /// Overload QGraphicsView::translate
0041     void translate(const QPointF& d);
0042 
0043     void set_active_tool(tools::Tool* tool);
0044     void set_tool_target(glaxnimate::gui::SelectionManager* window);
0045 
0046 public Q_SLOTS:
0047     /**
0048      *  \brief Translate and resize sceneRect
0049      *
0050      *  Translate the scene, if the result is not contained within sceneRect,
0051      *  the sceneRect is expanded
0052      *
0053      *  \param delta Translation amount
0054      */
0055     void translate_view(const QPointF& delta);
0056 
0057     /**
0058      * \brief Zoom view by factor
0059      *
0060      *  The zooming is performed relative to the current transformation
0061      *
0062      *  \param factor scaling factor ( 1 = don't zoom )
0063      */
0064     void zoom_view(qreal factor);
0065 
0066     /**
0067      * \brief Zoom view by factor
0068      *
0069      *  The zooming is performed relative to the current transformation
0070      *
0071      *  \param factor scaling factor ( 1 = don't zoom )
0072      *  \param anchor Point to keep stable (scene coords)
0073      */
0074     void zoom_view_anchor(qreal factor, const QPointF& anchor);
0075 
0076     /**
0077      * \brief Set zoom factor
0078      *
0079      *  The zooming is performed absolutely
0080      *
0081      *  \param factor scaling factor ( 1 = no zoom )
0082      */
0083     void set_zoom(qreal factor);
0084 
0085     /**
0086      * \brief Set zoom factor
0087      *
0088      *  The zooming is performed absolutely
0089      *
0090      *  \param factor scaling factor ( 1 = no zoom )
0091      *  \param anchor Point to keep stable (scene coords)
0092      */
0093     void set_zoom_anchor(qreal factor, const QPointF& anchor);
0094 
0095     /**
0096      * \brief Flips the view horizontally
0097      */
0098     void flip_horizontal();
0099 
0100     void zoom_in();
0101     void zoom_out();
0102     void reset_zoom() { set_zoom(1); }
0103 
0104     void set_rotation(qreal radians);
0105     void reset_rotation() { set_rotation(0); }
0106 
0107     void view_fit();
0108 
0109 Q_SIGNALS:
0110     /**
0111      *  \brief Emitted when zoom is changed
0112      *  \param percent Zoom percentage
0113      */
0114     void zoomed(qreal percent);
0115 
0116     /**
0117      *  \brief Emitted when rotation is changed
0118      *  \param angle in radians
0119      */
0120     void rotated(qreal angle);
0121 
0122     void dropped(const QMimeData* data);
0123 
0124     void mouse_moved(const QPointF& p);
0125 
0126 protected:
0127     void mousePressEvent(QMouseEvent * event) override;
0128     void mouseMoveEvent(QMouseEvent * event) override;
0129     void mouseReleaseEvent(QMouseEvent * event) override;
0130     void mouseDoubleClickEvent(QMouseEvent * event) override;
0131     void wheelEvent(QWheelEvent * event) override;
0132     void paintEvent(QPaintEvent *event) override;
0133     void keyPressEvent(QKeyEvent * event) override;
0134     void keyReleaseEvent(QKeyEvent * event) override;
0135     void resizeEvent(QResizeEvent* event) override;
0136     void changeEvent(QEvent* event) override;
0137     void dragEnterEvent(QDragEnterEvent * event) override;
0138     void dragMoveEvent(QDragMoveEvent * event) override;
0139     void dropEvent(QDropEvent * event) override;
0140 
0141     bool event(QEvent* event) override;
0142     bool viewportEvent(QEvent *event) override;
0143 
0144 private:
0145     void do_rotate(qreal radians, const QPointF& scene_anchor);
0146 
0147     class Private;
0148     std::unique_ptr<Private> d;
0149 };
0150 
0151 
0152 } // namespace glaxnimate::gui