From ec3e1403b645928f0c19ae225b9924848b8aa6bb Mon Sep 17 00:00:00 2001 From: tamasmeszaros Date: Fri, 7 Sep 2018 10:24:05 +0200 Subject: [PATCH] Cleaning up and fixing localization issues with AppController. --- xs/CMakeLists.txt | 3 +- xs/src/slic3r/AppController.cpp | 211 +----------------- xs/src/slic3r/AppController.hpp | 52 ++--- xs/src/slic3r/AppControllerWx.cpp | 73 +++--- ...essIndicator.hpp => ProgressIndicator.hpp} | 33 ++- xs/src/slic3r/Strings.hpp | 10 - xs/xsp/AppController.xsp | 3 - 7 files changed, 72 insertions(+), 313 deletions(-) rename xs/src/slic3r/{IProgressIndicator.hpp => ProgressIndicator.hpp} (62%) delete mode 100644 xs/src/slic3r/Strings.hpp diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt index c4d3492a3..efd52ac13 100644 --- a/xs/CMakeLists.txt +++ b/xs/CMakeLists.txt @@ -267,11 +267,10 @@ add_library(libslic3r_gui STATIC ${LIBDIR}/slic3r/Utils/Time.hpp ${LIBDIR}/slic3r/Utils/HexFile.cpp ${LIBDIR}/slic3r/Utils/HexFile.hpp - ${LIBDIR}/slic3r/IProgressIndicator.hpp + ${LIBDIR}/slic3r/ProgressIndicator.hpp ${LIBDIR}/slic3r/AppController.hpp ${LIBDIR}/slic3r/AppController.cpp ${LIBDIR}/slic3r/AppControllerWx.cpp - ${LIBDIR}/slic3r/Strings.hpp ) add_library(admesh STATIC diff --git a/xs/src/slic3r/AppController.cpp b/xs/src/slic3r/AppController.cpp index 9394df363..7bd044b25 100644 --- a/xs/src/slic3r/AppController.cpp +++ b/xs/src/slic3r/AppController.cpp @@ -43,15 +43,6 @@ namespace GUI { PresetBundle* get_preset_bundle(); } -static const PrintObjectStep STEP_SLICE = posSlice; -static const PrintObjectStep STEP_PERIMETERS = posPerimeters; -static const PrintObjectStep STEP_PREPARE_INFILL = posPrepareInfill; -static const PrintObjectStep STEP_INFILL = posInfill; -static const PrintObjectStep STEP_SUPPORTMATERIAL = posSupportMaterial; -static const PrintStep STEP_SKIRT = psSkirt; -static const PrintStep STEP_BRIM = psBrim; -static const PrintStep STEP_WIPE_TOWER = psWipeTower; - AppControllerBoilerplate::ProgresIndicatorPtr AppControllerBoilerplate::global_progress_indicator() { ProgresIndicatorPtr ret; @@ -71,193 +62,8 @@ void AppControllerBoilerplate::global_progress_indicator( pri_data_->m.unlock(); } -void PrintController::make_skirt() -{ - assert(print_ != nullptr); - - // prerequisites - for(auto obj : print_->objects) make_perimeters(obj); - for(auto obj : print_->objects) infill(obj); - for(auto obj : print_->objects) gen_support_material(obj); - - if(!print_->state.is_done(STEP_SKIRT)) { - print_->state.set_started(STEP_SKIRT); - print_->skirt.clear(); - if(print_->has_skirt()) print_->_make_skirt(); - - print_->state.set_done(STEP_SKIRT); - } -} - -void PrintController::make_brim() -{ - assert(print_ != nullptr); - - // prerequisites - for(auto obj : print_->objects) make_perimeters(obj); - for(auto obj : print_->objects) infill(obj); - for(auto obj : print_->objects) gen_support_material(obj); - make_skirt(); - - if(!print_->state.is_done(STEP_BRIM)) { - print_->state.set_started(STEP_BRIM); - - // since this method must be idempotent, we clear brim paths *before* - // checking whether we need to generate them - print_->brim.clear(); - - if(print_->config.brim_width > 0) print_->_make_brim(); - - print_->state.set_done(STEP_BRIM); - } -} - -void PrintController::make_wipe_tower() -{ - assert(print_ != nullptr); - - // prerequisites - for(auto obj : print_->objects) make_perimeters(obj); - for(auto obj : print_->objects) infill(obj); - for(auto obj : print_->objects) gen_support_material(obj); - make_skirt(); - make_brim(); - - if(!print_->state.is_done(STEP_WIPE_TOWER)) { - print_->state.set_started(STEP_WIPE_TOWER); - - // since this method must be idempotent, we clear brim paths *before* - // checking whether we need to generate them - print_->brim.clear(); - - if(print_->has_wipe_tower()) print_->_make_wipe_tower(); - - print_->state.set_done(STEP_WIPE_TOWER); - } -} - -void PrintController::slice(PrintObject *pobj) -{ - assert(pobj != nullptr && print_ != nullptr); - - if(pobj->state.is_done(STEP_SLICE)) return; - - pobj->state.set_started(STEP_SLICE); - - pobj->_slice(); - - auto msg = pobj->_fix_slicing_errors(); - if(!msg.empty()) report_issue(IssueType::WARN, msg); - - // simplify slices if required - if (print_->config.resolution) - pobj->_simplify_slices(scale_(print_->config.resolution)); - - - if(pobj->layers.empty()) - report_issue(IssueType::ERR, - _(L("No layers were detected. You might want to repair your " - "STL file(s) or check their size or thickness and retry")) - ); - - pobj->state.set_done(STEP_SLICE); -} - -void PrintController::make_perimeters(PrintObject *pobj) -{ - assert(pobj != nullptr); - - slice(pobj); - - if (!pobj->state.is_done(STEP_PERIMETERS)) { - pobj->_make_perimeters(); - } -} - -void PrintController::infill(PrintObject *pobj) -{ - assert(pobj != nullptr); - - make_perimeters(pobj); - - if (!pobj->state.is_done(STEP_PREPARE_INFILL)) { - pobj->state.set_started(STEP_PREPARE_INFILL); - - pobj->_prepare_infill(); - - pobj->state.set_done(STEP_PREPARE_INFILL); - } - - pobj->_infill(); -} - -void PrintController::gen_support_material(PrintObject *pobj) -{ - assert(pobj != nullptr); - - // prerequisites - slice(pobj); - - if(!pobj->state.is_done(STEP_SUPPORTMATERIAL)) { - pobj->state.set_started(STEP_SUPPORTMATERIAL); - - pobj->clear_support_layers(); - - if((pobj->config.support_material || pobj->config.raft_layers > 0) - && pobj->layers.size() > 1) { - pobj->_generate_support_material(); - } - - pobj->state.set_done(STEP_SUPPORTMATERIAL); - } -} - -void PrintController::slice(AppControllerBoilerplate::ProgresIndicatorPtr pri) -{ - auto st = pri->state(); - - Slic3r::trace(3, "Starting the slicing process."); - - pri->update(st+20, _(L("Generating perimeters"))); - for(auto obj : print_->objects) make_perimeters(obj); - - pri->update(st+60, _(L("Infilling layers"))); - for(auto obj : print_->objects) infill(obj); - - pri->update(st+70, _(L("Generating support material"))); - for(auto obj : print_->objects) gen_support_material(obj); - - pri->message_fmt(_(L("Weight: %.1fg, Cost: %.1f")), - print_->total_weight, print_->total_cost); - pri->state(st+85); - - - pri->update(st+88, _(L("Generating skirt"))); - make_skirt(); - - - pri->update(st+90, _(L("Generating brim"))); - make_brim(); - - pri->update(st+95, _(L("Generating wipe tower"))); - make_wipe_tower(); - - pri->update(st+100, _(L("Done"))); - - // time to make some statistics.. - - Slic3r::trace(3, _(L("Slicing process finished."))); -} - -void PrintController::slice() -{ - auto pri = global_progress_indicator(); - if(!pri) pri = create_progress_indicator(100, L("Slicing")); - slice(pri); -} - -void IProgressIndicator::message_fmt( - const string &fmtstr, ...) { +void ProgressIndicator::message_fmt( + const std::string &fmtstr, ...) { std::stringstream ss; va_list args; va_start(args, fmtstr); @@ -288,7 +94,6 @@ const PrintConfig &PrintController::config() const return print_->config; } - void AppController::arrange_model() { auto ftr = std::async( @@ -322,7 +127,7 @@ void AppController::arrange_model() for(auto& v : bedpoints) bed.append(Point::new_scale(v.x, v.y)); - if(pind) pind->update(0, _(L("Arranging objects..."))); + if(pind) pind->update(0, L("Arranging objects...")); try { arr::BedShapeHint hint; @@ -336,20 +141,20 @@ void AppController::arrange_model() false, // create many piles not just one pile [pind, count](unsigned rem) { if(pind) - pind->update(count - rem, _(L("Arranging objects..."))); + pind->update(count - rem, L("Arranging objects...")); }); } catch(std::exception& e) { std::cerr << e.what() << std::endl; report_issue(IssueType::ERR, - _(L("Could not arrange model objects! " - "Some geometries may be invalid.")), - _(L("Exception occurred"))); + L("Could not arrange model objects! " + "Some geometries may be invalid."), + L("Exception occurred")); } // Restore previous max value if(pind) { pind->max(pmax); - pind->update(0, _(L("Arranging done."))); + pind->update(0, L("Arranging done.")); } }); diff --git a/xs/src/slic3r/AppController.hpp b/xs/src/slic3r/AppController.hpp index e9252b50c..3ef47ffdc 100644 --- a/xs/src/slic3r/AppController.hpp +++ b/xs/src/slic3r/AppController.hpp @@ -7,7 +7,7 @@ #include #include -#include "IProgressIndicator.hpp" +#include "ProgressIndicator.hpp" namespace Slic3r { @@ -15,7 +15,8 @@ class Model; class Print; class PrintObject; class PrintConfig; - +class ProgressStatusBar; +class DynamicPrintConfig; /** * @brief A boilerplate class for creating application logic. It should provide @@ -33,7 +34,7 @@ class AppControllerBoilerplate { public: /// A Progress indicator object smart pointer - using ProgresIndicatorPtr = std::shared_ptr; + using ProgresIndicatorPtr = std::shared_ptr; private: class PriData; // Some structure to store progress indication data @@ -46,7 +47,7 @@ public: AppControllerBoilerplate(); ~AppControllerBoilerplate(); - using Path = string; + using Path = std::string; using PathList = std::vector; /// Common runtime issue types @@ -67,20 +68,20 @@ public: * @return Returns a list of paths choosed by the user. */ PathList query_destination_paths( - const string& title, + const std::string& title, const std::string& extensions) const; /** * @brief Same as query_destination_paths but works for directories only. */ PathList query_destination_dirs( - const string& title) const; + const std::string& title) const; /** * @brief Same as query_destination_paths but returns only one path. */ Path query_destination_path( - const string& title, + const std::string& title, const std::string& extensions, const std::string& hint = "") const; @@ -95,11 +96,11 @@ public: * title. */ bool report_issue(IssueType issuetype, - const string& description, - const string& brief); + const std::string& description, + const std::string& brief); bool report_issue(IssueType issuetype, - const string& description); + const std::string& description); /** * @brief Return the global progress indicator for the current controller. @@ -150,12 +151,12 @@ protected: */ ProgresIndicatorPtr create_progress_indicator( unsigned statenum, - const string& title, - const string& firstmsg) const; + const std::string& title, + const std::string& firstmsg) const; ProgresIndicatorPtr create_progress_indicator( unsigned statenum, - const string& title) const; + const std::string& title) const; // This is a global progress indicator placeholder. In the Slic3r UI it can // contain the progress indicator on the statusbar. @@ -167,24 +168,6 @@ protected: */ class PrintController: public AppControllerBoilerplate { Print *print_ = nullptr; -protected: - - void make_skirt(); - void make_brim(); - void make_wipe_tower(); - - void make_perimeters(PrintObject *pobj); - void infill(PrintObject *pobj); - void gen_support_material(PrintObject *pobj); - - /** - * @brief Slice one pront object. - * @param pobj The print object. - */ - void slice(PrintObject *pobj); - - void slice(ProgresIndicatorPtr pri); - public: // Must be public for perl to use it @@ -199,11 +182,6 @@ public: return PrintController::Ptr( new PrintController(print) ); } - /** - * @brief Slice the loaded print scene. - */ - void slice(); - const PrintConfig& config() const; }; @@ -248,7 +226,7 @@ public: * In perl we have a progress indicating status bar on the bottom of the * window which is defined and created in perl. We can pass the ID-s of the * gauge and the statusbar id and make a wrapper implementation of the - * IProgressIndicator interface so we can use this GUI widget from C++. + * ProgressIndicator interface so we can use this GUI widget from C++. * * This function should be called from perl. * diff --git a/xs/src/slic3r/AppControllerWx.cpp b/xs/src/slic3r/AppControllerWx.cpp index 4e116c7b9..36a465919 100644 --- a/xs/src/slic3r/AppControllerWx.cpp +++ b/xs/src/slic3r/AppControllerWx.cpp @@ -32,11 +32,11 @@ void AppControllerBoilerplate::process_events() AppControllerBoilerplate::PathList AppControllerBoilerplate::query_destination_paths( - const string &title, + const std::string &title, const std::string &extensions) const { - wxFileDialog dlg(wxTheApp->GetTopWindow(), title ); + wxFileDialog dlg(wxTheApp->GetTopWindow(), _(title) ); dlg.SetWildcard(extensions); dlg.ShowModal(); @@ -52,11 +52,11 @@ AppControllerBoilerplate::query_destination_paths( AppControllerBoilerplate::Path AppControllerBoilerplate::query_destination_path( - const string &title, + const std::string &title, const std::string &extensions, const std::string& hint) const { - wxFileDialog dlg(wxTheApp->GetTopWindow(), title ); + wxFileDialog dlg(wxTheApp->GetTopWindow(), _(title) ); dlg.SetWildcard(extensions); dlg.SetFilename(hint); @@ -71,8 +71,8 @@ AppControllerBoilerplate::query_destination_path( } bool AppControllerBoilerplate::report_issue(IssueType issuetype, - const string &description, - const string &brief) + const std::string &description, + const std::string &brief) { auto icon = wxICON_INFORMATION; auto style = wxOK|wxCENTRE; @@ -84,15 +84,15 @@ bool AppControllerBoilerplate::report_issue(IssueType issuetype, case IssueType::FATAL: icon = wxICON_ERROR; } - auto ret = wxMessageBox(description, brief, icon | style); + auto ret = wxMessageBox(_(description), _(brief), icon | style); return ret != wxCANCEL; } bool AppControllerBoilerplate::report_issue( AppControllerBoilerplate::IssueType issuetype, - const string &description) + const std::string &description) { - return report_issue(issuetype, description, string()); + return report_issue(issuetype, description, std::string()); } wxDEFINE_EVENT(PROGRESS_STATUS_UPDATE_EVENT, wxCommandEvent); @@ -104,10 +104,10 @@ namespace { * the main thread as well. */ class GuiProgressIndicator: - public IProgressIndicator, public wxEvtHandler { + public ProgressIndicator, public wxEvtHandler { wxProgressDialog gauge_; - using Base = IProgressIndicator; + using Base = ProgressIndicator; wxString message_; int range_; wxString title_; bool is_asynch_ = false; @@ -136,8 +136,8 @@ public: /// Get the mode of parallel operation. inline bool asynch() const { return is_asynch_; } - inline GuiProgressIndicator(int range, const string& title, - const string& firstmsg) : + inline GuiProgressIndicator(int range, const wxString& title, + const wxString& firstmsg) : gauge_(title, firstmsg, range, wxTheApp->GetTopWindow(), wxPD_APP_MODAL | wxPD_AUTO_HIDE), message_(firstmsg), @@ -151,11 +151,6 @@ public: this, id_); } - virtual void cancel() override { - update(max(), "Abort"); - IProgressIndicator::cancel(); - } - virtual void state(float val) override { state(static_cast(val)); } @@ -170,26 +165,28 @@ public: } else _state(st); } - virtual void message(const string & msg) override { - message_ = msg; + virtual void message(const std::string & msg) override { + message_ = _(msg); } - virtual void messageFmt(const string& fmt, ...) { + virtual void messageFmt(const std::string& fmt, ...) { va_list arglist; va_start(arglist, fmt); - message_ = wxString::Format(wxString(fmt), arglist); + message_ = wxString::Format(_(fmt), arglist); va_end(arglist); } - virtual void title(const string & title) override { - title_ = title; + virtual void title(const std::string & title) override { + title_ = _(title); } }; } AppControllerBoilerplate::ProgresIndicatorPtr AppControllerBoilerplate::create_progress_indicator( - unsigned statenum, const string& title, const string& firstmsg) const + unsigned statenum, + const std::string& title, + const std::string& firstmsg) const { auto pri = std::make_shared(statenum, title, firstmsg); @@ -202,20 +199,20 @@ AppControllerBoilerplate::create_progress_indicator( } AppControllerBoilerplate::ProgresIndicatorPtr -AppControllerBoilerplate::create_progress_indicator(unsigned statenum, - const string &title) const +AppControllerBoilerplate::create_progress_indicator( + unsigned statenum, const std::string &title) const { - return create_progress_indicator(statenum, title, string()); + return create_progress_indicator(statenum, title, std::string()); } namespace { // A wrapper progress indicator class around the statusbar created in perl. -class Wrapper: public IProgressIndicator, public wxEvtHandler { +class Wrapper: public ProgressIndicator, public wxEvtHandler { wxGauge *gauge_; wxStatusBar *stbar_; - using Base = IProgressIndicator; - std::string message_; + using Base = ProgressIndicator; + wxString message_; AppControllerBoilerplate& ctl_; void showProgress(bool show = true) { @@ -223,7 +220,7 @@ class Wrapper: public IProgressIndicator, public wxEvtHandler { } void _state(unsigned st) { - if( st <= IProgressIndicator::max() ) { + if( st <= ProgressIndicator::max() ) { Base::state(st); if(!gauge_->IsShown()) showProgress(true); @@ -266,7 +263,7 @@ public: virtual void max(float val) override { if(val > 1.0) { gauge_->SetRange(static_cast(val)); - IProgressIndicator::max(val); + ProgressIndicator::max(val); } } @@ -280,18 +277,18 @@ public: } } - virtual void message(const string & msg) override { - message_ = msg; + virtual void message(const std::string & msg) override { + message_ = _(msg); } - virtual void message_fmt(const string& fmt, ...) override { + virtual void message_fmt(const std::string& fmt, ...) override { va_list arglist; va_start(arglist, fmt); - message_ = wxString::Format(fmt, arglist); + message_ = wxString::Format(_(fmt), arglist); va_end(arglist); } - virtual void title(const string & /*title*/) override {} + virtual void title(const std::string & /*title*/) override {} }; } diff --git a/xs/src/slic3r/IProgressIndicator.hpp b/xs/src/slic3r/ProgressIndicator.hpp similarity index 62% rename from xs/src/slic3r/IProgressIndicator.hpp rename to xs/src/slic3r/ProgressIndicator.hpp index 704931574..1b064077e 100644 --- a/xs/src/slic3r/IProgressIndicator.hpp +++ b/xs/src/slic3r/ProgressIndicator.hpp @@ -3,16 +3,15 @@ #include #include -#include "Strings.hpp" namespace Slic3r { /** * @brief Generic progress indication interface. */ -class IProgressIndicator { +class ProgressIndicator { public: - using CancelFn = std::function; // Cancel functio signature. + using CancelFn = std::function; // Cancel function signature. private: float state_ = .0f, max_ = 1.f, step_; @@ -20,7 +19,7 @@ private: public: - inline virtual ~IProgressIndicator() {} + inline virtual ~ProgressIndicator() {} /// Get the maximum of the progress range. float max() const { return max_; } @@ -28,14 +27,14 @@ public: /// Get the current progress state float state() const { return state_; } - /// Set the maximum of hte progress range + /// Set the maximum of the progress range virtual void max(float maxval) { max_ = maxval; } /// Set the current state of the progress. virtual void state(float val) { state_ = val; } /** - * @brief Number of states int the progress. Can be used insted of giving a + * @brief Number of states int the progress. Can be used instead of giving a * maximum value. */ virtual void states(unsigned statenum) { @@ -43,25 +42,19 @@ public: } /// Message shown on the next status update. - virtual void message(const string&) = 0; + virtual void message(const std::string&) = 0; - /// Title of the operaton. - virtual void title(const string&) = 0; + /// Title of the operation. + virtual void title(const std::string&) = 0; - /// Formatted message for the next status update. Works just like sprinf. - virtual void message_fmt(const string& fmt, ...); + /// Formatted message for the next status update. Works just like sprintf. + virtual void message_fmt(const std::string& fmt, ...); /// Set up a cancel callback for the operation if feasible. - inline void on_cancel(CancelFn func) { cancelfunc_ = func; } + virtual void on_cancel(CancelFn func = CancelFn()) { cancelfunc_ = func; } - /** - * Explicitly shut down the progress indicator and call the associated - * callback. - */ - virtual void cancel() { cancelfunc_(); } - - /// Convinience function to call message and status update in one function. - void update(float st, const string& msg) { + /// Convenience function to call message and status update in one function. + void update(float st, const std::string& msg) { message(msg); state(st); } }; diff --git a/xs/src/slic3r/Strings.hpp b/xs/src/slic3r/Strings.hpp deleted file mode 100644 index b267fe064..000000000 --- a/xs/src/slic3r/Strings.hpp +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef STRINGS_HPP -#define STRINGS_HPP - -#include "GUI/GUI.hpp" - -namespace Slic3r { -using string = wxString; -} - -#endif // STRINGS_HPP diff --git a/xs/xsp/AppController.xsp b/xs/xsp/AppController.xsp index 1b653081d..a578fe0b1 100644 --- a/xs/xsp/AppController.xsp +++ b/xs/xsp/AppController.xsp @@ -8,10 +8,7 @@ %} %name{Slic3r::PrintController} class PrintController { - PrintController(Print *print); - - void slice(); }; %name{Slic3r::AppController} class AppController {