From 1957f3ed1e84b3cfe946d665a18e681d0eecba2e Mon Sep 17 00:00:00 2001 From: Kunlong Ma Date: Wed, 10 Apr 2024 20:52:52 +0800 Subject: [PATCH] FIX: fix can't enter ',' in multiplicator github: #3805 Change-Id: I6dd70822d1c2e79d66c70514d6dd580ab029c7ea --- src/slic3r/GUI/WipeTowerDialog.cpp | 63 ++++++++++++------------------ src/slic3r/GUI/WipeTowerDialog.hpp | 7 +++- 2 files changed, 31 insertions(+), 39 deletions(-) diff --git a/src/slic3r/GUI/WipeTowerDialog.cpp b/src/slic3r/GUI/WipeTowerDialog.cpp index cacddff1e..2f73ba952 100644 --- a/src/slic3r/GUI/WipeTowerDialog.cpp +++ b/src/slic3r/GUI/WipeTowerDialog.cpp @@ -430,18 +430,21 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, con auto on_apply_text_modify = [this](wxEvent& e) { wxString str = m_flush_multiplier_ebox->GetValue(); - float multiplier = wxAtof(str); - if (multiplier < g_min_flush_multiplier || multiplier > g_max_flush_multiplier) { - str = wxString::Format(("%.2f"), multiplier < g_min_flush_multiplier ? g_min_flush_multiplier : g_max_flush_multiplier); - m_flush_multiplier_ebox->SetValue(str); - MessageDialog dlg(nullptr, - wxString::Format(_L("The multiplier should be in range [%.2f, %.2f]."), g_min_flush_multiplier, g_max_flush_multiplier), - _L("Warning"), wxICON_WARNING | wxOK); - dlg.ShowModal(); - } - for (unsigned int i = 0; i < m_number_of_extruders; ++i) { - for (unsigned int j = 0; j < m_number_of_extruders; ++j) { - edit_boxes[i][j]->SetValue(to_string(int(m_matrix[m_number_of_extruders * j + i] * multiplier))); + str.Replace(",", "."); + double multiplier = 1.f; + if (str.ToDouble(&multiplier)) { + if (multiplier < g_min_flush_multiplier || multiplier > g_max_flush_multiplier) { + str = wxString::Format(("%.2f"), multiplier < g_min_flush_multiplier ? g_min_flush_multiplier : g_max_flush_multiplier); + m_flush_multiplier_ebox->SetValue(str); + MessageDialog dlg(nullptr, + wxString::Format(_L("The multiplier should be in range [%.2f, %.2f]."), g_min_flush_multiplier, g_max_flush_multiplier), + _L("Warning"), wxICON_WARNING | wxOK); + dlg.ShowModal(); + } + for (unsigned int i = 0; i < m_number_of_extruders; ++i) { + for (unsigned int j = 0; j < m_number_of_extruders; ++j) { + edit_boxes[i][j]->SetValue(to_string(int(m_matrix[m_number_of_extruders * j + i] * multiplier))); + } } } @@ -459,6 +462,7 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, con char flush_multi_str[32] = { 0 }; snprintf(flush_multi_str, sizeof(flush_multi_str), "%.2f", flush_multiplier); m_flush_multiplier_ebox->SetValue(flush_multi_str); + m_flush_multiplier_ebox->SetValidator(wxTextValidator(wxFILTER_NUMERIC)); param_sizer->Add(m_flush_multiplier_ebox, 0, wxALIGN_CENTER | wxALL, 0); param_sizer->AddStretchSpacer(1); m_sizer_advanced->Add(param_sizer, 0, wxEXPAND | wxLEFT, TEXT_BEG_PADDING); @@ -472,33 +476,16 @@ WipingPanel::WipingPanel(wxWindow* parent, const std::vector& matrix, con m_flush_multiplier_ebox->Bind(wxEVT_KILL_FOCUS, on_apply_text_modify); m_flush_multiplier_ebox->Bind(wxEVT_COMMAND_TEXT_UPDATED, [this](wxCommandEvent&) { wxString str = m_flush_multiplier_ebox->GetValue(); - float multiplier = wxAtof(str); - if (multiplier < g_min_flush_multiplier || multiplier > g_max_flush_multiplier) { - str = wxString::Format(("%.2f"), multiplier < g_min_flush_multiplier ? g_min_flush_multiplier : g_max_flush_multiplier); - m_flush_multiplier_ebox->SetValue(str); - m_flush_multiplier_ebox->SetInsertionPointEnd(); + str.Replace(",", "."); + double multiplier = 1.f; + if (str.ToDouble(&multiplier)) { + if (multiplier < g_min_flush_multiplier || multiplier > g_max_flush_multiplier) { + str = wxString::Format(("%.2f"), multiplier < g_min_flush_multiplier ? g_min_flush_multiplier : g_max_flush_multiplier); + m_flush_multiplier_ebox->SetValue(str); + } } - }); - m_flush_multiplier_ebox->Bind(wxEVT_CHAR, [this](wxKeyEvent& e) { - int keycode = e.GetKeyCode(); - - if (keycode == WXK_NONE) - return; - - if (keycode == WXK_BACK || keycode == WXK_DELETE || keycode == WXK_RETURN || - keycode == WXK_LEFT || keycode == WXK_RIGHT || - keycode == WXK_HOME || keycode == WXK_END) { - e.Skip(); - return; - } - - wxString input_char = wxString::Format("%c", keycode); - long value; - if (!input_char.ToLong(&value) && input_char != ".") - return; - - e.Skip(); - }); + m_flush_multiplier_ebox->SetInsertionPointEnd(); + }); } this->update_warning_texts(); diff --git a/src/slic3r/GUI/WipeTowerDialog.hpp b/src/slic3r/GUI/WipeTowerDialog.hpp index caed799be..791e2d46e 100644 --- a/src/slic3r/GUI/WipeTowerDialog.hpp +++ b/src/slic3r/GUI/WipeTowerDialog.hpp @@ -30,7 +30,12 @@ public: if (m_flush_multiplier_ebox == nullptr) return 1.f; - return std::atof(m_flush_multiplier_ebox->GetValue().c_str()); + wxString str = m_flush_multiplier_ebox->GetValue(); + str.Replace(",", "."); + double multiplier = 1.f; + str.ToDouble(&multiplier); + + return multiplier; } private: