looper/backends/ui/haiku/main_window.h

103 lines
2.5 KiB
C
Raw Normal View History

2024-11-12 14:53:44 -08:00
#pragma once
#include <Window.h>
#include <Application.h>
#include <GroupLayout.h>
#include <Slider.h>
#include <playback.h>
#include <thread>
#include <FilePanel.h>
#include <Bitmap.h>
#include <Menu.h>
#include <MenuItem.h>
#include <vector>
#include "aboutwindow.h"
#include "slider.h"
#include "prefs.h"
#include <atomic>
#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<Subwindow*> 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);
};