File indexing completed on 2025-02-02 04:11:07

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 "shape.hpp"
0010 
0011 namespace glaxnimate::model {
0012 
0013 
0014 class PolyStar : public Shape
0015 {
0016     GLAXNIMATE_OBJECT(PolyStar)
0017 
0018 public:
0019     enum StarType
0020     {
0021         Star = 1,
0022         Polygon = 2,
0023     };
0024 
0025     Q_ENUM(StarType)
0026 
0027     GLAXNIMATE_PROPERTY(StarType, type, Star, {}, {}, PropertyTraits::Visual)
0028     GLAXNIMATE_ANIMATABLE(QPointF, position, QPointF())
0029     GLAXNIMATE_ANIMATABLE(float, outer_radius, 0, {}, 0)
0030     GLAXNIMATE_ANIMATABLE(float, inner_radius, 0, {}, 0)
0031     GLAXNIMATE_ANIMATABLE(float, angle, 0, {}, 0, 360, true)
0032     GLAXNIMATE_ANIMATABLE(int, points, 5)
0033     GLAXNIMATE_ANIMATABLE(float, outer_roundness, 0, {}, 0, 100, false, PropertyTraits::Percent)
0034     GLAXNIMATE_ANIMATABLE(float, inner_roundness, 0, {}, 0, 100, false, PropertyTraits::Percent)
0035 
0036 public:
0037     using Shape::Shape;
0038 
0039     QIcon tree_icon() const override
0040     {
0041         if ( type.get() == Star )
0042             return QIcon::fromTheme("draw-star");
0043         return QIcon::fromTheme("draw-polygon");
0044     }
0045 
0046     QString type_name_human() const override
0047     {
0048         return i18n("PolyStar");
0049     }
0050 
0051     math::bezier::Bezier to_bezier(FrameTime t) const override;
0052 
0053     QRectF local_bounding_rect(FrameTime t) const override
0054     {
0055         float radius = qMax(this->outer_radius.get_at(t), this->inner_radius.get_at(t));
0056         return QRectF(position.get_at(t) - QPointF(radius, radius), QSizeF(radius*2, radius*2));
0057     }
0058 
0059     bool is_rounded() const;
0060 
0061     static math::bezier::Bezier draw(
0062         StarType type, const QPointF& pos, float r_in, float r_out,
0063         float angle_radians, int p, float round_in, float round_out, bool reverse);
0064 };
0065 
0066 } // namespace glaxnimate::model
0067