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

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 <set>
0010 
0011 #include "animatable.hpp"
0012 #include "math/bezier/bezier.hpp"
0013 
0014 namespace glaxnimate::model {
0015 
0016 namespace detail {
0017 
0018 // Intermediare non-templated class so Q_OBJECT works
0019 class AnimatedPropertyBezier : public detail::AnimatedProperty<math::bezier::Bezier>
0020 {
0021     Q_OBJECT
0022 public:
0023     AnimatedPropertyBezier(Object* object, const KLazyLocalizedString& name,
0024                    PropertyCallback<void, math::bezier::Bezier> emitter = {})
0025     : detail::AnimatedProperty<math::bezier::Bezier>(object, name, {}, std::move(emitter))
0026     {}
0027 
0028     int size() const
0029     {
0030         return value_.size();
0031     }
0032 
0033     bool closed() const
0034     {
0035         return value_.closed();
0036     }
0037 
0038     void set_closed(bool closed);
0039 
0040     Q_INVOKABLE void split_segment(int index, qreal factor);
0041     Q_INVOKABLE void remove_point(int index);
0042     void remove_points(const std::set<int>& indices);
0043 
0044     /**
0045      * \brief Extends all keyframe values to match \p target
0046      *
0047      * Each keyframe adds nodes from \p target to have at least \p target.size() nodes
0048      */
0049     void extend(const math::bezier::Bezier& target, bool at_end);
0050 };
0051 
0052 } // namespace detail
0053 
0054 template<>
0055 class AnimatedProperty<math::bezier::Bezier> : public detail::AnimatedPropertyBezier
0056 {
0057 public:
0058     using detail::AnimatedPropertyBezier::AnimatedPropertyBezier;
0059 };
0060 
0061 
0062 } // namespace glaxnimate::model