#pragma once #include #include #include #include #include #include #include #include #include #include #include #include "aboutwindow.h" #include "slider.h" #include "prefs.h" #include #define CMD_UPDATE_LABEL_SETTING 0x1000 class LooperLogScaler { double la; double lb; public: double x0; double x1; void update_min_max(double min, double max); LooperLogScaler(double min, double max); double scale_log(double value); double unscale_log(double value); }; extern bool show_labels; extern bool show_icons; extern bool quitting; class Subwindow { public: BWindow *window; static std::vector windows; std::atomic_bool Showing = false; std::atomic_bool ShownEver = false; private: inline Subwindow(BWindow *window) : window(window) { } public: inline static Subwindow *Add(BWindow *window) { auto output = new Subwindow(window); windows.push_back(output); return output; } inline void Show() { Showing.store(true); } }; class LooperRefHandler; class LooperWindow : public BWindow { BSlider *slider; BBitmap *pause_bitmap; BBitmap *resume_bitmap; BBitmap *refresh_bitmap; BBitmap *stop_bitmap; BMenu *file_menu; BMenuItem *open_item; BMenuItem *prefs_item; BMenuItem *quit_item; BMenu *help_menu; BMenuItem *about_item; BGroupLayout *layout; Playback *playback; BButton *restart_btn; BButton *stop_btn; BButton *pause_resume_btn; bool volume_clicked = false; bool speed_clicked = false; bool pitch_clicked = false; bool tempo_clicked = false; bool seek_clicked = false; void UpdateViewFlags(BView *view); void UpdateViewFlags(BLayout *layout); LooperSlider *volume_slider; LooperSlider *speed_slider; BFilePanel *file_panel; LooperSlider *pitch_slider; LooperSlider *tempo_slider; LooperRefHandler *ref_handler; std::thread *update_thread = nullptr; bool done = false; void Pulse(); void ThreadFunc(); const char *file_to_play = nullptr; public: Subwindow *about_subwindow; Subwindow *prefs_subwindow; void FrameResized(float newWidth, float newHeight) override; void MessageReceived(BMessage *msg) override; LooperWindow(Playback *playback); ~LooperWindow(); }; class LooperRefHandler : public BHandler { LooperWindow *win; BHandler *next_handler; public: void MessageReceived(BMessage *msg) override; LooperRefHandler(LooperWindow *win); };