dragging frames with ctrl
This commit is contained in:
		@@ -970,6 +970,12 @@ static void _imgui_timeline(Imgui* self)
 | 
			
		||||
 | 
			
		||||
		std::function<void(s32, Anm2Frame&)> timeline_item_frame = [&](s32 i, Anm2Frame& frame)
 | 
			
		||||
		{
 | 
			
		||||
			static s32 frameDelayStart{};
 | 
			
		||||
			static f32 frameDelayTimeStart{};
 | 
			
		||||
			const bool isModCtrl = ImGui::IsKeyDown(IMGUI_INPUT_CTRL);
 | 
			
		||||
			static Anm2Frame* draggingFrame = nullptr;
 | 
			
		||||
			static Anm2Type draggingFrameType = ANM2_NONE;
 | 
			
		||||
 | 
			
		||||
			ImGui::PushID(i);
 | 
			
		||||
			reference.frameIndex = i;
 | 
			
		||||
			ImVec2 framePos = ImGui::GetCursorPos();
 | 
			
		||||
@@ -986,8 +992,7 @@ static void _imgui_timeline(Imgui* self)
 | 
			
		||||
 | 
			
		||||
			ImGui::SetCursorPos(framePos);
 | 
			
		||||
			
 | 
			
		||||
			if (_imgui_atlas_button(frameButton, self))
 | 
			
		||||
				*self->reference = reference;
 | 
			
		||||
			if (_imgui_atlas_button(frameButton, self)) *self->reference = reference;
 | 
			
		||||
 | 
			
		||||
			if (ImGui::IsItemHovered())
 | 
			
		||||
			{
 | 
			
		||||
@@ -995,23 +1000,47 @@ static void _imgui_timeline(Imgui* self)
 | 
			
		||||
				_imgui_clipboard_hovered_item_set(self, frameWithReference);
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (type == ANM2_TRIGGERS)
 | 
			
		||||
			if (ImGui::IsItemActivated())
 | 
			
		||||
			{
 | 
			
		||||
				if (ImGui::IsItemActivated()) imgui_undo_push(self, IMGUI_ACTION_TRIGGER_MOVE);
 | 
			
		||||
 | 
			
		||||
				if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_SourceNoPreviewTooltip))
 | 
			
		||||
				if (type == ANM2_TRIGGERS || isModCtrl)
 | 
			
		||||
				{
 | 
			
		||||
					frame.atFrame = std::max(frameTime, 0);
 | 
			
		||||
					draggingFrame = &frame;
 | 
			
		||||
					draggingFrameType = type;
 | 
			
		||||
					*self->reference = reference;
 | 
			
		||||
				}
 | 
			
		||||
 | 
			
		||||
				if (type == ANM2_TRIGGERS)
 | 
			
		||||
					imgui_undo_push(self, IMGUI_ACTION_TRIGGER_MOVE);
 | 
			
		||||
				else if (isModCtrl)
 | 
			
		||||
				{
 | 
			
		||||
					imgui_undo_push(self, IMGUI_ACTION_FRAME_DELAY);
 | 
			
		||||
					frameDelayStart = draggingFrame->delay;
 | 
			
		||||
					frameDelayTimeStart = frameTime;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (draggingFrame)
 | 
			
		||||
			{
 | 
			
		||||
				if (draggingFrameType == ANM2_TRIGGERS)
 | 
			
		||||
				{
 | 
			
		||||
					draggingFrame->atFrame = std::max(frameTime, 0);
 | 
			
		||||
					for (auto& frameCheck : animation->triggers.frames)
 | 
			
		||||
					{
 | 
			
		||||
						if (&frame == &frameCheck) continue;
 | 
			
		||||
						if (frame.atFrame == frameCheck.atFrame)
 | 
			
		||||
						if (draggingFrame == &frameCheck) continue;
 | 
			
		||||
						if (draggingFrame->atFrame == frameCheck.atFrame)
 | 
			
		||||
						{
 | 
			
		||||
							frame.atFrame++;
 | 
			
		||||
							draggingFrame->atFrame++;
 | 
			
		||||
							break;
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					ImGui::EndDragDropSource();
 | 
			
		||||
				}
 | 
			
		||||
				else if (isModCtrl)
 | 
			
		||||
					draggingFrame->delay = std::max(frameDelayStart + (s32)(frameTime - frameDelayTimeStart), ANM2_FRAME_NUM_MIN);
 | 
			
		||||
 | 
			
		||||
				if (ImGui::IsMouseReleased(0))
 | 
			
		||||
				{
 | 
			
		||||
					draggingFrame = nullptr;
 | 
			
		||||
					draggingFrameType = ANM2_NONE;
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
			else
 | 
			
		||||
@@ -1022,32 +1051,32 @@ static void _imgui_timeline(Imgui* self)
 | 
			
		||||
					timeline_item_frame(i, frame);
 | 
			
		||||
					ImGui::EndDragDropSource();
 | 
			
		||||
				}
 | 
			
		||||
			}
 | 
			
		||||
 | 
			
		||||
			if (ImGui::BeginDragDropTarget())
 | 
			
		||||
			{
 | 
			
		||||
				if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(frameButton.drag_drop_get()))
 | 
			
		||||
				if (ImGui::BeginDragDropTarget())
 | 
			
		||||
				{
 | 
			
		||||
					Anm2Reference swapReference = *(Anm2Reference*)payload->Data;
 | 
			
		||||
					if (swapReference != reference)
 | 
			
		||||
					if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload(frameButton.drag_drop_get()))
 | 
			
		||||
					{
 | 
			
		||||
						imgui_undo_push(self, IMGUI_ACTION_FRAME_SWAP);
 | 
			
		||||
 | 
			
		||||
						Anm2Frame* swapFrame = anm2_frame_from_reference(self->anm2, &reference);
 | 
			
		||||
						Anm2Frame* dragFrame = anm2_frame_from_reference(self->anm2, &swapReference);
 | 
			
		||||
						
 | 
			
		||||
						if (swapFrame && dragFrame)
 | 
			
		||||
						Anm2Reference swapReference = *(Anm2Reference*)payload->Data;
 | 
			
		||||
						if (swapReference != reference)
 | 
			
		||||
						{
 | 
			
		||||
							Anm2Frame oldFrame = *swapFrame;
 | 
			
		||||
							imgui_undo_push(self, IMGUI_ACTION_FRAME_SWAP);
 | 
			
		||||
 | 
			
		||||
							*swapFrame = *dragFrame;
 | 
			
		||||
							*dragFrame = oldFrame;
 | 
			
		||||
							Anm2Frame* swapFrame = anm2_frame_from_reference(self->anm2, &reference);
 | 
			
		||||
							Anm2Frame* dragFrame = anm2_frame_from_reference(self->anm2, &swapReference);
 | 
			
		||||
							
 | 
			
		||||
							*self->reference = swapReference;
 | 
			
		||||
							if (swapFrame && dragFrame)
 | 
			
		||||
							{
 | 
			
		||||
								Anm2Frame oldFrame = *swapFrame;
 | 
			
		||||
 | 
			
		||||
								*swapFrame = *dragFrame;
 | 
			
		||||
								*dragFrame = oldFrame;
 | 
			
		||||
 | 
			
		||||
								*self->reference = swapReference;
 | 
			
		||||
							}
 | 
			
		||||
						}
 | 
			
		||||
					}
 | 
			
		||||
					ImGui::EndDragDropTarget();
 | 
			
		||||
				}
 | 
			
		||||
				ImGui::EndDragDropTarget();
 | 
			
		||||
			}
 | 
			
		||||
					
 | 
			
		||||
			if (i < (s32)item->frames.size() - 1) ImGui::SameLine();
 | 
			
		||||
 
 | 
			
		||||
@@ -66,6 +66,7 @@
 | 
			
		||||
#define IMGUI_ACTION_FRAME_TRANSFORM "Frame Transform"
 | 
			
		||||
#define IMGUI_ACTION_ANIMATION_SWAP "Animation Swap"
 | 
			
		||||
#define IMGUI_ACTION_TRIGGER_MOVE "Trigger AtFrame"
 | 
			
		||||
#define IMGUI_ACTION_FRAME_DELAY "Frame Delay"
 | 
			
		||||
#define IMGUI_ACTION_MOVE_PLAYHEAD "Move Playhead"
 | 
			
		||||
 | 
			
		||||
#define IMGUI_POPUP_FLAGS ImGuiWindowFlags_NoMove
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user