SPH
Widgets.cpp
Go to the documentation of this file.
1 #include "gui/windows/Widgets.h"
2 #include <wx/propgrid/propgrid.h>
3 #include <wx/propgrid/props.h>
4 
6 
7 FloatTextCtrl::FloatTextCtrl(wxWindow* parent, const double value, const Interval range)
8  : value(value)
9  , range(range) {
10 
11  lastValidValue = value;
12 
13  wxValidator* validator = wxFloatProperty::GetClassValidator();
14  this->Create(parent,
15  wxID_ANY,
16  std::to_string(value),
17  wxDefaultPosition,
18  wxSize(120, 30),
19  wxTE_PROCESS_ENTER | wxTE_RIGHT,
20  *validator);
21 
22  this->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent& UNUSED(evt)) { this->validate(); });
23  this->Bind(wxEVT_KILL_FOCUS, [this](wxFocusEvent& UNUSED(evt)) { this->validate(); });
24 
25  this->validate();
26 }
27 
28 void FloatTextCtrl::validate() {
29  wxFloatProperty prop;
30  wxVariant variant = this->GetValue();
31  wxPGValidationInfo info;
32  if (!prop.ValidateValue(variant, info)) {
33  value = lastValidValue;
34  } else {
35  value = float(variant.GetDouble());
36  }
37 
38  value = range.clamp(value);
39 
40  if (onValueChanged && value != lastValidValue) {
41  const bool validated = onValueChanged(value);
42  if (!validated) {
43  value = lastValidValue;
44  }
45  }
46 
47  lastValidValue = value;
48  variant = double(value);
49  this->ChangeValue(prop.ValueToString(variant));
50 }
51 
NAMESPACE_SPH_BEGIN
Definition: BarnesHut.cpp:13
#define UNUSED(x)
Definition: Object.h:37
#define NAMESPACE_SPH_END
Definition: Object.h:12
FloatTextCtrl(wxWindow *parent, const double value, const Interval range=Interval::unbounded())
Definition: Widgets.cpp:7
Function< bool(double)> onValueChanged
Definition: Widgets.h:17
Object representing a 1D interval of real numbers.
Definition: Interval.h:17
INLINE Float clamp(const Float &value) const
Clamps the given value by the interval.
Definition: Interval.h:68