diff --git a/src/GUI/GUI.cpp b/src/GUI/GUI.cpp index bafcaeb83..6fbae6d95 100644 --- a/src/GUI/GUI.cpp +++ b/src/GUI/GUI.cpp @@ -1,6 +1,7 @@ #include #ifndef WX_PRECOMP #include + #include #endif #include #include @@ -29,9 +30,13 @@ bool App::OnInit() wxString enc_datadir = encode_path(datadir); const wxString& slic3r_ini {datadir + "/slic3r.ini"}; - const wxString& print_ini {datadir + "/print"}; - const wxString& printer_ini {datadir + "/printer"}; - const wxString& material_ini {datadir + "/filament"}; + this->preset_ini[static_cast(preset_t::Print)] = {datadir + "/print"}; + this->preset_ini[static_cast(preset_t::Printer)] = {datadir + "/printer"}; + this->preset_ini[static_cast(preset_t::Material)] = {datadir + "/filament"}; + const wxString& print_ini = this->preset_ini[static_cast(preset_t::Print)]; + const wxString& printer_ini = this->preset_ini[static_cast(preset_t::Printer)]; + const wxString& material_ini = this->preset_ini[static_cast(preset_t::Material)]; + // if we don't have a datadir or a slic3r.ini, prompt for wizard. bool run_wizard = (wxDirExists(datadir) && wxFileExists(slic3r_ini)); @@ -162,6 +167,31 @@ void App::restore_window_pos(wxTopLevelWindow* window, const wxString& name ) { } void App::load_presets() { + for (size_t group = 0; group < preset_types; ++group) { + Presets& preset_list = this->presets.at(group); + wxString& ini = this->preset_ini.at(group); + // keep external or dirty presets + preset_list.erase(std::remove_if(preset_list.begin(), preset_list.end(), + [](const Preset& t) -> bool { return (t.external && t.file_exists()) || t.dirty(); }), + preset_list.end()); + if (wxDirExists(ini)) { + auto sink { wxDirTraverserSimple() }; + sink.file_cb = ([&preset_list, group] (const wxString& filename) { + if (std::find_if(preset_list.begin(), preset_list.end(), + [filename] (const Preset& t) + { return filename.ToStdString() == t.name; }) != preset_list.end()) return; + wxString path, name, ext; + wxFileName::SplitPath(filename, &path, &name, &ext); + preset_list.push_back(Preset(path.ToStdString(), (name + ext).ToStdString(), static_cast(group))); + }); + + wxDir dir(ini); + dir.Traverse(sink, "*.ini"); + + Slic3r::Log::debug("file") << "found " << preset_list.size() << " files " << "\n"; + } + + } /* for my $group (qw(printer filament print)) { my $presets = $self->{presets}{$group}; diff --git a/src/GUI/misc_ui.hpp b/src/GUI/misc_ui.hpp index fc207a3ff..ec24a57d1 100644 --- a/src/GUI/misc_ui.hpp +++ b/src/GUI/misc_ui.hpp @@ -4,6 +4,7 @@ #include #ifndef WX_PRECOMP #include + #include #endif #include @@ -157,6 +158,24 @@ extern std::unique_ptr ui_settings; wxString trim_zeroes(wxString in); +/// Extensible directory traversal sink, cribbed from wxwidgets docs +class wxDirTraverserSimple : public wxDirTraverser +{ +public: + std::function file_cb {nullptr}; + std::function dir_cb {nullptr}; + wxDirTraverserSimple() { } + virtual wxDirTraverseResult OnFile(const wxString& filename) + { + if (this->file_cb != nullptr) this->file_cb(filename); + return wxDIR_CONTINUE; + } + virtual wxDirTraverseResult OnDir(const wxString& dirname) + { + if (this->dir_cb != nullptr) this->file_cb(dirname); + return wxDIR_CONTINUE; + } +}; }} // namespace Slic3r::GUI