Warning, file /graphics/glaxnimate/src/gui/tools/rectangle_tool.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 #include "base.hpp"
0009 
0010 #include "draw_tool_drag.hpp"
0011 #include "model/shapes/rect.hpp"
0012 
0013 namespace glaxnimate::gui::tools {
0014 
0015 class RectangleTool : public DrawToolDrag
0016 {
0017 public:
0018     QString id() const override { return "draw-rect"; }
0019     QIcon icon() const override { return QIcon::fromTheme("draw-rectangle"); }
0020     QString name() const override { return i18n("Rectangle"); }
0021     QKeySequence key_sequence() const override { return QKeySequence(i18n("F4"), QKeySequence::PortableText); }
0022     static int static_group() noexcept { return Registry::Shape; }
0023     int group() const noexcept override { return static_group(); }
0024 
0025 protected:
0026     void on_drag_start() override
0027     {
0028         rect = QRectF(p1, p2);
0029     }
0030 
0031     void on_drag(const MouseEvent& event) override
0032     {
0033         update_rect(event.modifiers());
0034     }
0035 
0036     void on_drag_complete(const MouseEvent& event) override
0037     {
0038         auto shape = std::make_unique<model::Rect>(event.window->document());
0039         rect = rect.normalized();
0040         shape->position.set(rect.center());
0041         shape->size.set(rect.size());
0042         create_shape(i18n("Draw Rectangle"), event, std::move(shape));
0043     }
0044 
0045     void mouse_double_click(const MouseEvent& event) override { Q_UNUSED(event); }
0046 
0047     void key_press(const KeyEvent& event) override
0048     {
0049         if ( event.key() == Qt::Key_Escape || event.key() == Qt::Key_Back )
0050         {
0051             dragging = false;
0052             event.repaint();
0053         }
0054         else if ( dragging )
0055         {
0056             update_rect(event.modifiers());
0057             event.repaint();
0058         }
0059     }
0060 
0061     void paint(const PaintEvent& event) override
0062     {
0063         if ( dragging )
0064         {
0065             QPainterPath path;
0066             path.addPolygon(event.view->mapFromScene(rect));
0067             path.closeSubpath();
0068 
0069             draw_shape(event, path);
0070         }
0071     }
0072 
0073 protected:
0074     void update_rect(Qt::KeyboardModifiers modifiers)
0075     {
0076         QPointF recp2 = p2;
0077 
0078         if ( modifiers & Qt::ControlModifier )
0079         {
0080             QPointF dp = recp2 - p1;
0081             qreal comp = qMax(dp.x(), dp.y());
0082             recp2 = p1 + QPointF(comp, comp);
0083         }
0084 
0085         if ( modifiers & Qt::ShiftModifier )
0086             rect = QRectF(2*p1-recp2, recp2);
0087         else
0088             rect = QRectF(p1, recp2);
0089     }
0090 
0091     QRectF rect;
0092 
0093     static Autoreg<RectangleTool> autoreg;
0094 };
0095 
0096 } // namespace glaxnimate::gui::tools