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