ENH: add hint dialogs for firmware upgrade

Change-Id: Iff34e4543d50074db05280fec8178029c4531e00
(cherry picked from commit 6f98eda25c722ecb6e0b6f4926972031c00bc366)
This commit is contained in:
tao.jin 2022-09-16 10:26:20 +08:00 committed by Lane.Wei
parent 37d6efdbef
commit 83a9c259f7
7 changed files with 308 additions and 12 deletions

View file

@ -237,6 +237,8 @@ set(SLIC3R_GUI_SOURCES
GUI/ConfigManipulation.hpp GUI/ConfigManipulation.hpp
GUI/Field.cpp GUI/Field.cpp
GUI/Field.hpp GUI/Field.hpp
GUI/FirmwareUpdateDialog.cpp
GUI/FirmwareUpdateDialog.hpp
GUI/OptionsGroup.cpp GUI/OptionsGroup.cpp
GUI/OptionsGroup.hpp GUI/OptionsGroup.hpp
GUI/OG_CustomCtrl.cpp GUI/OG_CustomCtrl.cpp

View file

@ -1162,7 +1162,7 @@ int MachineObject::command_request_push_all()
int MachineObject::command_upgrade_confirm() int MachineObject::command_upgrade_confirm()
{ {
BOOST_LOG_TRIVIAL(trace) << "command_upgrade_confirm"; BOOST_LOG_TRIVIAL(info) << "command_upgrade_confirm";
json j; json j;
j["upgrade"]["command"] = "upgrade_confirm"; j["upgrade"]["command"] = "upgrade_confirm";
j["upgrade"]["sequence_id"] = std::to_string(MachineObject::m_sequence_id++); 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()); 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) int MachineObject::command_upgrade_firmware(FirmwareInfo info)
{ {
std::string version = info.version; std::string version = info.version;

View file

@ -534,6 +534,7 @@ public:
/* command upgrade */ /* command upgrade */
int command_upgrade_confirm(); int command_upgrade_confirm();
int command_consistency_upgrade_confirm();
int command_upgrade_firmware(FirmwareInfo info); int command_upgrade_firmware(FirmwareInfo info);
/* control apis */ /* control apis */

View file

@ -0,0 +1,173 @@
#include "FirmwareUpdateDialog.hpp"
#include <slic3r/GUI/I18N.hpp>
#include <wx/dcgraph.h>
#include <wx/dcmemory.h>
#include <slic3r/GUI/Widgets/Label.hpp>
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, int>(wxColour(61, 203, 115), StateColor::Hovered),
std::pair<wxColour, int>(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, int>(wxColour(206, 206, 206), StateColor::Hovered),
std::pair<wxColour, int>(*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

View file

@ -0,0 +1,45 @@
#ifndef slic3r_GUI_FirmwareUpdateDialog_hpp_
#define slic3r_GUI_FirmwareUpdateDialog_hpp_
#include "GUI_Utils.hpp"
#include <wx/statbmp.h>
#include "Widgets/Button.hpp"
#include <wx/stattext.h>
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

View file

@ -5,6 +5,7 @@
#include "GUI_App.hpp" #include "GUI_App.hpp"
#include "libslic3r/Thread.hpp" #include "libslic3r/Thread.hpp"
#include "ReleaseNote.hpp" #include "ReleaseNote.hpp"
#include "FirmwareUpdateDialog.hpp"
namespace Slic3r { namespace Slic3r {
namespace GUI { namespace GUI {
@ -12,6 +13,10 @@ namespace GUI {
static const wxColour TEXT_NORMAL_CLR = wxColour(0, 174, 66); static const wxColour TEXT_NORMAL_CLR = wxColour(0, 174, 66);
static const wxColour TEXT_FAILED_CLR = wxColour(255, 111, 0); 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) MachineInfoPanel::MachineInfoPanel(wxWindow* parent, wxWindowID id, const wxPoint& pos, const wxSize& size, long style, const wxString& name)
:wxPanel(parent, id, pos, size, style) :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)); m_staticText_upgrading_percent->SetLabelText(wxString::Format("%d%%", upgrade_percent));
} else if (obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) { } else if (obj->upgrade_display_state == (int) MachineObject::UpgradingDisplayState::UpgradingFinished) {
wxString result_text = obj->get_upgrade_result_str(obj->upgrade_err_code); 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_upgrade_progress->SetValue(upgrade_percent);
m_staticText_upgrading_percent->SetLabelText(wxString::Format("%d%%", upgrade_percent)); m_staticText_upgrading_percent->SetLabelText(wxString::Format("%d%%", upgrade_percent));
} }
@ -593,7 +597,7 @@ void MachineInfoPanel::show_status(int status, std::string upgrade_status_str)
m_staticText_upgrading_info->Hide(); m_staticText_upgrading_info->Hide();
m_staticText_upgrading_percent->Hide(); m_staticText_upgrading_percent->Hide();
} else if (status == (int) MachineObject::UpgradingDisplayState::UpgradingInProgress) { } 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); } for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(true); }
m_upgrade_retry_img->Hide(); m_upgrade_retry_img->Hide();
m_staticText_upgrading_info->Show(); 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->SetLabel(_L("Upgrading failed"));
m_staticText_upgrading_info->SetForegroundColour(TEXT_FAILED_CLR); m_staticText_upgrading_info->SetForegroundColour(TEXT_FAILED_CLR);
for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(true); } 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_info->Show();
m_staticText_upgrading_percent->Hide(); m_staticText_upgrading_percent->Show();
m_upgrade_retry_img->Show(); m_upgrade_retry_img->Show();
} else { } else {
for (size_t i = 0; i < m_upgrading_sizer->GetItemCount(); i++) { m_upgrading_sizer->Show(true); } m_staticText_upgrading_info->SetLabel(_L("Upgrading successful"));
m_button_upgrade_firmware->Hide();
m_staticText_upgrading_info->SetLabel(_L("Upgrading success"));
m_staticText_upgrading_info->Show(); 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_info->SetForegroundColour(TEXT_NORMAL_CLR);
m_staticText_upgrading_percent->SetForegroundColour(TEXT_NORMAL_CLR); m_staticText_upgrading_percent->SetForegroundColour(TEXT_NORMAL_CLR);
m_staticText_upgrading_percent->Show();
m_upgrade_retry_img->Hide(); m_upgrade_retry_img->Hide();
} }
} else { } else {
@ -652,8 +657,28 @@ void MachineInfoPanel::upgrade_firmware_internal() {
void MachineInfoPanel::on_upgrade_firmware(wxCommandEvent &event) void MachineInfoPanel::on_upgrade_firmware(wxCommandEvent &event)
{ {
if (m_obj) FirmwareUpdateDialog* confirm_dlg = new FirmwareUpdateDialog(this->GetParent());
m_obj->command_upgrade_confirm(); 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) 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 //update panels
if (m_push_upgrade_panel) { if (m_push_upgrade_panel) {
m_push_upgrade_panel->update(obj); m_push_upgrade_panel->update(obj);

View file

@ -78,7 +78,6 @@ protected:
std::string last_status_str = ""; std::string last_status_str = "";
void upgrade_firmware_internal(); void upgrade_firmware_internal();
void on_upgrade_firmware(wxCommandEvent &event);
void on_show_release_note(wxMouseEvent &event); void on_show_release_note(wxMouseEvent &event);
public: public:
@ -98,6 +97,9 @@ public:
void show_status(int status, std::string upgrade_status_str = ""); void show_status(int status, std::string upgrade_status_str = "");
void show_ams(bool show = false, bool force_update = false); 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}; MachineObject *m_obj{nullptr};
FirmwareInfo m_ota_info; FirmwareInfo m_ota_info;
FirmwareInfo m_ams_info; FirmwareInfo m_ams_info;
@ -129,6 +131,11 @@ protected:
//enable_select_firmware only in debug mode //enable_select_firmware only in debug mode
bool enable_select_firmware = false; bool enable_select_firmware = false;
bool m_need_update = 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: public:
UpgradePanel(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = wxTAB_TRAVERSAL); UpgradePanel(wxWindow *parent, wxWindowID id = wxID_ANY, const wxPoint &pos = wxDefaultPosition, const wxSize &size = wxDefaultSize, long style = wxTAB_TRAVERSAL);