#include "gui.h" #include #include "sequence.h" void Slider::Draw(SDL_Renderer* renderer) { constexpr int Radius = 25; SDL_Rect rect = { m_x, m_y, Radius, Radius }; SDL_RenderDrawRect(renderer, &rect); SDL_RenderDrawLine(renderer, m_x, m_y + (*value * valueScaling), m_x + Radius, m_y + (*value * valueScaling)); } bool Slider::InBounds(int x, int y) { constexpr int Radius = 25; SDL_Rect rect = { m_x, m_y, Radius, Radius }; SDL_Point point = { x, y }; return SDL_PointInRect(&point, &rect); } GUI::GUI(Sequence& seq) : m_sequence(seq) { int i = 0; for (auto& step : seq.steps) { ++i; m_sliders.emplace_back(i * 30 + 10, 120, &step.carrierFreq, 0.1f); m_sliders.emplace_back(i * 30 + 10, 180, &step.modFreq); m_sliders.emplace_back(i * 30 + 10, 220, &step.modDepth, 3.0f); } } void GUI::OnMouseDown(int x, int y) { for (Slider& slider : m_sliders) { if (slider.InBounds(x, y)) { m_activeSlider = &slider; m_dragStart = y; return; } } } void GUI::OnMouseUp() { m_activeSlider = nullptr; m_dragStart = 0; } void GUI::OnMouseMove(int x, int y) { if (m_activeSlider) { *m_activeSlider->value -= (m_dragStart - y) / m_activeSlider->valueScaling; m_dragStart = y; if (*m_activeSlider->value < 0) *m_activeSlider->value = 0; } } void GUI::Repaint(SDL_Renderer* renderer, int currentStep) { SDL_Rect rect = { 40, 40, 32, 32 }; for (int i = 0; i < 8; i++) { SDL_SetRenderDrawColor(renderer, m_sequence.steps[i].modDepth * 8, m_sequence.steps[i].modFreq * 2, m_sequence.steps[i].carrierFreq / 3, 255); if (i == currentStep) SDL_RenderFillRect(renderer, &rect); else SDL_RenderDrawRect(renderer, &rect); rect.x += rect.w + 8; } SDL_SetRenderDrawColor(renderer, 127, 127, 255, 255); for (Slider& slider : m_sliders) { slider.Draw(renderer); } }