GLUI: add Widget::delete_later(), fixes ParamLabel related crash
[spectmorph.git] / glui / smparamlabel.hh
1 // Licensed GNU LGPL v3 or later: http://www.gnu.org/licenses/lgpl.html
2
3 #ifndef SPECTMORPH_PARAM_LABEL_HH
4 #define SPECTMORPH_PARAM_LABEL_HH
5
6 #include "smlineedit.hh"
7
8 namespace SpectMorph
9 {
10
11 class ParamLabelModel
12 {
13 public:
14   double db = 0;
15   std::string
16   value_text()
17   {
18     return string_locale_printf ("%.2f", db);
19   }
20   std::string
21   display_text()
22   {
23     return string_locale_printf ("%.2f dB", db);
24   }
25   void
26   set_value_text (const std::string& t)
27   {
28     db = atof (t.c_str());
29   }
30 };
31
32 class ParamLabel : public Label
33 {
34   bool      pressed = false;
35   LineEdit *line_edit = nullptr;
36
37   ParamLabelModel *model;
38 public:
39   ParamLabel (Widget *parent, const std::string& text) :
40     Label (parent, text)
41   {
42     model = new ParamLabelModel();
43   }
44   void
45   mouse_press (double x, double y) override
46   {
47     pressed = true;
48   }
49   void
50   mouse_release (double x, double y) override
51   {
52     if (!pressed)
53       return;
54     pressed = false;
55
56     if (!line_edit)
57       {
58         line_edit = new LineEdit (this, model->value_text());
59         line_edit->height = height;
60         line_edit->width = width;
61         line_edit->x = 0;
62         line_edit->y = 0;
63
64         connect (line_edit->signal_return_pressed, this, &ParamLabel::on_return_pressed);
65         connect (line_edit->signal_focus_out, this, &ParamLabel::on_return_pressed);
66
67         window()->set_keyboard_focus (line_edit, true);
68
69         set_text ("");
70       }
71   }
72   void
73   on_return_pressed()
74   {
75     if (!line_edit->visible())
76       return;
77
78     model->set_value_text (line_edit->text());
79     signal_value_changed (model->db);
80     set_text (model->display_text());
81     line_edit->delete_later();
82     line_edit = nullptr;
83   }
84   Signal<double> signal_value_changed;
85 };
86
87 }
88
89 #endif