diff --git a/resources/images/printer_preview_BL-P001.png b/resources/images/printer_preview_BL-P001.png index 47f9b41d8..5bf40ff50 100644 Binary files a/resources/images/printer_preview_BL-P001.png and b/resources/images/printer_preview_BL-P001.png differ diff --git a/resources/images/printer_preview_BL-P002.png b/resources/images/printer_preview_BL-P002.png index 47f9b41d8..5bf40ff50 100644 Binary files a/resources/images/printer_preview_BL-P002.png and b/resources/images/printer_preview_BL-P002.png differ diff --git a/resources/images/printer_preview_C11.png b/resources/images/printer_preview_C11.png index 518dfd539..bbe6b4256 100644 Binary files a/resources/images/printer_preview_C11.png and b/resources/images/printer_preview_C11.png differ diff --git a/resources/images/printer_preview_C12.png b/resources/images/printer_preview_C12.png index 4a2e336ed..d9b3294e7 100644 Binary files a/resources/images/printer_preview_C12.png and b/resources/images/printer_preview_C12.png differ diff --git a/resources/images/printer_preview_C13.png b/resources/images/printer_preview_C13.png index a5cdc3b82..7d666d02d 100644 Binary files a/resources/images/printer_preview_C13.png and b/resources/images/printer_preview_C13.png differ diff --git a/resources/images/printer_preview_N1.png b/resources/images/printer_preview_N1.png index bb73fea05..80fbe7dc2 100644 Binary files a/resources/images/printer_preview_N1.png and b/resources/images/printer_preview_N1.png differ diff --git a/resources/images/printer_preview_N2S.png b/resources/images/printer_preview_N2S.png index 3cd23a5df..d7a640e41 100644 Binary files a/resources/images/printer_preview_N2S.png and b/resources/images/printer_preview_N2S.png differ diff --git a/resources/images/printer_preview_O1D.png b/resources/images/printer_preview_O1D.png index 70bbc3637..69ad76d37 100644 Binary files a/resources/images/printer_preview_O1D.png and b/resources/images/printer_preview_O1D.png differ diff --git a/src/slic3r/GUI/SelectMachine.cpp b/src/slic3r/GUI/SelectMachine.cpp index 651ef0a72..d62cb6d27 100644 --- a/src/slic3r/GUI/SelectMachine.cpp +++ b/src/slic3r/GUI/SelectMachine.cpp @@ -2760,17 +2760,14 @@ _compare_obj_names(MachineObject* obj1, MachineObject* obj2) *@note _collect_machine_list *@param dev_manager -- the device manager *@param sorted_machine_objs -- return the sorted machine objects -*@param sorted_machine_names -- return the sorted machine shown names *@param best_one -- return the best one */ /*******************************************************************/ static void _collect_sorted_machines(Slic3r::DeviceManager* dev_manager, - std::vector& sorted_machine_objs, - wxArrayString& sorted_machine_names) + std::vector& sorted_machine_objs) { sorted_machine_objs.clear(); - sorted_machine_names.clear(); if (!dev_manager) { return; @@ -2822,15 +2819,11 @@ _collect_sorted_machines(Slic3r::DeviceManager* dev_manager, /* Step 3: Get the sorted objects*/ auto _collect_sorted_objs = [](const std::vector& obj_list, - std::vector& sorted_machine_objs, - wxArrayString& sorted_machine_names) + std::vector& sorted_machine_objs) { for (auto obj : obj_list) { sorted_machine_objs.push_back(obj); - const wxString& dev_name = wxString::FromUTF8(obj->dev_name); - obj->is_lan_mode_printer() ? sorted_machine_names.push_back(dev_name + "(LAN)"): - sorted_machine_names.push_back(dev_name); } }; @@ -2838,11 +2831,11 @@ _collect_sorted_machines(Slic3r::DeviceManager* dev_manager, if (cur_selected_obj) { std::vector cur_selected_obj_list{ cur_selected_obj }; - _collect_sorted_objs(cur_selected_obj_list, sorted_machine_objs, sorted_machine_names); + _collect_sorted_objs(cur_selected_obj_list, sorted_machine_objs); } - _collect_sorted_objs(match_avaliable_list, sorted_machine_objs, sorted_machine_names); - _collect_sorted_objs(match_inavaliable_list, sorted_machine_objs, sorted_machine_names); - _collect_sorted_objs(other_list, sorted_machine_objs, sorted_machine_names); + _collect_sorted_objs(match_avaliable_list, sorted_machine_objs); + _collect_sorted_objs(match_inavaliable_list, sorted_machine_objs); + _collect_sorted_objs(other_list, sorted_machine_objs); } void SelectMachineDialog::update_user_printer() @@ -2856,11 +2849,9 @@ void SelectMachineDialog::update_user_printer() m_print_info = ""; } - wxArrayString sorted_machine_names; - _collect_sorted_machines(dev, m_list, sorted_machine_names); - // update the machine list, and select a default machine - m_printer_box->SetPrinterName(sorted_machine_names); + _collect_sorted_machines(dev, m_list); + m_printer_box->SetPrinters(m_list); if (!m_list.empty()) { m_printer_last_select = m_list.front()->dev_id; @@ -3053,15 +3044,6 @@ void SelectMachineDialog::on_selection_changed(wxCommandEvent &event) } if (obj) { - // update image - auto printer_img_name = "printer_preview_" + obj->printer_type; - try { - m_printer_box->SetPrinterImage(create_scaled_bitmap(printer_img_name, this, 52)); - } catch (const std::exception &) { - m_printer_box->SetPrinterImage(create_scaled_bitmap("printer_preview_BL-P001", this, 52)); - } - - obj->command_get_version(); obj->command_request_push_all(); if (!dev->get_selected_machine()) { @@ -5019,6 +5001,67 @@ void PrinterInfoBox::UpdatePlate(const std::string& plate_name) } } +static wxString _get_tips(MachineObject* obj_) +{ + wxString tips; + tips = obj_->get_printer_type_display_str(); + + wxString ext_diameter; + if (obj_->m_extder_data.total_extder_count == 1) { + ext_diameter += wxString::FromDouble(obj_->m_extder_data.extders[0].current_nozzle_diameter); + ext_diameter += "mm"; + } else if (obj_->m_extder_data.total_extder_count == 2) { + ext_diameter += wxString::FromDouble(obj_->m_extder_data.extders[1].current_nozzle_diameter);//Left + ext_diameter += "/"; + ext_diameter += wxString::FromDouble(obj_->m_extder_data.extders[0].current_nozzle_diameter); + ext_diameter += "mm"; + } else { + assert(0); + } + + if (!ext_diameter.empty()) { + tips += " "; + tips += ext_diameter; + } + + return tips; +} + +void PrinterInfoBox::SetPrinters(const std::vector& sorted_printers) +{ + m_comboBox_printer->Clear(); + + std::vector drop_items; + for (MachineObject* obj : sorted_printers) + { + wxString shown_dev_name = wxString::FromUTF8(obj->dev_name); + if (obj->is_lan_mode_printer()) { + shown_dev_name += "(LAN)"; + } + + DropDown::Item drop_item; + drop_item.text = shown_dev_name; + drop_item.text_static_tips = _get_tips(obj); + + // update image + try + { + drop_item.icon = create_scaled_bitmap("printer_preview_" + obj->printer_type, this, 32); + drop_item.icon_textctrl = create_scaled_bitmap("printer_preview_" + obj->printer_type, this, 52); + } + catch (const std::exception&) + { + drop_item.icon = create_scaled_bitmap("printer_preview_BL-P001", this, 32); + drop_item.icon_textctrl = create_scaled_bitmap("printer_preview_BL-P001", this, 52); + } + + drop_item.tip = obj->get_printer_type_display_str(); + drop_items.emplace_back(drop_item); + } + + m_comboBox_printer->SetItems(drop_items); +} + void PrinterInfoBox::EnableEditing(bool enable) { m_comboBox_printer->Enable(enable); @@ -5077,14 +5120,10 @@ void PrinterInfoBox::Create() printer_staticbox->SetMaxSize(wxSize(FromDIP(338), FromDIP(68))); printer_staticbox->SetBorderColor(wxColour(0xCECECE)); - m_printer_image = new wxStaticBitmap(printer_staticbox, wxID_ANY, create_scaled_bitmap("printer_preview_BL-P001", this, 52)); - m_printer_image->SetMinSize(wxSize(FromDIP(52), FromDIP(52))); - m_printer_image->SetMaxSize(wxSize(FromDIP(52), FromDIP(52))); - m_comboBox_printer = new ComboBox(printer_staticbox, wxID_ANY, "", wxDefaultPosition, wxDefaultSize, 0, nullptr, wxCB_READONLY); m_comboBox_printer->SetBorderWidth(0); - m_comboBox_printer->SetMinSize(wxSize(FromDIP(225), FromDIP(60))); - m_comboBox_printer->SetMaxSize(wxSize(FromDIP(225), FromDIP(60))); + m_comboBox_printer->SetMinSize(wxSize(FromDIP(277), FromDIP(60))); + m_comboBox_printer->SetMaxSize(wxSize(FromDIP(277), FromDIP(60))); m_comboBox_printer->SetBackgroundColor(*wxWHITE); m_comboBox_printer->Bind(wxEVT_COMBOBOX, &SelectMachineDialog::on_selection_changed, m_select_dialog); @@ -5096,7 +5135,6 @@ void PrinterInfoBox::Create() m_button_question->SetToolTip(_L("Click here if you can't connect to the printer")); sizer_printer_staticbox->Add(0, 0, 0, wxLEFT, FromDIP(7)); - sizer_printer_staticbox->Add(m_printer_image, 0, wxALIGN_CENTER, 0); sizer_printer_staticbox->Add(m_comboBox_printer, 0, wxALIGN_CENTER, 0); sizer_printer_staticbox->Add(m_button_refresh, 0, wxALIGN_CENTER, 0); sizer_printer_staticbox->AddSpacer(FromDIP(10)); diff --git a/src/slic3r/GUI/SelectMachine.hpp b/src/slic3r/GUI/SelectMachine.hpp index 892e6ed8f..5742b3174 100644 --- a/src/slic3r/GUI/SelectMachine.hpp +++ b/src/slic3r/GUI/SelectMachine.hpp @@ -515,9 +515,7 @@ public: ComboBox* GetPrinterComboBox() const { return m_comboBox_printer; } void SetPrinterName(const wxString& printer_name) { m_comboBox_printer->SetValue(printer_name); }; - void SetPrinterName(const wxArrayString& priner_names) { m_comboBox_printer->Set(priner_names); } - - void SetPrinterImage(const wxBitmap& bitmap) { m_printer_image->SetBitmap(bitmap); } + void SetPrinters(const std::vector& sorted_printers); void EnableEditing(bool enable); void EnableRefreshButton(bool enable); @@ -533,7 +531,6 @@ private: // owner SelectMachineDialog* m_select_dialog; - wxStaticBitmap* m_printer_image{ nullptr }; Label* m_stext_printer_title{ nullptr }; ComboBox* m_comboBox_printer{ nullptr }; ScalableButton* m_button_refresh{ nullptr }; diff --git a/src/slic3r/GUI/Widgets/ComboBox.cpp b/src/slic3r/GUI/Widgets/ComboBox.cpp index ca453e419..a57dc705a 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.cpp +++ b/src/slic3r/GUI/Widgets/ComboBox.cpp @@ -86,10 +86,17 @@ void ComboBox::SetSelection(int n) return; drop.SetSelection(n); SetLabel(drop.GetValue()); - if (drop.selection >= 0 && drop.iconSize.y > 0 && items[drop.selection].icon.IsOk()) - SetIcon(items[drop.selection].icon); + if (drop.selection >= 0 && drop.iconSize.y > 0 && items[drop.selection].icon_textctrl.IsOk()) + SetIcon(items[drop.selection].icon_textctrl); else SetIcon("drop_down"); + + if (drop.selection >= 0) { + SetStaticTips(items[drop.selection].text_static_tips, wxNullBitmap); + } else { + SetStaticTips(wxEmptyString, wxNullBitmap); + } + } void ComboBox::SelectAndNotify(int n) { SetSelection(n); @@ -111,10 +118,16 @@ void ComboBox::SetValue(const wxString &value) { drop.SetValue(value); SetLabel(value); - if (drop.selection >= 0 && drop.iconSize.y > 0 && items[drop.selection].icon.IsOk()) - SetIcon(items[drop.selection].icon); + if (drop.selection >= 0 && drop.iconSize.y > 0 && items[drop.selection].icon_textctrl.IsOk()) + SetIcon(items[drop.selection].icon_textctrl); else SetIcon("drop_down"); + + if (drop.selection >= 0) { + SetStaticTips(items[drop.selection].text_static_tips, wxNullBitmap); + } else { + SetStaticTips(wxEmptyString, wxNullBitmap); + } } void ComboBox::SetLabel(const wxString &value) @@ -189,13 +202,20 @@ int ComboBox::Append(const wxString &text, int ComboBox::Append(const wxString &text, const wxBitmap &bitmap, const wxString &group, void *clientData) { - Item item{text, bitmap, clientData, group}; + Item item{text, wxEmptyString, bitmap, bitmap, clientData, group}; items.push_back(item); SetClientDataType(wxClientData_Void); drop.Invalidate(); return items.size() - 1; } +int ComboBox::SetItems(const std::vector& the_items) +{ + items = the_items; + drop.Invalidate(); + return items.size() - 1; +} + void ComboBox::DoClear() { SetIcon("drop_down"); @@ -258,7 +278,7 @@ int ComboBox::DoInsertItems(const wxArrayStringsAdapter &items, { if (pos > this->items.size()) return -1; for (int i = 0; i < items.GetCount(); ++i) { - Item item { items[i], wxNullBitmap, clientData ? clientData[i] : NULL }; + Item item { items[i], wxEmptyString, wxNullBitmap, wxNullBitmap, clientData ? clientData[i] : NULL }; this->items.insert(this->items.begin() + pos, item); ++pos; } diff --git a/src/slic3r/GUI/Widgets/ComboBox.hpp b/src/slic3r/GUI/Widgets/ComboBox.hpp index ae00144d7..14065c76e 100644 --- a/src/slic3r/GUI/Widgets/ComboBox.hpp +++ b/src/slic3r/GUI/Widgets/ComboBox.hpp @@ -40,6 +40,8 @@ public: int Append(const wxString &item, const wxBitmap &bitmap, const wxString &group, void *clientData = nullptr); + int SetItems(const std::vector& the_items); + void set_replace_text(wxString text, wxString image_name); unsigned int GetCount() const override; diff --git a/src/slic3r/GUI/Widgets/DropDown.hpp b/src/slic3r/GUI/Widgets/DropDown.hpp index 0622ca413..8252489d4 100644 --- a/src/slic3r/GUI/Widgets/DropDown.hpp +++ b/src/slic3r/GUI/Widgets/DropDown.hpp @@ -19,7 +19,9 @@ public: struct Item { wxString text; + wxString text_static_tips;// display static tips for TextInput.eg.PrinterInfoBox wxBitmap icon; + wxBitmap icon_textctrl;// display icon for TextInput.eg.PrinterInfoBox void * data{nullptr}; wxString group{}; wxString alias{}; diff --git a/src/slic3r/GUI/Widgets/TextInput.cpp b/src/slic3r/GUI/Widgets/TextInput.cpp index 58d7af51e..2e17d8fbb 100644 --- a/src/slic3r/GUI/Widgets/TextInput.cpp +++ b/src/slic3r/GUI/Widgets/TextInput.cpp @@ -95,6 +95,14 @@ void TextInput::SetLabel(const wxString& label) Refresh(); } +void TextInput::SetStaticTips(const wxString& tips, const wxBitmap& bitmap) +{ + static_tips = tips; + static_tips_icon = bitmap; + messureSize(); + Refresh(); +} + void TextInput::SetIcon(const wxBitmap &icon) { this->icon = ScalableBitmap(); @@ -228,7 +236,7 @@ void TextInput::render(wxDC& dc) pt.x = (size.x - (szIcon.x + 0 + labelSize.x)) / 2; } dc.DrawBitmap(icon.bmp(), pt); - pt.x += szIcon.x + 0; + pt.x += (szIcon.x + szIcon.x * 0.2); } if (icon_1.bmp().IsOk()) { wxSize szIcon = icon_1.GetBmpSize(); @@ -243,18 +251,51 @@ void TextInput::render(wxDC& dc) } auto text = wxWindow::GetLabel(); if (!text.IsEmpty()) { - wxSize textSize = text_ctrl->GetSize(); - if (align_right || align_center) { - if (pt.x + labelSize.x + 5 > size.x) - text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, size.x - pt.x - 5); - pt.y = (size.y - labelSize.y) / 2; + if (static_tips.IsEmpty()) { + wxSize textSize = text_ctrl->GetSize(); + if (align_right || align_center) + { + if (pt.x + labelSize.x + 5 > size.x) + text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, size.x - pt.x - 5); + pt.y = (size.y - labelSize.y) / 2; + } + else + { + pt.x += textSize.x; + pt.y = (size.y + textSize.y) / 2 - labelSize.y; + } + dc.SetTextForeground(label_color.colorForStates(states)); + dc.SetFont(GetFont()); + dc.DrawText(text, pt); } else { - pt.x += textSize.x; - pt.y = (size.y + textSize.y) / 2 - labelSize.y; + wxSize textSize = text_ctrl->GetSize(); + if (align_right || align_center) { + if (pt.x + labelSize.x + 5 > size.x) + text = wxControl::Ellipsize(text, dc, wxELLIPSIZE_END, size.x - pt.x - 5); + pt.y = (size.y - labelSize.y - static_tips_size.y - 8) / 2; + } else { + pt.x += textSize.x; + pt.y = (size.y - labelSize.y - static_tips_size.y - 8) / 2; + } + dc.SetTextForeground(label_color.colorForStates(states)); + dc.SetFont(GetFont()); + dc.DrawText(text, pt); + + if (align_right || align_center) { + if (pt.x + static_tips_size.x + 5 > size.x) { + text = wxControl::Ellipsize(static_tips, dc, wxELLIPSIZE_END, size.x - pt.x - 5); + } + + pt.y += (labelSize.y + 8); + } else { + pt.x += static_tips_size.x; + pt.y += (labelSize.y + 8); + } + + dc.SetTextForeground(wxColour(144, 144, 144)); + dc.SetFont(GetFont()); + dc.DrawText(static_tips, pt); } - dc.SetTextForeground(label_color.colorForStates(states)); - dc.SetFont(GetFont()); - dc.DrawText(text, pt); } } @@ -264,10 +305,19 @@ void TextInput::messureSize() wxClientDC dc(this); labelSize = dc.GetTextExtent(wxWindow::GetLabel()); wxSize textSize = text_ctrl->GetSize(); + + if (!static_tips.empty()) { + static_tips_size = dc.GetTextExtent(static_tips); + textSize.x = std::max(labelSize.GetWidth(), static_tips_size.GetWidth()); + textSize.y += static_tips_size.y; + textSize.y += 8; + } + int h = textSize.y + 8; if (size.y < h) { size.y = h; } + wxSize minSize = size; minSize.x = GetMinWidth(); SetMinSize(minSize); diff --git a/src/slic3r/GUI/Widgets/TextInput.hpp b/src/slic3r/GUI/Widgets/TextInput.hpp index d44a4e630..20407b5de 100644 --- a/src/slic3r/GUI/Widgets/TextInput.hpp +++ b/src/slic3r/GUI/Widgets/TextInput.hpp @@ -14,6 +14,10 @@ class TextInput : public wxNavigationEnabled StateColor text_color; wxTextCtrl * text_ctrl; + wxString static_tips; + wxSize static_tips_size; + wxBitmap static_tips_icon; + static const int TextInputWidth = 200; static const int TextInputHeight = 50; @@ -41,8 +45,9 @@ public: void SetLabel(const wxString& label); - void SetIcon(const wxBitmap & icon); + void SetStaticTips(const wxString& tips, const wxBitmap& bitmap); + void SetIcon(const wxBitmap & icon); void SetIcon(const wxString & icon); void SetIcon_1(const wxString &icon);