Advertisement
BlueBear

ImGuiTimeline.hpp

Mar 11th, 2016
1,382
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #pragma once
  2.  
  3. #include <cmath>
  4.  
  5. #include "imgui.h"
  6.  
  7. namespace ImGui {
  8.  
  9.     static void PlotTimeLine(AudioManager *audioManager) {
  10.         DWORD i;
  11.         float markerTimePosition;
  12.         static float timeLineHorizontalPosition = 0.0f;
  13.         static float timescale = 10.0;
  14.  
  15.         DWORD marksCount = audioManager->getMidiEvents()->getMarkersCount();
  16.         DWORD roundedTotalPlayTime = (DWORD) round(audioManager->getAudio()->getTotalTime());
  17.         BASS_MIDI_MARK *marks = audioManager->getMidiEvents()->getMarkers();
  18.         float time = (float) audioManager->getAudio()->getTime();
  19.  
  20.         ImDrawList *draw_list = ImGui::GetWindowDrawList();
  21.  
  22.         ImVec2 canvasPosition = ImGui::GetCursorScreenPos();
  23.         ImVec2 canvasSize = ImGui::GetContentRegionAvail();
  24.  
  25.         draw_list->PushClipRect(ImVec4(canvasPosition.x, canvasPosition.y, canvasPosition.x + canvasSize.x, canvasPosition.y + canvasSize.y));
  26.  
  27.         timeLineHorizontalPosition = -(time * timescale) + (canvasSize.x / 2.0f);
  28.  
  29.         ImGui::InvisibleButton("canvas", canvasSize);
  30.  
  31.         if (ImGui::IsItemHovered()) {
  32.             timescale += ImGui::GetIO().MouseWheel;
  33.             timescale = fmaxf(2.0f, timescale);
  34.         }
  35.  
  36.         // MIDI event markers
  37.         for (i = 0; i < marksCount; i++) {
  38.             markerTimePosition = timescale * (float) audioManager->getAudio()->getTimeFromPosition(marks[i].pos);
  39.             markerTimePosition += timeLineHorizontalPosition;
  40.  
  41.             draw_list->AddLine(
  42.                 ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 15),
  43.                 ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 100),
  44.                 ImColor(255, 255, 255, 255),
  45.                 1.0f
  46.             );
  47.  
  48.             if (ImGui::IsItemHovered()) {
  49.                 float offset = (i % 2 == 0 ? 20.0f : 0.0f);
  50.  
  51.                 draw_list->AddText(
  52.                         ImVec2(canvasPosition.x + markerTimePosition, canvasPosition.y + 100 + offset),
  53.                         ImColor(255, 255, 255, 255),
  54.                         marks[i].text
  55.                 );
  56.             }
  57.         }
  58.  
  59.         // Current time bar
  60.         draw_list->AddLine(ImVec2((canvasSize.x / 2) + canvasPosition.x, canvasPosition.y + 15),
  61.                            ImVec2((canvasSize.x / 2) + canvasPosition.x, canvasPosition.y + 100), ImColor(0, 255, 0, 255),
  62.                            0.8f);
  63.  
  64.         // Time bars
  65.         for (i = 0; i <= roundedTotalPlayTime; i++) {
  66.             if (i % 10) {
  67.                 //every second
  68.                 draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15),
  69.                                    ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 50),
  70.                                    ImColor(255, 255, 0, 255), 0.8f);
  71.             }
  72.             else if (i % 60 == 0) {
  73.                 //every 60 seconds
  74.                 char str[10];
  75.                 snprintf(str, 10, "%d", i);
  76.                 draw_list->AddText(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition - 5, canvasPosition.y),
  77.                                    ImColor(255, 255, 255, 255), str);
  78.                 draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15),
  79.                                    ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 100),
  80.                                    ImColor(255, 0, 0, 255), 0.8f);
  81.             }
  82.             else {
  83.                 //every 10 seconds
  84.                 char str[10];
  85.                 snprintf(str, 10, "%d", i);
  86.                 draw_list->AddText(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition - 5, canvasPosition.y),
  87.                                    ImColor(255, 255, 255, 255), str);
  88.                 draw_list->AddLine(ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 15),
  89.                                    ImVec2(canvasPosition.x + (i * timescale) + timeLineHorizontalPosition, canvasPosition.y + 75),
  90.                                    ImColor(255, 255, 0, 255), 0.8f);
  91.             }
  92.  
  93.         }
  94.         draw_list->PopClipRect();
  95.  
  96.     }
  97.  
  98.     static void Timeline(bool *isOpen, AudioManager *audioManager) {
  99.         //ImGui::SetNextWindowSize(ImVec2(100, 0), ImGuiSetCond_FirstUseEver);
  100.  
  101.         if (ImGui::Begin("Timeline", isOpen)) {
  102.             PlotTimeLine(audioManager);
  103.         }
  104.         ImGui::End();
  105.     }
  106.  
  107. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement