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