11class ArrangerObjectLoopRange :
public QObject
16 clipStartPosition CONSTANT)
19 loopStartPosition CONSTANT)
24 bool trackBounds READ trackBounds WRITE setTrackBounds NOTIFY
26 Q_PROPERTY (
bool looped READ looped NOTIFY loopedChanged)
31 ArrangerObjectLoopRange (
33 QObject * parent =
nullptr);
47 return clip_start_pos_adapter_.get ();
51 return loop_start_pos_adapter_.get ();
55 return loop_end_pos_adapter_.get ();
57 bool trackBounds ()
const {
return track_bounds_; }
58 void setTrackBounds (
bool track)
60 if (track_bounds_ != track)
62 track_bounds_ = track;
63 Q_EMIT trackBoundsChanged (track);
66 Q_SIGNAL
void trackBoundsChanged (
bool track);
70 return loopStartPosition ()->samples () > 0
71 || clipStartPosition ()->samples () > 0
72 || length ()->samples () != loopEndPosition ()->samples ();
74 Q_SIGNAL
void loopedChanged ();
76 Q_SIGNAL
void loopableObjectPropertiesChanged ();
87 loop_end_pos_.get_ticks () - loop_start_pos_.get_ticks ());
96 units::sample_t (units::samples (0)),
101 auto length () const -> const dsp::AtomicPositionQmlAdapter *
103 return bounds_.length ();
106 static constexpr auto kClipStartPosKey =
"clipStartPos"sv;
107 static constexpr auto kLoopStartPosKey =
"loopStartPos"sv;
108 static constexpr auto kLoopEndPosKey =
"loopEndPos"sv;
109 static constexpr auto kTrackBoundsKey =
"trackBounds"sv;
110 friend auto to_json (nlohmann::json &j,
const ArrangerObjectLoopRange &
object)
112 j[kClipStartPosKey] =
object.clip_start_pos_;
113 j[kLoopStartPosKey] =
object.loop_start_pos_;
114 j[kLoopEndPosKey] =
object.loop_end_pos_;
115 j[kTrackBoundsKey] =
object.track_bounds_;
118 from_json (
const nlohmann::json &j, ArrangerObjectLoopRange &
object)
120 j.at (kClipStartPosKey).get_to (
object.clip_start_pos_);
121 j.at (kLoopStartPosKey).get_to (
object.loop_start_pos_);
122 j.at (kLoopEndPosKey).get_to (
object.loop_end_pos_);
123 j.at (kTrackBoundsKey).get_to (
object.track_bounds_);
124 Q_EMIT
object.trackBoundsChanged (
object.track_bounds_);
127 friend void init_from (
128 ArrangerObjectLoopRange &obj,
129 const ArrangerObjectLoopRange &other,
132 obj.clip_start_pos_.set_ticks (other.clip_start_pos_.get_ticks ());
133 obj.loop_start_pos_.set_ticks (other.loop_start_pos_.get_ticks ());
134 obj.loop_end_pos_.set_ticks (other.loop_end_pos_.get_ticks ());
137 BOOST_DESCRIBE_CLASS (
138 ArrangerObjectLoopRange,
142 (clip_start_pos_, loop_start_pos_, loop_end_pos_))
153 bool track_bounds_{
true };
154 std::optional<QMetaObject::Connection> track_bounds_connection_;
156 const ArrangerObjectBounds &bounds_;
164 dsp::AtomicPosition clip_start_pos_;
165 utils::QObjectUniquePtr<dsp::AtomicPositionQmlAdapter> clip_start_pos_adapter_;
168 dsp::AtomicPosition loop_start_pos_;
169 utils::QObjectUniquePtr<dsp::AtomicPositionQmlAdapter> loop_start_pos_adapter_;
176 dsp::AtomicPosition loop_end_pos_;
177 utils::QObjectUniquePtr<dsp::AtomicPositionQmlAdapter> loop_end_pos_adapter_;