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