Compact Printer Selection UI (#11196)

This commit is contained in:
yw4z
2025-11-17 18:30:35 +03:00
committed by GitHub
parent d6936ec32a
commit 73b93d2ed0
17 changed files with 357 additions and 109 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 11 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 8.8 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.7 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><circle cx="7.5" cy="7.5" r="4" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/><line x1=".5" y1=".5" x2=".5" y2="4.5" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/><line x1="14.5" y1="14.5" x2="14.5" y2="10.5" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/><path d="M13.83,4.5C12.71,2.13,10.3.5,7.5.5c-2.71,0-5.17,1.56-6.33,4" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/><path d="M1.27,10.69c1.16,2.26,3.51,3.81,6.23,3.81,2.71,0,5.17-1.56,6.33-4" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/></svg>

After

Width:  |  Height:  |  Size: 802 B

View File

@@ -0,0 +1 @@
<?xml version="1.0" encoding="UTF-8"?><svg id="a" xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16"><circle cx="7.5" cy="7.5" r="4" style="fill:#009688; stroke:#009688; stroke-linecap:round; stroke-linejoin:round;"/><line x1=".5" y1=".5" x2=".5" y2="4.5" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/><line x1="14.5" y1="14.5" x2="14.5" y2="10.5" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/><path d="M13.83,4.5C12.71,2.13,10.3.5,7.5.5c-2.71,0-5.17,1.56-6.33,4" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/><path d="M1.27,10.69c1.16,2.26,3.51,3.81,6.23,3.81,2.71,0,5.17-1.56,6.33-4" style="fill:none; stroke:#949494; stroke-linecap:round; stroke-linejoin:round;"/></svg>

After

Width:  |  Height:  |  Size: 805 B

View File

@@ -20,23 +20,32 @@ namespace Slic3r { namespace GUI {
ImageDPIFrame::ImageDPIFrame() ImageDPIFrame::ImageDPIFrame()
: DPIFrame(static_cast<wxWindow *>(wxGetApp().mainframe), wxID_ANY, "", wxDefaultPosition, wxDefaultSize, !wxCAPTION | !wxCLOSE_BOX | wxBORDER_NONE) : DPIFrame(static_cast<wxWindow *>(wxGetApp().mainframe), wxID_ANY, "", wxDefaultPosition, wxDefaultSize, !wxCAPTION | !wxCLOSE_BOX | wxBORDER_NONE)
{ {
m_image_px = 280; m_image_px = 240;
int width = 270; int width = 270;
//SetTransparent(0); //SetTransparent(0);
SetMinSize(wxSize(FromDIP(width), -1)); SetMinSize(wxSize(FromDIP(width), -1));
SetMaxSize(wxSize(FromDIP(width), -1)); SetMaxSize(wxSize(FromDIP(width), -1));
SetBackgroundColour(wxColour(242, 242, 242, 255)); SetBackgroundColour(wxColour(255, 255, 255, 255));
#ifdef __APPLE__ #ifdef __APPLE__
SetWindowStyleFlag(GetWindowStyleFlag() | wxSTAY_ON_TOP); SetWindowStyleFlag(GetWindowStyleFlag() | wxSTAY_ON_TOP);
#endif #endif
m_sizer_main = new wxBoxSizer(wxVERTICAL); m_sizer_main = new wxBoxSizer(wxVERTICAL);
m_title = new wxStaticText(this, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, wxST_ELLIPSIZE_END);
m_title->SetFont(Label::Head_14);
m_title->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#262E30")));
m_title->SetMaxSize(wxSize(FromDIP(width), -1));
auto image_sizer = new wxBoxSizer(wxVERTICAL); auto image_sizer = new wxBoxSizer(wxVERTICAL);
auto imgsize = FromDIP(width); auto imgsize = FromDIP(width);
m_bitmap = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("printer_preview_C13", this, m_image_px), wxDefaultPosition, wxSize(imgsize, imgsize * 0.94), 0); m_bitmap = new wxStaticBitmap(this, wxID_ANY, create_scaled_bitmap("printer_preview_C13", this, m_image_px), wxDefaultPosition, FromDIP(wxSize(m_image_px, m_image_px)), 0);
image_sizer->Add(m_bitmap, 0, wxALIGN_CENTER | wxALL, FromDIP(0)); image_sizer->Add(m_bitmap, 0, wxALIGN_CENTER | wxALL, FromDIP(10));
m_sizer_main->Add(m_title, 0, wxALIGN_CENTER | wxTOP | wxLEFT | wxRIGHT, FromDIP(10));
m_sizer_main->Add(image_sizer, FromDIP(0), wxALIGN_CENTER, FromDIP(0)); m_sizer_main->Add(image_sizer, FromDIP(0), wxALIGN_CENTER, FromDIP(0));
wxGetApp().UpdateDarkUI(this); // ORCA fix white bg on dark mode
Bind(wxEVT_CLOSE_WINDOW, [this](auto &e) { Bind(wxEVT_CLOSE_WINDOW, [this](auto &e) {
on_hide(); on_hide();
}); });
@@ -60,12 +69,24 @@ void ImageDPIFrame::set_bitmap(const wxBitmap &bit_map) {
m_bitmap->SetBitmap(bit_map); m_bitmap->SetBitmap(bit_map);
} }
void ImageDPIFrame::set_title(const wxString& title) {
m_title->Show(!title.empty());
if(!title.empty())
m_title->SetLabel(title);
Layout();
}
void ImageDPIFrame::on_dpi_changed(const wxRect &suggested_rect) void ImageDPIFrame::on_dpi_changed(const wxRect &suggested_rect)
{ {
// m_image->Rescale(); // m_image->Rescale();
//m_bitmap->Rescale(); //m_bitmap->Rescale();
} }
void ImageDPIFrame::sys_color_changed()
{
wxGetApp().UpdateDarkUI(this);
}
void ImageDPIFrame::init_timer() void ImageDPIFrame::init_timer()
{ {
m_refresh_timer = new wxTimer(); m_refresh_timer = new wxTimer();
@@ -76,7 +97,7 @@ void ImageDPIFrame::init_timer()
void ImageDPIFrame::on_timer(wxTimerEvent &event) void ImageDPIFrame::on_timer(wxTimerEvent &event)
{ {
if (!IsShown()) {//after 1s to show Frame if (!IsShown()) {//after 1s to show Frame
if (m_timer_count >= 50) { if (m_timer_count >= 20) { // ORCA show frame faster to maatch time with tooltips
Show(); Show();
Raise(); Raise();
} }
@@ -123,6 +144,7 @@ void ImageDPIFrame::on_hide()
wxGetApp().mainframe->Raise(); wxGetApp().mainframe->Raise();
} }
} }
set_title(""); // reset title on hide
} }
} // namespace GUI } // namespace GUI

View File

@@ -12,12 +12,14 @@ public:
ImageDPIFrame(); ImageDPIFrame();
~ImageDPIFrame() override; ~ImageDPIFrame() override;
void on_dpi_changed(const wxRect &suggested_rect) override; void on_dpi_changed(const wxRect &suggested_rect) override;
void sys_color_changed();
void on_show(); void on_show();
void on_hide(); void on_hide();
bool Show(bool show = true) override; bool Show(bool show = true) override;
void set_bitmap(const wxBitmap& bit_map); void set_bitmap(const wxBitmap& bit_map);
int get_image_px() { return m_image_px; } int get_image_px() { return m_image_px; }
void set_title(const wxString& title);
private: private:
void init_timer(); void init_timer();
@@ -27,6 +29,8 @@ private:
wxStaticBitmap *m_bitmap = nullptr; wxStaticBitmap *m_bitmap = nullptr;
wxBoxSizer *m_sizer_main{nullptr}; wxBoxSizer *m_sizer_main{nullptr};
int m_image_px; int m_image_px;
wxString m_title_str;
wxStaticText* m_title;
wxTimer * m_refresh_timer{nullptr}; wxTimer * m_refresh_timer{nullptr};
float m_timer_count = 0; float m_timer_count = 0;
}; };

View File

