FIX: rebuild the TempInput logic

jira: [STUDIO-10386]
Change-Id: If7160dacafaa19d7056125961a59111ff63ea25b
(cherry picked from commit f078f6bfdc4bf2610f8c861132241ebdd933bb74)
This commit is contained in:
xin.zhang 2025-03-10 09:34:22 +08:00 committed by lane.wei
parent 3d83cd4442
commit 1820ca6fc0
3 changed files with 86 additions and 44 deletions

View File

@ -2223,18 +2223,29 @@ StatusPanel::StatusPanel(wxWindow *parent, wxWindowID id, const wxPoint &pos, co
Bind(wxCUSTOMEVT_SET_TEMP_FINISH, [this](wxCommandEvent e) { Bind(wxCUSTOMEVT_SET_TEMP_FINISH, [this](wxCommandEvent e) {
int id = e.GetInt(); int id = e.GetInt();
if (id == m_tempCtrl_bed->GetType()) { if (id == m_tempCtrl_bed->GetType()) {
m_tempCtrl_bed->SetOnChanging();
on_set_bed_temp(); on_set_bed_temp();
m_tempCtrl_bed->ReSetOnChanging();
} else if (id == m_tempCtrl_nozzle->GetType()) { } else if (id == m_tempCtrl_nozzle->GetType()) {
if (e.GetString() == wxString::Format("%d", MAIN_NOZZLE_ID)) { if (e.GetString() == wxString::Format("%d", MAIN_NOZZLE_ID)) {
m_tempCtrl_nozzle->SetOnChanging();
on_set_nozzle_temp(MAIN_NOZZLE_ID); on_set_nozzle_temp(MAIN_NOZZLE_ID);
m_tempCtrl_nozzle->ReSetOnChanging();
} else if (e.GetString() == wxString::Format("%d", DEPUTY_NOZZLE_ID)) { } else if (e.GetString() == wxString::Format("%d", DEPUTY_NOZZLE_ID)) {
m_tempCtrl_nozzle_deputy->SetOnChanging();
on_set_nozzle_temp(DEPUTY_NOZZLE_ID); on_set_nozzle_temp(DEPUTY_NOZZLE_ID);
m_tempCtrl_nozzle_deputy->ReSetOnChanging();
} else { } else {
m_tempCtrl_nozzle->SetOnChanging();
on_set_nozzle_temp(UNIQUE_NOZZLE_ID);//there is only one nozzle on_set_nozzle_temp(UNIQUE_NOZZLE_ID);//there is only one nozzle
m_tempCtrl_nozzle->ReSetOnChanging();
} }
} else if (id == m_tempCtrl_chamber->GetType()) { } else if (id == m_tempCtrl_chamber->GetType()) {
m_tempCtrl_chamber->SetOnChanging();
on_set_chamber_temp(); on_set_chamber_temp();
m_tempCtrl_chamber->ReSetOnChanging();
} }
}); });
@ -4125,10 +4136,7 @@ void StatusPanel::on_set_chamber_temp()
wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL); wxEmptyString, wxICON_WARNING | wxOK | wxCANCEL);
} }
/*the dialog will be blocked APPLE, let the printer send back message*/
#ifndef __APPLE__
if (champer_switch_head_dlg->ShowModal() != wxID_OK) { return; } if (champer_switch_head_dlg->ShowModal() != wxID_OK) { return; }
#endif // __APPLE__
} }
obj->command_set_chamber(chamber_temp); obj->command_set_chamber(chamber_temp);

View File

