#pragma once
#include <cmath>
#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();
}
}
Comments
0 B
|👍
/👎
0 B
|👍
/👎
0 B
|0 👍
/0 👎
0 B
|0 👍
/0 👎
0 B
|👍
/👎