Warning, file /graphics/glaxnimate/src/gui/tools/star_tool.cpp 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 #include "draw_tool_drag.hpp" 0008 #include "model/shapes/polystar.hpp" 0009 #include "math/math.hpp" 0010 #include "widgets/tools/star_tool_widget.hpp" 0011 0012 namespace glaxnimate::gui::tools { 0013 0014 class StarTool : public DrawToolDrag 0015 { 0016 public: 0017 QString id() const override { return "draw-star"; } 0018 QIcon icon() const override { return QIcon::fromTheme("draw-polygon-star"); } 0019 QString name() const override { return i18n("Star"); } 0020 QKeySequence key_sequence() const override { return QKeySequence(i18n("*"), QKeySequence::PortableText); } 0021 static int static_group() noexcept { return Registry::Shape; } 0022 int group() const noexcept override { return static_group(); } 0023 0024 protected: 0025 void on_drag_start() override 0026 { 0027 polar = {}; 0028 } 0029 0030 void on_drag(const MouseEvent& event) override 0031 { 0032 angle_from_points(); 0033 if ( event.modifiers() & Qt::ControlModifier ) 0034 snap_angle(); 0035 update_shape(); 0036 } 0037 0038 void on_drag_complete(const MouseEvent& event) override 0039 { 0040 auto shape = std::make_unique<model::PolyStar>(event.window->document()); 0041 shape->position.set(p1); 0042 shape->outer_radius.set(polar.length); 0043 shape->angle.set(math::rad2deg(polar.angle)); 0044 shape->inner_radius.set(widget()->spoke_ratio() * polar.length); 0045 shape->type.set(widget()->star_type()); 0046 shape->points.set(widget()->points()); 0047 create_shape(i18n("Draw Star"), event, std::move(shape)); 0048 bez.clear(); 0049 } 0050 0051 void paint(const PaintEvent& event) override 0052 { 0053 if ( dragging ) 0054 { 0055 QPainterPath path; 0056 bez.add_to_painter_path(path); 0057 draw_shape(event, event.view->mapFromScene(path)); 0058 } 0059 } 0060 0061 QWidget* on_create_widget() override 0062 { 0063 return new StarToolWidget(); 0064 } 0065 0066 void key_press(const KeyEvent& event) override 0067 { 0068 if ( event.key() == Qt::Key_Escape || event.key() == Qt::Key_Back ) 0069 { 0070 dragging = false; 0071 event.repaint(); 0072 bez.clear(); 0073 event.accept(); 0074 } 0075 else if ( dragging && event.key() == Qt::Key_Control ) 0076 { 0077 snap_angle(); 0078 update_shape(); 0079 event.repaint(); 0080 } 0081 } 0082 0083 private: 0084 void snap_angle() 0085 { 0086 polar.angle = qRound(polar.angle / math::pi * 180 / 15) * 15. / 180. * math::pi; 0087 } 0088 0089 void angle_from_points() 0090 { 0091 polar = p2 - p1; 0092 polar.angle = polar.angle + math::pi / 2; 0093 } 0094 0095 void update_shape() 0096 { 0097 bez = model::PolyStar::draw( 0098 widget()->star_type(), 0099 p1, 0100 widget()->spoke_ratio() * polar.length, 0101 polar.length, 0102 polar.angle, 0103 widget()->points(), 0104 0, 0105 0, 0106 false 0107 ); 0108 } 0109 0110 math::PolarVector<QPointF> polar; 0111 math::bezier::Bezier bez; 0112 0113 0114 StarToolWidget* widget() 0115 { 0116 return static_cast<StarToolWidget*>(get_settings_widget()); 0117 } 0118 0119 static Autoreg<StarTool> autoreg; 0120 }; 0121 0122 0123 tools::Autoreg<tools::StarTool> tools::StarTool::autoreg{max_priority + 2}; 0124 0125 } // namespace glaxnimate::gui::tools