ENH: new printer layout

Change-Id: I8acc59b2446a13c8f7fe3a6bdf090f39d4896b1f
Jira: STUDIO-8859
(cherry picked from commit d723fa714f34d572052b5cae0847472529f2c62f)
This commit is contained in:
chunmao.guo 2024-11-26 13:31:52 +08:00 committed by Noisyfox
parent c9ed30bc59
commit d1f45e87b0
5 changed files with 310 additions and 161 deletions

View file

@ -0,0 +1,3 @@
<svg width="13" height="13" viewBox="0 0 13 13" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.48975 2.84082C7.56719 2.84082 8.6005 3.26883 9.36237 4.0307C10.1242 4.79257 10.5522 5.82588 10.5522 6.90332C10.5522 7.98076 10.1242 9.01408 9.36237 9.77594C8.6005 10.5378 7.56719 10.9658 6.48975 10.9658C5.4123 10.9658 4.37899 10.5378 3.61712 9.77594C2.85526 9.01408 2.42725 7.98076 2.42725 6.90332C2.42725 5.82588 2.85526 4.79257 3.61712 4.0307C4.37899 3.26883 5.4123 2.84082 6.48975 2.84082ZM6.48975 11.9033C7.81583 11.9033 9.0876 11.3765 10.0253 10.4389C10.963 9.50117 11.4897 8.2294 11.4897 6.90332C11.4897 5.57724 10.963 4.30547 10.0253 3.36779C9.0876 2.4301 7.81583 1.90332 6.48975 1.90332C5.16366 1.90332 3.89189 2.4301 2.95421 3.36779C2.01653 4.30547 1.48975 5.57724 1.48975 6.90332C1.48975 8.2294 2.01653 9.50117 2.95421 10.4389C3.89189 11.3765 5.16366 11.9033 6.48975 11.9033ZM5.7085 8.46582C5.44873 8.46582 5.23975 8.6748 5.23975 8.93457C5.23975 9.19434 5.44873 9.40332 5.7085 9.40332H7.271C7.53076 9.40332 7.73975 9.19434 7.73975 8.93457C7.73975 8.6748 7.53076 8.46582 7.271 8.46582H7.11475V6.74707C7.11475 6.4873 6.90576 6.27832 6.646 6.27832H5.7085C5.44873 6.27832 5.23975 6.4873 5.23975 6.74707C5.23975 7.00684 5.44873 7.21582 5.7085 7.21582H6.17725V8.46582H5.7085ZM6.48975 5.65332C6.65551 5.65332 6.81448 5.58747 6.93169 5.47026C7.0489 5.35305 7.11475 5.19408 7.11475 5.02832C7.11475 4.86256 7.0489 4.70359 6.93169 4.58638C6.81448 4.46917 6.65551 4.40332 6.48975 4.40332C6.32399 4.40332 6.16501 4.46917 6.0478 4.58638C5.93059 4.70359 5.86475 4.86256 5.86475 5.02832C5.86475 5.19408 5.93059 5.35305 6.0478 5.47026C6.16501 5.58747 6.32399 5.65332 6.48975 5.65332Z" fill="#6B6B6B"/>
</svg>

After

Width:  |  Height:  |  Size: 1.7 KiB

View file

