#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include "aboutwindow.h" #include "slider.h" #include "prefs.h" #include #include #define CMD_UPDATE_LABEL_SETTING 0x1000 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 HaikuLooperRefHandler; class HaikuLooperWindow : public BWindow { BSlider *slider; BStringView *position_label; 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); HaikuLooperSlider *volume_slider; HaikuLooperSlider *speed_slider; BFilePanel *file_panel; HaikuLooperSlider *pitch_slider; HaikuLooperSlider *tempo_slider; HaikuLooperRefHandler *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; HaikuLooperWindow(Playback *playback); ~HaikuLooperWindow(); }; class HaikuLooperRefHandler : public BHandler { HaikuLooperWindow *win; BHandler *next_handler; public: void MessageReceived(BMessage *msg) override; HaikuLooperRefHandler(HaikuLooperWindow *win); };