Resync the device status pages

This commit is contained in:
SoftFever
2026-07-17 08:30:22 +08:00
parent 5e95aca42d
commit 80d3c3908d
8 changed files with 145 additions and 19 deletions

View File

@@ -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<string> 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));
}
}

View File

@@ -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;

View File

@@ -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();

View File

@@ -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();
};

View File

@@ -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;

View File

@@ -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

View File

@@ -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);

View File

@@ -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);