@ -203,6 +203,7 @@ wxDEFINE_EVENT(EVT_MODIFY_FILAMENT, SimpleEvent);
wxDEFINE_EVENT(EVT_ADD_FILAMENT, SimpleEvent);
wxDEFINE_EVENT(EVT_DEL_FILAMENT, SimpleEvent);
wxDEFINE_EVENT(EVT_ADD_CUSTOM_FILAMENT, ColorEvent);
bool Plater::has_illegal_filename_characters(const wxString& wxs_name)
{
std::string name = into_u8(wxs_name);
@ -324,29 +325,63 @@ int SidebarProps::ContentMargin() { return 12; } // Use as side margins content
int SidebarProps::IconSpacing() { return 10; } // Use on main elements
int SidebarProps::ElementSpacing() { return 5; } // Use if elements has relation between them like edit button for combo box etc.
struct ExtruderGroup : StaticGroup
{
ExtruderGroup(wxWindow * parent, int index, wxString const &title);
wxStaticBoxSizer *sizer = nullptr;
ScalableButton * btn_edit = nullptr;
ComboBox * combo_nozzle = nullptr;
AMSPreview * ams[4] = {nullptr};
void Rescale()
{
if (btn_edit)
btn_edit->msw_rescale();
combo_nozzle->Rescale();
}
};
struct Sidebar::priv
{
Plater *plater;
wxPanel *scrolled;
PlaterPresetComboBox *combo_print;
wxPanel *scrolled = nullptr;
PlaterPresetComboBox *combo_sla_print = nullptr;
PlaterPresetComboBox *combo_sla_material = nullptr;
// Printer
wxSizer * vsizer_printer = 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;
// Printer - bed
StaticBox * panel_printer_bed = nullptr;
wxStaticBitmap *image_printer_bed = nullptr;
ComboBox * combo_printer_bed = nullptr;
// Printer - sync
Button *btn_sync_printer;
// Printer - ams
ExtruderGroup *left_extruder = nullptr;
ExtruderGroup *right_extruder = nullptr;
ExtruderGroup *single_extruder = nullptr;
int FromDIP(int n) { return plater->FromDIP(n); }
void layout_printer(bool isBBL, bool isDual);
PlaterPresetComboBox *combo_print = nullptr;
std::vector<PlaterPresetComboBox*> combos_filament;
int editing_filament = -1;
wxBoxSizer *sizer_filaments;
PlaterPresetComboBox *combo_sla_print;
PlaterPresetComboBox *combo_sla_material;
PlaterPresetComboBox* combo_printer = nullptr;
wxBoxSizer *sizer_params;
wxBoxSizer *sizer_filaments = nullptr;
//BBS Sidebar widgets
wxPanel* m_panel_print_title;
wxStaticText* m_staticText_print_title;
wxPanel* m_panel_print_content;
wxBoxSizer *sizer_params;
//wxComboBox * m_comboBox_print_preset;
ComboBox * m_bed_type_list = nullptr;
wxStaticText * m_left_ams_count = nullptr;
wxStaticText * m_right_ams_count = nullptr;
wxSizer * m_dual_extruder_sizer = nullptr;
wxStaticLine * m_staticline1;
StaticBox* m_panel_filament_title;
wxStaticText* m_staticText_filament_settings;
@ -369,7 +404,6 @@ struct Sidebar::priv
StaticBox* m_panel_printer_title = nullptr;
ScalableButton* m_printer_icon = nullptr;
ScalableButton* m_printer_setting = nullptr;
Button *m_extruder_sync = nullptr;
wxStaticText * m_text_printer_settings = nullptr;
wxPanel* m_panel_printer_content = nullptr;
@ -402,6 +436,66 @@ struct Sidebar::priv
#endif
};
void Sidebar::priv::layout_printer(bool isBBL, bool isDual)
{
// Printer - preset
if (auto sizer = static_cast<wxBoxSizer *>(panel_printer_preset->GetSizer());
sizer == nullptr || isDual != (sizer->GetOrientation() == wxVERTICAL)) {
wxBoxSizer *hsizer_printer_btn = new wxBoxSizer(wxHORIZONTAL);
hsizer_printer_btn->AddStretchSpacer(1);
hsizer_printer_btn->Add(btn_edit_printer, 0, wxALIGN_CENTER | wxLEFT, FromDIP(4));
hsizer_printer_btn->Add(btn_connect_printer, 0, wxALIGN_CENTER | wxLEFT, FromDIP(4));
combo_printer->SetWindowStyle(combo_printer->GetWindowStyle() & ~wxALIGN_MASK | (isDual ? wxALIGN_CENTER_HORIZONTAL : wxALIGN_RIGHT));
if (isDual) {
wxBoxSizer *vsizer = new wxBoxSizer(wxVERTICAL);
vsizer->AddStretchSpacer(1);
wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL);
hsizer->AddStretchSpacer(1);
hsizer->Add(image_printer, 0);
hsizer->Add(hsizer_printer_btn, 1, wxRIGHT, FromDIP(12));
vsizer->Add(hsizer, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(4));
vsizer->Add(combo_printer, 0, wxEXPAND | wxALL, FromDIP(4));
vsizer->AddStretchSpacer(1);
panel_printer_preset->SetSizer(vsizer);
} else {
wxBoxSizer *hsizer = new wxBoxSizer(wxHORIZONTAL);
hsizer->Add(image_printer, 0, wxLEFT | wxALIGN_CENTER, FromDIP(4));
wxBoxSizer *vsizer = new wxBoxSizer(wxVERTICAL);
vsizer->AddSpacer(FromDIP(4));
vsizer->Add(hsizer_printer_btn, 1, wxEXPAND | wxRIGHT, FromDIP(16));
vsizer->Add(combo_printer, 0, wxEXPAND | wxLEFT, FromDIP(4));
vsizer->AddStretchSpacer(1);
vsizer->AddSpacer(FromDIP(4));
hsizer->Add(vsizer, 1, wxEXPAND | wxLEFT | wxRIGHT, FromDIP(4));
panel_printer_preset->SetSizer(hsizer);
}
}
if (vsizer_printer->GetItemCount() == 0) {
wxBoxSizer *hsizer_printer = new wxBoxSizer(wxHORIZONTAL);
hsizer_printer->Add(panel_printer_preset, 1, wxEXPAND);
hsizer_printer->Add(panel_printer_bed, 0, wxLEFT | wxEXPAND, FromDIP(4));
hsizer_printer->Add(btn_sync_printer, 0, wxLEFT | wxEXPAND, FromDIP(4));
// Printer - extruder
auto hsizer_extruder = new wxBoxSizer(wxHORIZONTAL);
hsizer_extruder->Add(left_extruder->sizer, 1, wxEXPAND);
hsizer_extruder->Add(right_extruder->sizer, 1, wxLEFT | wxEXPAND, FromDIP(4));
vsizer_printer->Add(hsizer_printer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, FromDIP(4));
vsizer_printer->Add(hsizer_extruder, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, FromDIP(4));
vsizer_printer->Add(single_extruder->sizer, 0, wxEXPAND | wxLEFT | wxRIGHT | wxTOP, FromDIP(4));
vsizer_printer->AddSpacer(FromDIP(4));
}
btn_connect_printer->Show(!isBBL);
btn_sync_printer->Show(isDual);
panel_printer_bed->Show(isBBL);
vsizer_printer->GetItem(1)->GetSizer()->GetItem(1)->Show(isDual);
vsizer_printer->GetItem(1)->Show(isBBL && isDual);
vsizer_printer->GetItem(2)->Show(isBBL && !isDual);
}
Sidebar::priv::~priv()
{
// BBS
@ -657,8 +751,8 @@ static DynamicFilamentList1Based dynamic_filament_list_1_based;
class AMSCountPopupWindow : public PopupWindow
{
public:
AMSCountPopupWindow(wxWindow * parent, wxStaticText *text, int index)
: PopupWindow(parent, wxBORDER_NONE | wxPU_CONTAINS_CONTROLS)
AMSCountPopupWindow(ExtruderGroup *extruder, int index)
: PopupWindow(extruder, wxBORDER_NONE | wxPU_CONTAINS_CONTROLS)
{
auto msg = new wxStaticText(this, wxID_ANY, _L("Please set the number of ams installed on the this extrusion head."));
msg->SetFont(Label::Body_14);
@ -676,9 +770,9 @@ public:
GetAMSCount(index, ams4, ams1);
auto val4 = new SpinInput(this, {}, {}, wxDefaultPosition, {FromDIP(60), -1}, 0, 0, 4, ams4);
auto val1 = new SpinInput(this, {}, {}, wxDefaultPosition, {FromDIP(60), -1}, 0, 0, 8, ams1);
auto event_handler = [index, val4, val1, text](auto &evt) {
auto event_handler = [index, val4, val1, extruder](auto &evt) {
SetAMSCount(index, val4->GetValue(), val1->GetValue());
UpdateAMSCount(index, text);
UpdateAMSCount(index, extruder);
};
val4->Bind(wxEVT_SPINCTRL, event_handler);
val1->Bind(wxEVT_SPINCTRL, event_handler);
@ -740,7 +834,7 @@ public:
}
}
static void UpdateAMSCount(int index, wxStaticText *text)
static void UpdateAMSCount(int index, ExtruderGroup *extruder)
{
std::vector<std::map<int, int>> &ams_counts = wxGetApp().preset_bundle->extruder_ams_counts;
ams_counts.resize(2);
@ -752,10 +846,75 @@ public:
ams_map[1] = 0;
}
std::string ams_info = std::to_string(ams_map[4]) + "/" + std::to_string(ams_map[1]);
text->SetLabel(from_u8(ams_info));
//*extruder = from_u8(ams_info);
}
};
ExtruderGroup::ExtruderGroup(wxWindow * parent, int index, wxString const &title)
: StaticGroup(parent, wxID_ANY, title)
{
SetFont(Label::Body_10);
SetForegroundColour("#909090");
ShowBadge(true);
// Nozzle
wxStaticText *label_nozzle = new wxStaticText(this, wxID_ANY, _L("Nozzle"));
label_nozzle->SetFont(Label::Body_14);
label_nozzle->SetForegroundColour("#262E30");
auto combo_nozzle = new ComboBox(this, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY);
combo_nozzle->GetDropDown().SetUseContentWidth(true);
combo_nozzle->Bind(wxEVT_COMBOBOX, [this, index, combo_nozzle](wxCommandEvent &evt) {
auto printer_tab = dynamic_cast<TabPrinter *>(wxGetApp().get_tab(Preset::TYPE_PRINTER));
printer_tab->set_extruder_volume_type(index, NozzleVolumeType(intptr_t(combo_nozzle->GetClientData(evt.GetInt()))));
});
this->combo_nozzle = combo_nozzle;
// AMS
wxStaticText *label_ams = new wxStaticText(this, wxID_ANY, _L("AMS"));
label_ams->SetFont(Label::Body_14);
label_ams->SetForegroundColour("#262E30");
if (index >= 0) {
btn_edit = new ScalableButton(this, wxID_ANY, "dot");
btn_edit->SetBackgroundColour(*wxWHITE);
btn_edit->Hide();
btn_edit->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [this, index](auto &evt) {
PopupWindow *window = new AMSCountPopupWindow(this, index);
auto size = GetSize();
auto pos = ClientToScreen({0, size.y + 12});
size.SetWidth(size.GetWidth() + FromDIP(10));
window->Position(pos, {0, 0});
window->Popup();
});
auto hovered = std::make_shared<wxWindow *>();
for (wxWindow *w : std::initializer_list<wxWindow *>{this, label_nozzle, combo_nozzle, btn_edit, label_ams}) {
w->Bind(wxEVT_ENTER_WINDOW, [w, hovered, this](wxMouseEvent &evt) { *hovered = w; btn_edit->SetBitmap_("edit"); });
w->Bind(wxEVT_LEAVE_WINDOW, [w, hovered, this](wxMouseEvent &evt) { if (*hovered == w) { btn_edit->SetBitmap_("dot"); *hovered = nullptr; } });
}
}
wxBoxSizer * hsizer_ams = new wxBoxSizer(wxHORIZONTAL);
hsizer_ams->Add(label_ams, 1, wxALIGN_CENTER);
if (btn_edit)
hsizer_ams->Add(btn_edit, 0, 0);
hsizer_ams->AddStretchSpacer(2);
wxBoxSizer * hsizer_nozzle = new wxBoxSizer(wxHORIZONTAL);
hsizer_nozzle->Add(label_nozzle, 2, wxALIGN_CENTER);
hsizer_nozzle->Add(combo_nozzle, 3, wxEXPAND);
if (index < 0) {
wxStaticBoxSizer *hsizer = new wxStaticBoxSizer(this, wxHORIZONTAL);
hsizer->Add(hsizer_ams, 1, wxLEFT | wxTOP | wxBOTTOM | wxALIGN_CENTER, FromDIP(4));
hsizer->Add(hsizer_nozzle, 1, wxALL | wxALIGN_CENTER, FromDIP(4));
hsizer->AddSpacer(FromDIP(4));
this->sizer = hsizer;
} else {
wxStaticBoxSizer *vsizer = new wxStaticBoxSizer(this, wxVERTICAL);
vsizer->Add(hsizer_ams, 0, wxEXPAND | wxLEFT | wxTOP | wxRIGHT, FromDIP(4));
vsizer->Add(hsizer_nozzle, 0, wxEXPAND | wxALL, FromDIP(4));
this->sizer = vsizer;
}
}
void Sidebar::priv::sync_extruder_list()
{
auto printer_tab = dynamic_cast<TabPrinter *>(wxGetApp().get_tab(Preset::TYPE_PRINTER));
@ -804,10 +963,14 @@ void Sidebar::priv::sync_extruder_list()
int deputy_index = obj->is_main_extruder_on_left() ? 1 : 0;
AMSCountPopupWindow::SetAMSCount(deputy_index, deputy_4, deputy_1);
AMSCountPopupWindow::SetAMSCount(main_index, main_4, main_1);
AMSCountPopupWindow::UpdateAMSCount(0, m_left_ams_count);
AMSCountPopupWindow::UpdateAMSCount(1, m_right_ams_count);
AMSCountPopupWindow::UpdateAMSCount(0, left_extruder);
AMSCountPopupWindow::UpdateAMSCount(1, right_extruder);
}
#define PRINTER_THUMBNAIL_SIZE (wxSize(FromDIP(48), FromDIP(48)))
#define PRINTER_PANEL_SIZE_SMALL (wxSize(FromDIP(98), FromDIP(68)))
#define PRINTER_PANEL_SIZE (wxSize(FromDIP(98), FromDIP(98)))
Sidebar::Sidebar(Plater *parent)
: wxPanel(parent, wxID_ANY, wxDefaultPosition, wxSize(42 * wxGetApp().em_unit(), -1)), p(new priv(parent))
{
@ -882,8 +1045,6 @@ 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_extruder_sync, 0, wxALIGN_CENTER);
h_sizer_title->AddSpacer(FromDIP(SidebarProps::TitlebarMargin()));
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);
@ -917,70 +1078,92 @@ Sidebar::Sidebar(Plater *parent)
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));
PlaterPresetComboBox* combo_printer = new PlaterPresetComboBox(p->m_panel_printer_content, Preset::TYPE_PRINTER);
combo_printer->SetBorderWidth(0);
combo_printer->ShowBadge(true);
ScalableButton* edit_btn = new ScalableButton(p->m_panel_printer_content, wxID_ANY, "edit");
p->panel_printer_preset = new StaticBox(p->m_panel_printer_content);
p->panel_printer_preset->SetCornerRadius(8);
p->panel_printer_preset->SetBorderColor(wxColour("#CECECE"));
p->panel_printer_preset->SetMinSize(PRINTER_PANEL_SIZE_SMALL);
p->panel_printer_preset->ShowBadge(true);
ScalableButton *edit_btn = new ScalableButton(p->panel_printer_preset, wxID_ANY, "dot");
edit_btn->SetToolTip(_L("Click to edit preset"));
edit_btn->Bind(wxEVT_BUTTON, [this, combo_printer](wxCommandEvent)
edit_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent)
{
p->editing_filament = -1;
if (combo_printer->switch_to_tab())
if (p->combo_printer->switch_to_tab())
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);
PlaterPresetComboBox *combo_printer = new PlaterPresetComboBox(p->panel_printer_preset, Preset::TYPE_PRINTER);
combo_printer->SetBorderWidth(0);
combo_printer->edit_btn = edit_btn;
p->combo_printer = combo_printer;
connection_btn = new ScalableButton(p->m_panel_printer_content, wxID_ANY, "monitor_signal_strong");
connection_btn->SetBackgroundColour(wxColour(255, 255, 255));
connection_btn->SetToolTip(_L("Connection"));
connection_btn->Bind(wxEVT_BUTTON, [this, combo_printer](wxCommandEvent)
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"));
p->btn_connect_printer->Bind(wxEVT_BUTTON, [this, combo_printer](wxCommandEvent)
{
PhysicalPrinterDialog dlg(this->GetParent());
dlg.ShowModal();
});
wxBoxSizer* vsizer_printer = new wxBoxSizer(wxVERTICAL);
wxBoxSizer* hsizer_printer = new wxBoxSizer(wxHORIZONTAL);
vsizer_printer->AddSpacer(FromDIP(16));
hsizer_printer->Add(combo_printer, 1, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(SidebarProps::ContentMargin()));
hsizer_printer->Add(edit_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(SidebarProps::ElementSpacing()));
hsizer_printer->Add(connection_btn, 0, wxALIGN_CENTER_VERTICAL | wxLEFT, FromDIP(SidebarProps::IconSpacing()));
hsizer_printer->AddSpacer(FromDIP(SidebarProps::ContentMargin()));
vsizer_printer->Add(hsizer_printer, 0, wxEXPAND, 0);
{
auto hovered = std::make_shared<wxWindow *>();
for (wxWindow *w : std::initializer_list<wxWindow *>{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; } });
}
}
// Bed type selection
wxBoxSizer* bed_type_sizer = new wxBoxSizer(wxHORIZONTAL);
wxStaticText* bed_type_title = new wxStaticText(p->m_panel_printer_content, wxID_ANY, _L("Bed type"));
//bed_type_title->SetBackgroundColour();
bed_type_title->Wrap(-1);
bed_type_title->SetFont(Label::Body_14);
p->m_bed_type_list = new ComboBox(p->m_panel_printer_content, wxID_ANY, wxString(""), wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY);
const ConfigOptionDef* bed_type_def = print_config_def.get("curr_bed_type");
p->panel_printer_bed = new StaticBox(p->m_panel_printer_content);
p->panel_printer_bed->SetCornerRadius(8);
p->panel_printer_bed->SetBorderColor(wxColour("#CECECE"));
p->panel_printer_bed->SetMinSize(PRINTER_PANEL_SIZE_SMALL);
p->panel_printer_bed->ShowBadge(true);
ScalableButton *wiki_bed = new ScalableButton(p->panel_printer_bed, wxID_ANY, "dot");
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", 48);
p->image_printer_bed = new wxStaticBitmap(p->panel_printer_bed, wxID_ANY, bitmap_bed.bmp(), wxDefaultPosition, PRINTER_THUMBNAIL_SIZE, 0);
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->SetBorderWidth(0);
p->combo_printer_bed->GetDropDown().SetUseContentWidth(true);
const ConfigOptionDef *bed_type_def = print_config_def.get("curr_bed_type");
if (bed_type_def && bed_type_def->enum_keys_map) {
for (auto item : bed_type_def->enum_labels) {
p->m_bed_type_list->AppendString(_L(item));
p->combo_printer_bed->AppendString(_L(item));
}
}
bed_type_title->Bind(wxEVT_ENTER_WINDOW, [bed_type_title, this](wxMouseEvent &e) {
e.Skip();
auto font = bed_type_title->GetFont();
font.SetUnderlined(true);
bed_type_title->SetFont(font);
SetCursor(wxCURSOR_HAND);
});
bed_type_title->Bind(wxEVT_LEAVE_WINDOW, [bed_type_title, this](wxMouseEvent &e) {
e.Skip();
auto font = bed_type_title->GetFont();
font.SetUnderlined(false);
bed_type_title->SetFont(font);
SetCursor(wxCURSOR_ARROW);
});
bed_type_title->Bind(wxEVT_LEFT_UP, [bed_type_title, this](wxMouseEvent &e) {
wxLaunchDefaultBrowser("https://github.com/SoftFever/OrcaSlicer/wiki/bed-types");
});
{
auto hovered = std::make_shared<wxWindow *>();
for (wxWindow *w : std::initializer_list<wxWindow *>{p->panel_printer_bed, wiki_bed, p->image_printer_bed, p->combo_printer_bed}) {
w->Bind(wxEVT_ENTER_WINDOW, [w, hovered, wiki_bed](wxMouseEvent &evt) { *hovered = w; wiki_bed->SetBitmap_("help"); });
w->Bind(wxEVT_LEAVE_WINDOW, [w, hovered, wiki_bed](wxMouseEvent &evt) { if (*hovered == w) { wiki_bed->SetBitmap_("dot"); *hovered = nullptr; } });
}
}
wxBoxSizer *bed_type_sizer = new wxBoxSizer(wxVERTICAL);
bed_type_sizer->AddStretchSpacer(1);
wxBoxSizer *bed_type_hsizer = new wxBoxSizer(wxHORIZONTAL);
wxBoxSizer *bed_type_hsizer2 = new wxBoxSizer(wxHORIZONTAL);
bed_type_hsizer2->AddStretchSpacer(1);
bed_type_hsizer2->Add(wiki_bed, 0, wxLEFT, FromDIP(4));
bed_type_hsizer->Add(bed_type_hsizer2, 1);
bed_type_hsizer->Add(p->image_printer_bed, 0);
bed_type_hsizer->AddStretchSpacer(1);
bed_type_sizer->Add(bed_type_hsizer, 0, wxALIGN_CENTER | wxLEFT | wxTOP | wxRIGHT, FromDIP(4));
bed_type_sizer->Add(p->combo_printer_bed, 0, wxEXPAND | wxALL, FromDIP(4));
bed_type_sizer->AddStretchSpacer(1);
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");
@ -992,11 +1175,7 @@ Sidebar::Sidebar(Plater *parent)
}
int bed_type_idx = bed_type_value - 1;
p->m_bed_type_list->Select(bed_type_idx);
bed_type_sizer->Add(bed_type_title, 1, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(SidebarProps::ContentMargin()));
bed_type_sizer->Add(p->m_bed_type_list, 4, wxLEFT | wxEXPAND, FromDIP(SidebarProps::ElementSpacing()));
bed_type_sizer->AddSpacer(FromDIP(SidebarProps::ContentMargin()));
vsizer_printer->Add(bed_type_sizer, 0, wxEXPAND | wxTOP, FromDIP(5));
p->combo_printer_bed->Select(bed_type_idx);
auto& project_config = wxGetApp().preset_bundle->project_config;
/*const t_config_enum_values* keys_map = print_config_def.get("curr_bed_type")->enum_keys_map;
@ -1008,76 +1187,35 @@ Sidebar::Sidebar(Plater *parent)
BedType bed_type = (BedType)bed_type_value;
project_config.set_key_value("curr_bed_type", new ConfigOptionEnum<BedType>(bed_type));
// Dual Extruder Types (Begin)
p->m_dual_extruder_sizer = new wxBoxSizer(wxHORIZONTAL);
// Sync printer information
auto btn_sync = new Button(p->m_panel_printer_content, _L("Sync printer information"), "ams_nozzle_sync");
//btn_sync->SetFont(Label::Body_8);
btn_sync->SetToolTip(_L("Synchronize nozzle information and the number of AMS"));
btn_sync->SetCornerRadius(8);
StateColor btn_sync_bg_col(
std::pair<wxColour, int>(wxColour(0xCECECE), StateColor::Pressed),
std::pair<wxColour, int>(wxColour(0xF8F8F8), StateColor::Hovered),
std::pair<wxColour, int>(wxColour(0xF8F8F8), StateColor::Normal));
StateColor btn_sync_bd_col(
std::pair<wxColour, int>(wxColour(0x00AE42), StateColor::Pressed),
std::pair<wxColour, int>(wxColour(0x00AE42), StateColor::Hovered),
std::pair<wxColour, int>(wxColour(0xEEEEEE), StateColor::Normal));
btn_sync->SetBackgroundColor(btn_sync_bg_col);
btn_sync->SetBorderColor(btn_sync_bd_col);
btn_sync->SetPaddingSize({FromDIP(6), FromDIP(12)});
btn_sync->SetMinSize(PRINTER_PANEL_SIZE);
btn_sync->SetMaxSize(PRINTER_PANEL_SIZE);
btn_sync->SetVertical();
btn_sync->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { p->sync_extruder_list(); });
p->btn_sync_printer = btn_sync;
auto add_extruder = [this](int index, wxString const & title) {
StaticGroup *static_box = new StaticGroup(p->m_panel_printer_content, wxID_ANY, title);
static_box->SetFont(Label::Body_10);
static_box->SetForegroundColour("#909090");
static_box->ShowBadge(true);
wxStaticBoxSizer *static_box_sizer = new wxStaticBoxSizer(static_box, wxVERTICAL);
// AMS count
wxBoxSizer * ams_count_sizer = new wxBoxSizer(wxHORIZONTAL);
wxStaticText *ams_count_title = new wxStaticText(static_box, wxID_ANY, _L("AMS"));
ams_count_title->SetFont(Label::Body_14);
ams_count_title->SetForegroundColour("#262E30");
auto ams_count_text = new wxStaticText(static_box, wxID_ANY, wxString("1/1"));
ams_count_text->SetFont(Label::Body_14);
ams_count_text->SetForegroundColour("#262E30");
AMSCountPopupWindow::UpdateAMSCount(index, ams_count_text);
auto ams_count_edit = new ScalableButton(static_box, wxID_ANY, "edit");
ams_count_edit->Bind(wxEVT_COMMAND_BUTTON_CLICKED, [this, index, ams_count_text](auto &evt) {
PopupWindow *window = new AMSCountPopupWindow(ams_count_text, ams_count_text, index);
auto pos = ams_count_text->ClientToScreen({0, 0});
auto size = ams_count_text->GetSize();
size.SetWidth(size.GetWidth() + FromDIP(10));
window->Position(pos, size);
window->Popup();
});
ams_count_edit->SetBackgroundColour(*wxWHITE);
ams_count_sizer->Add(ams_count_title, 2, wxLEFT | wxALIGN_CENTER_VERTICAL, FromDIP(8));
ams_count_sizer->Add(ams_count_text, 1, wxLEFT | wxEXPAND);
ams_count_sizer->Add(ams_count_edit, 2, wxLEFT | wxEXPAND);
static_box_sizer->Add(ams_count_sizer, 0, wxTOP | wxEXPAND, FromDIP(8));
p->m_dual_extruder_sizer->Add(static_box_sizer, 1, wxEXPAND);
return ams_count_text;
};
p->m_dual_extruder_sizer->Add(FromDIP(10), 0);
auto left_extruder = add_extruder(0, _L("Left Extruder"));
p->m_left_ams_count = left_extruder;
p->m_dual_extruder_sizer->Add(FromDIP(2), 0);
auto right_extruder = add_extruder(1, _L("Right Extruder"));
p->m_right_ams_count = right_extruder;
p->m_dual_extruder_sizer->Add(FromDIP(2), 0);
p->left_extruder = new ExtruderGroup(p->m_panel_printer_content, 0, _L("Left"));
p->right_extruder = new ExtruderGroup(p->m_panel_printer_content, 1, _L("Right"));
p->single_extruder = new ExtruderGroup(p->m_panel_printer_content, -1, "");
auto extruder_btn = new Button(p->m_panel_printer_content, _L("Sync AMS Nozzle information"), "ams_nozzle_sync");
extruder_btn->SetFont(Label::Body_8);
extruder_btn->SetToolTip(_L("Synchronize nozzle information and the number of AMS"));
extruder_btn->SetCornerRadius(0);
StateColor extruder_btn_bg_col(std::pair<wxColour, int>(wxColour(0xCECECE), StateColor::Pressed),
std::pair<wxColour, int>(wxColour(0xF8F8F8), StateColor::Hovered),
std::pair<wxColour, int>(wxColour(0xF8F8F8), StateColor::Normal));
StateColor extruder_btn_bd_col(std::pair<wxColour, int>(wxColour(0x00AE42), StateColor::Pressed),
std::pair<wxColour, int>(wxColour(0x00AE42), StateColor::Hovered),
std::pair<wxColour, int>(wxColour(0xEEEEEE), StateColor::Normal));
extruder_btn->SetBackgroundColor(extruder_btn_bg_col);
extruder_btn->SetBorderColor(extruder_btn_bd_col);
extruder_btn->SetPaddingSize({FromDIP(6), FromDIP(12)});
extruder_btn->SetMinSize({FromDIP(48), FromDIP(68)});
extruder_btn->SetMaxSize({FromDIP(48), FromDIP(68)});
extruder_btn->SetVertical();
extruder_btn->Bind(wxEVT_BUTTON, [this](wxCommandEvent &e) { p->sync_extruder_list(); });
p->m_extruder_sync = extruder_btn;
p->m_dual_extruder_sizer->Add(FromDIP(2), 0);
p->m_dual_extruder_sizer->Add(extruder_btn, 0, wxTOP | wxEXPAND, FromDIP(6));
p->m_dual_extruder_sizer->Add(FromDIP(10), 0);
vsizer_printer->Add(p->m_dual_extruder_sizer, 0, wxEXPAND | wxTOP, FromDIP(5));
// Dual Extruder Types (End)
vsizer_printer->AddSpacer(FromDIP(16));
p->m_panel_printer_content->SetSizer(vsizer_printer);
p->vsizer_printer = new wxBoxSizer(wxVERTICAL);
p->layout_printer(true, true);
p->m_panel_printer_content->SetSizer(p->vsizer_printer);
p->m_panel_printer_content->Layout();
scrolled_sizer->Add(p->m_panel_printer_content, 0, wxEXPAND, 0);
}
@ -1194,7 +1332,7 @@ Sidebar::Sidebar(Plater *parent)
//bSizer39->Hide(p->m_bpButton_del_filament); // ORCA: Hide delete filament button if there is only one filament
}
ams_btn = new ScalableButton(p->m_panel_filament_title, wxID_ANY, "ams_fila_sync", wxEmptyString, wxDefaultSize, wxDefaultPosition,
auto ams_btn = new ScalableButton(p->m_panel_filament_title, wxID_ANY, "ams_fila_sync", wxEmptyString, wxDefaultSize, wxDefaultPosition,
wxBU_EXACTFIT | wxNO_BORDER, false, 16); // ORCA match icon size with other icons as 16x16
ams_btn->SetToolTip(_L("Synchronize filament list from AMS"));
ams_btn->Bind(wxEVT_BUTTON, [this, scrolled_sizer](wxCommandEvent &e) {
@ -1457,14 +1595,14 @@ void Sidebar::update_all_preset_comboboxes()
if (preset_bundle.use_bbl_network()) {
//only show connection button for not-BBL printer
connection_btn->Hide();
p->btn_connect_printer->Hide();
//only show sync-ams button for BBL printer
ams_btn->Show();
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 {
connection_btn->Show();
ams_btn->Hide();
p->btn_connect_printer->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");
wxString apikey;
@ -1499,7 +1637,7 @@ void Sidebar::update_all_preset_comboboxes()
//p->m_staticText_filament_settings->Update();
if (is_bbl_vendor || cfg.opt_bool("support_multi_bed_types")) {
p->m_bed_type_list->Enable();
p->combo_printer_bed->Enable();
// Orca: don't update bed type if loading project
if (!p->plater->is_loading_project()) {
auto str_bed_type = wxGetApp().app_config->get_printer_setting(wxGetApp().preset_bundle->printers.get_selected_preset_name(),
@ -1510,17 +1648,17 @@ void Sidebar::update_all_preset_comboboxes()
bed_type_value = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle);
}
p->m_bed_type_list->SelectAndNotify(bed_type_value - 1);
p->combo_printer_bed->SelectAndNotify(bed_type_value - 1);
} else {
BedType bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle);
p->m_bed_type_list->SelectAndNotify((int) bed_type - 1);
p->combo_printer_bed->SelectAndNotify((int) bed_type - 1);
}
}
} else {
// m_bed_type_list->SelectAndNotify(btPEI - 1);
BedType bed_type = preset_bundle.printers.get_edited_preset().get_default_bed_type(&preset_bundle);
p->m_bed_type_list->SelectAndNotify((int) bed_type - 1);
p->m_bed_type_list->Disable();
p->combo_printer_bed->SelectAndNotify((int) bed_type - 1);
p->combo_printer_bed->Disable();
}
// Update the print choosers to only contain the compatible presets, update the dirty flags.
@ -1610,6 +1748,9 @@ void Sidebar::update_presets(Preset::Type preset_type)
}
Preset& printer_preset = wxGetApp().preset_bundle->printers.get_edited_preset();
bool isBBL = preset_bundle.is_bbl_vendor();
if (auto printer_structure_opt = printer_preset.config.option<ConfigOptionEnum<PrinterStructure>>("printer_structure")) {
wxGetApp().plater()->get_current_canvas3D()->get_arrange_settings().align_to_y_axis = (printer_structure_opt->value == PrinterStructure::psI3);
}
@ -1618,7 +1759,11 @@ void Sidebar::update_presets(Preset::Type preset_type)
// Update dual extrudes
auto* nozzle_diameter = dynamic_cast<const ConfigOptionFloats*>(printer_preset.config.option("nozzle_diameter"));
p->m_dual_extruder_sizer->Show(preset_bundle.is_bbl_vendor() && nozzle_diameter->size() == 2);
bool is_dual_extruder = nozzle_diameter->size() == 2;
p->layout_printer(isBBL, is_dual_extruder);
Layout();
break;
}
@ -1689,13 +1834,16 @@ void Sidebar::msw_rescale()
p->m_bpButton_set_filament->msw_rescale();
p->m_flushing_volume_btn->Rescale();
//BBS
p->m_bed_type_list->Rescale();
p->m_bed_type_list->SetMinSize({-1, 3 * wxGetApp().em_unit()});
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->m_extruder_sync->SetPaddingSize({FromDIP(6), FromDIP(12)});
p->m_extruder_sync->SetMinSize({FromDIP(48), FromDIP(68)});
p->m_extruder_sync->SetMaxSize({FromDIP(48), FromDIP(68)});
p->m_extruder_sync->Rescale();
p->btn_sync_printer->SetPaddingSize({FromDIP(6), FromDIP(12)});
p->btn_sync_printer->SetMinSize(PRINTER_PANEL_SIZE);
p->btn_sync_printer->SetMaxSize(PRINTER_PANEL_SIZE);
p->btn_sync_printer->Rescale();
#if 0
if (p->mode_sizer)
p->mode_sizer->msw_rescale();
@ -2000,7 +2148,7 @@ void Sidebar::on_bed_type_change(BedType bed_type)
{
// btDefault option is not included in global bed type setting
int sel_idx = (int)bed_type - 1;
if (p->m_bed_type_list != nullptr) p->m_bed_type_list->SetSelection(sel_idx);
if (p->combo_printer_bed != nullptr) p->combo_printer_bed->SetSelection(sel_idx);
}
std::map<int, DynamicPrintConfig> Sidebar::build_filament_ams_list(MachineObject* obj)

View file

@ -215,8 +215,6 @@ private:
std::unique_ptr<priv> p;
wxBoxSizer* m_scrolled_sizer = nullptr;
ScalableButton* connection_btn = nullptr;
ScalableButton* ams_btn = nullptr;
};
class Plater: public wxPanel

View file

@ -72,7 +72,7 @@ namespace GUI {
**/
PresetComboBox::PresetComboBox(wxWindow* parent, Preset::Type preset_type, const wxSize& size, PresetBundle* preset_bundle/* = nullptr*/) :
::ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, wxCB_READONLY),
::ComboBox(parent, wxID_ANY, wxEmptyString, wxDefaultPosition, size, 0, nullptr, preset_type == Preset::TYPE_PRINTER ? (wxCB_READONLY | wxALIGN_CENTER_HORIZONTAL) : wxCB_READONLY),
m_type(preset_type),
m_last_selected(wxNOT_FOUND),
m_em_unit(em_unit(this)),

View file

@ -42,7 +42,7 @@ ComboBox::ComboBox(wxWindow *parent,
: drop(items)
{
if ((style & wxALIGN_MASK) == 0 && (style & wxCB_READONLY))
style |= wxALIGN_CENTER_HORIZONTAL;
style |= wxALIGN_RIGHT;
text_off = style & CB_NO_TEXT;
TextInput::Create(parent, "", value, (style & CB_NO_DROP_ICON) ? "" : "drop_down", pos, size,
style | wxTE_PROCESS_ENTER);