#ifndef XTC_MAIN_WINDOW_HPP #define XTC_MAIN_WINDOW_HPP #include #include #include #include "xtc/xtc_project.h" #include "xtc/xtc_backend.h" class GraphWidget; class SequencerWidget; class Fl_Box; class Fl_Button; class Fl_Tabs; class MainWindow : public Fl_Double_Window { public: explicit MainWindow(bool prompt_unsaved = true); ~MainWindow() override; MainWindow(const MainWindow &) = delete; MainWindow &operator=(const MainWindow &) = delete; using Fl_Double_Window::show; int handle(int event) override; xtc_result save_project(const char *path); xtc_result open_project(const char *path); private: std::unique_ptr project_{nullptr, xtc_project_destroy}; SequencerWidget *sequencer_ = nullptr; bool dirty_ = false, prompt_unsaved_ = true; std::string path_; bool discard_changes(); void mark_dirty(); xtc_result install_project(xtc_project *candidate); static xtc_result seek(void *context, uint64_t tick); static void file_callback(Fl_Widget *, void *context); GraphWidget *graph_widget_ = nullptr; Fl_Box *graph_state_ = nullptr; xtc_backend *backend_ = nullptr; bool ready_ = false; bool running_ = false; bool closing_ = false; Fl_Button *play_ = nullptr; Fl_Button *stop_ = nullptr; Fl_Box *indicator_ = nullptr; Fl_Box *status_ = nullptr; Fl_Box *error_ = nullptr; Fl_Tabs *tabs_ = nullptr; static xtc_result edit_graph(void *context, const xtc_graph_edit &edit, size_t *out_added_id); void open_backend(); void start_engine(); void stop_engine(); void reconnect_engine(); void refresh_status(); bool close_window(); void report_error(const char *operation, xtc_result result); static void play_callback(Fl_Widget *, void *context); static void stop_callback(Fl_Widget *, void *context); static void reconnect_callback(Fl_Widget *, void *context); static void close_callback(Fl_Widget *, void *context); static void view_callback(Fl_Widget *widget, void *view); static void about_callback(Fl_Widget *, void *); static void timer_callback(void *context); }; #endif