Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVojtech Kral <vojtech@kral.hk>2019-05-20 14:32:36 +0300
committerVojtech Kral <vojtech@kral.hk>2019-05-20 15:39:42 +0300
commit8133aa1324c9dde4a4f0e33ae8afe4e1cad8c147 (patch)
treeddecb39011025d782fc9a3e62f667f25539709fa /src/slic3r/GUI/Field.cpp
parentcd1a445c836a82cef7e6d6a9970a05ef1bff2c3c (diff)
Fix wxSpinCtrl in settings on Mac OS, cf. #2237
Diffstat (limited to 'src/slic3r/GUI/Field.cpp')
-rw-r--r--src/slic3r/GUI/Field.cpp46
1 files changed, 20 insertions, 26 deletions
diff --git a/src/slic3r/GUI/Field.cpp b/src/slic3r/GUI/Field.cpp
index 30b95d82a..01fa9eedc 100644
--- a/src/slic3r/GUI/Field.cpp
+++ b/src/slic3r/GUI/Field.cpp
@@ -434,7 +434,6 @@ void CheckBox::msw_rescale()
field->SetMinSize(wxSize(-1, int(1.5f*field->GetFont().GetPixelSize().y +0.5f)));
}
-int undef_spin_val = -9999; //! Probably, It's not necessary
void SpinCtrl::BUILD() {
auto size = wxSize(wxDefaultSize);
@@ -472,12 +471,14 @@ void SpinCtrl::BUILD() {
temp->SetFont(Slic3r::GUI::wxGetApp().normal_font());
temp->SetBackgroundStyle(wxBG_STYLE_PAINT);
-#ifndef __WXOSX__
- // #ys_FIXME_KILL_FOCUS
- // wxEVT_KILL_FOCUS doesn't handled on OSX now (wxWidgets 3.1.1)
- // So, we will update values on KILL_FOCUS & SPINCTRL events under MSW and GTK
- // and on TEXT event under OSX
+// XXX: On OS X the wxSpinCtrl widget is made up of two subwidgets, unfortunatelly
+// the kill focus event is not propagated to the encompassing widget,
+// so we need to bind it on the inner text widget instead. (Ugh.)
+#ifdef __WXOSX__
+ temp->GetText()->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e)
+#else
temp->Bind(wxEVT_KILL_FOCUS, ([this](wxEvent& e)
+#endif
{
e.Skip();
if (bEnterPressed) {
@@ -486,7 +487,7 @@ void SpinCtrl::BUILD() {
}
propagate_value();
- }), temp->GetId());
+ }));
temp->Bind(wxEVT_SPINCTRL, ([this](wxCommandEvent e) { propagate_value(); }), temp->GetId());
@@ -496,7 +497,6 @@ void SpinCtrl::BUILD() {
propagate_value();
bEnterPressed = true;
}), temp->GetId());
-#endif
temp->Bind(wxEVT_TEXT, ([this](wxCommandEvent e)
{
@@ -504,24 +504,17 @@ void SpinCtrl::BUILD() {
// # when it was changed from the text control, so the on_change callback
// # gets the old one, and on_kill_focus resets the control to the old value.
// # As a workaround, we get the new value from $event->GetString and store
-// # here temporarily so that we can return it from $self->get_value
- std::string value = e.GetString().utf8_str().data();
- if (is_matched(value, "^\\-?\\d+$")) {
- try {
- tmp_value = std::stoi(value);
- }
- catch (const std::exception & /* e */) {
- tmp_value = -9999;
- }
- }
- else tmp_value = -9999;
-#ifdef __WXOSX__
- propagate_value();
+// # here temporarily so that we can return it from get_value()
+ long value;
+ const bool parsed = e.GetString().ToLong(&value);
+ tmp_value = parsed && value <= INT_MAX ? (int)value : UNDEF_VALUE;
+
+#ifdef __WXOSX__
// Forcibly set the input value for SpinControl, since the value
- // inserted from the clipboard is not updated under OSX
- if (tmp_value > -9999) {
- wxSpinCtrl* spin = dynamic_cast<wxSpinCtrl*>(window);
+ // inserted from the keyboard or clipboard is not updated under OSX
+ if (tmp_value != UNDEF_VALUE) {
+ wxSpinCtrl* spin = static_cast<wxSpinCtrl*>(window);
spin->SetValue(tmp_value);
// But in SetValue() is executed m_text_ctrl->SelectAll(), so
@@ -539,10 +532,11 @@ void SpinCtrl::BUILD() {
void SpinCtrl::propagate_value()
{
- if (tmp_value == -9999)
+ if (tmp_value == UNDEF_VALUE) {
on_kill_focus();
- else if (boost::any_cast<int>(m_value) != tmp_value)
+ } else {
on_change_field();
+ }
}
void SpinCtrl::msw_rescale()