From 73b93d2ed0c7f58a1e636dd2aad3ddee01c8b20c Mon Sep 17 00:00:00 2001 From: yw4z Date: Mon, 17 Nov 2025 18:30:35 +0300 Subject: [PATCH] Compact Printer Selection UI (#11196) --- resources/images/bed_plate_cool_smooth.png | Bin 0 -> 3318 bytes resources/images/bed_plate_cool_supertack.png | Bin 0 -> 2343 bytes resources/images/bed_plate_cool_textured.png | Bin 0 -> 5345 bytes resources/images/bed_plate_engineering.png | Bin 0 -> 2828 bytes .../images/bed_plate_high_temp_smooth.png | Bin 0 -> 2440 bytes resources/images/bed_plate_pei.png | Bin 0 -> 3399 bytes .../images/big_bed_plate_cool_smooth.png | Bin 0 -> 11559 bytes .../images/big_bed_plate_cool_supertack.png | Bin 0 -> 8413 bytes .../images/big_bed_plate_cool_textured.png | Bin 0 -> 16669 bytes .../images/big_bed_plate_engineering.png | Bin 0 -> 8985 bytes .../images/big_bed_plate_high_temp_smooth.png | Bin 0 -> 7930 bytes resources/images/big_bed_plate_pei.png | Bin 0 -> 10369 bytes resources/images/printer_sync_not.svg | 1 + resources/images/printer_sync_ok.svg | 1 + src/slic3r/GUI/ImageDPIFrame.cpp | 34 +- src/slic3r/GUI/ImageDPIFrame.hpp | 4 + src/slic3r/GUI/Plater.cpp | 426 +++++++++++++----- 17 files changed, 357 insertions(+), 109 deletions(-) create mode 100644 resources/images/bed_plate_cool_smooth.png create mode 100644 resources/images/bed_plate_cool_supertack.png create mode 100644 resources/images/bed_plate_cool_textured.png create mode 100644 resources/images/bed_plate_engineering.png create mode 100644 resources/images/bed_plate_high_temp_smooth.png create mode 100644 resources/images/bed_plate_pei.png create mode 100644 resources/images/big_bed_plate_cool_smooth.png create mode 100644 resources/images/big_bed_plate_cool_supertack.png create mode 100644 resources/images/big_bed_plate_cool_textured.png create mode 100644 resources/images/big_bed_plate_engineering.png create mode 100644 resources/images/big_bed_plate_high_temp_smooth.png create mode 100644 resources/images/big_bed_plate_pei.png create mode 100644 resources/images/printer_sync_not.svg create mode 100644 resources/images/printer_sync_ok.svg diff --git a/resources/images/bed_plate_cool_smooth.png b/resources/images/bed_plate_cool_smooth.png new file mode 100644 index 0000000000000000000000000000000000000000..625ebd6325ded24583fd38c8e7239c75a50b00e1 GIT binary patch literal 3318 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 Axc~qF literal 0 HcmV?d00001 diff --git a/resources/images/bed_plate_cool_supertack.png b/resources/images/bed_plate_cool_supertack.png new file mode 100644 index 0000000000000000000000000000000000000000..1c135709434717dcd8b798229c7b9223cb51824f GIT binary patch literal 2343 zcmV+?3E1|DP)TqM^e!d*p_g@EyNgXnAi<8ctWR+n@$Qm zgtVO)$aI3!@vTqETRuX+KxfjIws~oA(;3IE$A-x?CYb^HlsGeXjcaVngB*h~AcO-* zcC1Sg^g&2QmveM3TNfMl8~?S=TI>8dYp=c6-Xm#kZH?aE-fl^fJ_2^LVMvm+@y}D| z&Ye5KGdzwRJJt^zPkHaekR)je_^`jfe;|SN^z?K~l5`=1awZ$kEQxC5Wx#skBuc%# zy_2Yad8)WpOoVPO{przuMO{R4X+y7VC0WKIl1X_p%x!wfgA7F^lkygMCaUljdFuK$t%^p2$T!isj4u;z z6X7sdE}yR)3Ie+mDD8~?^*W4M`g88pGI&wyS}fpSJ@rGjfrj&zq*3 zAaP+1t1Pp(FFBp_y$rGx3wg15?+5_jU%$%Y^{a|DRwH5VobD&+OD3@pYe>^YL{y6J zSuYwvpO=~8i&|AW_s>F`G}iL`Xq`#xIyf&&Qb-LHEo+2JA*SY~!) zNVDxscr+a1?%7j3_RV9J?bN>2Z8%0felr%4e2`b!b_iF~K0xB``O`$hAfD)&R(#oogx_azrl_|EflyI{|$L76qBK{@reQ{o> zPpe&~?r7wp%Ut-Q%x^a!U(Jzy}Y!Ux>H9Tt-7MbD?)(b|wmuKcB zb~Nsz>FE2ER#p)WhnX5Y%l)CjypjhSb|U#$`z>6)l+?>h?JBF;-iX(_u2 z&^M3g(~k*w+=}`}-$@OR4_!MEC0x&LL2oZFHDw!*y-&rfKLg;wm2dHU`Y{pza@JV% zzLQp5)4{qLuGhJqUY=sghGHo@_wO$?`7{!zR$Nm*&}@pAI9=FZ?9{h z;-{|>n7GCC#Q|LVS}3dCh22?Bz~g2ux`N+5&i497>@F9seJzx}@FLZR-oRqB@z^)d zaom=fPJ6jGA4TbPexRE4@NMM=8@iCrnJ4ktRD}Ilg zho0MsuCk+|nzFij0vuqyyU-)keKSD`kFWWFq#Fj$GI^l$P)QAsUv!KwQ;Y;tNb<7HcS>^8{lGXL z3B;L#n_DSaKSauAU(IKs3QsnB@sV{Wq9n_N zODlEQ z*O>k4^CYbH&9`y=_$SGFH~-7*SD)v;3X4j&)kql6-~Y<=&>)Ydr-+6!UzFTnNwZH? zD+1GBuS`06^yr!%L&df>D-?O|Teks)BBEqyi@fxqxe9NQmw6cO2R==>QJI#xSm;)+ z7;&RAAyxQk$BoMLJR{_OpeTKjxM=@MGSfvwl)gw@w0||3sr!MV^z(t|%AVn?9isH} zf#=E|7`)mcNj# zClA1~{(HzhtE;OkA{=fe@&Kf@wOBi_qrI~mNc%x<(Zg;pp~P;-<#b|~?U{or5`xrZ zH*eemHWZPO(cuB0hm<){^azI|JPbT!W@eU$frn}Gr-8hcl_$xX_yY4iI@&v1f!6Ap z>OXGVR<;wK4)P>P;@-XK#6Q1a1ja{4d#9_qruyr$veNw)OXdc7v5>d2vclY)cVp&E z6`a8M=xFck2aXpy4xOV%@k}J&V`Oyr1n?&y^R3I`8dE^e$msCE{{c~B#L}XXU`PM} N002ovPDHLkV1g!Lpf&&i literal 0 HcmV?d00001 diff --git a/resources/images/bed_plate_cool_textured.png b/resources/images/bed_plate_cool_textured.png new file mode 100644 index 0000000000000000000000000000000000000000..0514ec1f50eab84a809191cf5c00307599f44f8c GIT binary patch literal 5345 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 literal 0 HcmV?d00001 diff --git a/resources/images/bed_plate_engineering.png b/resources/images/bed_plate_engineering.png new file mode 100644 index 0000000000000000000000000000000000000000..62a3ad9093969fe834b9c532aae3dc3554197e4a GIT binary patch literal 2828 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 ei`V;lFaHlJa+eDX&yF+z0000UT~6 literal 0 HcmV?d00001 diff --git a/resources/images/bed_plate_high_temp_smooth.png b/resources/images/bed_plate_high_temp_smooth.png new file mode 100644 index 0000000000000000000000000000000000000000..d7f80aee92437833416145deca9317792c37522e GIT binary patch literal 2440 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 literal 0 HcmV?d00001 diff --git a/resources/images/bed_plate_pei.png b/resources/images/bed_plate_pei.png new file mode 100644 index 0000000000000000000000000000000000000000..c94290530425fb9d04359c25229ab47ae25020c6 GIT binary patch literal 3399 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 literal 0 HcmV?d00001 diff --git a/resources/images/big_bed_plate_cool_smooth.png b/resources/images/big_bed_plate_cool_smooth.png new file mode 100644 index 0000000000000000000000000000000000000000..66ea212bc3d2f85ee7e134772a89813c15801585 GIT binary patch literal 11559 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%0AJ8(erauY!e!}UYGHig_a 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 literal 0 HcmV?d00001 diff --git a/resources/images/big_bed_plate_cool_supertack.png b/resources/images/big_bed_plate_cool_supertack.png new file mode 100644 index 0000000000000000000000000000000000000000..bbd607e7a82e1766465930fa7bb079cd14b480db GIT binary patch literal 8413 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 literal 0 HcmV?d00001 diff --git a/resources/images/big_bed_plate_cool_textured.png b/resources/images/big_bed_plate_cool_textured.png new file mode 100644 index 0000000000000000000000000000000000000000..5aee15fc99c953e09e3ad63a1bf457d04c1596fc GIT binary patch literal 16669 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

EJBXoDdE))cLMokJS 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 Uo1`}bcncsk6)oi|C5!O?5BZzxvH$=8 literal 0 HcmV?d00001 diff --git a/resources/images/big_bed_plate_engineering.png b/resources/images/big_bed_plate_engineering.png new file mode 100644 index 0000000000000000000000000000000000000000..2cd6e7fe080bde7606f3095b8f68a8ecf3908104 GIT binary patch literal 8985 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 Jx!%pl{{o}znf3qx literal 0 HcmV?d00001 diff --git a/resources/images/printer_sync_not.svg b/resources/images/printer_sync_not.svg new file mode 100644 index 0000000000..225b67a5fc --- /dev/null +++ b/resources/images/printer_sync_not.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/resources/images/printer_sync_ok.svg b/resources/images/printer_sync_ok.svg new file mode 100644 index 0000000000..4312185601 --- /dev/null +++ b/resources/images/printer_sync_ok.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/slic3r/GUI/ImageDPIFrame.cpp b/src/slic3r/GUI/ImageDPIFrame.cpp index b72a50f603..a893293553 100644 --- a/src/slic3r/GUI/ImageDPIFrame.cpp +++ b/src/slic3r/GUI/ImageDPIFrame.cpp @@ -20,23 +20,32 @@ namespace Slic3r { namespace GUI { ImageDPIFrame::ImageDPIFrame() : DPIFrame(static_cast(wxGetApp().mainframe), wxID_ANY, "", wxDefaultPosition, wxDefaultSize, !wxCAPTION | !wxCLOSE_BOX | wxBORDER_NONE) { - m_image_px = 280; + m_image_px = 240; int width = 270; //SetTransparent(0); SetMinSize(wxSize(FromDIP(width), -1)); SetMaxSize(wxSize(FromDIP(width), -1)); - SetBackgroundColour(wxColour(242, 242, 242, 255)); + SetBackgroundColour(wxColour(255, 255, 255, 255)); #ifdef __APPLE__ SetWindowStyleFlag(GetWindowStyleFlag() | wxSTAY_ON_TOP); #endif - + 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 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); - image_sizer->Add(m_bitmap, 0, wxALIGN_CENTER | wxALL, FromDIP(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(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)); + wxGetApp().UpdateDarkUI(this); // ORCA fix white bg on dark mode + Bind(wxEVT_CLOSE_WINDOW, [this](auto &e) { on_hide(); }); @@ -60,12 +69,24 @@ void ImageDPIFrame::set_bitmap(const wxBitmap &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) { // m_image->Rescale(); //m_bitmap->Rescale(); } +void ImageDPIFrame::sys_color_changed() +{ + wxGetApp().UpdateDarkUI(this); +} + void ImageDPIFrame::init_timer() { m_refresh_timer = new wxTimer(); @@ -76,7 +97,7 @@ void ImageDPIFrame::init_timer() void ImageDPIFrame::on_timer(wxTimerEvent &event) { 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(); Raise(); } @@ -123,6 +144,7 @@ void ImageDPIFrame::on_hide() wxGetApp().mainframe->Raise(); } } + set_title(""); // reset title on hide } } // namespace GUI diff --git a/src/slic3r/GUI/ImageDPIFrame.hpp b/src/slic3r/GUI/ImageDPIFrame.hpp index 02ebb33bf8..817ef6be18 100644 --- a/src/slic3r/GUI/ImageDPIFrame.hpp +++ b/src/slic3r/GUI/ImageDPIFrame.hpp @@ -12,12 +12,14 @@ public: ImageDPIFrame(); ~ImageDPIFrame() override; void on_dpi_changed(const wxRect &suggested_rect) override; + void sys_color_changed(); void on_show(); void on_hide(); bool Show(bool show = true) override; void set_bitmap(const wxBitmap& bit_map); int get_image_px() { return m_image_px; } + void set_title(const wxString& title); private: void init_timer(); @@ -27,6 +29,8 @@ private: wxStaticBitmap *m_bitmap = nullptr; wxBoxSizer *m_sizer_main{nullptr}; int m_image_px; + wxString m_title_str; + wxStaticText* m_title; wxTimer * m_refresh_timer{nullptr}; float m_timer_count = 0; }; diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp index 76b42641c1..937c0e6fdf 100644 --- a/src/slic3r/GUI/Plater.cpp +++ b/src/slic3r/GUI/Plater.cpp @@ -212,8 +212,8 @@ wxDEFINE_EVENT(EVT_DEL_FILAMENT, SimpleEvent); wxDEFINE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent); wxDEFINE_EVENT(EVT_NOTICE_CHILDE_SIZE_CHANGED, SimpleEvent); wxDEFINE_EVENT(EVT_NOTICE_FULL_SCREEN_CHANGED, IntEvent); -#define PRINTER_THUMBNAIL_SIZE (wxSize(FromDIP(48), FromDIP(48))) -#define PRINTER_PANEL_SIZE (wxSize(FromDIP(96), FromDIP(98))) +#define PRINTER_THUMBNAIL_SIZE (wxSize(40, 40)) // ORCA +#define PRINTER_PANEL_SIZE ( wxSize(70, 60)) // ORCA #define BTN_SYNC_SIZE (wxSize(FromDIP(96), FromDIP(98))) static string get_diameter_string(float diameter) @@ -245,12 +245,12 @@ void Plater::show_illegal_characters_warning(wxWindow* parent) } static std::map bed_type_thumbnails = { - {BedType::btPC, "bed_cool"}, - {BedType::btEP, "bed_engineering"}, - {BedType::btPEI, "bed_high_templ"}, - {BedType::btPTE, "bed_pei"}, - {BedType::btPCT, "bed_pei"}, // TODO: Orca hack - {BedType::btSuperTack, "bed_cool_supertack"} + {BedType::btPC, "bed_plate_cool_smooth" }, //"bed_cool"}, + {BedType::btEP, "bed_plate_engineering" }, //"bed_engineering"}, + {BedType::btPEI, "bed_plate_high_temp_smooth"}, //"bed_high_templ"}, + {BedType::btPTE, "bed_plate_pei" }, //"bed_pei"}, + {BedType::btPCT, "bed_plate_cool_textured" }, //"bed_pei"}, // TODO: Orca hack + {BedType::btSuperTack, "bed_plate_cool_supertack" } //"bed_cool_supertack"} }; // print_model_id @@ -425,12 +425,21 @@ struct Sidebar::priv // Printer wxSizer * vsizer_printer = nullptr; + wxBoxSizer * extruder_dual_sizer = nullptr; + wxBoxSizer * extruder_single_sizer = nullptr; // Printer - preset StaticBox * panel_printer_preset = nullptr; wxStaticBitmap * image_printer = nullptr; PlaterPresetComboBox *combo_printer = nullptr; ScalableButton * btn_edit_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 StaticBox * panel_printer_bed = nullptr; wxStaticBitmap *image_printer_bed = nullptr; @@ -438,7 +447,7 @@ struct Sidebar::priv ImageDPIFrame *big_bed_image_popup = nullptr; // Printer - sync - Button *btn_sync_printer; + //Button *btn_sync_printer; std::shared_ptr counter_sync_printer = std::make_shared(); wxTimer * timer_sync_printer = new wxTimer(); // Printer - ams @@ -484,6 +493,8 @@ struct Sidebar::priv // BBS printer config StaticBox* m_panel_printer_title = nullptr; ScalableButton* m_printer_icon = nullptr; + ScalableButton* m_printer_connect = nullptr; + ScalableButton* m_printer_bbl_sync = nullptr; ScalableButton* m_printer_setting = nullptr; wxStaticText * m_text_printer_settings = nullptr; wxPanel* m_panel_printer_content = nullptr; @@ -525,22 +536,15 @@ void Sidebar::priv::layout_printer(bool isBBL, bool isDual) // Printer - preset if (auto sizer = static_cast(panel_printer_preset->GetSizer()); 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) { - wxBoxSizer *vsizer = new wxBoxSizer(wxVERTICAL); wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL); - hsizer->AddStretchSpacer(1); - hsizer->Add(image_printer, 0, wxEXPAND | wxTOP, FromDIP(8)); - hsizer->Add(hsizer_printer_btn, 1, wxEXPAND, 0); - hsizer->AddSpacer(FromDIP(6)); - vsizer->AddSpacer(FromDIP(4)); - vsizer->Add(hsizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(8)); - vsizer->Add(combo_printer, 0, wxEXPAND | wxALL, FromDIP(4)); - panel_printer_preset->SetSizer(vsizer); + hsizer->Add(image_printer, 0, wxLEFT | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(10)); + hsizer->Add(combo_printer, 1, wxEXPAND | wxALL | wxALIGN_LEFT | wxALIGN_CENTER_VERTICAL, FromDIP(2)); + hsizer->AddSpacer(FromDIP(2)); + hsizer->Add(btn_edit_printer, 0, wxRIGHT | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(SidebarProps::IconSpacing())); + //hsizer->Add(btn_connect_printer, 0, wxRIGHT | wxALIGN_RIGHT | wxALIGN_CENTER_VERTICAL, FromDIP(SidebarProps::IconSpacing())); + panel_printer_preset->SetSizer(hsizer); //} else { // wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL); // 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) { wxBoxSizer *hsizer_printer = new wxBoxSizer(wxHORIZONTAL); hsizer_printer->Add(panel_printer_preset, 1, wxEXPAND, 0); - hsizer_printer->Add(panel_printer_bed, 0, wxLEFT | wxEXPAND, FromDIP(4)); - hsizer_printer->Add(btn_sync_printer, 0, wxLEFT | wxEXPAND, FromDIP(4)); - vsizer_printer->Add(hsizer_printer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, FromDIP(4)); - vsizer_printer->AddSpacer(FromDIP(4)); + hsizer_printer->Add(panel_nozzle_dia , 0, wxLEFT, FromDIP(4)); + hsizer_printer->Add(panel_printer_bed, 0, wxLEFT, FromDIP(4)); + //hsizer_printer->Add(btn_sync_printer , 0, wxLEFT, 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 // double - auto hsizer_extruder = new wxBoxSizer(wxHORIZONTAL); - hsizer_extruder->Add(left_extruder->sizer, 1, wxEXPAND, 0); - hsizer_extruder->AddSpacer(FromDIP(4)); - hsizer_extruder->Add(right_extruder->sizer, 1, wxEXPAND, 0); + extruder_dual_sizer = new wxBoxSizer(wxHORIZONTAL); + extruder_dual_sizer->Add(left_extruder->sizer, 1, wxEXPAND, 0); + extruder_dual_sizer->AddSpacer(FromDIP(4)); + extruder_dual_sizer->Add(right_extruder->sizer, 1, wxEXPAND, 0); // single - vsizer_printer->Add(hsizer_extruder, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(4)); - vsizer_printer->Add(single_extruder->sizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(4)); + extruder_single_sizer = single_extruder->sizer; + 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_sync_printer->Show(isBBL); - panel_printer_bed->Show(true); // Orca: always show bed type selector - vsizer_printer->GetItem(2)->GetSizer()->GetItem(1)->Show(isDual); - vsizer_printer->GetItem(2)->Show(isDual); // Orca: always show diameter selection - vsizer_printer->GetItem(3)->Show(!isDual); + //btn_connect_printer->Show(!isBBL); + m_printer_connect->Show(!isBBL); + //btn_sync_printer->Show(isBBL); + m_printer_bbl_sync->Show(isBBL); + + // 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) @@ -587,7 +605,8 @@ void Sidebar::priv::flush_printer_sync(bool restart) *counter_sync_printer = 6; 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) timer_sync_printer->Stop(); } @@ -996,13 +1015,13 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title // Nozzle wxStaticText *label_diameter = new wxStaticText(this, wxID_ANY, _L("Diameter")); 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}); auto combo_diameter = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); this->combo_diameter = combo_diameter; wxStaticText *label_flow = new wxStaticText(this, wxID_ANY, _L("Flow")); 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}); auto combo_flow = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); combo_flow->GetDropDown().SetUseContentWidth(true); @@ -1017,7 +1036,7 @@ ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title // AMS wxStaticText *label_ams = new wxStaticText(this, wxID_ANY, _L("AMS")); label_ams->SetFont(Label::Body_14); - label_ams->SetForegroundColour("#262E30"); + label_ams->SetForegroundColour(StateColor::darkModeColorFor(wxColour("#262E30"))); //label_ams->SetMinSize({FromDIP(70), -1}); if (index >= 0) { 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_msg = new wxStaticText(this, wxID_ANY, _L("Not installed")); 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 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, {}, {}); single_extruder->ShowBadge(false); single_extruder->sync_ams(nullptr, {}, {}); - btn_sync_printer->SetBorderColor(not_synced_colour); - btn_sync_printer->SetIcon("printer_sync"); + //btn_sync_printer->SetBorderColor(not_synced_colour); + //btn_sync_printer->SetIcon("printer_sync"); + m_printer_bbl_sync->SetBitmap_("printer_sync_not"); }; 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("#CECECE"), StateColor::Normal)); bool all_extruder_synced = std::all_of(extruder_synced.begin(), extruder_synced.end(), [](bool value) { return value; }); if (printer_synced && all_extruder_synced) { - btn_sync_printer->SetBorderColor(synced_colour); - btn_sync_printer->SetIcon("ams_nozzle_sync"); + // btn_sync_printer->SetBorderColor(synced_colour); + // btn_sync_printer->SetIcon("ams_nozzle_sync"); + m_printer_bbl_sync->SetBitmap_("printer_sync_ok"); } else { - btn_sync_printer->SetBorderColor(not_synced_colour); - btn_sync_printer->SetIcon("printer_sync"); + // btn_sync_printer->SetBorderColor(not_synced_colour); + // 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()) { 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); Refresh(); } @@ -1597,6 +1620,20 @@ Sidebar::Sidebar(Plater *parent) //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->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { @@ -1611,6 +1648,8 @@ Sidebar::Sidebar(Plater *parent) h_sizer_title->AddSpacer(FromDIP(SidebarProps::ElementSpacing())); h_sizer_title->Add(p->m_text_printer_settings, 0, wxALIGN_CENTER); 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->AddSpacer(FromDIP(SidebarProps::TitlebarMargin())); h_sizer_title->SetMinSize(-1, 3 * em); @@ -1641,22 +1680,33 @@ Sidebar::Sidebar(Plater *parent) /*************************** 2. add printer content ************************/ + 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)); StateColor panel_bd_col(std::pair(wxColour("#009688"), StateColor::Pressed), std::pair(wxColour("#009688"), StateColor::Hovered), - std::pair(wxColour("#EEEEEE"), StateColor::Normal)); + std::pair(wxColour("#DBDBDB"), StateColor::Normal)); 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->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->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->Hide(); // hide for first launch edit_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent) { p->editing_filament = -1; @@ -1664,17 +1714,33 @@ Sidebar::Sidebar(Plater *parent) p->editing_filament = 0; }); p->btn_edit_printer = edit_btn; - ScalableBitmap bitmap_printer(p->panel_printer_preset, "printer_placeholder", 48); - p->image_printer = new wxStaticBitmap(p->panel_printer_preset, wxID_ANY, bitmap_printer.bmp(), wxDefaultPosition, PRINTER_THUMBNAIL_SIZE, 0); + 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, FromDIP(PRINTER_THUMBNAIL_SIZE), 0); p->image_printer->Bind(wxEVT_LEFT_DOWN, [this](auto &evt) { p->combo_printer->wxEvtHandler::ProcessEvent(evt); }); 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); 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->SetBackgroundColour(wxColour(255, 255, 255)); p->btn_connect_printer->SetToolTip(_L("Connection")); @@ -1683,30 +1749,107 @@ Sidebar::Sidebar(Plater *parent) PhysicalPrinterDialog dlg(this->GetParent()); dlg.ShowModal(); }); - + */ { - auto hovered = std::make_shared(); - for (wxWindow *w : std::initializer_list{p->panel_printer_preset, edit_btn, p->image_printer, combo_printer}) { - w->Bind(wxEVT_ENTER_WINDOW, [w, hovered, edit_btn](wxMouseEvent &evt) { *hovered = w; edit_btn->SetBitmap_("edit"); }); - w->Bind(wxEVT_LEAVE_WINDOW, [w, hovered, edit_btn](wxMouseEvent &evt) { if (*hovered == w) { edit_btn->SetBitmap_("dot"); *hovered = nullptr; } }); + // ORCA use Show/Hide to gain text area instead using blank icon + for (wxWindow *w : std::initializer_list{p->panel_printer_preset, p->btn_edit_printer, p->image_printer, p->combo_printer}) { + w->Bind(wxEVT_ENTER_WINDOW, [this](wxMouseEvent &e) { + 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 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->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->combo_printer_bed->wxEvtHandler::ProcessEvent(evt); }); - ScalableButton *wiki_bed = new ScalableButton(p->panel_printer_bed, wxID_ANY, "help"); - wiki_bed->Bind(wxEVT_BUTTON, [](wxCommandEvent) { - wxLaunchDefaultBrowser("https://wiki.bambulab.com/en/x1/manual/compatibility-and-parameter-settings-of-filaments"); - }); + //ScalableButton *wiki_bed = new ScalableButton(p->panel_printer_bed, wxID_ANY, "help"); + //wiki_bed->Bind(wxEVT_BUTTON, [](wxCommandEvent) { + // 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->Bind(wxEVT_LEFT_DOWN, [this](auto &evt) { 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 = 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->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); p->combo_printer_bed->Bind(wxEVT_COMBOBOX, [this](auto &e) { bool isDual = static_cast(p->panel_printer_preset->GetSizer())->GetOrientation() == wxVERTICAL; 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) { 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 }); @@ -1737,17 +1883,26 @@ Sidebar::Sidebar(Plater *parent) }); p->image_printer_bed->Bind(wxEVT_ENTER_WINDOW, &Sidebar::on_enter_image_printer_bed, this); - wxBoxSizer *bed_type_vsizer = new wxBoxSizer(wxVERTICAL); - bed_type_vsizer->AddStretchSpacer(1); - wxBoxSizer *bed_type_hsizer = new wxBoxSizer(wxHORIZONTAL); - bed_type_hsizer->AddStretchSpacer(1); - bed_type_hsizer->Add(p->image_printer_bed, 1, wxEXPAND | wxTOP, FromDIP(8)); - bed_type_hsizer->Add(wiki_bed, 1, wxTOP, FromDIP(2)); - bed_type_vsizer->Add(bed_type_hsizer, 0, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(8)); - bed_type_vsizer->Add(p->combo_printer_bed, 0, wxEXPAND | wxALL, FromDIP(2)); - bed_type_vsizer->AddStretchSpacer(1); + // ORCA paint whole combobox on focus + auto bed_focus_bg = [this, panel_bd_col](bool focused){ + auto bg_color = StateColor::darkModeColorFor(wxColour(focused ? "#E5F0EE" : "#FFFFFF")); + auto panel = p->panel_printer_bed; + panel->SetBackgroundColor(bg_color); + if(focused) + panel->SetBorderColor(wxColour("#009688")); + else + 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; 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; project_config.set_key_value("curr_bed_type", new ConfigOptionEnum(bed_type)); + /* ORCA THIS PART MOVED TO TITLEBAR // Sync printer information btn_sync = new Button(p->m_panel_printer_content, _L("Sync info"), "printer_sync", 0, 32); //btn_sync->SetFont(Label::Body_8); @@ -1795,10 +1951,12 @@ Sidebar::Sidebar(Plater *parent) btn_sync->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { deal_btn_sync(); }); + p->btn_sync_printer = btn_sync; + */ p->timer_sync_printer->Bind(wxEVT_TIMER, [this] (wxTimerEvent & e) { 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->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(); 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->SetPosition(temp_pos); p->big_bed_image_popup->on_show(); @@ -2231,13 +2390,15 @@ void Sidebar::update_all_preset_comboboxes() if (preset_bundle.use_bbl_network()) { //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 p->m_bpButton_ams_filament->Show(); //update print button default value for bbl or third-party printer p_mainframe->set_print_button_to_default(MainFrame::PrintSelectType::ePrintPlate); } else { - p->btn_connect_printer->Show(); + //p->btn_connect_printer->Show(); + p->m_printer_connect->Show(); p->m_bpButton_ams_filament->Hide(); 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"); @@ -2303,6 +2464,9 @@ void Sidebar::update_all_preset_comboboxes() 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. //BBS @@ -2427,12 +2591,38 @@ void Sidebar::update_presets(Preset::Type preset_type) update_extruder_diameter(*p->left_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 { AMSCountPopupWindow::UpdateAMSCount(0, p->single_extruder); //if (!p->is_switching_diameter) 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("nozzle_type"); + if(cfg_nozzle_type != nullptr){ + std::vector 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()) @@ -2496,8 +2686,8 @@ BedType Sidebar::get_cur_select_bed_type() { std::string Sidebar::get_cur_select_bed_image() { 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 image_path = bed_type_thumbnails[select_bed_type] + series_suffix_str; + //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; return image_path; } @@ -2576,12 +2766,36 @@ void Sidebar::msw_rescale() p->m_panel_filament_title->GetSizer() ->SetMinSize(-1, 3 * wxGetApp().em_unit()); 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->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->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(p->panel_printer_preset->GetSizer())->GetOrientation() == wxVERTICAL; 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_bpButton_add_filament->msw_rescale(); @@ -2590,16 +2804,13 @@ void Sidebar::msw_rescale() p->m_bpButton_set_filament->msw_rescale(); p->m_flushing_volume_btn->Rescale(); //BBS - p->combo_printer_bed->Rescale(); - p->combo_printer_bed->SetMinSize({-1, 3 * wxGetApp().em_unit()}); p->left_extruder->Rescale(); p->right_extruder->Rescale(); p->single_extruder->Rescale(); - p->btn_sync_printer->SetPaddingSize({FromDIP(6), FromDIP(12)}); - 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->SetPaddingSize({FromDIP(6), FromDIP(12)}); + //p->btn_sync_printer->SetMinSize(BTN_SYNC_SIZE); + //p->btn_sync_printer->Rescale(); #if 0 if (p->mode_sizer) p->mode_sizer->msw_rescale(); @@ -2611,7 +2822,7 @@ void Sidebar::msw_rescale() // //p->combo_printer // } ) // combo->msw_rescale(); - p->combo_printer->msw_rescale(); + for (PlaterPresetComboBox* combo : p->combos_filament) combo->msw_rescale(); @@ -2658,7 +2869,9 @@ void Sidebar::sys_color_changed() for (wxWindow* win : std::vector{ p->scrolled, p->presets_panel }) wxGetApp().UpdateAllStaticTextDarkUI(win); #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{ p->btn_reslice, p->btn_export_gcode }) // wxGetApp().UpdateDarkUI(btn, true); p->m_printer_icon->msw_rescale(); @@ -2691,6 +2904,13 @@ void Sidebar::sys_color_changed() for (PlaterPresetComboBox* combo : p->combos_filament) 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 obj_list()->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(); std::string printer_type = selected_preset.get_current_printer_type(preset_bundle); 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 { // Orca: try to use the printer model cover as the thumbnail const auto model_name = selected_preset.config.opt_string("printer_model"); @@ -3617,7 +3837,7 @@ void Sidebar::update_printer_thumbnail() .make_preferred(); if (boost::filesystem::exists(cover_path)) { 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 return; } 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 } }