diff --git a/src/slic3r/CMakeLists.txt b/src/slic3r/CMakeLists.txt index 1408ccc849..12da13bc8c 100644 --- a/src/slic3r/CMakeLists.txt +++ b/src/slic3r/CMakeLists.txt @@ -237,6 +237,8 @@ set(SLIC3R_GUI_SOURCES GUI/ConfigManipulation.hpp GUI/Field.cpp GUI/Field.hpp + GUI/FirmwareUpdateDialog.cpp + GUI/FirmwareUpdateDialog.hpp GUI/OptionsGroup.cpp GUI/OptionsGroup.hpp GUI/OG_CustomCtrl.cpp diff --git a/src/slic3r/GUI/DeviceManager.cpp b/src/slic3r/GUI/DeviceManager.cpp index 00a2081ccb..c7b6470499 100644 --- a/src/slic3r/GUI/DeviceManager.cpp +++ b/src/slic3r/GUI/DeviceManager.cpp @@ -1162,7 +1162,7 @@ int MachineObject::command_request_push_all() int MachineObject::command_upgrade_confirm() { - BOOST_LOG_TRIVIAL(trace) << "command_upgrade_confirm"; + BOOST_LOG_TRIVIAL(info) << "command_upgrade_confirm"; json j; j["upgrade"]["command"] = "upgrade_confirm"; j["upgrade"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); @@ -1170,6 +1170,16 @@ int MachineObject::command_upgrade_confirm() return this->publish_json(j.dump()); } +int MachineObject::command_consistency_upgrade_confirm() +{ + BOOST_LOG_TRIVIAL(info) << "command_consistency_upgrade_confirm"; + json j; + j["upgrade"]["command"] = "consistency_confirm"; + j["upgrade"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); + j["upgrade"]["src_id"] = 1; // 1 for slicer + return this->publish_json(j.dump()); +} + int MachineObject::command_upgrade_firmware(FirmwareInfo info) { std::string version = info.version; diff --git a/src/slic3r/GUI/DeviceManager.hpp b/src/slic3r/GUI/DeviceManager.hpp index 39cbd3a04d..077a25b87f 100644 --- a/src/slic3r/GUI/DeviceManager.hpp +++ b/src/slic3r/GUI/DeviceManager.hpp @@ -534,6 +534,7 @@ public: /* command upgrade */ int command_upgrade_confirm(); + int command_consistency_upgrade_confirm(); int command_upgrade_firmware(FirmwareInfo info); /* control apis */ diff --git a/src/slic3r/GUI/FirmwareUpdateDialog.cpp b/src/slic3r/GUI/FirmwareUpdateDialog.cpp new file mode 100644 index 0000000000..600e2d3b6c --- /dev/null +++ b/src/slic3r/GUI/FirmwareUpdateDialog.cpp @@ -0,0 +1,173 @@ +#include "FirmwareUpdateDialog.hpp" +#include +#include +#include +#include + + +namespace Slic3r { namespace GUI { + +wxDEFINE_EVENT(EVT_UPGRADE_FIRMWARE, wxCommandEvent); + +FirmwareUpdateDialog::FirmwareUpdateDialog(wxWindow* parent, wxWindowID id, const wxString& title, const wxPoint& pos, const wxSize& size, long style) + : DPIDialog(parent, id, _L("Upgrade firmware"), pos, size, style) +{ + std::string icon_path = (boost::format("%1%/images/BambuStudioTitle.ico") % resources_dir()).str(); + SetIcon(wxIcon(encode_path(icon_path.c_str()), wxBITMAP_TYPE_ICO)); + + auto* main_sizer = new wxBoxSizer(wxVERTICAL); + auto* button_sizer = new wxBoxSizer(wxHORIZONTAL); + + wxPanel* m_line_top = new wxPanel(this, wxID_ANY, wxDefaultPosition, wxSize(-1, 1), wxTAB_TRAVERSAL); + m_line_top->SetBackgroundColour(wxColour(166, 169, 170)); + + m_button_confirm = new Button(this, _L("Confirm")); + m_button_confirm->SetFont(Label::Body_14); + m_button_confirm->SetMinSize(wxSize(-1, FromDIP(24))); + m_button_confirm->SetCornerRadius(FromDIP(12)); + StateColor confirm_btn_bg(std::pair(wxColour(61, 203, 115), StateColor::Hovered), + std::pair(wxColour(0, 174, 66), StateColor::Normal)); + m_button_confirm->SetBackgroundColor(confirm_btn_bg); + m_button_confirm->SetBorderColor(wxColour(0, 174, 66)); + m_button_confirm->SetTextColor(*wxWHITE); + + m_button_close = new Button(this, _L("Cancel")); + m_button_close->SetFont(Label::Body_14); + m_button_close->SetMinSize(wxSize(-1, FromDIP(24))); + m_button_close->SetCornerRadius(FromDIP(12)); + StateColor close_btn_bg(std::pair(wxColour(206, 206, 206), StateColor::Hovered), + std::pair(*wxWHITE, StateColor::Normal)); + m_button_close->SetBackgroundColor(close_btn_bg); + m_button_close->SetBorderColor(wxColour(38, 46, 48)); + m_button_close->SetTextColor(wxColour(38, 46, 48)); + + button_sizer->AddStretchSpacer(); + button_sizer->Add(m_button_confirm); + button_sizer->AddSpacer(FromDIP(20)); + button_sizer->Add(m_button_close); + + main_sizer->Add(m_line_top, 0, wxEXPAND, 0); + main_sizer->AddSpacer(wxSize(FromDIP(475), FromDIP(100)).y); + main_sizer->Add(button_sizer, 0, wxBOTTOM | wxRIGHT | wxEXPAND, FromDIP(25)); + + SetSizer(main_sizer); + + CenterOnParent(); + + this->SetSize(wxSize(wxSize(FromDIP(475), FromDIP(100)).x, -1)); + this->SetMinSize(wxSize(wxSize(FromDIP(475), FromDIP(100)).x, -1)); + Layout(); + Fit(); + this->Bind(wxEVT_PAINT, &FirmwareUpdateDialog::OnPaint, this); + m_button_confirm->Bind(wxEVT_BUTTON, &FirmwareUpdateDialog::on_button_confirm, this); + m_button_close->Bind(wxEVT_BUTTON, &FirmwareUpdateDialog::on_button_close, this); +} + +FirmwareUpdateDialog::~FirmwareUpdateDialog() {} + +void FirmwareUpdateDialog::SetHint(const wxString& hint){ + firm_up_hint = hint; +} + +void FirmwareUpdateDialog::OnPaint(wxPaintEvent& event){ + wxPaintDC dc(this); + render(dc); +} + +void FirmwareUpdateDialog::render(wxDC& dc) { + wxSize size = GetSize(); + + dc.SetFont(Label::Body_14); + dc.SetTextForeground(text_color); + wxPoint pos_start = wxPoint(FromDIP(25), FromDIP(25)); + + wxSize firm_up_hint_size = dc.GetTextExtent(firm_up_hint); + wxPoint pos_firm_up_hint = pos_start; + + if (firm_up_hint_size.x + pos_firm_up_hint.x + FromDIP(25) > wxSize(FromDIP(475), FromDIP(100)).x) { + bool is_ch = false; + if (firm_up_hint[0] > 0x80 && firm_up_hint[1] > 0x80) + is_ch = true; + + wxString fisrt_line; + wxString remaining_line; + + wxString count_txt; + int new_line_pos = 0; + for (int i = 0; i < firm_up_hint.length(); i++) { + count_txt += firm_up_hint[i]; + auto text_size = dc.GetTextExtent(count_txt); + if (text_size.x + pos_firm_up_hint.x + FromDIP(25) < wxSize(FromDIP(475), FromDIP(100)).x) + { + if (firm_up_hint[i] == ' ' || firm_up_hint[i] == '\n') + new_line_pos = i; + } + else { + if (!is_ch) { + fisrt_line = firm_up_hint.SubString(0, new_line_pos); + remaining_line = firm_up_hint.SubString(new_line_pos + 1, firm_up_hint.length()); + break; + } + else { + fisrt_line = firm_up_hint.SubString(0, i); + remaining_line = firm_up_hint.SubString(i, firm_up_hint.length()); + break; + } + count_txt = ""; + } + } + dc.DrawText(fisrt_line, pos_firm_up_hint); + + + count_txt = ""; + new_line_pos = 0; + for (int i = 0; i < remaining_line.length(); i++) { + count_txt += remaining_line[i]; + auto text_size = dc.GetTextExtent(count_txt); + if (text_size.x + FromDIP(25) + FromDIP(25) < wxSize(FromDIP(475), FromDIP(100)).x) + { + if (remaining_line[i] == ' ' || remaining_line[i] == '\n') + new_line_pos = i; + } + else { + if (!is_ch){ + remaining_line[new_line_pos] = '\n'; + } + else { + remaining_line.insert(i, '\n'); + } + count_txt = ""; + } + } + wxPoint pos_txt = pos_firm_up_hint; + pos_txt.y += dc.GetCharHeight(); + dc.DrawText(remaining_line, pos_txt); + } + else + dc.DrawText(firm_up_hint, pos_firm_up_hint); +} + +void FirmwareUpdateDialog::on_button_confirm(wxCommandEvent& event) { + wxCommandEvent evt(EVT_UPGRADE_FIRMWARE, GetId()); + event.SetEventObject(this); + GetEventHandler()->ProcessEvent(evt); + + if (this->IsModal()) + this->EndModal(wxID_OK); + else + this->Close(); +} + +void FirmwareUpdateDialog::on_button_close(wxCommandEvent& event) { + this->Close(); +} + +void FirmwareUpdateDialog::on_dpi_changed(const wxRect& suggested_rect) { + m_button_confirm->SetMinSize(wxSize(-1, FromDIP(24))); + m_button_confirm->SetCornerRadius(FromDIP(12)); + m_button_close->SetMinSize(wxSize(-1, FromDIP(24))); + m_button_close->SetCornerRadius(FromDIP(12)); + Layout(); +} + +}} // namespace Slic3r::GUI \ No newline at end of file diff --git a/src/slic3r/GUI/FirmwareUpdateDialog.hpp b/src/slic3r/GUI/FirmwareUpdateDialog.hpp new file mode 100644 index 0000000000..a0fa53facf --- /dev/null +++ b/src/slic3r/GUI/FirmwareUpdateDialog.hpp @@ -0,0 +1,45 @@ +#ifndef slic3r_GUI_FirmwareUpdateDialog_hpp_ +#define slic3r_GUI_FirmwareUpdateDialog_hpp_ + +#include "GUI_Utils.hpp" +#include +#include "Widgets/Button.hpp" +#include + +namespace Slic3r { namespace GUI { + +wxDECLARE_EVENT(EVT_UPGRADE_FIRMWARE, wxCommandEvent); + +class FirmwareUpdateDialog : public DPIDialog +{ +private: + wxStaticText* m_staticText_hint; + Button* m_button_confirm; + Button* m_button_close; + wxStaticBitmap* m_bitmap_home; + ScalableBitmap m_home_bmp; + wxString firm_up_hint = ""; + + void OnPaint(wxPaintEvent& event); + void render(wxDC& dc); + void on_button_confirm(wxCommandEvent& event); + void on_button_close(wxCommandEvent& event); + void on_dpi_changed(const wxRect& suggested_rect) override; + +public: + FirmwareUpdateDialog(wxWindow* parent, + wxWindowID id = wxID_ANY, + const wxString& title = wxEmptyString, + const wxPoint& pos = wxDefaultPosition, + const wxSize& size = wxDefaultSize, + long style = wxCLOSE_BOX | wxCAPTION); + + const wxColour text_color = wxColour(107, 107, 107); + + void SetHint(const wxString &hint); + + ~FirmwareUpdateDialog(); +}; +}} // namespace Slic3r::GUI + +#endif \ No newline at end of file diff --git a/src/slic3r/GUI/UpgradePanel.cpp b/src/slic3r/GUI/UpgradePanel.cpp index db94d1f40b..1379683606 100644 --- a/src/slic3r/GUI/UpgradePanel.cpp +++ b/src/slic3r/GUI/UpgradePanel.cpp @@ -5,6 +5,7 @@ #include "GUI_App.hpp" #include "libslic3r/Thread.hpp" #include "ReleaseNote.hpp" +#include "FirmwareUpdateDialog.hpp" namespace Slic3r { namespace GUI { @@ -12,6 +13,10 @@ namespace GUI { static const wxColour TEXT_NORMAL_CLR = wxColour(0, 174, 66); static const wxColour TEXT_FAILED_CLR = wxColour(255, 111, 0); +wxString normal_upgrade_hint = _L("Are you sure you want to update? This will take about 10 minutes. Do not turn off the power while the printer is updating."); +wxString force_upgrade_hint = _L("An important update was detected and needs to be run before printing can continue. Do you want to update now? You can also update later from 'Upgrade firmware'."); +wxString consistency_upgrade_hint = _L("The firmware version is abnormal. Repairing and updating are required before printing. Do you want to update now? You can also update later on printer or update next time starting the studio."); + MachineInfoPanel::MachineInfoPanel(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name) :wxPanel(parent, id, pos, size, style) { @@ -312,7 +317,6 @@ void MachineInfoPanel::update(MachineObject* obj) m_staticText_upgrading_percent->SetLabelText(wxString::Format("%d%%", upgrade_percent)); } else if (obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) { wxString result_text = obj->get_upgrade_result_str(obj->upgrade_err_code); - m_staticText_upgrading_info->SetLabelText(result_text); m_upgrade_progress->SetValue(upgrade_percent); m_staticText_upgrading_percent->SetLabelText(wxString::Format("%d%%", upgrade_percent)); } @@ -575,7 +579,7 @@ void MachineInfoPanel::show_status(int status, std::string upgrade_status_str) BOOST_LOG_TRIVIAL(trace) << "MachineInfoPanel: show_status = " << status << ", str = " << upgrade_status_str; Freeze(); - + if (status == (int)MachineObject::UpgradingDisplayState::UpgradingUnavaliable) { m_button_upgrade_firmware->Show(); m_button_upgrade_firmware->Disable(); @@ -593,7 +597,7 @@ void MachineInfoPanel::show_status(int status, std::string upgrade_status_str) m_staticText_upgrading_info->Hide(); m_staticText_upgrading_percent->Hide(); } else if (status == (int) MachineObject::UpgradingDisplayState::UpgradingInProgress) { - m_button_upgrade_firmware->Hide(); + m_button_upgrade_firmware->Disable(); for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(true); } m_upgrade_retry_img->Hide(); m_staticText_upgrading_info->Show(); @@ -606,17 +610,18 @@ void MachineInfoPanel::show_status(int status, std::string upgrade_status_str) m_staticText_upgrading_info->SetLabel(_L("Upgrading failed")); m_staticText_upgrading_info->SetForegroundColour(TEXT_FAILED_CLR); for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(true); } - m_button_upgrade_firmware->Hide(); + m_button_upgrade_firmware->Disable(); m_staticText_upgrading_info->Show(); - m_staticText_upgrading_percent->Hide(); + m_staticText_upgrading_percent->Show(); m_upgrade_retry_img->Show(); } else { - for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(true); } - m_button_upgrade_firmware->Hide(); - m_staticText_upgrading_info->SetLabel(_L("Upgrading success")); + m_staticText_upgrading_info->SetLabel(_L("Upgrading successful")); m_staticText_upgrading_info->Show(); + for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(true); } + m_button_upgrade_firmware->Disable(); m_staticText_upgrading_info->SetForegroundColour(TEXT_NORMAL_CLR); m_staticText_upgrading_percent->SetForegroundColour(TEXT_NORMAL_CLR); + m_staticText_upgrading_percent->Show(); m_upgrade_retry_img->Hide(); } } else { @@ -652,8 +657,28 @@ void MachineInfoPanel::upgrade_firmware_internal() { void MachineInfoPanel::on_upgrade_firmware(wxCommandEvent &event) { - if (m_obj) - m_obj->command_upgrade_confirm(); + FirmwareUpdateDialog* confirm_dlg = new FirmwareUpdateDialog(this->GetParent()); + confirm_dlg->SetHint(normal_upgrade_hint); + confirm_dlg->Bind(EVT_UPGRADE_FIRMWARE, [this](wxCommandEvent &e) { + if (m_obj){ + m_obj->command_upgrade_confirm(); + } + }); + if(confirm_dlg->ShowModal()) + delete confirm_dlg; +} + +void MachineInfoPanel::on_consisitency_upgrade_firmware(wxCommandEvent &event) +{ + FirmwareUpdateDialog* confirm_dlg = new FirmwareUpdateDialog(this->GetParent()); + confirm_dlg->SetHint(normal_upgrade_hint); + confirm_dlg->Bind(EVT_UPGRADE_FIRMWARE, [this](wxCommandEvent &e) { + if (m_obj){ + m_obj->command_consistency_upgrade_confirm(); + } + }); + if(confirm_dlg->ShowModal()) + delete confirm_dlg; } void MachineInfoPanel::on_show_release_note(wxMouseEvent &event) @@ -759,6 +784,39 @@ void UpgradePanel::update(MachineObject *obj) } } + //force upgrade + //unlock hint + if (m_obj && (m_obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) && (last_forced_hint_status != m_obj->upgrade_display_state)) { + last_forced_hint_status = m_obj->upgrade_display_state; + m_show_forced_hint = true; + } + if (m_obj && m_show_forced_hint) { + if (m_obj->upgrade_force_upgrade) { + m_show_forced_hint = false; //lock hint + FirmwareUpdateDialog* force_dlg = new FirmwareUpdateDialog(m_scrolledWindow); + force_dlg->SetHint(force_upgrade_hint); + force_dlg->Bind(EVT_UPGRADE_FIRMWARE, &MachineInfoPanel::on_upgrade_firmware, m_push_upgrade_panel); + if (force_dlg->ShowModal()) + delete force_dlg; + } + } + + //consistency upgrade + if (m_obj && (m_obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) && (last_consistency_hint_status != m_obj->upgrade_display_state)) { + last_consistency_hint_status = m_obj->upgrade_display_state; + m_show_consistency_hint = true; + } + if (m_obj && m_show_consistency_hint) { + if (m_obj->upgrade_consistency_request) { + m_show_consistency_hint = false; + FirmwareUpdateDialog* consistency_dlg = new FirmwareUpdateDialog(m_scrolledWindow); + consistency_dlg->SetHint(consistency_upgrade_hint); + consistency_dlg->Bind(EVT_UPGRADE_FIRMWARE, &MachineInfoPanel::on_consisitency_upgrade_firmware, m_push_upgrade_panel); + if (consistency_dlg->ShowModal()) + delete consistency_dlg; + } + } + //update panels if (m_push_upgrade_panel) { m_push_upgrade_panel->update(obj); diff --git a/src/slic3r/GUI/UpgradePanel.hpp b/src/slic3r/GUI/UpgradePanel.hpp index 412d45ed13..378c48e42d 100644 --- a/src/slic3r/GUI/UpgradePanel.hpp +++ b/src/slic3r/GUI/UpgradePanel.hpp @@ -78,7 +78,6 @@ protected: std::string last_status_str = ""; void upgrade_firmware_internal(); - void on_upgrade_firmware(wxCommandEvent &event); void on_show_release_note(wxMouseEvent &event); public: @@ -98,6 +97,9 @@ public: void show_status(int status, std::string upgrade_status_str = ""); void show_ams(bool show = false, bool force_update = false); + void on_upgrade_firmware(wxCommandEvent &event); + void on_consisitency_upgrade_firmware(wxCommandEvent &event); + MachineObject *m_obj{nullptr}; FirmwareInfo m_ota_info; FirmwareInfo m_ams_info; @@ -129,6 +131,11 @@ protected: //enable_select_firmware only in debug mode bool enable_select_firmware = false; bool m_need_update = false; + //hint of force upgrade or consistency upgrade + int last_forced_hint_status = -1; + int last_consistency_hint_status = -1; + bool m_show_forced_hint = true; + bool m_show_consistency_hint = true; public: UpgradePanel(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = wxTAB_TRAVERSAL);