Fix fs::path <-> wxString conversions

This commit is contained in:
Vojtech Kral 2019-01-02 15:11:05 +01:00
parent 760b1cd9bc
commit 2db0906071
6 changed files with 51 additions and 26 deletions

View file

@ -4,6 +4,7 @@
#include "WipeTowerDialog.hpp" #include "WipeTowerDialog.hpp"
#include <assert.h> #include <assert.h>
#include <string>
#include <boost/lexical_cast.hpp> #include <boost/lexical_cast.hpp>
#include <boost/algorithm/string.hpp> #include <boost/algorithm/string.hpp>
@ -314,6 +315,20 @@ std::string into_u8(const wxString &str)
return std::string(buffer_utf8.data()); return std::string(buffer_utf8.data());
} }
wxString from_path(const boost::filesystem::path &path)
{
#ifdef _WIN32
return wxString(path.string<std::wstring>());
#else
return wxString::FromUTF8(path.string<std::string>());
#endif
}
boost::filesystem::path into_path(const wxString &str)
{
return boost::filesystem::path(str.wx_str());
}
bool get_current_screen_size(wxWindow *window, unsigned &width, unsigned &height) bool get_current_screen_size(wxWindow *window, unsigned &width, unsigned &height)
{ {
const auto idx = wxDisplay::GetFromWindow(window); const auto idx = wxDisplay::GetFromWindow(window);

View file

@ -1,6 +1,10 @@
#ifndef slic3r_GUI_hpp_ #ifndef slic3r_GUI_hpp_
#define slic3r_GUI_hpp_ #define slic3r_GUI_hpp_
#include <boost/filesystem/path.hpp>
#include <wx/string.h>
#include "libslic3r/Config.hpp" #include "libslic3r/Config.hpp"
class wxWindow; class wxWindow;
@ -8,7 +12,6 @@ class wxMenuBar;
class wxNotebook; class wxNotebook;
class wxComboCtrl; class wxComboCtrl;
class wxFileDialog; class wxFileDialog;
class wxString;
class wxTopLevelWindow; class wxTopLevelWindow;
namespace Slic3r { namespace Slic3r {
@ -53,10 +56,16 @@ void create_combochecklist(wxComboCtrl* comboCtrl, std::string text, std::string
// encoded inside an int. // encoded inside an int.
int combochecklist_get_flags(wxComboCtrl* comboCtrl); int combochecklist_get_flags(wxComboCtrl* comboCtrl);
// Return wxString from std::string in UTF8 // wxString conversions:
// wxString from std::string in UTF8
wxString from_u8(const std::string &str); wxString from_u8(const std::string &str);
// Return std::string in UTF8 from wxString // std::string in UTF8 from wxString
std::string into_u8(const wxString &str); std::string into_u8(const wxString &str);
// wxString from boost path
wxString from_path(const boost::filesystem::path &path);
// boost path from wxString
boost::filesystem::path into_path(const wxString &str);
// Returns the dimensions of the screen on which the main frame is displayed // Returns the dimensions of the screen on which the main frame is displayed
bool get_current_screen_size(wxWindow *window, unsigned &width, unsigned &height); bool get_current_screen_size(wxWindow *window, unsigned &width, unsigned &height);

View file

@ -382,7 +382,7 @@ void GUI_App::import_model(wxWindow *parent, wxArrayString& input_files)
input_files.Clear(); input_files.Clear();
wxFileDialog dialog(parent ? parent : GetTopWindow(), wxFileDialog dialog(parent ? parent : GetTopWindow(),
_(L("Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):")), _(L("Choose one or more files (STL/OBJ/AMF/3MF/PRUSA):")),
app_config->get_last_dir(), "", from_u8(app_config->get_last_dir()), "",
file_wildcards(FT_MODEL), wxFD_OPEN | wxFD_MULTIPLE | wxFD_FILE_MUST_EXIST); file_wildcards(FT_MODEL), wxFD_OPEN | wxFD_MULTIPLE | wxFD_FILE_MUST_EXIST);
if (dialog.ShowModal() == wxID_OK) if (dialog.ShowModal() == wxID_OK)

View file

@ -224,7 +224,7 @@ void MainFrame::init_menubar()
wxMenuItem* item_open = append_menu_item(fileMenu, wxID_ANY, _(L("Open…\tCtrl+O")), _(L("Open a project file")), wxMenuItem* item_open = append_menu_item(fileMenu, wxID_ANY, _(L("Open…\tCtrl+O")), _(L("Open a project file")),
[this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, "brick_add.png"); [this](wxCommandEvent&) { if (m_plater) m_plater->load_project(); }, "brick_add.png");
wxMenuItem* item_save = append_menu_item(fileMenu, wxID_ANY, _(L("Save\tCtrl+S")), _(L("Save current project file")), wxMenuItem* item_save = append_menu_item(fileMenu, wxID_ANY, _(L("Save\tCtrl+S")), _(L("Save current project file")),
[this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(m_plater->get_project_filename().wx_str()); }, "disk.png"); [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(into_path(m_plater->get_project_filename())); }, "disk.png");
wxMenuItem* item_save_as = append_menu_item(fileMenu, wxID_ANY, _(L("Save as…\tCtrl+Alt+S")), _(L("Save current project file as")), wxMenuItem* item_save_as = append_menu_item(fileMenu, wxID_ANY, _(L("Save as…\tCtrl+Alt+S")), _(L("Save current project file as")),
[this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(); }, "disk.png"); [this](wxCommandEvent&) { if (m_plater) m_plater->export_3mf(); }, "disk.png");

View file

@ -863,7 +863,7 @@ bool PlaterDropTarget::OnDropFiles(wxCoord x, wxCoord y, const wxArrayString &fi
std::vector<fs::path> paths; std::vector<fs::path> paths;
for (const auto &filename : filenames) { for (const auto &filename : filenames) {
fs::path path(filename); fs::path path(into_path(filename));
if (std::regex_match(path.string(), pattern_drop)) { if (std::regex_match(path.string(), pattern_drop)) {
paths.push_back(std::move(path)); paths.push_back(std::move(path));
@ -1396,7 +1396,7 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
for (size_t i = 0; i < input_files.size(); i++) { for (size_t i = 0; i < input_files.size(); i++) {
const auto &path = input_files[i]; const auto &path = input_files[i];
const auto filename = path.filename(); const auto filename = path.filename();
const auto dlg_info = wxString::Format(_(L("Processing input file %s\n")), filename.string()); const auto dlg_info = wxString::Format(_(L("Processing input file %s\n")), from_path(filename));
dlg.Update(100 * i / input_files.size(), dlg_info); dlg.Update(100 * i / input_files.size(), dlg_info);
const bool type_3mf = std::regex_match(path.string(), pattern_3mf); const bool type_3mf = std::regex_match(path.string(), pattern_3mf);
@ -1470,7 +1470,7 @@ std::vector<size_t> Plater::priv::load_files(const std::vector<fs::path>& input_
if ( obj->volumes.size()>1 ) { if ( obj->volumes.size()>1 ) {
Slic3r::GUI::show_error(nullptr, Slic3r::GUI::show_error(nullptr,
wxString::Format(_(L("You can't to add the object(s) from %s because of one or some of them is(are) multi-part")), wxString::Format(_(L("You can't to add the object(s) from %s because of one or some of them is(are) multi-part")),
filename.string())); from_path(filename)));
return std::vector<size_t>(); return std::vector<size_t>();
} }
} }
@ -1609,8 +1609,8 @@ std::unique_ptr<CheckboxFileDialog> Plater::priv::get_export_file(GUI::FileType
((file_type == FT_AMF) || (file_type == FT_3MF)) ? _(L("Export print config")) : "", ((file_type == FT_AMF) || (file_type == FT_3MF)) ? _(L("Export print config")) : "",
true, true,
_(L("Save file as:")), _(L("Save file as:")),
output_file.parent_path().string(), from_path(output_file.parent_path()),
output_file.filename().string(), from_path(output_file.filename()),
wildcard, wildcard,
wxFD_SAVE | wxFD_OVERWRITE_PROMPT wxFD_SAVE | wxFD_OVERWRITE_PROMPT
); );
@ -1619,7 +1619,7 @@ std::unique_ptr<CheckboxFileDialog> Plater::priv::get_export_file(GUI::FileType
return nullptr; return nullptr;
} }
fs::path path(dlg->GetPath()); fs::path path(into_path(dlg->GetPath()));
wxGetApp().app_config->update_last_output_dir(path.parent_path().string()); wxGetApp().app_config->update_last_output_dir(path.parent_path().string());
return dlg; return dlg;
@ -2855,7 +2855,7 @@ void Plater::load_project()
p->project_filename = input_file; p->project_filename = input_file;
std::vector<fs::path> input_paths; std::vector<fs::path> input_paths;
input_paths.push_back(input_file.wx_str()); input_paths.push_back(into_path(input_file));
load_files(input_paths); load_files(input_paths);
} }
@ -2868,7 +2868,7 @@ void Plater::add_model()
std::vector<fs::path> input_paths; std::vector<fs::path> input_paths;
for (const auto &file : input_files) { for (const auto &file : input_files) {
input_paths.push_back(file.wx_str()); input_paths.push_back(into_path(file));
} }
load_files(input_paths, true, false); load_files(input_paths, true, false);
} }
@ -2882,7 +2882,7 @@ void Plater::extract_config_from_project()
return; return;
std::vector<fs::path> input_paths; std::vector<fs::path> input_paths;
input_paths.push_back(input_file.wx_str()); input_paths.push_back(into_path(input_file));
load_files(input_paths, false, true); load_files(input_paths, false, true);
} }
@ -3033,15 +3033,15 @@ void Plater::export_gcode(fs::path output_path)
wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _(L("Save G-code file as:")) : _(L("Save Zip file as:")), wxFileDialog dlg(this, (printer_technology() == ptFFF) ? _(L("Save G-code file as:")) : _(L("Save Zip file as:")),
start_dir, start_dir,
default_output_file.filename().string(), from_path(default_output_file.filename()),
GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_PNGZIP, default_output_file.extension().string()), GUI::file_wildcards((printer_technology() == ptFFF) ? FT_GCODE : FT_PNGZIP, default_output_file.extension().string()),
wxFD_SAVE | wxFD_OVERWRITE_PROMPT wxFD_SAVE | wxFD_OVERWRITE_PROMPT
); );
if (dlg.ShowModal() == wxID_OK) { if (dlg.ShowModal() == wxID_OK) {
fs::path path(dlg.GetPath()); fs::path path = into_path(dlg.GetPath());
wxGetApp().app_config->update_last_output_dir(path.parent_path().string()); wxGetApp().app_config->update_last_output_dir(path.parent_path().string());
output_path = path; output_path = std::move(path);
} }
} else { } else {
try { try {
@ -3065,8 +3065,8 @@ void Plater::export_stl(bool selection_only)
if (! dialog) { return; } if (! dialog) { return; }
// Store a binary STL // Store a binary STL
wxString path = dialog->GetPath(); const wxString path = dialog->GetPath();
auto path_cstr = path.c_str(); const std::string path_u8 = into_u8(path);
TriangleMesh mesh; TriangleMesh mesh;
if (selection_only) { if (selection_only) {
@ -3080,7 +3080,7 @@ void Plater::export_stl(bool selection_only)
auto mesh = p->model.mesh(); auto mesh = p->model.mesh();
} }
Slic3r::store_stl(path_cstr, &mesh, true); Slic3r::store_stl(path_u8.c_str(), &mesh, true);
p->statusbar()->set_status_text(wxString::Format(_(L("STL file exported to %s")), path)); p->statusbar()->set_status_text(wxString::Format(_(L("STL file exported to %s")), path));
} }
@ -3091,11 +3091,11 @@ void Plater::export_amf()
auto dialog = p->get_export_file(FT_AMF); auto dialog = p->get_export_file(FT_AMF);
if (! dialog) { return; } if (! dialog) { return; }
wxString path = dialog->GetPath(); const wxString path = dialog->GetPath();
auto path_cstr = path.c_str(); const std::string path_u8 = into_u8(path);
DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure(); DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure();
if (Slic3r::store_amf(path_cstr, &p->model, dialog->get_checkbox_value() ? &cfg : nullptr)) { if (Slic3r::store_amf(path_u8.c_str(), &p->model, dialog->get_checkbox_value() ? &cfg : nullptr)) {
// Success // Success
p->statusbar()->set_status_text(wxString::Format(_(L("AMF file exported to %s")), path)); p->statusbar()->set_status_text(wxString::Format(_(L("AMF file exported to %s")), path));
} else { } else {
@ -3118,13 +3118,14 @@ void Plater::export_3mf(const boost::filesystem::path& output_path)
export_config = dialog->get_checkbox_value(); export_config = dialog->get_checkbox_value();
} }
else else
path = output_path.string(); path = from_path(output_path);
if (!path.Lower().EndsWith(".3mf")) if (!path.Lower().EndsWith(".3mf"))
return; return;
DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure(); DynamicPrintConfig cfg = wxGetApp().preset_bundle->full_config_secure();
if (Slic3r::store_3mf(path.c_str(), &p->model, export_config ? &cfg : nullptr)) { const std::string path_u8 = into_u8(path);
if (Slic3r::store_3mf(path_u8.c_str(), &p->model, export_config ? &cfg : nullptr)) {
// Success // Success
p->statusbar()->set_status_text(wxString::Format(_(L("3MF file exported to %s")), path)); p->statusbar()->set_status_text(wxString::Format(_(L("3MF file exported to %s")), path));
} else { } else {

View file

@ -49,7 +49,7 @@ PrintHostSendDialog::PrintHostSendDialog(const fs::path &path)
fs::path PrintHostSendDialog::filename() const fs::path PrintHostSendDialog::filename() const
{ {
return fs::path(txt_filename->GetValue().wx_str()); return into_path(txt_filename->GetValue());
} }
bool PrintHostSendDialog::start_print() const bool PrintHostSendDialog::start_print() const