7092a6ffbb066abf7dd2bb3d9bd40a1884eeb42f
[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   Widget                   *dialog_widget = nullptr;
34   bool                      have_popup_window = false;
35   std::unique_ptr<Window>   popup_window;
36   double                    global_scale;
37   bool                      auto_redraw;
38   Rect                      update_region;
39   bool                      update_full_redraw = false;
40   bool                      debug_update_region = false;
41   std::vector<Timer *>      timers;
42   std::vector<Shortcut *>   shortcuts;
43   std::vector<Window *>     child_windows;
44
45   std::function<void()>     m_close_callback;
46
47   Widget *find_widget_xy (double ex, double ey);
48
49 public:
50   Window (const std::string& title, int width, int height, PuglNativeWindow parent = 0, bool resize = false, PuglNativeWindow transient_parent = 0);
51   virtual ~Window();
52
53   std::vector<Widget *> crawl_widgets();
54   void on_display();
55   void on_event (const PuglEvent *event);
56   void on_resize (int *width, int *height);
57   void wait_for_event();
58   void wait_event_fps();
59   void process_events();
60   void show();
61   void open_file_dialog (const std::string& title, const std::string& filter, const std::string& filter_title, std::function<void(std::string)> callback);
62   void save_file_dialog (const std::string& title, const std::string& filter, const std::string& filter_title, std::function<void(std::string)> callback);
63   void on_file_selected (const std::string& filename);
64   void need_update (Widget *widget, const Rect *changed_rect = nullptr);
65   void on_widget_deleted (Widget *widget);
66   void set_menu_widget (Widget *widget);
67   void set_keyboard_focus (Widget *widget);
68   void set_dialog_widget (Widget *widget);
69   void set_close_callback (const std::function<void()>& callback);
70   void set_popup_window (Window *window);
71   void add_timer (Timer *timer);
72   void remove_timer (Timer *timer);
73   void add_shortcut (Shortcut *shortcut);
74   void remove_shortcut (Shortcut *shortcut);
75   void add_child_window (Window *window);
76   void remove_child_window (Window *window);
77   Window *window() override;
78   PuglNativeWindow native_window();
79
80   void fill_zoom_menu (Menu *menu);
81   void set_gui_scaling (double s);
82   double gui_scaling();
83
84   void get_scaled_size (int *w, int *h);
85
86   Signal<> signal_update_size;
87 };
88
89 }
90
91 #endif