GLUI: add Widget::delete_later(), fixes ParamLabel related crash
[spectmorph.git] / glui / smwindow.hh
1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2
3 #ifndef SPECTMORPH_WINDOW_HH
4 #define SPECTMORPH_WINDOW_HH
5
6 #include "smwidget.hh"
7 #include "pugl/pugl.h"
8 #include <memory>
9 #include <functional>
10
11 namespace SpectMorph
12 {
13
14 struct CairoGL;
15 class NativeFileDialog;
16 struct Menu;
17 class Timer;
18 class Shortcut;
19
20 struct Window : public Widget
21 {
22 protected:
23   PuglView                 *view;
24   std::unique_ptr<CairoGL>  cairo_gl;
25   bool                      draw_grid;
26   bool                      have_file_dialog = false;
27   std::function<void(std::string)> file_dialog_callback;
28   std::unique_ptr<NativeFileDialog> native_file_dialog;
29   Widget                   *mouse_widget = nullptr;
30   Widget                   *enter_widget = nullptr;
31   Widget                   *menu_widget = nullptr;
32   Widget                   *keyboard_focus_widget = nullptr;
33   bool                      keyboard_focus_release_on_click = false;
34   Widget                   *dialog_widget = nullptr;
35   bool                      have_popup_window = false;
36   std::unique_ptr<Window>   popup_window;
37   double                    global_scale;
38   bool                      auto_redraw;
39   Rect                      update_region;
40   bool                      update_full_redraw = false;
41   bool                      debug_update_region = false;
42   std::vector<Timer *>      timers;
43   std::vector<Shortcut *>   shortcuts;
44   std::vector<Window *>     child_windows;
45   std::vector<Widget *>     delete_later_widgets;
46
47   std::function<void()>     m_close_callback;
48
49   Widget *find_widget_xy (double ex, double ey);
50
51 public:
52   Window (const std::string& title, int width, int height, PuglNativeWindow parent = 0, bool resize = false, PuglNativeWindow transient_parent = 0);
53   virtual ~Window();
54
55   std::vector<Widget *> crawl_widgets();
56   void on_display();
57   void on_event (const PuglEvent *event);
58   void on_resize (int *width, int *height);
59   void wait_for_event();
60   void wait_event_fps();
61   void process_events();
62   void show();
63   void open_file_dialog (const std::string& title, const std::string& filter, const std::string& filter_title, std::function<void(std::string)> callback);
64   void save_file_dialog (const std::string& title, const std::string& filter, const std::string& filter_title, std::function<void(std::string)> callback);
65   void on_file_selected (const std::string& filename);
66   void need_update (Widget *widget, const Rect *changed_rect = nullptr);
67   void on_widget_deleted (Widget *widget);
68   void set_menu_widget (Widget *widget);
69   void set_keyboard_focus (Widget *widget, bool release_on_click = false);
70   void set_dialog_widget (Widget *widget);
71   void set_close_callback (const std::function<void()>& callback);
72   void set_popup_window (Window *window);
73   void add_timer (Timer *timer);
74   void remove_timer (Timer *timer);
75   void add_shortcut (Shortcut *shortcut);
76   void remove_shortcut (Shortcut *shortcut);
77   void add_child_window (Window *window);
78   void remove_child_window (Window *window);
79   void add_delete_later (Widget *widget);
80   Window *window() override;
81   PuglNativeWindow native_window();
82
83   void fill_zoom_menu (Menu *menu);
84   void set_gui_scaling (double s);
85   double gui_scaling();
86
87   void get_scaled_size (int *w, int *h);
88
89   Signal<> signal_update_size;
90 };
91
92 }
93
94 #endif