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