diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp index e1292bd3a9..4f2a4f8790 100644 --- a/xs/src/slic3r/GUI/GUI.cpp +++ b/xs/src/slic3r/GUI/GUI.cpp @@ -193,23 +193,7 @@ void create_preset_tab(const char *name) { CTabPrint* panel = new CTabPrint(g_wxTabPanel, name); panel->create_preset_tab(); - g_wxTabPanel->AddPage(panel, name); - - //!------------Exp - // parse all command line options into a DynamicConfig -/* - DynamicPrintConfig print_config; -//! const DynamicPrintConfig &print_config = preset_bundle.prints .get_edited_preset().config; - - auto vsizer = new wxBoxSizer(wxVERTICAL); - this->SetSizer(vsizer); - auto optgroup = GUI::ConfigOptionsGroup(this, "Custom GCode", &print_config); - optgroup.on_change = ON_CHANGE(= , {}); - vsizer->Add(optgroup.sizer, 0, wxEXPAND | wxALL, 10); - - optgroup.append_single_option_line(GUI::Option(*(config.def->get("before_layer_gcode")), "before_layer_gcode")); -*/ //!------------Exp - + g_wxTabPanel->AddPage(panel, name); } } } diff --git a/xs/src/slic3r/GUI/OptionsGroup.cpp b/xs/src/slic3r/GUI/OptionsGroup.cpp index 88fc378a43..cbece3fee0 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.cpp +++ b/xs/src/slic3r/GUI/OptionsGroup.cpp @@ -1,4 +1,4 @@ -#include "OptionsGroup.hpp" +#include "OptionsGroup.hpp" #include "ConfigExceptions.hpp" #include @@ -127,7 +127,7 @@ void OptionsGroup::append_line(const Line& line) { // add sidetext if any if (option.sidetext != "") { - auto sidetext = new wxStaticText(parent(), wxID_ANY, option.sidetext, wxDefaultPosition, wxDefaultSize); + auto sidetext = new wxStaticText(parent(), wxID_ANY, wxString::FromUTF8(option.sidetext.c_str()), wxDefaultPosition, wxDefaultSize); sidetext->SetFont(sidetext_font); sizer->Add(sidetext, 0, wxLEFT | wxALIGN_CENTER_VERTICAL, 4); } diff --git a/xs/src/slic3r/GUI/OptionsGroup.hpp b/xs/src/slic3r/GUI/OptionsGroup.hpp index f81d937bdf..75348628b8 100644 --- a/xs/src/slic3r/GUI/OptionsGroup.hpp +++ b/xs/src/slic3r/GUI/OptionsGroup.hpp @@ -26,7 +26,7 @@ namespace Slic3r { namespace GUI { /// Widget type describes a function object that returns a wxWindow (our widget) and accepts a wxWidget (parent window). -using widget_t = std::function; +using widget_t = std::function;//!std::function; using column_t = std::function; class StaticText; @@ -65,7 +65,6 @@ private: }; using t_optionfield_map = std::map; -using t_optionoption_map = std::map; //! class OptionsGroup { public: @@ -114,7 +113,7 @@ public: }; protected: - /*const t_optionoption_map& options; //*/const t_optiondef_map& options; //! + const t_optiondef_map& options; wxWindow* _parent {nullptr}; /// Field list, contains unique_ptrs of the derived type. diff --git a/xs/src/slic3r/GUI/Tab.cpp b/xs/src/slic3r/GUI/Tab.cpp index 436eabebb6..0aa57ef0a1 100644 --- a/xs/src/slic3r/GUI/Tab.cpp +++ b/xs/src/slic3r/GUI/Tab.cpp @@ -316,7 +316,7 @@ void CTabPrint::build() optgroup->append_single_option_line(option); page = add_options_page("Notes", "note.png"); - optgroup = page->new_optgroup("Notes"); //! label_width = > 0, + optgroup = page->new_optgroup("Notes"); option = get_option_("notes"); option.opt.full_width = true; option.opt.height = 250; @@ -325,7 +325,7 @@ void CTabPrint::build() page = add_options_page("Dependencies", "wrench.png"); optgroup = page->new_optgroup("Profile dependencies"); line = Line{ "Compatible printers", "" }; -// line.widget = ? ? ? ; //! widget = > $self->_compatible_printers_widget, + line.widget = compatible_printers_widget_; optgroup->append_line(line); } @@ -387,6 +387,94 @@ void CTab::save_preset(wxCommandEvent &event){}; void CTab::delete_preset(wxCommandEvent &event){}; void CTab::_toggle_show_hide_incompatible(wxCommandEvent &event){}; +// # Return a callback to create a Tab widget to mark the preferences as compatible / incompatible to the current printer. +wxSizer* CTab::compatible_printers_widget_(wxWindow* parent) +{ + auto checkbox /*= compatible_printers_checkbox*/ = new wxCheckBox(parent, wxID_ANY, "All"); + + auto btn /*= compatible_printers_btn*/ = new wxButton(parent, wxID_ANY, "Set…", wxDefaultPosition, wxDefaultSize, + wxBU_LEFT | wxBU_EXACTFIT); +// btn->SetFont(GUI::small_font); + btn->SetBitmap(wxBitmap(wxT("var\\printer_empty.png"), wxBITMAP_TYPE_PNG)); + + auto sizer = new wxBoxSizer(wxHORIZONTAL); + sizer->Add(checkbox, 0, wxALIGN_CENTER_VERTICAL); + sizer->Add(btn, 0, wxALIGN_CENTER_VERTICAL); + + checkbox->Bind(wxEVT_CHECKBOX, ([=](wxCommandEvent e) + { + btn->Enable(!checkbox->GetValue()); + // # All printers have been made compatible with this preset. + // _load_key_value('compatible_printers', []) if checkbox->GetValue(); + }) ); + + btn->Bind(wxEVT_BUTTON, ([=](wxCommandEvent e) + { + PresetCollection *prints = new PresetCollection(Preset::TYPE_PRINT, Preset::print_options()); + prints->preset(0).config.opt_string("print_settings_id", true); + prints->preset(0).config.optptr("compatible_printers", true); + DynamicPrintConfig config_ = prints->get_edited_preset().config; + + // # Collect names of non-default non-external printer profiles. + PresetCollection *printers = new PresetCollection(Preset::TYPE_PRINTER, Preset::print_options()); + printers->preset(0).config.opt_string("print_settings_id", true); + wxArrayString presets; + for (size_t idx = 0; idx < printers->size(); ++idx) + { + Preset& preset = printers->preset(idx); + if (!preset.is_default && !preset.is_external) + presets.Add(preset.name); + } + + auto dlg = new wxMultiChoiceDialog(parent, + "Select the printers this profile is compatible with.", + "Compatible printers", presets); + // # Collect and set indices of printers marked as compatible. + wxArrayInt selections; + auto *compatible_printers = dynamic_cast(config_.option("compatible_printers")); + if (compatible_printers != nullptr || !compatible_printers->values.empty()) + for (auto preset_name : compatible_printers->values) + for (size_t idx = 0; idx < presets.GetCount(); ++idx) + if (presets[idx].compare(preset_name) == 0) + { + selections.Add(idx); + break; + } + dlg->SetSelections(selections); + // # Show the dialog. + if (dlg->ShowModal() == wxID_OK) { + selections.Clear(); + selections = dlg->GetSelections(); + std::vector value; + for (auto idx : selections) + value.push_back(presets[idx].ToStdString()); + if (/*!@$value*/value.empty()) { + checkbox->SetValue(1); + btn->Disable(); + } + // # All printers have been made compatible with this preset. + // _load_key_value('compatible_printers', $value); + } + })); + return sizer; +} + +void CTab::load_key_value_(std::string opt_key, std::vector value) +{ + // # To be called by custom widgets, load a value into a config, + // # update the preset selection boxes (the dirty flags) + // $self->{config}->set($opt_key, $value); + // # Mark the print & filament enabled if they are compatible with the currently selected preset. + if (opt_key.compare("compatible_printers")==0) { + // wxTheApp->{preset_bundle}->update_compatible_with_printer(0); + // $self->{presets}->update_tab_ui($self->{presets_choice}, $self->{show_incompatible_presets}); + // } else { + // $self->{presets}->update_dirty_ui($self->{presets_choice}); + } + // $self->_on_presets_changed; + // $self->_update; +} + // package Slic3r::GUI::Tab::Page; ConfigOptionsGroupShp CPage::new_optgroup(std::string title, size_t label_width /*= 0*/) { diff --git a/xs/src/slic3r/GUI/Tab.h b/xs/src/slic3r/GUI/Tab.h index 4970adfc22..7de862b518 100644 --- a/xs/src/slic3r/GUI/Tab.h +++ b/xs/src/slic3r/GUI/Tab.h @@ -85,6 +85,8 @@ protected: wxBoxSizer* left_sizer_; wxTreeCtrl* treectrl_; wxImageList* icons_; + wxCheckBox* compatible_printers_checkbox_; + wxButton* compatible_printers_btn; int icon_count; std::map icon_index_; // Map from an icon file name to its index in $self->{icons}. std::vector pages_; // $self->{pages} = []; @@ -107,6 +109,9 @@ public: void rebuild_page_tree(); void select_preset(wxString preset_name){}; + static wxSizer* compatible_printers_widget_(wxWindow* parent); + void load_key_value_(std::string opt_key, std::vector value); + void OnTreeSelChange(wxTreeEvent& event); void OnKeyDown(wxKeyEvent& event); void OnComboBox(wxCommandEvent& event) { select_preset(presets_choice_->GetStringSelection()); }