#pragma once #include #include "imgui.h" namespace ImGui { static void PlotTimeLine(AudioManager *audioManager) { DWORD i; float markerTimePosition; static float timeLineHorizontalPosition = 0.0f; static float timescale = 10.0; DWORD marksCount = audioManager->getMidiEvents()->getMarkersCount(); DWORD roundedTotalPlayTime = (DWORD) round(audioManager->getAudio()->getTotalTime()); BASS_MIDI_MARK *marks = audioManager->getMidiEvents()->getMarkers(); float time = (float) audioManager->getAudio()->getTime(); ImDrawList *draw_list = ImGui::GetWindowDrawList(); ImVec2 canvasPosition = ImGui::GetCursorScreenPos(); ImVec2 canvasSize = ImGui::GetContentRegionAvail(); draw_list->PushClipRect(ImVec4(canvasPosition.x, canvasPosition.y, canvasPosition.x + canvasSize.x, canvasPosition.y + canvasSize.y)); timeLineHorizontalPosition = -(time * timescale) + (canvasSize.x / 2.0f); ImGui::InvisibleButton("canvas", canvasSize); if (ImGui::IsItemHovered()) { timescale += ImGui::GetIO().MouseWheel; timescale = fmaxf(2.0f, timescale); } // MIDI event markers for (i = 0; i < marksCount; i++) { markerTimePosition = timescale * (float) audioManager->getAudio()->getTimeFromPosition(marks[i].pos); markerTimePosition += timeLineHorizontalPosition; draw_list->AddLine( ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 15), ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 100), ImColor(255, 255, 255, 255), 1.0f ); if (ImGui::IsItemHovered()) { float offset = (i % 2 == 0 ? 20.0f : 0.0f); draw_list->AddText( ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 100 + offset), ImColor(255, 255, 255, 255), marks[i].text ); } } // Current time bar draw_list->AddLine(ImVec2((canvasSize.x / 2) + canvasPosition.x, canvasPosition.y + 15), ImVec2((canvasSize.x / 2) + canvasPosition.x, canvasPosition.y + 100), ImColor(0, 255, 0, 255), 0.8f); // Time bars for (i = 0; i <= roundedTotalPlayTime; i++) { if (i % 10) { //every second draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15), ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 50), ImColor(255, 255, 0, 255), 0.8f); } else if (i % 60 == 0) { //every 60 seconds char str[10]; snprintf(str, 10, "%d", i); draw_list->AddText(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition - 5, canvasPosition.y), ImColor(255, 255, 255, 255), str); draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15), ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 100), ImColor(255, 0, 0, 255), 0.8f); } else { //every 10 seconds char str[10]; snprintf(str, 10, "%d", i); draw_list->AddText(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition - 5, canvasPosition.y), ImColor(255, 255, 255, 255), str); draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15), ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 75), ImColor(255, 255, 0, 255), 0.8f); } } draw_list->PopClipRect(); } static void Timeline(bool *isOpen, AudioManager *audioManager) { //ImGui::SetNextWindowSize(ImVec2(100, 0), ImGuiSetCond_FirstUseEver); if (ImGui::Begin("Timeline", isOpen)) { PlotTimeLine(audioManager); } ImGui::End(); } }