NAP
sequencecontrollerevent.h
1 /* This Source Code Form is subject to the terms of the Mozilla Public
2  * License, v. 2.0. If a copy of the MPL was not distributed with this
3  * file, You can obtain one at https://mozilla.org/MPL/2.0/. */
4 
5 #pragma once
6 
7 #include "sequencecontroller.h"
8 #include "sequencetracksegmentevent.h"
9 
10 #include <nap/logger.h>
11 
12 namespace nap
13 {
15 
16  class SequenceService;
17 
22  {
23  RTTI_ENABLE(SequenceController)
24  public:
32  : SequenceController(service, player, editor)
33  {
34  }
35 
36 
43  template<typename T>
44  void editEventSegment(const std::string& trackID, const std::string& segmentID, const T& value);
45 
52  double segmentEventStartTimeChange(const std::string& trackID, const std::string& segmentID, double time);
53 
59  const SequenceTrackSegment* insertSegment(const std::string& trackID, double time) override;
60 
66  template<typename SEGMENT_TYPE>
67  const SequenceTrackSegment* insertEventSegment(const std::string& trackID, double time);
68 
74  void deleteSegment(const std::string& trackID, const std::string& segmentID) override;
75 
79  void addNewEventTrack();
80 
85  void insertTrack(rttr::type type) override;
86  };
87 
88 
89  template<typename SEGMENT_TYPE>
90  const SequenceTrackSegment* SequenceControllerEvent::insertEventSegment(const std::string& trackID, double time)
91  {
92  SequenceTrackSegment *return_ptr = nullptr;
93 
94  performEditAction([this, trackID, time, &return_ptr]() mutable
95  {
96  // create new segment & set parameters
97  std::unique_ptr<SEGMENT_TYPE> new_segment = std::make_unique<SEGMENT_TYPE>();
98  new_segment->mStartTime = time;
99  new_segment->mID = mService.generateUniqueID(getPlayerReadObjectIDs());
100  new_segment->mDuration = 0.0;
101 
102  //
103  SequenceTrack *track = findTrack(trackID);
104  assert(track != nullptr); // track not found
105 
106  track->mSegments.emplace_back(ResourcePtr<SEGMENT_TYPE>(new_segment.get()));
107 
108  return_ptr = new_segment.get();
109  getPlayerOwnedObjects().emplace_back(std::move(new_segment));
110  });
111 
112  return return_ptr;
113  }
114 
115 
116  template<typename T>
117  void SequenceControllerEvent::editEventSegment(const std::string& trackID, const std::string& segmentID, const T& value)
118  {
119  performEditAction([this, trackID, segmentID, value]()
120  {
121  SequenceTrack *track = findTrack(trackID);
122  assert(track != nullptr); // track not found
123 
124  SequenceTrackSegment *segment = findSegment(trackID, segmentID);
125  assert(segment != nullptr); // segment not found
126 
127  assert(segment->get_type().template is_derived_from<SequenceTrackSegmentEvent<T>>());
128  auto *event_segment = static_cast<SequenceTrackSegmentEvent<T> *>(segment);
129 
130  event_segment->mValue = value;
131  });
132  }
133 }
nap::SequenceController::findTrack
SequenceTrack * findTrack(const std::string &trackID)
nap::SequencePlayer
Definition: sequenceplayer.h:36
nap::SequenceEditor
Definition: sequenceeditor.h:32
nap::SequenceController
Definition: sequencecontroller.h:25
nap::rtti::ObjectPtr
Definition: objectptr.h:154
nap::SequenceService
Definition: sequenceservice.h:42
nap::SequenceController::findSegment
SequenceTrackSegment * findSegment(const std::string &trackID, const std::string &segmentID)
nap::SequenceControllerEvent::insertEventSegment
const SequenceTrackSegment * insertEventSegment(const std::string &trackID, double time)
Definition: sequencecontrollerevent.h:90
nap::SequenceTrackSegment
Definition: sequencetracksegment.h:19
nap::SequenceControllerEvent::SequenceControllerEvent
SequenceControllerEvent(SequenceService &service, SequencePlayer &player, SequenceEditor &editor)
Definition: sequencecontrollerevent.h:31
nap::SequenceTrack
Definition: sequencetrack.h:22
nap::SequenceController::mService
SequenceService & mService
Definition: sequencecontroller.h:181
nap::SequenceTrackSegmentEvent
Definition: sequencetracksegmentevent.h:39
nap::SequenceController::performEditAction
void performEditAction(std::function< void()> action)
nap::SequenceTrack::mSegments
std::vector< ResourcePtr< SequenceTrackSegment > > mSegments
Property: 'Segments' Vector holding track segments.
Definition: sequencetrack.h:33
nap::SequenceController::getPlayerReadObjectIDs
std::unordered_set< std::string > & getPlayerReadObjectIDs()
Definition: sequencecontroller.h:172
nap::SequenceTrackSegmentEvent::mValue
T mValue
Definition: sequencetracksegmentevent.h:43
nap::SequenceController::getPlayerOwnedObjects
std::vector< std::unique_ptr< rtti::Object > > & getPlayerOwnedObjects()
Definition: sequencecontroller.h:168
nap::SequenceControllerEvent::editEventSegment
void editEventSegment(const std::string &trackID, const std::string &segmentID, const T &value)
Definition: sequencecontrollerevent.h:117
nap
Definition: templateapp.h:17
nap::SequenceControllerEvent
Definition: sequencecontrollerevent.h:21
nap::SequenceService::generateUniqueID
std::string generateUniqueID(std::unordered_set< std::string > &objectIDs, const std::string &baseID="Generated")