mirror of
https://github.com/OrcaSlicer/OrcaSlicer.git
synced 2026-07-19 17:02:08 +00:00
feat(gui): multi-nozzle UI for H2C/A2L
Multi-nozzle sync widget, AMS rack-nozzle mapping popup, calibration rework, send-dialog nozzle mapping and extruder-count UI. Includes the fix to persist the AMS sync badge on filament cards (H2C/A2L and direct-sync printers).
This commit is contained in:
@@ -3,6 +3,7 @@
|
||||
#include <slic3r/GUI/Widgets/Label.hpp>
|
||||
#include <slic3r/GUI/I18N.hpp>
|
||||
#include "slic3r/GUI/DeviceTab/uiDeviceUpdateVersion.h"
|
||||
#include "slic3r/GUI/DeviceTab/wgtDeviceNozzleRackUpdate.h"
|
||||
|
||||
#include "GUI.hpp"
|
||||
#include "GUI_App.hpp"
|
||||
@@ -217,6 +218,9 @@ MachineInfoPanel::MachineInfoPanel(wxWindow* parent, wxWindowID id, const wxPoin
|
||||
createAirPumpWidgets(m_main_left_sizer);
|
||||
createExtinguishWidgets(m_main_left_sizer);
|
||||
|
||||
// nozzle rack widgets (H2C induction hotend rack; hidden unless GetNozzleRack()->IsSupported())
|
||||
createNozzleRackWidgets(m_main_left_sizer);
|
||||
|
||||
m_main_sizer->Add(m_main_left_sizer, 1, wxEXPAND, 0);
|
||||
|
||||
wxBoxSizer *m_main_right_sizer = new wxBoxSizer(wxVERTICAL);
|
||||
@@ -431,6 +435,7 @@ void MachineInfoPanel::init_bitmaps()
|
||||
m_img_laser = ScalableBitmap(this, "laser", 160);
|
||||
m_img_cutting = ScalableBitmap(this, "cut", 160);
|
||||
m_img_extinguish = ScalableBitmap(this, "extinguish", 160);
|
||||
m_img_nozzle_rack = ScalableBitmap(this, "nozzle_rack", 160);
|
||||
|
||||
upgrade_green_icon = ScalableBitmap(this, "monitor_upgrade_online", 5);
|
||||
upgrade_gray_icon = ScalableBitmap(this, "monitor_upgrade_offline", 5);
|
||||
@@ -539,6 +544,7 @@ void MachineInfoPanel::update(MachineObject* obj)
|
||||
update_cut(obj);
|
||||
update_laszer(obj);
|
||||
update_extinguish(obj);
|
||||
update_nozzle_rack(obj);
|
||||
|
||||
//update progress
|
||||
int upgrade_percent = obj->get_upgrade_percent();
|
||||
@@ -1257,6 +1263,80 @@ void MachineInfoPanel::show_extinguish(bool show)
|
||||
}
|
||||
}
|
||||
|
||||
void MachineInfoPanel::createNozzleRackWidgets(wxBoxSizer *main_left_sizer)
|
||||
{
|
||||
// horizontal line above
|
||||
m_nozzle_rack_line_above = new wxStaticLine(this, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxLI_HORIZONTAL);
|
||||
m_nozzle_rack_line_above->SetBackgroundColour(wxColour(206, 206, 206));
|
||||
main_left_sizer->Add(m_nozzle_rack_line_above, 0, wxEXPAND | wxLEFT, FromDIP(40));
|
||||
|
||||
m_nozzle_rack_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
|
||||
// left placeholder icon (keep consistent spacing with others)
|
||||
m_nozzle_rack_img = new wxStaticBitmap(this, wxID_ANY, wxNullBitmap, wxDefaultPosition, wxSize(FromDIP(200), FromDIP(200)));
|
||||
m_nozzle_rack_img->SetBitmap(m_img_nozzle_rack.bmp());
|
||||
m_nozzle_rack_sizer->Add(m_nozzle_rack_img, 0, wxALIGN_CENTER_VERTICAL | wxALL, FromDIP(5));
|
||||
|
||||
// right content: label + update button
|
||||
auto *content_sizer = new wxBoxSizer(wxHORIZONTAL);
|
||||
m_nozzle_rack_text = new wxStaticText(this, wxID_ANY, _L("Hotends on Rack"), wxDefaultPosition, wxDefaultSize, 0);
|
||||
m_nozzle_rack_text->Wrap(-1);
|
||||
m_nozzle_rack_text->SetFont(Label::Head_14);
|
||||
content_sizer->Add(m_nozzle_rack_text, 0, wxALIGN_CENTER_VERTICAL | wxRIGHT | wxLEFT, FromDIP(50));
|
||||
|
||||
m_nozzle_rack_update_btn = new Button(this, _L("Info"));
|
||||
StateColor btn_bg(std::pair<wxColour, int>(wxColour(255, 255, 255), StateColor::Disabled), std::pair<wxColour, int>(wxColour(200, 200, 200), StateColor::Pressed),
|
||||
std::pair<wxColour, int>(wxColour(240, 240, 240), StateColor::Hovered), std::pair<wxColour, int>(wxColour(255, 255, 255), StateColor::Enabled),
|
||||
std::pair<wxColour, int>(wxColour(255, 255, 255), StateColor::Normal));
|
||||
StateColor btn_bd(std::pair<wxColour, int>(wxColour(200, 200, 200), StateColor::Disabled), std::pair<wxColour, int>(wxColour(150, 150, 150), StateColor::Enabled));
|
||||
StateColor btn_text(std::pair<wxColour, int>(wxColour(150, 150, 150), StateColor::Disabled), std::pair<wxColour, int>(wxColour(0, 0, 0), StateColor::Enabled));
|
||||
m_nozzle_rack_update_btn->SetBackgroundColor(btn_bg);
|
||||
m_nozzle_rack_update_btn->SetBorderColor(btn_bd);
|
||||
m_nozzle_rack_update_btn->SetTextColor(btn_text);
|
||||
m_nozzle_rack_update_btn->SetFont(Label::Body_10.Bold());
|
||||
m_nozzle_rack_update_btn->SetMinSize(wxSize(FromDIP(-1), FromDIP(24)));
|
||||
m_nozzle_rack_update_btn->SetCornerRadius(FromDIP(12));
|
||||
m_nozzle_rack_update_btn->Bind(wxEVT_BUTTON, &MachineInfoPanel::on_nozzle_rack_update, this);
|
||||
content_sizer->Add(m_nozzle_rack_update_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(350));
|
||||
|
||||
m_nozzle_rack_sizer->Add(content_sizer, 1, wxEXPAND, 0);
|
||||
|
||||
main_left_sizer->Add(m_nozzle_rack_sizer, 0, wxEXPAND, 0);
|
||||
}
|
||||
|
||||
void MachineInfoPanel::update_nozzle_rack(MachineObject* obj)
|
||||
{
|
||||
if (obj && obj->GetNozzleSystem()) {
|
||||
auto rack = obj->GetNozzleSystem()->GetNozzleRack();
|
||||
if (rack && rack->IsSupported()) {
|
||||
show_nozzle_rack(true);
|
||||
}
|
||||
else {
|
||||
show_nozzle_rack(false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void MachineInfoPanel::show_nozzle_rack(bool show)
|
||||
{
|
||||
if (m_nozzle_rack_img->IsShown() != show) {
|
||||
m_nozzle_rack_line_above->Show(show);
|
||||
m_nozzle_rack_update_btn->Show(show);
|
||||
m_nozzle_rack_img->Show(show);
|
||||
m_nozzle_rack_text->Show(show);
|
||||
}
|
||||
}
|
||||
|
||||
void MachineInfoPanel::on_nozzle_rack_update(wxCommandEvent &event)
|
||||
{
|
||||
if (!m_obj || !m_obj->GetNozzleSystem()) return;
|
||||
auto rack = m_obj->GetNozzleSystem()->GetNozzleRack();
|
||||
if (!rack) return;
|
||||
|
||||
wgtDeviceNozzleRackUpgradeDlg dlg(this, rack);
|
||||
dlg.ShowModal();
|
||||
}
|
||||
|
||||
|
||||
void MachineInfoPanel::on_sys_color_changed()
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user