Implemented GUI::load_presets to check file existence.

This commit is contained in:
Joseph Lenox 2018-11-10 23:49:17 -06:00 committed by Joseph Lenox
parent 9812e6a81c
commit 292bfdcfb2
2 changed files with 52 additions and 3 deletions

View File

@ -1,6 +1,7 @@
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#include <wx/dir.h>
#endif
#include <wx/display.h>
#include <wx/filefn.h>
@ -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<int>(preset_t::Print)] = {datadir + "/print"};
this->preset_ini[static_cast<int>(preset_t::Printer)] = {datadir + "/printer"};
this->preset_ini[static_cast<int>(preset_t::Material)] = {datadir + "/filament"};
const wxString& print_ini = this->preset_ini[static_cast<int>(preset_t::Print)];
const wxString& printer_ini = this->preset_ini[static_cast<int>(preset_t::Printer)];
const wxString& material_ini = this->preset_ini[static_cast<int>(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<preset_t>(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};

View File

@ -4,6 +4,7 @@
#include <wx/wxprec.h>
#ifndef WX_PRECOMP
#include <wx/wx.h>
#include <wx/dir.h>
#endif
#include <wx/settings.h>
@ -157,6 +158,24 @@ extern std::unique_ptr<Settings> ui_settings;
wxString trim_zeroes(wxString in);
/// Extensible directory traversal sink, cribbed from wxwidgets docs
class wxDirTraverserSimple : public wxDirTraverser
{
public:
std::function<void(const wxString&)> file_cb {nullptr};
std::function<void(const wxString&)> 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