@ -40,6 +40,61 @@ TempInput::TempInput(wxWindow *parent, int type, wxString text, TempInputType i
Create(parent, text, label, normal_icon, actice_icon, pos, size, style); Create(parent, text, label, normal_icon, actice_icon, pos, size, style);
} }
void TempInput::ResetWaringDlg()
{
if (wdialog) { wdialog->Dismiss(); }
if (warning_mode) { Warning(false, WARNING_TOO_HIGH); }
}
bool TempInput::CheckIsValidVal(bool show_warning)
{
auto temp = text_ctrl->GetValue();
if (temp.ToStdString().empty())
{
return false;
}
if (!AllisNum(temp.ToStdString()))
{
return false;
}
/*show temperature range warnings*/
auto tempint = std::stoi(temp.ToStdString());
if (tempint > max_temp)
{
if (show_warning)
{
Warning(true, WARNING_TOO_HIGH);
}
return false;
}
else if (tempint < min_temp)
{
if (show_warning)
{
Warning(true, WARNING_TOO_LOW);
}
return false;
}
return true;
}
void TempInput::OnEdit()
{
/*clear previous status*/
ResetWaringDlg();
/*check the value is valid or not*/
if (CheckIsValidVal(true))
{
SetFinish();
}
}
void TempInput::Create(wxWindow *parent, wxString text, wxString label, wxString normal_icon, wxString actice_icon, const wxPoint &pos, const wxSize &size, long style) void TempInput::Create(wxWindow *parent, wxString text, wxString label, wxString normal_icon, wxString actice_icon, const wxPoint &pos, const wxSize &size, long style)
{ {
StaticBox::Create(parent, wxID_ANY, pos, size, style); StaticBox::Create(parent, wxID_ANY, pos, size, style);
@ -70,49 +125,19 @@ void TempInput::Create(wxWindow *parent, wxString text, wxString label, wxString
e.SetId(GetId()); e.SetId(GetId());
ProcessEventLocally(e); ProcessEventLocally(e);
e.Skip(); e.Skip();
OnEdit();
auto temp = text_ctrl->GetValue(); if (!m_on_changing) /*the wxCUSTOMEVT_SET_TEMP_FINISH event may popup a dialog, which may generate dead loop*/
if (temp.ToStdString().empty()) { {
text_ctrl->SetValue(wxString("_")); ResetWaringDlg();
return; SetFinish();
} }
if (!AllisNum(temp.ToStdString())) return;
if (max_temp <= 0) return;
/* auto tempint = std::stoi(temp.ToStdString());
if ((tempint > max_temp || tempint < min_temp) && !warning_mode) {
if (tempint > max_temp)
Warning(true, WARNING_TOO_HIGH);
else if (tempint < min_temp)
Warning(true, WARNING_TOO_LOW);
return;
} else {
Warning(false);
}*/
SetFinish();
}); });
text_ctrl->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent &e) { text_ctrl->Bind(wxEVT_TEXT_ENTER, [this](wxCommandEvent &e)
/*the wxEVT_KILL_FOCUS will be triggered in Slic3r::GUI::wxGetApp().GetMainTopWindow()->SetFocus() for win or linux, but not APPLE*/ {
#ifdef __APPLE__ if (!m_on_changing) /*the wxCUSTOMEVT_SET_TEMP_FINISH event may popup a dialog, which may generate dead loop*/
OnEdit(); {
auto temp = text_ctrl->GetValue(); OnEdit();
if (temp.ToStdString().empty()) return;
if (!AllisNum(temp.ToStdString())) return;
if (max_temp <= 0) return;
auto tempint = std::stoi(temp.ToStdString());
if (tempint > max_temp) {
Warning(true, WARNING_TOO_HIGH);
return;
} }
else {
Warning(false, WARNING_TOO_LOW);
}
SetFinish();
#endif
Slic3r::GUI::wxGetApp().GetMainTopWindow()->SetFocus();
}); });
text_ctrl->Bind(wxEVT_RIGHT_DOWN, [this](auto &e) {}); // disable context menu text_ctrl->Bind(wxEVT_RIGHT_DOWN, [this](auto &e) {}); // disable context menu
text_ctrl->Bind(wxEVT_LEFT_DOWN, [this](auto &e) { text_ctrl->Bind(wxEVT_LEFT_DOWN, [this](auto &e) {
@ -259,6 +284,8 @@ void TempInput::Warning(bool warn, WarningType type)
else if (type == WarningType::WARNING_TOO_LOW) else if (type == WarningType::WARNING_TOO_LOW)
warning_string = _L("The minmum temperature should not be less than ") + wxString::Format("%d", min_temp); warning_string = _L("The minmum temperature should not be less than ") + wxString::Format("%d", min_temp);
warning_text->SetLabel(warning_string); warning_text->SetLabel(warning_string);
warning_text->Wrap(-1);
warning_text->Fit();
wdialog->Fit(); wdialog->Fit();
wdialog->Popup(); wdialog->Popup();
} else { } else {

View File

@ -19,6 +19,7 @@ class TempInput : public wxNavigationEnabled<StaticBox>
bool hover; bool hover;
bool m_read_only{false}; bool m_read_only{false};
bool m_on_changing {false};
wxSize labelSize; wxSize labelSize;
ScalableBitmap normal_icon; ScalableBitmap normal_icon;
ScalableBitmap actice_icon; ScalableBitmap actice_icon;
@ -117,14 +118,20 @@ public:
wxTextCtrl const *GetTextCtrl() const { return text_ctrl; } wxTextCtrl const *GetTextCtrl() const { return text_ctrl; }
void SetOnChanging() { m_on_changing = true; }
void ReSetOnChanging() { m_on_changing = false; }
protected: protected:
virtual void OnEdit() {} virtual void OnEdit();
virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO); virtual void DoSetSize(int x, int y, int width, int height, int sizeFlags = wxSIZE_AUTO);
void DoSetToolTipText(wxString const &tip) override; void DoSetToolTipText(wxString const &tip) override;
private: private:
void ResetWaringDlg();
bool CheckIsValidVal(bool show_warning);
void paintEvent(wxPaintEvent &evt); void paintEvent(wxPaintEvent &evt);
void render(wxDC &dc); void render(wxDC &dc);