7 #include "sequencetrackview.h"
8 #include "sequencecontrollerevent.h"
9 #include "sequencetracksegment.h"
10 #include "sequenceeditorguiclipboard.h"
11 #include "sequenceeventtrackview_guiactions.h"
12 #include "sequenceguiutils.h"
15 #include <imguiutils.h>
22 class SequenceEventTrackView;
23 class SequenceGUIService;
30 class NAPAPI SequenceEventTrackSegmentViewBase
37 SequenceEventTrackSegmentViewBase() = default;
42 virtual ~SequenceEventTrackSegmentViewBase() = default;
50 virtual
bool handleEditPopupContent(sequenceguiactions::Action& action) = 0;
61 virtual
void drawEvent(const SequenceTrackSegment& segment, ImDrawList* drawList, const ImVec2& topLeft,
float x, ImU32 color) = 0;
70 virtual
void insertSegment(SequenceControllerEvent& controller, const std::
string& trackID,
double time) = 0;
80 virtual std::unique_ptr<sequenceguiactions::Action> createEditAction(const SequenceTrackSegmentEventBase* segment, const std::
string& trackID, const std::
string& segmentID) = 0;
120 void drawEvent(
const SequenceTrackSegment& segment, ImDrawList* drawList,
const ImVec2& topLeft,
float x, ImU32 color)
override;
139 std::unique_ptr<sequenceguiactions::Action>
169 void showInspectorContent(
const SequenceTrack& track)
override;
176 void showTrackContent(
const SequenceTrack& track,
const ImVec2& trackTopLeft)
override;
181 void handleInsertEventSegmentPopup();
187 void handleEditEventSegmentPopup();
197 bool pasteEventsFromClipboard(
const std::string& trackID,
double time,
utility::ErrorState& errorState);
219 drawSegmentHandler(
const SequenceTrack& track,
const SequenceTrackSegment& segment,
const ImVec2& trackTopLeft,
float segmentX,
float segmentWidth, ImDrawList* drawList);
224 void handleEditSegmentValuePopup();
231 void updateSegmentInClipboard(
const std::string& trackID,
const std::string& segmentID);
236 void handleAssignOutputIDToTrack();
241 void handleSegmentDrag();
246 void handleLoadPresetPopup();
250 std::unordered_map<rtti::TypeInfo, std::unique_ptr<SequenceEventTrackSegmentViewBase>> mSegmentViews;
258 namespace sequenceguiclipboard
266 :
Clipboard(type), mSequenceName(std::move(sequenceName))
273 std::string mSequenceName;
287 ImGui::OpenPopup(
"Edit Event");
290 ImGui::SetNextWindowPos(action->mWindowPos);
292 mState.mAction = sequenceguiactions::createAction<sequenceguiactions::EditingEventSegment<T>>(action->mTrackID, action->mSegmentID, action->mWindowPos, action->mValue, action->mStartTime);
300 auto take_snapshot = [
this, action]()
302 if(action->mTakeSnapshot)
305 getEditor().takeSnapshot(action->get_type());
308 if(ImGui::BeginPopup(
"Edit Event"))
312 assert(it != mSegmentViews.end());
313 if(it->second->handleEditPopupContent(*action))
319 bool edit_time =
false;
322 ImGui::PushItemWidth(100.0f * mState.mScale);
324 edit_time = ImGui::InputInt3(
"Time (mm:ss:ms)", &time_array[0]);
325 time_array[0] = math::clamp<int>(time_array[0], 0, 99999);
326 time_array[1] = math::clamp<int>(time_array[1], 0, 59);
327 time_array[2] = math::clamp<int>(time_array[2], 0, 99);
329 ImGui::PopItemWidth();
339 double time = event_controller.segmentEventStartTimeChange(action->mTrackID, action->mSegmentID, new_time);
340 updateSegmentInClipboard(action->mTrackID, action->mSegmentID);
341 action->mStartTime = time;
342 mState.mDirty =
true;
347 event_controller.
editEventSegment<T>(action->mTrackID, action->mSegmentID, action->mValue);
348 updateSegmentInClipboard(action->mTrackID, action->mSegmentID);
349 mState.mAction = sequenceguiactions::createAction<sequenceguiactions::None>();
350 ImGui::CloseCurrentPopup();
355 ImGui::CloseCurrentPopup();
356 mState.mAction = sequenceguiactions::createAction<sequenceguiactions::None>();
359 action->mWindowPos = ImGui::GetWindowPos();
365 mState.mAction = sequenceguiactions::createAction<sequenceguiactions::None>();
378 const auto *new_segment =
dynamic_cast<const T *
>(controller.insertEventSegment<T>(trackID,
381 assert(new_segment !=
nullptr);
384 const auto *event_upcast =
dynamic_cast<const T *
>(&baseEvent);
385 assert(event_upcast !=
nullptr);
388 controller.editEventSegment(trackID, new_segment->mID, event_upcast->mValue);
403 return sequenceguiactions::createAction<sequenceguiactions::OpenEditEventSegmentPopup<T>>(trackID, segmentID, ImGui::GetWindowPos(),
event->mValue, segment->
mStartTime);