@@ -212,8 +212,8 @@ wxDEFINE_EVENT(EVT_DEL_FILAMENT, SimpleEvent);
wxDEFINE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent); wxDEFINE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent);
wxDEFINE_EVENT(EVT_NOTICE_CHILDE_SIZE_CHANGED, SimpleEvent); wxDEFINE_EVENT(EVT_NOTICE_CHILDE_SIZE_CHANGED, SimpleEvent);
wxDEFINE_EVENT(EVT_NOTICE_FULL_SCREEN_CHANGED, IntEvent); wxDEFINE_EVENT(EVT_NOTICE_FULL_SCREEN_CHANGED, IntEvent);
#define PRINTER_THUMBNAIL_SIZE (wxSize(FromDIP(48), FromDIP(48))) #define PRINTER_THUMBNAIL_SIZE (wxSize(40, 40)) // ORCA
#define PRINTER_PANEL_SIZE (wxSize(FromDIP(96), FromDIP(98))) #define PRINTER_PANEL_SIZE ( wxSize(70, 60)) // ORCA
#define BTN_SYNC_SIZE (wxSize(FromDIP(96), FromDIP(98))) #define BTN_SYNC_SIZE (wxSize(FromDIP(96), FromDIP(98)))
static string get_diameter_string(float diameter) static string get_diameter_string(float diameter)
@@ -245,12 +245,12 @@ void Plater::show_illegal_characters_warning(wxWindow* parent)
} }
static std::map<BedType, std::string> bed_type_thumbnails = { static std::map<BedType, std::string> bed_type_thumbnails = {
{BedType::btPC, "bed_cool"}, {BedType::btPC, "bed_plate_cool_smooth" }, //"bed_cool"},
{BedType::btEP, "bed_engineering"}, {BedType::btEP, "bed_plate_engineering" }, //"bed_engineering"},
{BedType::btPEI, "bed_high_templ"}, {BedType::btPEI, "bed_plate_high_temp_smooth"}, //"bed_high_templ"},
{BedType::btPTE, "bed_pei"}, {BedType::btPTE, "bed_plate_pei" }, //"bed_pei"},
{BedType::btPCT, "bed_pei"}, // TODO: Orca hack {BedType::btPCT, "bed_plate_cool_textured" }, //"bed_pei"}, // TODO: Orca hack
{BedType::btSuperTack, "bed_cool_supertack"} {BedType::btSuperTack, "bed_plate_cool_supertack" } //"bed_cool_supertack"}
}; };
// print_model_id // print_model_id
@@ -425,12 +425,21 @@ struct Sidebar::priv
// Printer // Printer
wxSizer * vsizer_printer = nullptr; wxSizer * vsizer_printer = nullptr;
wxBoxSizer * extruder_dual_sizer = nullptr;
wxBoxSizer * extruder_single_sizer = nullptr;
// Printer - preset // Printer - preset
StaticBox * panel_printer_preset = nullptr; StaticBox * panel_printer_preset = nullptr;
wxStaticBitmap * image_printer = nullptr; wxStaticBitmap * image_printer = nullptr;
PlaterPresetComboBox *combo_printer = nullptr; PlaterPresetComboBox *combo_printer = nullptr;
ScalableButton * btn_edit_printer = nullptr; ScalableButton * btn_edit_printer = nullptr;
ScalableButton * btn_connect_printer = nullptr; ScalableButton * btn_connect_printer = nullptr;
// Nozzle diameter
StaticBox * panel_nozzle_dia = nullptr;
Label * label_nozzle_title= nullptr;
ComboBox * combo_nozzle_dia = nullptr;
Label * label_nozzle_type = nullptr;
// Printer - bed // Printer - bed
StaticBox * panel_printer_bed = nullptr; StaticBox * panel_printer_bed = nullptr;
wxStaticBitmap *image_printer_bed = nullptr; wxStaticBitmap *image_printer_bed = nullptr;
@@ -438,7 +447,7 @@ struct Sidebar::priv
ImageDPIFrame *big_bed_image_popup = nullptr; ImageDPIFrame *big_bed_image_popup = nullptr;
// Printer - sync // Printer - sync
Button *btn_sync_printer; //Button *btn_sync_printer;
std::shared_ptr<int> counter_sync_printer = std::make_shared<int>(); std::shared_ptr<int> counter_sync_printer = std::make_shared<int>();
wxTimer * timer_sync_printer = new wxTimer(); wxTimer * timer_sync_printer = new wxTimer();
// Printer - ams // Printer - ams
@@ -484,6 +493,8 @@ struct Sidebar::priv
// BBS printer config // BBS printer config
StaticBox* m_panel_printer_title = nullptr; StaticBox* m_panel_printer_title = nullptr;
ScalableButton* m_printer_icon = nullptr; ScalableButton* m_printer_icon = nullptr;
ScalableButton* m_printer_connect = nullptr;
ScalableButton* m_printer_bbl_sync = nullptr;
ScalableButton* m_printer_setting = nullptr; ScalableButton* m_printer_setting = nullptr;
wxStaticText * m_text_printer_settings = nullptr; wxStaticText * m_text_printer_settings = nullptr;
wxPanel* m_panel_printer_content = nullptr; wxPanel* m_panel_printer_content = nullptr;
@@ -525,22 +536,15 @@ void Sidebar::priv::layout_printer(bool isBBL, bool isDual)
// Printer - preset // Printer - preset
if (auto sizer = static_cast<wxBoxSizer *>(panel_printer_preset->GetSizer()); if (auto sizer = static_cast<wxBoxSizer *>(panel_printer_preset->GetSizer());
sizer == nullptr /*|| isBBL != (sizer->GetOrientation() == wxVERTICAL)*/) { sizer == nullptr /*|| isBBL != (sizer->GetOrientation() == wxVERTICAL)*/) {
wxBoxSizer *hsizer_printer_btn = new wxBoxSizer(wxHORIZONTAL);
hsizer_printer_btn->AddStretchSpacer(1);
hsizer_printer_btn->Add(btn_edit_printer, 0);
hsizer_printer_btn->Add(btn_connect_printer, 0, wxALIGN_CENTER | wxLEFT, FromDIP(4));
combo_printer->SetWindowStyle(combo_printer->GetWindowStyle() & ~wxALIGN_MASK | wxALIGN_CENTER_HORIZONTAL);
//if (isBBL) { //if (isBBL) {
wxBoxSizer *vsizer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL);
hsizer->AddStretchSpacer(1); hsizer->Add(image_printer, 0, wxLEFT | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(10));
hsizer->Add(image_printer, 0, wxEXPAND | wxTOP, FromDIP(8)); hsizer->Add(combo_printer, 1, wxEXPAND | wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(2));
hsizer->Add(hsizer_printer_btn, 1, wxEXPAND, 0); hsizer->AddSpacer(FromDIP(2));
hsizer->AddSpacer(FromDIP(6)); hsizer->Add(btn_edit_printer, 0, wxRIGHT | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(SidebarProps::IconSpacing()));
vsizer->AddSpacer(FromDIP(4)); //hsizer->Add(btn_connect_printer, 0, wxRIGHT | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(SidebarProps::IconSpacing()));
vsizer->Add(hsizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(8)); panel_printer_preset->SetSizer(hsizer);
vsizer->Add(combo_printer, 0, wxEXPAND | wxALL, FromDIP(4));
panel_printer_preset->SetSizer(vsizer);
//} else { //} else {
// wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL); // wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL);
// hsizer->Add(image_printer, 0, wxLEFT | wxALIGN_CENTER, FromDIP(4)); // hsizer->Add(image_printer, 0, wxLEFT | wxALIGN_CENTER, FromDIP(4));
@@ -554,31 +558,45 @@ void Sidebar::priv::layout_printer(bool isBBL, bool isDual)
if (vsizer_printer->GetItemCount() == 0) { if (vsizer_printer->GetItemCount() == 0) {
wxBoxSizer *hsizer_printer = new wxBoxSizer(wxHORIZONTAL); wxBoxSizer *hsizer_printer = new wxBoxSizer(wxHORIZONTAL);
hsizer_printer->Add(panel_printer_preset, 1, wxEXPAND, 0); hsizer_printer->Add(panel_printer_preset, 1, wxEXPAND, 0);
hsizer_printer->Add(panel_printer_bed, 0, wxLEFT | wxEXPAND, FromDIP(4)); hsizer_printer->Add(panel_nozzle_dia , 0, wxLEFT, FromDIP(4));
hsizer_printer->Add(btn_sync_printer, 0, wxLEFT | wxEXPAND, FromDIP(4)); hsizer_printer->Add(panel_printer_bed, 0, wxLEFT, FromDIP(4));
vsizer_printer->Add(hsizer_printer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, FromDIP(4)); //hsizer_printer->Add(btn_sync_printer , 0, wxLEFT, FromDIP(4));
vsizer_printer->AddSpacer(FromDIP(4)); vsizer_printer->AddSpacer(FromDIP(8));
vsizer_printer->Add(hsizer_printer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(SidebarProps::ContentMargin()));
vsizer_printer->AddSpacer(FromDIP(8));
// Printer - extruder // Printer - extruder
// double // double
auto hsizer_extruder = new wxBoxSizer(wxHORIZONTAL); extruder_dual_sizer = new wxBoxSizer(wxHORIZONTAL);
hsizer_extruder->Add(left_extruder->sizer, 1, wxEXPAND, 0); extruder_dual_sizer->Add(left_extruder->sizer, 1, wxEXPAND, 0);
hsizer_extruder->AddSpacer(FromDIP(4)); extruder_dual_sizer->AddSpacer(FromDIP(4));
hsizer_extruder->Add(right_extruder->sizer, 1, wxEXPAND, 0); extruder_dual_sizer->Add(right_extruder->sizer, 1, wxEXPAND, 0);
// single // single
vsizer_printer->Add(hsizer_extruder, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(4)); extruder_single_sizer = single_extruder->sizer;
vsizer_printer->Add(single_extruder->sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(4)); wxBoxSizer * extruder_sizer = new wxBoxSizer(wxVERTICAL);
extruder_sizer->Add(extruder_dual_sizer , 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(SidebarProps::ContentMargin()));
extruder_sizer->Add(extruder_single_sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(SidebarProps::ContentMargin()));
vsizer_printer->AddSpacer(FromDIP(4)); vsizer_printer->Add(extruder_sizer, 1, wxEXPAND | wxBOTTOM, FromDIP(8));
} }
btn_connect_printer->Show(!isBBL); //btn_connect_printer->Show(!isBBL);
btn_sync_printer->Show(isBBL); m_printer_connect->Show(!isBBL);
panel_printer_bed->Show(true); // Orca: always show bed type selector //btn_sync_printer->Show(isBBL);
vsizer_printer->GetItem(2)->GetSizer()->GetItem(1)->Show(isDual); m_printer_bbl_sync->Show(isBBL);
vsizer_printer->GetItem(2)->Show(isDual); // Orca: always show diameter selection
vsizer_printer->GetItem(3)->Show(!isDual); // ORCA show plate type combo box only when its supported
PresetBundle &preset_bundle = *wxGetApp().preset_bundle;
auto cfg = preset_bundle.printers.get_edited_preset().config;
panel_printer_bed->Show(isBBL || cfg.opt_bool("support_multi_bed_types"));
extruder_dual_sizer->Show(isDual);
// NEEDFIX requires AMS check or any type of ???
// Single nozzle & non ams
panel_nozzle_dia->Show(!isDual);
extruder_single_sizer->Show(false);
} }
void Sidebar::priv::flush_printer_sync(bool restart) void Sidebar::priv::flush_printer_sync(bool restart)
@@ -587,7 +605,8 @@ void Sidebar::priv::flush_printer_sync(bool restart)
*counter_sync_printer = 6; *counter_sync_printer = 6;
timer_sync_printer->Start(500); timer_sync_printer->Start(500);
} }
btn_sync_printer->SetBackgroundColorNormal((*counter_sync_printer & 1) ? "#F8F8F8" :"#009688"); //btn_sync_printer->SetBackgroundColorNormal((*counter_sync_printer & 1) ? "#F8F8F8" :"#009688");
m_printer_bbl_sync->SetBitmap_((*counter_sync_printer & 1) ? "printer_sync_not" : "printer_sync_ok");
if (--*counter_sync_printer <= 0) if (--*counter_sync_printer <= 0)
timer_sync_printer->Stop(); timer_sync_printer->Stop();
} }
@@ -996,13 +1015,13 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
// Nozzle // Nozzle
wxStaticText *label_diameter = new wxStaticText(this, wxID_ANY, _L("Diameter")); wxStaticText *label_diameter = new wxStaticText(this, wxID_ANY, _L("Diameter"));
label_diameter->SetFont(Label::Body_14); label_diameter->SetFont(Label::Body_14);
label_diameter->SetForegroundColour("#262E30"); label_diameter->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#262E30")));
if (index >= 0) label_diameter->SetMinSize({FromDIP(80), -1}); if (index >= 0) label_diameter->SetMinSize({FromDIP(80), -1});
auto combo_diameter = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); auto combo_diameter = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY);
this->combo_diameter = combo_diameter; this->combo_diameter = combo_diameter;
wxStaticText *label_flow = new wxStaticText(this, wxID_ANY, _L("Flow")); wxStaticText *label_flow = new wxStaticText(this, wxID_ANY, _L("Flow"));
label_flow->SetFont(Label::Body_14); label_flow->SetFont(Label::Body_14);
label_flow->SetForegroundColour("#262E30"); label_flow->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#262E30")));
if (index >= 0) label_flow->SetMinSize({FromDIP(80), -1}); if (index >= 0) label_flow->SetMinSize({FromDIP(80), -1});
auto combo_flow = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); auto combo_flow = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY);
combo_flow->GetDropDown().SetUseContentWidth(true); combo_flow->GetDropDown().SetUseContentWidth(true);
@@ -1017,7 +1036,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
// AMS // AMS
wxStaticText *label_ams = new wxStaticText(this, wxID_ANY, _L("AMS")); wxStaticText *label_ams = new wxStaticText(this, wxID_ANY, _L("AMS"));
label_ams->SetFont(Label::Body_14); label_ams->SetFont(Label::Body_14);
label_ams->SetForegroundColour("#262E30"); label_ams->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#262E30")));
//label_ams->SetMinSize({FromDIP(70), -1}); //label_ams->SetMinSize({FromDIP(70), -1});
if (index >= 0) { if (index >= 0) {
btn_edit = new ScalableButton(this, wxID_ANY, "dot"); btn_edit = new ScalableButton(this, wxID_ANY, "dot");
@@ -1046,7 +1065,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title
// AMS not installed message // AMS not installed message
ams_not_installed_msg = new wxStaticText(this, wxID_ANY, _L("Not installed")); ams_not_installed_msg = new wxStaticText(this, wxID_ANY, _L("Not installed"));
ams_not_installed_msg->SetFont(Label::Body_14); ams_not_installed_msg->SetFont(Label::Body_14);
ams_not_installed_msg->SetForegroundColour("#262E30"); ams_not_installed_msg->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#262E30")));
// AMS group // AMS group
for (size_t i = 0; i < 4; ++i) { for (size_t i = 0; i < 4; ++i) {
@@ -1365,8 +1384,9 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj)
right_extruder->sync_ams(nullptr, {}, {}); right_extruder->sync_ams(nullptr, {}, {});
single_extruder->ShowBadge(false); single_extruder->ShowBadge(false);
single_extruder->sync_ams(nullptr, {}, {}); single_extruder->sync_ams(nullptr, {}, {});
btn_sync_printer->SetBorderColor(not_synced_colour); //btn_sync_printer->SetBorderColor(not_synced_colour);
btn_sync_printer->SetIcon("printer_sync"); //btn_sync_printer->SetIcon("printer_sync");
m_printer_bbl_sync->SetBitmap_("printer_sync_not");
}; };
if (!obj || !obj->is_info_ready()) { if (!obj || !obj->is_info_ready()) {
@@ -1518,12 +1538,14 @@ void Sidebar::priv::update_sync_status(const MachineObject *obj)
StateColor synced_colour(std::pair<wxColour, int>(wxColour("#CECECE"), StateColor::Normal)); StateColor synced_colour(std::pair<wxColour, int>(wxColour("#CECECE"), StateColor::Normal));
bool all_extruder_synced = std::all_of(extruder_synced.begin(), extruder_synced.end(), [](bool value) { return value; }); bool all_extruder_synced = std::all_of(extruder_synced.begin(), extruder_synced.end(), [](bool value) { return value; });
if (printer_synced && all_extruder_synced) { if (printer_synced && all_extruder_synced) {
btn_sync_printer->SetBorderColor(synced_colour); // btn_sync_printer->SetBorderColor(synced_colour);
btn_sync_printer->SetIcon("ams_nozzle_sync"); // btn_sync_printer->SetIcon("ams_nozzle_sync");
m_printer_bbl_sync->SetBitmap_("printer_sync_ok");
} }
else { else {
btn_sync_printer->SetBorderColor(not_synced_colour); // btn_sync_printer->SetBorderColor(not_synced_colour);
btn_sync_printer->SetIcon("printer_sync"); // btn_sync_printer->SetIcon("printer_sync");
m_printer_bbl_sync->SetBitmap_("printer_sync_not");
} }
} }
@@ -1531,7 +1553,8 @@ void Sidebar::update_sync_ams_btn_enable(wxUpdateUIEvent &e)
{ {
if (m_last_slice_state != p->plater->is_background_process_slicing()) { if (m_last_slice_state != p->plater->is_background_process_slicing()) {
m_last_slice_state = p->plater->is_background_process_slicing(); m_last_slice_state = p->plater->is_background_process_slicing();
btn_sync->Enable(!m_last_slice_state); //btn_sync->Enable(!m_last_slice_state);
p->m_printer_bbl_sync->Enable(!m_last_slice_state);
ams_btn->Enable(!m_last_slice_state); ams_btn->Enable(!m_last_slice_state);
Refresh(); Refresh();
} }
@@ -1597,6 +1620,20 @@ Sidebar::Sidebar(Plater *parent)
//wizard_t->run(ConfigWizard::RR_USER, ConfigWizard::SP_CUSTOM); //wizard_t->run(ConfigWizard::RR_USER, ConfigWizard::SP_CUSTOM);
}); });
// ORCA use connect button on titlebar
p->m_printer_connect = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "monitor_signal_strong");
p->m_printer_connect->SetToolTip(_L("Connection"));
p->m_printer_connect->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
PhysicalPrinterDialog dlg(this->GetParent());
dlg.ShowModal();
});
// ORCA use sync button on titlebar
p->m_printer_bbl_sync = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "printer_sync_not");
p->m_printer_bbl_sync->SetToolTip(_L("Synchronize nozzle information and the number of AMS"));
p->m_printer_bbl_sync->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
deal_btn_sync();
});
p->m_printer_setting = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "settings"); p->m_printer_setting = new ScalableButton(p->m_panel_printer_title, wxID_ANY, "settings");
p->m_printer_setting->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { p->m_printer_setting->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
@@ -1611,6 +1648,8 @@ Sidebar::Sidebar(Plater *parent)
h_sizer_title->AddSpacer(FromDIP(SidebarProps::ElementSpacing())); h_sizer_title->AddSpacer(FromDIP(SidebarProps::ElementSpacing()));
h_sizer_title->Add(p->m_text_printer_settings, 0, wxALIGN_CENTER); h_sizer_title->Add(p->m_text_printer_settings, 0, wxALIGN_CENTER);
h_sizer_title->AddStretchSpacer(); h_sizer_title->AddStretchSpacer();
h_sizer_title->Add(p->m_printer_connect , 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20)); // used larger margin to prevent accidental clicks
h_sizer_title->Add(p->m_printer_bbl_sync, 0, wxALIGN_CENTER | wxRIGHT, FromDIP(20)); // used larger margin to prevent accidental clicks
h_sizer_title->Add(p->m_printer_setting, 0, wxALIGN_CENTER); h_sizer_title->Add(p->m_printer_setting, 0, wxALIGN_CENTER);
h_sizer_title->AddSpacer(FromDIP(SidebarProps::TitlebarMargin())); h_sizer_title->AddSpacer(FromDIP(SidebarProps::TitlebarMargin()));
h_sizer_title->SetMinSize(-1, 3 * em); h_sizer_title->SetMinSize(-1, 3 * em);
@@ -1641,22 +1680,33 @@ Sidebar::Sidebar(Plater *parent)
/*************************** 2. add printer content ************************/ /*************************** 2. add printer content ************************/
p->m_panel_printer_content = new wxPanel(p->scrolled, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL); p->m_panel_printer_content = new wxPanel(p->scrolled, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
p->m_panel_printer_content->SetBackgroundColour(wxColour(255, 255, 255)); p->m_panel_printer_content->SetBackgroundColour(wxColour(255, 255, 255));
StateColor panel_bd_col(std::pair<wxColour, int>(wxColour("#009688"), StateColor::Pressed), StateColor panel_bd_col(std::pair<wxColour, int>(wxColour("#009688"), StateColor::Pressed),
std::pair<wxColour, int>(wxColour("#009688"), StateColor::Hovered), std::pair<wxColour, int>(wxColour("#009688"), StateColor::Hovered),
std::pair<wxColour, int>(wxColour("#EEEEEE"), StateColor::Normal)); std::pair<wxColour, int>(wxColour("#DBDBDB"), StateColor::Normal));
p->panel_printer_preset = new StaticBox(p->m_panel_printer_content); p->panel_printer_preset = new StaticBox(p->m_panel_printer_content);
p->panel_printer_preset->SetCornerRadius(8); p->panel_printer_preset->SetCornerRadius(FromDIP(8));
p->panel_printer_preset->SetBorderColor(panel_bd_col); p->panel_printer_preset->SetBorderColor(panel_bd_col);
p->panel_printer_preset->SetMinSize(PRINTER_PANEL_SIZE); p->panel_printer_preset->SetMinSize(FromDIP(PRINTER_PANEL_SIZE));
p->panel_printer_preset->Bind(wxEVT_LEFT_DOWN, [this](auto & evt) { p->panel_printer_preset->Bind(wxEVT_LEFT_DOWN, [this](auto & evt) {
p->combo_printer->wxEvtHandler::ProcessEvent(evt); p->combo_printer->wxEvtHandler::ProcessEvent(evt);
}); });
// ORCA Hide Cover automatically if there is not enough space
p->panel_printer_preset->Bind(wxEVT_SIZE, [this](auto & e) {
bool is_narrow = e.GetSize().GetWidth() < p->scrolled->FromDIP(235);
if(is_narrow && p->image_printer->IsShown())
p->image_printer->Hide();
else if(!is_narrow && !p->image_printer->IsShown())
p->image_printer->Show();
e.Skip();
});
ScalableButton *edit_btn = new ScalableButton(p->panel_printer_preset, wxID_ANY, "dot"); ScalableButton *edit_btn = new ScalableButton(p->panel_printer_preset, wxID_ANY, "edit");
edit_btn->SetToolTip(_L("Click to edit preset")); edit_btn->SetToolTip(_L("Click to edit preset"));
edit_btn->Hide(); // hide for first launch
edit_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent) edit_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent)
{ {
p->editing_filament = -1; p->editing_filament = -1;
@@ -1664,17 +1714,33 @@ Sidebar::Sidebar(Plater *parent)
p->editing_filament = 0; p->editing_filament = 0;
}); });
p->btn_edit_printer = edit_btn; p->btn_edit_printer = edit_btn;
ScalableBitmap bitmap_printer(p->panel_printer_preset, "printer_placeholder", 48); ScalableBitmap bitmap_printer(p->panel_printer_preset, "printer_placeholder", PRINTER_THUMBNAIL_SIZE.GetHeight());
p->image_printer = new wxStaticBitmap(p->panel_printer_preset, wxID_ANY, bitmap_printer.bmp(), wxDefaultPosition, PRINTER_THUMBNAIL_SIZE, 0); p->image_printer = new wxStaticBitmap(p->panel_printer_preset, wxID_ANY, bitmap_printer.bmp(), wxDefaultPosition, FromDIP(PRINTER_THUMBNAIL_SIZE), 0);
p->image_printer->Bind(wxEVT_LEFT_DOWN, [this](auto &evt) { p->image_printer->Bind(wxEVT_LEFT_DOWN, [this](auto &evt) {
p->combo_printer->wxEvtHandler::ProcessEvent(evt); p->combo_printer->wxEvtHandler::ProcessEvent(evt);
}); });
PlaterPresetComboBox *combo_printer = new PlaterPresetComboBox(p->panel_printer_preset, Preset::TYPE_PRINTER); PlaterPresetComboBox *combo_printer = new PlaterPresetComboBox(p->panel_printer_preset, Preset::TYPE_PRINTER);
combo_printer->SetWindowStyle(combo_printer->GetWindowStyle() & ~wxALIGN_MASK | wxALIGN_CENTER_HORIZONTAL); //combo_printer->SetWindowStyle(combo_printer->GetWindowStyle() & ~wxALIGN_MASK | wxALIGN_CENTER_HORIZONTAL);
combo_printer->SetBorderWidth(0); combo_printer->SetBorderWidth(0);
p->combo_printer = combo_printer; p->combo_printer = combo_printer;
// ORCA paint whole combobox on focus
auto printer_focus_bg = [this, panel_bd_col](bool focused){
auto bg_color = StateColor::darkModeColorFor(wxColour(focused ? "#E5F0EE" : "#FFFFFF"));
auto panel = p->panel_printer_preset;
panel->SetBackgroundColor(bg_color);
if(focused)
panel->SetBorderColor(wxColour("#009688"));
else
panel->SetBorderColor(panel_bd_col);
p->btn_edit_printer->SetBackgroundColour(bg_color);
p->image_printer->SetBackgroundColour(bg_color);
p->combo_printer->SetBackgroundColour(bg_color); // paints margins instead combo background
};
combo_printer->Bind(wxEVT_SET_FOCUS, [this, printer_focus_bg](auto& e) {printer_focus_bg(true ); e.Skip();});
combo_printer->Bind(wxEVT_KILL_FOCUS, [this, printer_focus_bg](auto& e) {printer_focus_bg(false); e.Skip();});
/* ORCA This part moved to titlebar
p->btn_connect_printer = new ScalableButton(p->panel_printer_preset, wxID_ANY, "monitor_signal_strong"); p->btn_connect_printer = new ScalableButton(p->panel_printer_preset, wxID_ANY, "monitor_signal_strong");
p->btn_connect_printer->SetBackgroundColour(wxColour(255, 255, 255)); p->btn_connect_printer->SetBackgroundColour(wxColour(255, 255, 255));
p->btn_connect_printer->SetToolTip(_L("Connection")); p->btn_connect_printer->SetToolTip(_L("Connection"));
@@ -1683,30 +1749,107 @@ Sidebar::Sidebar(Plater *parent)
PhysicalPrinterDialog dlg(this->GetParent()); PhysicalPrinterDialog dlg(this->GetParent());
dlg.ShowModal(); dlg.ShowModal();
}); });
*/
{ {
auto hovered = std::make_shared<wxWindow *>(); // ORCA use Show/Hide to gain text area instead using blank icon
for (wxWindow *w : std::initializer_list<wxWindow *>{p->panel_printer_preset, edit_btn, p->image_printer, combo_printer}) { for (wxWindow *w : std::initializer_list<wxWindow *>{p->panel_printer_preset, p->btn_edit_printer, p->image_printer, p->combo_printer}) {
w->Bind(wxEVT_ENTER_WINDOW, [w, hovered, edit_btn](wxMouseEvent &evt) { *hovered = w; edit_btn->SetBitmap_("edit"); }); w->Bind(wxEVT_ENTER_WINDOW, [this](wxMouseEvent &e) {
w->Bind(wxEVT_LEAVE_WINDOW, [w, hovered, edit_btn](wxMouseEvent &evt) { if (*hovered == w) { edit_btn->SetBitmap_("dot"); *hovered = nullptr; } }); if(!p->combo_printer->HasFocus())
p->panel_printer_preset->SetBorderColor(wxColour("#009688"));
if(!p->btn_edit_printer->IsShown()){
p->btn_edit_printer->Show();
p->panel_printer_preset->Layout();
}
e.Skip();
});
w->Bind(wxEVT_LEAVE_WINDOW, [this, panel_bd_col](wxMouseEvent &e) {
wxWindow* next_w = wxFindWindowAtPoint(wxGetMousePosition());
if (!next_w || (next_w != p->panel_printer_preset && next_w != p->btn_edit_printer && next_w != p->image_printer && next_w != p->combo_printer)){
if(!p->combo_printer->HasFocus())
p->panel_printer_preset->SetBorderColor(panel_bd_col);
p->btn_edit_printer->Hide();
p->panel_printer_preset->Layout();
}
e.Skip();
});
} }
} }
// ORCA unified Nozzle diameter selection
p->panel_nozzle_dia = new StaticBox(p->m_panel_printer_content);
p->panel_nozzle_dia->SetCornerRadius(FromDIP(8));
p->panel_nozzle_dia->SetBorderColor(panel_bd_col);
p->panel_nozzle_dia->SetMinSize(FromDIP(PRINTER_PANEL_SIZE));
p->panel_nozzle_dia->Bind(wxEVT_LEFT_DOWN, [this](auto & evt) {
p->combo_nozzle_dia->wxEvtHandler::ProcessEvent(evt);
});
p->label_nozzle_title = new Label(p->panel_nozzle_dia, _L("Nozzle"));
p->label_nozzle_title->SetFont(Label::Body_10);
p->label_nozzle_title->Bind(wxEVT_LEFT_DOWN, [this](auto & evt) {
p->combo_nozzle_dia->wxEvtHandler::ProcessEvent(evt);
});
p->combo_nozzle_dia = new ComboBox(p->panel_nozzle_dia, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY);
p->combo_nozzle_dia->SetBorderWidth(0);
p->combo_nozzle_dia->GetDropDown().SetUseContentWidth(true);
p->combo_nozzle_dia->SetMinSize(FromDIP(wxSize(PRINTER_PANEL_SIZE.GetWidth() - 4, 26))); // requires a static value in here
p->combo_nozzle_dia->SetMaxSize(FromDIP(wxSize(PRINTER_PANEL_SIZE.GetWidth() - 4, 26))); // using -1 with wxEXPAND has issues
p->combo_nozzle_dia->Bind(wxEVT_COMBOBOX, [this](auto &e) {
auto evt_combo = (*p->single_extruder).combo_diameter;
evt_combo->SetSelection(e.GetSelection());
wxCommandEvent evt(wxEVT_COMBOBOX, evt_combo->GetId());
evt.SetEventObject(evt_combo);
evt.SetInt(e.GetSelection());
wxPostEvent(evt_combo, evt);
e.Skip();
});
// ORCA paint whole combobox on focus
auto nozzle_focus_bg = [this, panel_bd_col](bool focused){
auto bg_color = StateColor::darkModeColorFor(wxColour(focused ? "#E5F0EE" : "#FFFFFF"));
auto panel = p->panel_nozzle_dia;
panel->SetBackgroundColor(bg_color);
if(focused)
panel->SetBorderColor(wxColour("#009688"));
else
panel->SetBorderColor(panel_bd_col);
p->label_nozzle_title->SetBackgroundColour(bg_color);
p->label_nozzle_type->SetBackgroundColour(bg_color);
p->combo_nozzle_dia->SetBackgroundColour(bg_color); // paints margins instead combo background
};
p->combo_nozzle_dia->Bind(wxEVT_SET_FOCUS, [this, nozzle_focus_bg](auto& e) {nozzle_focus_bg(true ); e.Skip();});
p->combo_nozzle_dia->Bind(wxEVT_KILL_FOCUS, [this, nozzle_focus_bg](auto& e) {nozzle_focus_bg(false); e.Skip();});
p->label_nozzle_type = new Label(p->panel_nozzle_dia, "Brass", wxST_ELLIPSIZE_END | wxALIGN_CENTRE_HORIZONTAL);
p->label_nozzle_type->SetFont(Label::Body_10);
p->label_nozzle_type->SetMinSize(FromDIP(wxSize(56, -1)));
p->label_nozzle_type->SetMaxSize(FromDIP(wxSize(56, -1)));
p->label_nozzle_type->Bind(wxEVT_LEFT_DOWN, [this](auto & evt) {
p->combo_nozzle_dia->wxEvtHandler::ProcessEvent(evt);
});
wxGridSizer *nozzle_dia_sizer = new wxGridSizer(3, 1, FromDIP(2), 0);
nozzle_dia_sizer->Add(p->label_nozzle_title, 0, wxALIGN_CENTER | wxTOP, FromDIP(4));
nozzle_dia_sizer->Add(p->combo_nozzle_dia , 0, wxALIGN_CENTER | wxTOP | wxBOTTOM, FromDIP(2));
nozzle_dia_sizer->Add(p->label_nozzle_type , 0, wxALIGN_CENTER);
p->panel_nozzle_dia->SetSizer(nozzle_dia_sizer);
// Bed type selection // Bed type selection
p->panel_printer_bed = new StaticBox(p->m_panel_printer_content); p->panel_printer_bed = new StaticBox(p->m_panel_printer_content);
p->panel_printer_bed->SetCornerRadius(8); p->panel_printer_bed->SetCornerRadius(FromDIP(8));
p->panel_printer_bed->SetBorderColor(panel_bd_col); p->panel_printer_bed->SetBorderColor(panel_bd_col);
p->panel_printer_bed->SetMinSize(PRINTER_PANEL_SIZE); p->panel_printer_bed->SetMinSize(FromDIP(PRINTER_PANEL_SIZE));
p->panel_printer_bed->Bind(wxEVT_LEFT_DOWN, [this](auto &evt) { p->panel_printer_bed->Bind(wxEVT_LEFT_DOWN, [this](auto &evt) {
p->combo_printer_bed->wxEvtHandler::ProcessEvent(evt); p->combo_printer_bed->wxEvtHandler::ProcessEvent(evt);
}); });
ScalableButton *wiki_bed = new ScalableButton(p->panel_printer_bed, wxID_ANY, "help"); //ScalableButton *wiki_bed = new ScalableButton(p->panel_printer_bed, wxID_ANY, "help");
wiki_bed->Bind(wxEVT_BUTTON, [](wxCommandEvent) { //wiki_bed->Bind(wxEVT_BUTTON, [](wxCommandEvent) {
wxLaunchDefaultBrowser("https://wiki.bambulab.com/en/x1/manual/compatibility-and-parameter-settings-of-filaments"); // wxLaunchDefaultBrowser("https://wiki.bambulab.com/en/x1/manual/compatibility-and-parameter-settings-of-filaments");
}); //});
ScalableBitmap bitmap_bed(p->panel_printer_bed, "printer_placeholder", 32); ScalableBitmap bitmap_bed(p->panel_printer_bed, "printer_placeholder", PRINTER_THUMBNAIL_SIZE.GetHeight());
p->image_printer_bed = new wxStaticBitmap(p->panel_printer_bed, wxID_ANY, bitmap_bed.bmp(), wxDefaultPosition, wxDefaultSize, 0); p->image_printer_bed = new wxStaticBitmap(p->panel_printer_bed, wxID_ANY, bitmap_bed.bmp(), wxDefaultPosition, wxDefaultSize, 0);
p->image_printer_bed->Bind(wxEVT_LEFT_DOWN, [this](auto &evt) { p->image_printer_bed->Bind(wxEVT_LEFT_DOWN, [this](auto &evt) {
p->image_printer_bed->Unbind(wxEVT_LEAVE_WINDOW, &Sidebar::on_leave_image_printer_bed, this); p->image_printer_bed->Unbind(wxEVT_LEAVE_WINDOW, &Sidebar::on_leave_image_printer_bed, this);
@@ -1716,17 +1859,20 @@ Sidebar::Sidebar(Plater *parent)
p->combo_printer_bed->wxEvtHandler::ProcessEvent(evt); p->combo_printer_bed->wxEvtHandler::ProcessEvent(evt);
}); });
p->combo_printer_bed = new ComboBox(p->panel_printer_bed, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY | wxALIGN_CENTER_HORIZONTAL); p->combo_printer_bed = new ComboBox(p->panel_printer_bed, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY);
p->combo_printer_bed->SetBorderWidth(0); p->combo_printer_bed->SetBorderWidth(0);
p->combo_printer_bed->GetDropDown().SetUseContentWidth(true); p->combo_printer_bed->GetDropDown().SetUseContentWidth(true);
p->combo_printer_bed->SetMinSize(FromDIP(wxSize(18,-1))); // ORCA show only arrow
p->combo_printer_bed->SetMaxSize(FromDIP(wxSize(18,-1))); // ORCA show only arrow
reset_bed_type_combox_choices(true); reset_bed_type_combox_choices(true);
p->combo_printer_bed->Bind(wxEVT_COMBOBOX, [this](auto &e) { p->combo_printer_bed->Bind(wxEVT_COMBOBOX, [this](auto &e) {
bool isDual = static_cast<wxBoxSizer *>(p->panel_printer_preset->GetSizer())->GetOrientation() == wxVERTICAL; bool isDual = static_cast<wxBoxSizer *>(p->panel_printer_preset->GetSizer())->GetOrientation() == wxVERTICAL;
auto image_path = get_cur_select_bed_image(); auto image_path = get_cur_select_bed_image();
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, 48)); p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, PRINTER_THUMBNAIL_SIZE.GetHeight()));
if (p->big_bed_image_popup) { if (p->big_bed_image_popup) {
p->big_bed_image_popup->set_bitmap(create_scaled_bitmap("big_" + image_path, p->big_bed_image_popup, p->big_bed_image_popup->get_image_px())); p->big_bed_image_popup->set_bitmap(create_scaled_bitmap("big_" + image_path, p->big_bed_image_popup, p->big_bed_image_popup->get_image_px()));
p->big_bed_image_popup->set_title(p->combo_printer_bed->GetString(p->combo_printer_bed->GetSelection()));
} }
e.Skip(); // fix bug:Event spreads to sidebar e.Skip(); // fix bug:Event spreads to sidebar
}); });
@@ -1737,17 +1883,26 @@ Sidebar::Sidebar(Plater *parent)
}); });
p->image_printer_bed->Bind(wxEVT_ENTER_WINDOW, &Sidebar::on_enter_image_printer_bed, this); p->image_printer_bed->Bind(wxEVT_ENTER_WINDOW, &Sidebar::on_enter_image_printer_bed, this);
wxBoxSizer *bed_type_vsizer = new wxBoxSizer(wxVERTICAL); // ORCA paint whole combobox on focus
bed_type_vsizer->AddStretchSpacer(1); auto bed_focus_bg = [this, panel_bd_col](bool focused){
wxBoxSizer *bed_type_hsizer = new wxBoxSizer(wxHORIZONTAL); auto bg_color = StateColor::darkModeColorFor(wxColour(focused ? "#E5F0EE" : "#FFFFFF"));
bed_type_hsizer->AddStretchSpacer(1); auto panel = p->panel_printer_bed;
bed_type_hsizer->Add(p->image_printer_bed, 1, wxEXPAND | wxTOP, FromDIP(8)); panel->SetBackgroundColor(bg_color);
bed_type_hsizer->Add(wiki_bed, 1, wxTOP, FromDIP(2)); if(focused)
bed_type_vsizer->Add(bed_type_hsizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(8)); panel->SetBorderColor(wxColour("#009688"));
bed_type_vsizer->Add(p->combo_printer_bed, 0, wxEXPAND | wxALL, FromDIP(2)); else
bed_type_vsizer->AddStretchSpacer(1); panel->SetBorderColor(panel_bd_col);
p->image_printer_bed->SetBackgroundColour(bg_color);
p->combo_printer_bed->SetBackgroundColour(bg_color); // paints margins instead combo background
};
p->combo_printer_bed->Bind(wxEVT_SET_FOCUS, [this, bed_focus_bg](auto& e) {bed_focus_bg(true ); e.Skip();});
p->combo_printer_bed->Bind(wxEVT_KILL_FOCUS, [this, bed_focus_bg](auto& e) {bed_focus_bg(false); e.Skip();});
p->panel_printer_bed->SetSizer(bed_type_vsizer); wxBoxSizer *bed_type_sizer = new wxBoxSizer(wxHORIZONTAL);
bed_type_sizer->Add(p->combo_printer_bed, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(2));
bed_type_sizer->Add(p->image_printer_bed, 0, wxALL | wxALIGN_CENTER_VERTICAL, FromDIP(2));
p->panel_printer_bed->SetSizer(bed_type_sizer);
AppConfig *app_config = wxGetApp().app_config; AppConfig *app_config = wxGetApp().app_config;
std::string str_bed_type = app_config->get("curr_bed_type"); std::string str_bed_type = app_config->get("curr_bed_type");
@@ -1771,6 +1926,7 @@ Sidebar::Sidebar(Plater *parent)
BedType bed_type = (BedType)bed_type_value; BedType bed_type = (BedType)bed_type_value;
project_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(bed_type)); project_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(bed_type));
/* ORCA THIS PART MOVED TO TITLEBAR
// Sync printer information // Sync printer information
btn_sync = new Button(p->m_panel_printer_content, _L("Sync info"), "printer_sync", 0, 32); btn_sync = new Button(p->m_panel_printer_content, _L("Sync info"), "printer_sync", 0, 32);
//btn_sync->SetFont(Label::Body_8); //btn_sync->SetFont(Label::Body_8);
@@ -1795,10 +1951,12 @@ Sidebar::Sidebar(Plater *parent)
btn_sync->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { btn_sync->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) {
deal_btn_sync(); deal_btn_sync();
}); });
p->btn_sync_printer = btn_sync;
*/
p->timer_sync_printer->Bind(wxEVT_TIMER, [this] (wxTimerEvent & e) { p->timer_sync_printer->Bind(wxEVT_TIMER, [this] (wxTimerEvent & e) {
p->flush_printer_sync(); p->flush_printer_sync();
}); });
p->btn_sync_printer = btn_sync;
p->left_extruder = new ExtruderGroup(p->m_panel_printer_content, 0, _L("Left Nozzle")); p->left_extruder = new ExtruderGroup(p->m_panel_printer_content, 0, _L("Left Nozzle"));
p->right_extruder = new ExtruderGroup(p->m_panel_printer_content, 1, _L("Right Nozzle")); p->right_extruder = new ExtruderGroup(p->m_panel_printer_content, 1, _L("Right Nozzle"));
@@ -2094,6 +2252,7 @@ void Sidebar::on_enter_image_printer_bed(wxMouseEvent &evt) {
auto image_path = get_cur_select_bed_image(); auto image_path = get_cur_select_bed_image();
p->big_bed_image_popup->set_bitmap(create_scaled_bitmap("big_" + image_path, p->big_bed_image_popup, p->big_bed_image_popup->get_image_px())); p->big_bed_image_popup->set_bitmap(create_scaled_bitmap("big_" + image_path, p->big_bed_image_popup, p->big_bed_image_popup->get_image_px()));
} }
p->big_bed_image_popup->set_title(p->combo_printer_bed->GetString(p->combo_printer_bed->GetSelection()));
p->big_bed_image_popup->SetCanFocus(false); p->big_bed_image_popup->SetCanFocus(false);
p->big_bed_image_popup->SetPosition(temp_pos); p->big_bed_image_popup->SetPosition(temp_pos);
p->big_bed_image_popup->on_show(); p->big_bed_image_popup->on_show();
@@ -2231,13 +2390,15 @@ void Sidebar::update_all_preset_comboboxes()
if (preset_bundle.use_bbl_network()) { if (preset_bundle.use_bbl_network()) {
//only show connection button for not-BBL printer //only show connection button for not-BBL printer
p->btn_connect_printer->Hide(); //p->btn_connect_printer->Hide();
p->m_printer_connect->Hide();
//only show sync-ams button for BBL printer //only show sync-ams button for BBL printer
p->m_bpButton_ams_filament->Show(); p->m_bpButton_ams_filament->Show();
//update print button default value for bbl or third-party printer //update print button default value for bbl or third-party printer
p_mainframe->set_print_button_to_default(MainFrame::PrintSelectType::ePrintPlate); p_mainframe->set_print_button_to_default(MainFrame::PrintSelectType::ePrintPlate);
} else { } else {
p->btn_connect_printer->Show(); //p->btn_connect_printer->Show();
p->m_printer_connect->Show();
p->m_bpButton_ams_filament->Hide(); p->m_bpButton_ams_filament->Hide();
auto print_btn_type = MainFrame::PrintSelectType::eExportGcode; auto print_btn_type = MainFrame::PrintSelectType::eExportGcode;
wxString url = cfg.opt_string("print_host_webui").empty() ? cfg.opt_string("print_host") : cfg.opt_string("print_host_webui"); wxString url = cfg.opt_string("print_host_webui").empty() ? cfg.opt_string("print_host") : cfg.opt_string("print_host_webui");
@@ -2303,6 +2464,9 @@ void Sidebar::update_all_preset_comboboxes()
p->combo_printer_bed->Disable(); p->combo_printer_bed->Disable();
} }
// ORCA Hide plate selector if not supported by printer
p->panel_printer_bed->Show(is_bbl_vendor || cfg.opt_bool("support_multi_bed_types"));
// Update the print choosers to only contain the compatible presets, update the dirty flags. // Update the print choosers to only contain the compatible presets, update the dirty flags.
//BBS //BBS
@@ -2427,12 +2591,38 @@ void Sidebar::update_presets(Preset::Type preset_type)
update_extruder_diameter(*p->left_extruder); update_extruder_diameter(*p->left_extruder);
update_extruder_diameter(*p->right_extruder); update_extruder_diameter(*p->right_extruder);
//} //}
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, 48)); p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, PRINTER_THUMBNAIL_SIZE.GetHeight()));
} else { } else {
AMSCountPopupWindow::UpdateAMSCount(0, p->single_extruder); AMSCountPopupWindow::UpdateAMSCount(0, p->single_extruder);
//if (!p->is_switching_diameter) //if (!p->is_switching_diameter)
update_extruder_diameter(*p->single_extruder); update_extruder_diameter(*p->single_extruder);
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, 48));
// ORCA sync unified nozzle combo box
p->combo_nozzle_dia->Clear();
for (size_t i = 0; i < diameters.size(); ++i)
p->combo_nozzle_dia->Append(diameters[i], {});
p->combo_nozzle_dia->SetSelection((*p->single_extruder).combo_diameter->GetSelection());
// ORCA update nozzle type
const auto& full_config = wxGetApp().preset_bundle->full_config();
wxString nozzle_type = "-";
const ConfigOptionEnumsGenericNullable* cfg_nozzle_type = full_config.option<ConfigOptionEnumsGenericNullable>("nozzle_type");
if(cfg_nozzle_type != nullptr){
std::vector<NozzleType> nozzle_types(cfg_nozzle_type->size());
for (size_t idx = 0; idx < cfg_nozzle_type->size(); ++idx)
nozzle_types[idx] = NozzleType(cfg_nozzle_type->values[idx]);
nozzle_type = _L( // NEEDFIX this part can be replaced with shorter names
nozzle_types[0] == ntHardenedSteel ? "Hardened Steel" :
nozzle_types[0] == ntStainlessSteel ? "Stainless Steel" :
nozzle_types[0] == ntTungstenCarbide ? "Tungsten Carbide" :
nozzle_types[0] == ntBrass ? "Brass"
: "-" // Undefined
);
}
p->label_nozzle_type->SetLabel(nozzle_type);
p->label_nozzle_type->SetToolTip(nozzle_type == "-" ? "" : nozzle_type);
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, PRINTER_THUMBNAIL_SIZE.GetHeight()));
} }
if (GUI::wxGetApp().plater()) if (GUI::wxGetApp().plater())
@@ -2496,8 +2686,8 @@ BedType Sidebar::get_cur_select_bed_type() {
std::string Sidebar::get_cur_select_bed_image() std::string Sidebar::get_cur_select_bed_image()
{ {
auto select_bed_type = get_cur_select_bed_type(); auto select_bed_type = get_cur_select_bed_type();
auto series_suffix_str = m_cur_image_bed_type.empty() ? "" : ("_" + m_cur_image_bed_type); //auto series_suffix_str = m_cur_image_bed_type.empty() ? "" : ("_" + m_cur_image_bed_type);
auto image_path = bed_type_thumbnails[select_bed_type] + series_suffix_str; auto image_path = bed_type_thumbnails[select_bed_type];// + series_suffix_str;
return image_path; return image_path;
} }
@@ -2576,12 +2766,36 @@ void Sidebar::msw_rescale()
p->m_panel_filament_title->GetSizer() p->m_panel_filament_title->GetSizer()
->SetMinSize(-1, 3 * wxGetApp().em_unit()); ->SetMinSize(-1, 3 * wxGetApp().em_unit());
p->m_printer_icon->msw_rescale(); p->m_printer_icon->msw_rescale();
p->m_printer_connect->msw_rescale();
p->m_printer_bbl_sync->msw_rescale();
p->m_printer_icon->msw_rescale();
p->m_printer_setting->msw_rescale(); p->m_printer_setting->msw_rescale();
p->panel_printer_preset->SetMinSize(FromDIP(PRINTER_PANEL_SIZE));
p->panel_printer_preset->SetCornerRadius(FromDIP(8));
p->image_printer->SetSize(FromDIP(PRINTER_THUMBNAIL_SIZE));
update_printer_thumbnail();
p->combo_printer->Rescale();
p->btn_edit_printer->msw_rescale(); p->btn_edit_printer->msw_rescale();
p->image_printer->SetSize(PRINTER_THUMBNAIL_SIZE);
p->panel_nozzle_dia->SetMinSize(FromDIP(PRINTER_PANEL_SIZE));
p->panel_nozzle_dia->SetCornerRadius(FromDIP(8));
p->combo_nozzle_dia->Rescale();
p->panel_printer_bed->SetMinSize(FromDIP(PRINTER_PANEL_SIZE));
p->panel_printer_bed->SetCornerRadius(FromDIP(8));
p->combo_printer_bed->Rescale();
p->combo_printer_bed->SetMinSize(FromDIP(wxSize(18,-1))); // ORCA show only arrow
p->combo_printer_bed->SetMaxSize(FromDIP(wxSize(18,-1))); // ORCA show only arrow
bool isDual = static_cast<wxBoxSizer *>(p->panel_printer_preset->GetSizer())->GetOrientation() == wxVERTICAL; bool isDual = static_cast<wxBoxSizer *>(p->panel_printer_preset->GetSizer())->GetOrientation() == wxVERTICAL;
auto image_path = get_cur_select_bed_image(); auto image_path = get_cur_select_bed_image();
p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, 48)); p->image_printer_bed->SetBitmap(create_scaled_bitmap(image_path, this, PRINTER_THUMBNAIL_SIZE.GetHeight()));
if (p->big_bed_image_popup){ // ORCA force rebuild frame. current wxwidget version not supports wxBITMAP_SCALE_FILL flag on wxStaticBitmap
// also wxImage scaledImage = bit_map.ConvertToImage(); scaledImage.Rescale(FromDIP(m_image_px), FromDIP(m_image_px), wxIMAGE_QUALITY_HIGH);
// didnt worked as expected and it requires use on set_bitmap. so that will try to scale everytime
p->big_bed_image_popup->Destroy();
p->big_bed_image_popup = nullptr;
}
p->m_filament_icon->msw_rescale(); p->m_filament_icon->msw_rescale();
p->m_bpButton_add_filament->msw_rescale(); p->m_bpButton_add_filament->msw_rescale();
@@ -2590,16 +2804,13 @@ void Sidebar::msw_rescale()
p->m_bpButton_set_filament->msw_rescale(); p->m_bpButton_set_filament->msw_rescale();
p->m_flushing_volume_btn->Rescale(); p->m_flushing_volume_btn->Rescale();
//BBS //BBS
p->combo_printer_bed->Rescale();
p->combo_printer_bed->SetMinSize({-1, 3 * wxGetApp().em_unit()});
p->left_extruder->Rescale(); p->left_extruder->Rescale();
p->right_extruder->Rescale(); p->right_extruder->Rescale();
p->single_extruder->Rescale(); p->single_extruder->Rescale();
p->btn_sync_printer->SetPaddingSize({FromDIP(6), FromDIP(12)}); //p->btn_sync_printer->SetPaddingSize({FromDIP(6), FromDIP(12)});
p->btn_sync_printer->SetMinSize(BTN_SYNC_SIZE); //p->btn_sync_printer->SetMinSize(BTN_SYNC_SIZE);
p->panel_printer_bed->SetMinSize(PRINTER_PANEL_SIZE); //p->btn_sync_printer->Rescale();
p->btn_sync_printer->Rescale();
#if 0 #if 0
if (p->mode_sizer) if (p->mode_sizer)
p->mode_sizer->msw_rescale(); p->mode_sizer->msw_rescale();
@@ -2611,7 +2822,7 @@ void Sidebar::msw_rescale()
// //p->combo_printer // //p->combo_printer
// } ) // } )
// combo->msw_rescale(); // combo->msw_rescale();
p->combo_printer->msw_rescale();
for (PlaterPresetComboBox* combo : p->combos_filament) for (PlaterPresetComboBox* combo : p->combos_filament)
combo->msw_rescale(); combo->msw_rescale();
@@ -2658,7 +2869,9 @@ void Sidebar::sys_color_changed()
for (wxWindow* win : std::vector<wxWindow*>{ p->scrolled, p->presets_panel }) for (wxWindow* win : std::vector<wxWindow*>{ p->scrolled, p->presets_panel })
wxGetApp().UpdateAllStaticTextDarkUI(win); wxGetApp().UpdateAllStaticTextDarkUI(win);
#endif #endif
p->btn_sync_printer->SetIcon("printer_sync"); //p->btn_sync_printer->SetIcon("printer_sync");
p->m_printer_bbl_sync->msw_rescale();
p->m_printer_connect->msw_rescale();
// for (wxWindow* btn : std::vector<wxWindow*>{ p->btn_reslice, p->btn_export_gcode }) // for (wxWindow* btn : std::vector<wxWindow*>{ p->btn_reslice, p->btn_export_gcode })
// wxGetApp().UpdateDarkUI(btn, true); // wxGetApp().UpdateDarkUI(btn, true);
p->m_printer_icon->msw_rescale(); p->m_printer_icon->msw_rescale();
@@ -2691,6 +2904,13 @@ void Sidebar::sys_color_changed()
for (PlaterPresetComboBox* combo : p->combos_filament) for (PlaterPresetComboBox* combo : p->combos_filament)
combo->sys_color_changed(); combo->sys_color_changed();
if (p->big_bed_image_popup) // ORCA
p->big_bed_image_popup->sys_color_changed();
p->btn_edit_printer->msw_rescale();
p->image_printer->SetSize(FromDIP(PRINTER_THUMBNAIL_SIZE));
p->image_printer_bed->SetSize(FromDIP(PRINTER_THUMBNAIL_SIZE));
// BBS // BBS
obj_list()->sys_color_changed(); obj_list()->sys_color_changed();
obj_layers()->sys_color_changed(); obj_layers()->sys_color_changed();
@@ -3603,7 +3823,7 @@ void Sidebar::update_printer_thumbnail()
Preset & selected_preset = preset_bundle->printers.get_edited_preset(); Preset & selected_preset = preset_bundle->printers.get_edited_preset();
std::string printer_type = selected_preset.get_current_printer_type(preset_bundle); std::string printer_type = selected_preset.get_current_printer_type(preset_bundle);
if (printer_thumbnails.find(printer_type) != printer_thumbnails.end()) if (printer_thumbnails.find(printer_type) != printer_thumbnails.end())
p->image_printer->SetBitmap(create_scaled_bitmap(printer_thumbnails[printer_type], this, 48)); p->image_printer->SetBitmap(create_scaled_bitmap(printer_thumbnails[printer_type], this, PRINTER_THUMBNAIL_SIZE.GetHeight()));
else { else {
// Orca: try to use the printer model cover as the thumbnail // Orca: try to use the printer model cover as the thumbnail
const auto model_name = selected_preset.config.opt_string("printer_model"); const auto model_name = selected_preset.config.opt_string("printer_model");
@@ -3617,7 +3837,7 @@ void Sidebar::update_printer_thumbnail()
.make_preferred(); .make_preferred();
if (boost::filesystem::exists(cover_path)) { if (boost::filesystem::exists(cover_path)) {
try { try {
p->image_printer->SetBitmap(create_scaled_bitmap(cover_path.string(), this, 48)); p->image_printer->SetBitmap(create_scaled_bitmap(cover_path.string(), this, PRINTER_THUMBNAIL_SIZE.GetHeight()));
printer_thumbnails[printer_type] = cover_path.string(); // Cache the path so we don't look up again printer_thumbnails[printer_type] = cover_path.string(); // Cache the path so we don't look up again
return; return;
} catch (...) {} } catch (...) {}
@@ -3625,7 +3845,7 @@ void Sidebar::update_printer_thumbnail()
} }
} }
} }
p->image_printer->SetBitmap(create_scaled_bitmap("printer_placeholder", this, 48)); p->image_printer->SetBitmap(create_scaled_bitmap("printer_placeholder", this, PRINTER_THUMBNAIL_SIZE.GetHeight()));
printer_thumbnails[printer_type] = "printer_placeholder"; // Avoid unnecessary try printer_thumbnails[printer_type] = "printer_placeholder"; // Avoid unnecessary try
} }
} }