From 80d3c3908deb0adfc3075d3980f59a0a75632d27 Mon Sep 17 00:00:00 2001 From: SoftFever Date: Fri, 17 Jul 2026 08:30:22 +0800 Subject: [PATCH] Resync the device status pages --- src/slic3r/GUI/HMS.cpp | 7 +- src/slic3r/GUI/MediaPlayCtrl.cpp | 5 +- src/slic3r/GUI/Monitor.cpp | 14 ++++ src/slic3r/GUI/Monitor.hpp | 1 + src/slic3r/GUI/StatusPanel.cpp | 19 +++--- src/slic3r/GUI/UpgradePanel.cpp | 96 ++++++++++++++++++++++++++++ src/slic3r/GUI/UpgradePanel.hpp | 18 ++++++ src/slic3r/GUI/Widgets/SideTools.cpp | 4 +- 8 files changed, 145 insertions(+), 19 deletions(-) diff --git a/src/slic3r/GUI/HMS.cpp b/src/slic3r/GUI/HMS.cpp index 561b3750b2..4d39a7b0be 100644 --- a/src/slic3r/GUI/HMS.cpp +++ b/src/slic3r/GUI/HMS.cpp @@ -12,9 +12,10 @@ static const char* HMS_PATH = "hms"; static const char* HMS_LOCAL_IMG_PATH = "hms/local_image"; // the local HMS info +// Orca: dev-id-type set trimmed to the devices Orca ships local HMS images for static unordered_set package_dev_id_types {"094", "239", "093", "22E"}; -// HMS should be disabled when stealth mode is on or networking is not installed +// Orca: HMS should be disabled when stealth mode is on or networking is not installed static bool should_disable_hms() { Slic3r::AppConfig* config = Slic3r::GUI::wxGetApp().app_config; @@ -251,7 +252,7 @@ int HMSQuery::save_to_local(std::string lang, std::string hms_type, std::string std::string dir_str = (hms_folder / filename).make_preferred().string(); std::ofstream json_file(encode_path(dir_str.c_str())); if (json_file.is_open()) { - json_file << save_json.dump(1, '\t') << std::endl; + json_file << save_json.dump(1, '\t') << std::endl; // Orca: tab-indented dump json_file.close(); return 0; } @@ -266,6 +267,7 @@ std::string HMSQuery::hms_language_code() // set language code to en by default return "en"; std::string lang_code = wxGetApp().app_config->get_language_code(); + // Orca: english fallback limited to locales without a translated HMS catalog if (lang_code.compare("uk") == 0 || lang_code.compare("cs") == 0 || lang_code.compare("ru") == 0) { @@ -577,6 +579,7 @@ wxImage HMSQuery::query_image_from_local(const wxString& image_name) { const fs::path& image_path = entry.path(); const fs::path& image_name = fs::relative(image_path, local_img_dir); + // Orca: from_path() for correct UTF-8 path encoding m_hms_local_images[from_path(image_name)] = wxImage(from_path(image_path)); } } diff --git a/src/slic3r/GUI/MediaPlayCtrl.cpp b/src/slic3r/GUI/MediaPlayCtrl.cpp index 8878d1f3ad..90e956be69 100644 --- a/src/slic3r/GUI/MediaPlayCtrl.cpp +++ b/src/slic3r/GUI/MediaPlayCtrl.cpp @@ -88,10 +88,7 @@ MediaPlayCtrl::MediaPlayCtrl(wxWindow *parent, wxMediaCtrl2 *media_ctrl, const w m_button_play->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [this](auto &e) { TogglePlay(); }); m_button_play->Bind(wxEVT_RIGHT_UP, [this](auto & e) { m_media_ctrl->Play(); }); - // m_label_status->Bind(wxEVT_LEFT_UP, [this](auto &e) { - // auto url = wxString::Format(L"https://wiki.bambulab.com/%s/software/bambu-studio/faq/live-view", L"en"); - // wxLaunchDefaultBrowser(url); - // }); + // Orca: live-view FAQ link binding removed (vendor URL) Bind(wxEVT_RIGHT_UP, [this](auto & e) { wxClipboard & c = *wxTheClipboard; diff --git a/src/slic3r/GUI/Monitor.cpp b/src/slic3r/GUI/Monitor.cpp index ccec5048f2..068bcf7e6d 100644 --- a/src/slic3r/GUI/Monitor.cpp +++ b/src/slic3r/GUI/Monitor.cpp @@ -541,6 +541,20 @@ void MonitorPanel::jump_to_LiveView() m_status_info_panel->get_media_play_ctrl()->jump_to_play(); } +void MonitorPanel::jump_to_Rack() +{ + if (!this->IsShown()) { + return; + } + + auto page = m_tabpanel->GetCurrentPage(); + if (page && page != m_status_info_panel) { + m_tabpanel->SetSelection(PT_STATUS); + } + + m_status_info_panel->jump_to_Rack(); +} + void MonitorPanel::update_network_version_footer() { std::string binary_version = Slic3r::NetworkAgent::get_version(); diff --git a/src/slic3r/GUI/Monitor.hpp b/src/slic3r/GUI/Monitor.hpp index cf050068b6..fe115a351a 100644 --- a/src/slic3r/GUI/Monitor.hpp +++ b/src/slic3r/GUI/Monitor.hpp @@ -158,6 +158,7 @@ public: void jump_to_HMS(); void jump_to_Upgrade(); void jump_to_LiveView(); + void jump_to_Rack(); void update_network_version_footer(); }; diff --git a/src/slic3r/GUI/StatusPanel.cpp b/src/slic3r/GUI/StatusPanel.cpp index 9617eb60cc..c27fd982d8 100644 --- a/src/slic3r/GUI/StatusPanel.cpp +++ b/src/slic3r/GUI/StatusPanel.cpp @@ -4503,6 +4503,8 @@ void StatusPanel::on_filament_edit(wxCommandEvent &event) if (obj) { m_filament_setting_dlg->obj = obj; + // Orca: 2D mode (laser/cut) only allows viewing filament info, not editing + m_filament_setting_dlg->m_view_only = !obj->is_fdm_type(); int ams_id = event.GetInt(); int slot_id = event.GetString().IsEmpty() ? 0 : std::stoi(event.GetString().ToStdString()); @@ -4571,6 +4573,8 @@ void StatusPanel::on_ext_spool_edit(wxCommandEvent &event) if (obj) { m_filament_setting_dlg->obj = obj; + // Orca: 2D mode (laser/cut) only allows viewing filament info, not editing + m_filament_setting_dlg->m_view_only = !obj->is_fdm_type(); int ams_id = event.GetInt(); int slot_id = event.GetString().IsEmpty() ? 0 : std::stoi(event.GetString().ToStdString()); @@ -4716,16 +4720,8 @@ void StatusPanel::on_ams_selected(wxCommandEvent &event) void StatusPanel::on_ams_guide(wxCommandEvent& event) { - wxString ams_wiki_url; - if (m_ams_control && m_ams_control->m_is_none_ams_mode == AMSModel::GENERIC_AMS) { - ams_wiki_url = "https://wiki.bambulab.com/en/software/bambu-studio/use-ams-on-bambu-studio"; - } - else if (m_ams_control && m_ams_control->m_is_none_ams_mode == AMSModel::AMS_LITE) { - ams_wiki_url = "https://wiki.bambulab.com/en/ams-lite"; - } - else { - ams_wiki_url = "https://wiki.bambulab.com/en/software/bambu-studio/use-ams-on-bambu-studio"; - } + // Orca: neutral wiki link (vendor URLs removed) + wxString ams_wiki_url = "https://www.orcaslicer.com/wiki/"; wxLaunchDefaultBrowser(ams_wiki_url); } @@ -5424,7 +5420,8 @@ void StatusPanel::update_filament_loading_panel(MachineObject* obj) bool ams_loading_state = false; auto ams_status_sub = obj->ams_status_sub; - if (obj->is_enable_np) { + // Orca: skip busy-loading detection during a cold pull (backing enum/parse landed in cluster 2) + if (obj->is_enable_np && obj->ams_status_main != AMS_STATUS_MAIN_COLD_PULL) { ams_loading_state = obj->GetExtderSystem()->IsBusyLoading(); } else if (obj->ams_status_main == AMS_STATUS_MAIN_FILAMENT_CHANGE) { ams_loading_state = true; diff --git a/src/slic3r/GUI/UpgradePanel.cpp b/src/slic3r/GUI/UpgradePanel.cpp index 16fe0420d8..d0b7e039a9 100644 --- a/src/slic3r/GUI/UpgradePanel.cpp +++ b/src/slic3r/GUI/UpgradePanel.cpp @@ -219,6 +219,8 @@ MachineInfoPanel::MachineInfoPanel(wxWindow* parent, wxWindowID id, const wxPoin createAirPumpWidgets(m_main_left_sizer); createExtinguishWidgets(m_main_left_sizer); createFilaTrackSwitchWidgets(m_main_left_sizer); + createRotaryWidgets(m_main_left_sizer); // Orca: accessory firmware version display + createExhaustFan(m_main_left_sizer); // Orca: accessory firmware version display // nozzle rack widgets (H2C induction hotend rack; hidden unless GetNozzleRack()->IsSupported()) createNozzleRackWidgets(m_main_left_sizer); @@ -429,6 +431,48 @@ void MachineInfoPanel::createFilaTrackSwitchWidgets(wxBoxSizer* main_left_sizer) main_left_sizer->Add(m_filatrack_sizer, 0, wxEXPAND, 0); } +// Orca: accessory firmware version display (device photo asset not shipped, so no left icon) +void MachineInfoPanel::createRotaryWidgets(wxBoxSizer* main_left_sizer) +{ + m_rotary_line_above = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL); + m_rotary_line_above->SetBackgroundColour(wxColour(206, 206, 206)); + main_left_sizer->Add(m_rotary_line_above, 0, wxEXPAND | wxLEFT, FromDIP(40)); + + m_rotary_img = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(FromDIP(200), FromDIP(200))); + + wxBoxSizer* content_sizer = new wxBoxSizer(wxVERTICAL); + content_sizer->Add(0, 40, 0, wxEXPAND, FromDIP(5)); + m_rotary_version = new uiDeviceUpdateVersion(this, wxID_ANY); + content_sizer->Add(m_rotary_version, 0, wxEXPAND, 0); + + m_rotary_sizer = new wxBoxSizer(wxHORIZONTAL); + m_rotary_sizer->Add(m_rotary_img, 0, wxALIGN_TOP | wxALL, FromDIP(5)); + m_rotary_sizer->Add(content_sizer, 1, wxEXPAND, 0); + + main_left_sizer->Add(m_rotary_sizer, 0, wxEXPAND, 0); +} + +// Orca: accessory firmware version display (device photo asset not shipped, so no left icon) +void MachineInfoPanel::createExhaustFan(wxBoxSizer* main_left_sizer) +{ + m_exhaustfan_line_above = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL); + m_exhaustfan_line_above->SetBackgroundColour(wxColour(206, 206, 206)); + main_left_sizer->Add(m_exhaustfan_line_above, 0, wxEXPAND | wxLEFT, FromDIP(40)); + + m_exhaustfan_img = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(FromDIP(200), FromDIP(200))); + + wxBoxSizer* content_sizer = new wxBoxSizer(wxVERTICAL); + content_sizer->Add(0, 40, 0, wxEXPAND, FromDIP(5)); + m_exhaustfan_version = new uiDeviceUpdateVersion(this, wxID_ANY); + content_sizer->Add(m_exhaustfan_version, 0, wxEXPAND, 0); + + m_exhaustfan_sizer = new wxBoxSizer(wxHORIZONTAL); + m_exhaustfan_sizer->Add(m_exhaustfan_img, 0, wxALIGN_TOP | wxALL, FromDIP(5)); + m_exhaustfan_sizer->Add(content_sizer, 1, wxEXPAND, 0); + + main_left_sizer->Add(m_exhaustfan_sizer, 0, wxEXPAND, 0); +} + void MachineInfoPanel::msw_rescale() { rescale_bitmaps(); @@ -569,6 +613,8 @@ void MachineInfoPanel::update(MachineObject* obj) update_laszer(obj); update_extinguish(obj); update_filatrack(obj); + update_rotary(obj); // Orca: accessory firmware version display + update_exhaustfan(obj); // Orca: accessory firmware version display update_nozzle_rack(obj); //update progress @@ -1167,6 +1213,34 @@ void MachineInfoPanel::update_filatrack(MachineObject* obj) } } +// Orca: accessory firmware version display (backing parse landed in cluster 2) +void MachineInfoPanel::update_rotary(MachineObject* obj) +{ + if (obj && obj->rotary_version_info.isValid()) + { + m_rotary_version->UpdateInfo(obj->rotary_version_info); + show_rotary(true); + } + else + { + show_rotary(false); + } +} + +// Orca: accessory firmware version display (backing parse landed in cluster 2) +void MachineInfoPanel::update_exhaustfan(MachineObject* obj) +{ + if (obj && obj->exhaustfan_version_info.isValid()) + { + m_exhaustfan_version->UpdateInfo(obj->exhaustfan_version_info); + show_exhaustfan(true); + } + else + { + show_exhaustfan(false); + } +} + void MachineInfoPanel::show_status(int status, std::string upgrade_status_str) { if (last_status == status && last_status_str == upgrade_status_str) return; @@ -1311,6 +1385,28 @@ void MachineInfoPanel::show_filatrack(bool show) } } +// Orca: accessory firmware version display +void MachineInfoPanel::show_rotary(bool show) +{ + if (m_rotary_version->IsShown() != show) + { + m_rotary_img->Show(show); + m_rotary_line_above->Show(show); + m_rotary_version->Show(show); + } +} + +// Orca: accessory firmware version display +void MachineInfoPanel::show_exhaustfan(bool show) +{ + if (m_exhaustfan_version->IsShown() != show) + { + m_exhaustfan_img->Show(show); + m_exhaustfan_line_above->Show(show); + m_exhaustfan_version->Show(show); + } +} + void MachineInfoPanel::createNozzleRackWidgets(wxBoxSizer *main_left_sizer) { // horizontal line above diff --git a/src/slic3r/GUI/UpgradePanel.hpp b/src/slic3r/GUI/UpgradePanel.hpp index 0cf88ae080..68aa1b9089 100644 --- a/src/slic3r/GUI/UpgradePanel.hpp +++ b/src/slic3r/GUI/UpgradePanel.hpp @@ -140,6 +140,18 @@ protected: wxStaticLine* m_filatrack_line_above = nullptr; uiDeviceUpdateVersion* m_filatrack_version = nullptr; + /* rotary attachment info (Orca: accessory firmware version display) */ + wxBoxSizer* m_rotary_sizer = nullptr; + wxStaticBitmap* m_rotary_img = nullptr; + wxStaticLine* m_rotary_line_above = nullptr; + uiDeviceUpdateVersion* m_rotary_version = nullptr; + + /* exhaust fan info (Orca: accessory firmware version display) */ + wxBoxSizer* m_exhaustfan_sizer = nullptr; + wxStaticBitmap* m_exhaustfan_img = nullptr; + wxStaticLine* m_exhaustfan_line_above = nullptr; + uiDeviceUpdateVersion* m_exhaustfan_version = nullptr; + /* nozzle rack (H2C induction hotend rack) — opens wgtDeviceNozzleRackUpgradeDlg */ wxBoxSizer* m_nozzle_rack_sizer = nullptr; wxStaticBitmap* m_nozzle_rack_img = nullptr; @@ -228,6 +240,8 @@ private: void createLaserWidgets(wxBoxSizer* main_left_sizer); void createExtinguishWidgets(wxBoxSizer* main_left_sizer); void createFilaTrackSwitchWidgets(wxBoxSizer* main_left_sizer); + void createRotaryWidgets(wxBoxSizer* main_left_sizer); // Orca: accessory firmware version display + void createExhaustFan(wxBoxSizer* main_left_sizer); // Orca: accessory firmware version display void createNozzleRackWidgets(wxBoxSizer* main_left_sizer); void update_air_pump(MachineObject* obj); @@ -235,6 +249,8 @@ private: void update_laszer(MachineObject* obj); void update_extinguish(MachineObject* obj); void update_filatrack(MachineObject* obj); + void update_rotary(MachineObject* obj); // Orca: accessory firmware version display + void update_exhaustfan(MachineObject* obj); // Orca: accessory firmware version display void update_nozzle_rack(MachineObject* obj); void show_air_pump(bool show = true); @@ -242,6 +258,8 @@ private: void show_laszer(bool show = true); void show_extinguish(bool show = true); void show_filatrack(bool show = true); + void show_rotary(bool show = true); // Orca: accessory firmware version display + void show_exhaustfan(bool show = true); // Orca: accessory firmware version display void show_nozzle_rack(bool show = true); void on_nozzle_rack_update(wxCommandEvent& event); diff --git a/src/slic3r/GUI/Widgets/SideTools.cpp b/src/slic3r/GUI/Widgets/SideTools.cpp index 377253e707..d66c46c42b 100644 --- a/src/slic3r/GUI/Widgets/SideTools.cpp +++ b/src/slic3r/GUI/Widgets/SideTools.cpp @@ -274,8 +274,8 @@ SideTools::SideTools(wxWindow *parent, wxWindowID id, const wxPoint &pos, const wxBoxSizer* connection_sizer_V = new wxBoxSizer(wxVERTICAL); wxBoxSizer* connection_sizer_H = new wxBoxSizer(wxHORIZONTAL); - // ORCA standardized HyperLink - m_hyperlink = new HyperLink(m_connection_info, _L("Failed to connect to the server"), wxT("https://wiki.bambulab.com/en/software/bambu-studio/failed-to-connect-printer")); + // ORCA standardized HyperLink; Orca: neutral wiki link (vendor URL removed) + m_hyperlink = new HyperLink(m_connection_info, _L("Failed to connect to the server"), wxT("https://www.orcaslicer.com/wiki/")); m_more_err_open = ScalableBitmap(this, "monitir_err_open", 16); m_more_err_close = ScalableBitmap(this, "monitir_err_close", 16);