Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/prusa3d/PrusaSlicer.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/xs
diff options
context:
space:
mode:
authortamasmeszaros <meszaros.q@gmail.com>2018-08-30 16:21:41 +0300
committertamasmeszaros <meszaros.q@gmail.com>2018-08-30 18:35:49 +0300
commit4f53fc2a5f2ed179f857398e9f9ff3fe5956e52f (patch)
treeea6a927058fc7e4fe2095b7a9f89ccd7c7df246d /xs
parent3750bd781eb2b48bc9ac6ac5acf8ce1bf99da0be (diff)
parentf5b1729af3e09ffc5ac64d2540227a0286cdb465 (diff)
Merge remote-tracking branch 'origin/cpp_progress_status_bar' into dev
# Conflicts: # lib/Slic3r/GUI/MainFrame.pm # xs/src/slic3r/AppController.cpp # xs/src/slic3r/AppControllerWx.cpp # xs/src/slic3r/GUI/GUI.hpp
Diffstat (limited to 'xs')
-rw-r--r--xs/CMakeLists.txt7
-rw-r--r--xs/src/libslic3r/Print.cpp2
-rw-r--r--xs/src/libslic3r/Print.hpp4
-rw-r--r--xs/src/perlglue.cpp1
-rw-r--r--xs/src/slic3r/AppController.cpp94
-rw-r--r--xs/src/slic3r/AppController.hpp8
-rw-r--r--xs/src/slic3r/AppControllerWx.cpp176
-rw-r--r--xs/src/slic3r/GUI/GUI.cpp6
-rw-r--r--xs/src/slic3r/GUI/PngExportDialog.cpp286
-rw-r--r--xs/src/slic3r/GUI/PngExportDialog.hpp67
-rw-r--r--xs/src/slic3r/GUI/ProgressStatusBar.cpp151
-rw-r--r--xs/src/slic3r/GUI/ProgressStatusBar.hpp64
-rw-r--r--xs/src/slic3r/ProgressIndicator.hpp (renamed from xs/src/slic3r/IProgressIndicator.hpp)18
-rw-r--r--xs/xsp/AppController.xsp3
-rw-r--r--xs/xsp/ProgressStatusBar.xsp48
-rw-r--r--xs/xsp/my.map6
-rw-r--r--xs/xsp/typemap.xspt1
17 files changed, 362 insertions, 580 deletions
diff --git a/xs/CMakeLists.txt b/xs/CMakeLists.txt
index b65c56aa6..5acb92e6a 100644
--- a/xs/CMakeLists.txt
+++ b/xs/CMakeLists.txt
@@ -261,6 +261,8 @@ add_library(libslic3r_gui STATIC
${LIBDIR}/slic3r/GUI/UpdateDialogs.hpp
${LIBDIR}/slic3r/GUI/FirmwareDialog.cpp
${LIBDIR}/slic3r/GUI/FirmwareDialog.hpp
+ ${LIBDIR}/slic3r/GUI/ProgressStatusBar.hpp
+ ${LIBDIR}/slic3r/GUI/ProgressStatusBar.cpp
${LIBDIR}/slic3r/Utils/Http.cpp
${LIBDIR}/slic3r/Utils/Http.hpp
${LIBDIR}/slic3r/Utils/FixModelByWin10.cpp
@@ -279,11 +281,9 @@ add_library(libslic3r_gui STATIC
${LIBDIR}/slic3r/Utils/PresetUpdater.hpp
${LIBDIR}/slic3r/Utils/Time.cpp
${LIBDIR}/slic3r/Utils/Time.hpp
- ${LIBDIR}/slic3r/GUI/PngExportDialog.hpp
- ${LIBDIR}/slic3r/GUI/PngExportDialog.cpp
${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
@@ -479,6 +479,7 @@ set(XS_XSP_FILES
${XSP_DIR}/Utils_PrintHost.xsp
${XSP_DIR}/Utils_PresetUpdater.xsp
${XSP_DIR}/AppController.xsp
+ ${XSP_DIR}/ProgressStatusBar.xsp
${XSP_DIR}/XS.xsp
)
foreach (file ${XS_XSP_FILES})
diff --git a/xs/src/libslic3r/Print.cpp b/xs/src/libslic3r/Print.cpp
index 54a7539db..aeb034378 100644
--- a/xs/src/libslic3r/Print.cpp
+++ b/xs/src/libslic3r/Print.cpp
@@ -13,7 +13,7 @@
#include <boost/lexical_cast.hpp>
#include <boost/log/trivial.hpp>
-#include "slic3r/IProgressIndicator.hpp"
+#include "slic3r/ProgressIndicator.hpp"
#include "PrintExport.hpp"
//! macro used to mark string used at localization,
diff --git a/xs/src/libslic3r/Print.hpp b/xs/src/libslic3r/Print.hpp
index 61e77b572..86dca2e26 100644
--- a/xs/src/libslic3r/Print.hpp
+++ b/xs/src/libslic3r/Print.hpp
@@ -227,8 +227,8 @@ private:
typedef std::vector<PrintObject*> PrintObjectPtrs;
typedef std::vector<PrintRegion*> PrintRegionPtrs;
-class IProgressIndicator;
-using ProgressIndicatorPtr = std::shared_ptr<IProgressIndicator>;
+class ProgressIndicator;
+using ProgressIndicatorPtr = std::shared_ptr<ProgressIndicator>;
// The complete print tray with possibly multiple objects.
class Print
diff --git a/xs/src/perlglue.cpp b/xs/src/perlglue.cpp
index 5e0918755..c3f84dacd 100644
--- a/xs/src/perlglue.cpp
+++ b/xs/src/perlglue.cpp
@@ -62,6 +62,7 @@ REGISTER_CLASS(Preset, "GUI::Preset");
REGISTER_CLASS(PresetCollection, "GUI::PresetCollection");
REGISTER_CLASS(PresetBundle, "GUI::PresetBundle");
REGISTER_CLASS(TabIface, "GUI::Tab");
+REGISTER_CLASS(ProgressStatusBar, "GUI::ProgressStatusBar");
REGISTER_CLASS(PresetUpdater, "PresetUpdater");
REGISTER_CLASS(AppController, "AppController");
REGISTER_CLASS(PrintController, "PrintController");
diff --git a/xs/src/slic3r/AppController.cpp b/xs/src/slic3r/AppController.cpp
index d313b2d38..4d0ed3af2 100644
--- a/xs/src/slic3r/AppController.cpp
+++ b/xs/src/slic3r/AppController.cpp
@@ -401,7 +401,7 @@ void PrintController::slice_to_png()
// });
}
-void IProgressIndicator::message_fmt(
+void ProgressIndicator::message_fmt(
const string &fmtstr, ...) {
std::stringstream ss;
va_list args;
@@ -435,67 +435,61 @@ const PrintConfig &PrintController::config() const
void AppController::arrange_model()
{
- auto ftr = std::async(
- supports_asynch()? std::launch::async : std::launch::deferred,
- [this]()
- {
- using Coord = libnest2d::TCoord<libnest2d::PointImpl>;
+ using Coord = libnest2d::TCoord<libnest2d::PointImpl>;
- unsigned count = 0;
- for(auto obj : model_->objects) count += obj->instances.size();
+ unsigned count = 0;
+ for(auto obj : model_->objects) count += obj->instances.size();
- auto pind = global_progress_indicator();
+ auto pind = global_progress_indicator();
- float pmax = 1.0;
+ float pmax = 1.0;
- if(pind) {
- pmax = pind->max();
+ if(pind) {
+ pmax = pind->max();
- // Set the range of the progress to the object count
- pind->max(count);
+ // Set the range of the progress to the object count
+ pind->max(count);
- }
-
- auto dist = print_ctl()->config().min_object_distance();
+ pind->on_cancel([](){
+ std::cout << "Cannot be cancelled!" << std::endl;
+ });
+ }
- // Create the arranger config
- auto min_obj_distance = static_cast<Coord>(dist/SCALING_FACTOR);
+ auto dist = print_ctl()->config().min_object_distance();
- auto& bedpoints = print_ctl()->config().bed_shape.values;
- Polyline bed; bed.points.reserve(bedpoints.size());
- for(auto& v : bedpoints)
- bed.append(Point::new_scale(v(0), v(1)));
+ // Create the arranger config
+ auto min_obj_distance = static_cast<Coord>(dist/SCALING_FACTOR);
- if(pind) pind->update(0, _(L("Arranging objects...")));
+ auto& bedpoints = print_ctl()->config().bed_shape.values;
+ Polyline bed; bed.points.reserve(bedpoints.size());
+ for(auto& v : bedpoints)
+ bed.append(Point::new_scale(v(0), v(1)));
- try {
- arr::arrange(*model_,
- min_obj_distance,
- bed,
- arr::BOX,
- false, // create many piles not just one pile
- [pind, count](unsigned rem) {
- if(pind)
- 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")));
- }
+ if(pind) pind->update(0, _(L("Arranging objects...")));
- // Restore previous max value
- if(pind) {
- pind->max(pmax);
- pind->update(0, _(L("Arranging done.")));
- }
- });
+ try {
+ arr::arrange(*model_,
+ min_obj_distance,
+ bed,
+ arr::BOX,
+ false, // create many piles not just one pile
+ [this, pind, count](unsigned rem) {
+ if(pind)
+ 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")));
+ }
- while( ftr.wait_for(std::chrono::milliseconds(10))
- != std::future_status::ready) {
- process_events();
+ // Restore previous max value
+ if(pind) {
+ pind->max(pmax);
+ pind->update(0, _(L("Arranging done.")));
+ pind->on_cancel(/*remove cancel function*/);
}
}
diff --git a/xs/src/slic3r/AppController.hpp b/xs/src/slic3r/AppController.hpp
index d22f49028..f24444359 100644
--- a/xs/src/slic3r/AppController.hpp
+++ b/xs/src/slic3r/AppController.hpp
@@ -7,7 +7,7 @@
#include <atomic>
#include <iostream>
-#include "IProgressIndicator.hpp"
+#include "ProgressIndicator.hpp"
namespace Slic3r {
@@ -15,6 +15,7 @@ class Model;
class Print;
class PrintObject;
class PrintConfig;
+class ProgressStatusBar;
/**
* @brief A boilerplate class for creating application logic. It should provide
@@ -32,7 +33,7 @@ class AppControllerBoilerplate {
public:
/// A Progress indicator object smart pointer
- using ProgresIndicatorPtr = std::shared_ptr<IProgressIndicator>;
+ using ProgresIndicatorPtr = std::shared_ptr<ProgressIndicator>;
private:
class PriData; // Some structure to store progress indication data
@@ -278,8 +279,7 @@ public:
* @param gauge_id The ID of the gague widget of the status bar.
* @param statusbar_id The ID of the status bar.
*/
- void set_global_progress_indicator(unsigned gauge_id,
- unsigned statusbar_id);
+ void set_global_progress_indicator(ProgressStatusBar *prs);
void arrange_model();
};
diff --git a/xs/src/slic3r/AppControllerWx.cpp b/xs/src/slic3r/AppControllerWx.cpp
index 5fc18dbf8..39192e7d3 100644
--- a/xs/src/slic3r/AppControllerWx.cpp
+++ b/xs/src/slic3r/AppControllerWx.cpp
@@ -4,7 +4,7 @@
#include <future>
#include <slic3r/GUI/GUI.hpp>
-#include <slic3r/GUI/PngExportDialog.hpp>
+#include <slic3r/GUI/ProgressStatusBar.hpp>
#include <wx/app.h>
#include <wx/filedlg.h>
@@ -105,10 +105,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;
@@ -154,7 +154,7 @@ public:
virtual void cancel() override {
update(max(), "Abort");
- IProgressIndicator::cancel();
+ ProgressIndicator::cancel();
}
virtual void state(float val) override {
@@ -211,31 +211,21 @@ AppControllerBoilerplate::create_progress_indicator(unsigned statenum,
namespace {
-// A wrapper progress indicator class around the statusbar created in perl.
-class Wrapper: public IProgressIndicator, public wxEvtHandler {
- wxGauge *gauge_;
- wxStatusBar *stbar_;
- using Base = IProgressIndicator;
+class Wrapper: public ProgressIndicator, public wxEvtHandler {
+ ProgressStatusBar *sbar_;
+ using Base = ProgressIndicator;
std::string message_;
AppControllerBoilerplate& ctl_;
void showProgress(bool show = true) {
- gauge_->Show(show);
+ sbar_->show_progress(show);
}
void _state(unsigned st) {
- if( st <= IProgressIndicator::max() ) {
+ if( st <= ProgressIndicator::max() ) {
Base::state(st);
-
- if(!gauge_->IsShown()) showProgress(true);
-
- stbar_->SetStatusText(message_);
- if(static_cast<long>(st) == gauge_->GetRange()) {
- gauge_->SetValue(0);
- showProgress(false);
- } else {
- gauge_->SetValue(static_cast<int>(st));
- }
+ sbar_->set_status_text(message_);
+ sbar_->set_progress(st);
}
}
@@ -248,12 +238,12 @@ class Wrapper: public IProgressIndicator, public wxEvtHandler {
public:
- inline Wrapper(wxGauge *gauge, wxStatusBar *stbar,
+ inline Wrapper(ProgressStatusBar *sbar,
AppControllerBoilerplate& ctl):
- gauge_(gauge), stbar_(stbar), ctl_(ctl)
+ sbar_(sbar), ctl_(ctl)
{
- Base::max(static_cast<float>(gauge->GetRange()));
- Base::states(static_cast<unsigned>(gauge->GetRange()));
+ Base::max(static_cast<float>(sbar_->get_range()));
+ Base::states(static_cast<unsigned>(sbar_->get_range()));
Bind(PROGRESS_STATUS_UPDATE_EVENT,
&Wrapper::_state,
@@ -266,8 +256,8 @@ public:
virtual void max(float val) override {
if(val > 1.0) {
- gauge_->SetRange(static_cast<int>(val));
- IProgressIndicator::max(val);
+ sbar_->set_range(static_cast<int>(val));
+ ProgressIndicator::max(val);
}
}
@@ -294,135 +284,19 @@ public:
virtual void title(const string & /*title*/) override {}
+ virtual void on_cancel(CancelFn fn) override {
+ sbar_->set_cancel_callback(fn);
+ Base::on_cancel(fn);
+ }
+
};
}
-void AppController::set_global_progress_indicator(
- unsigned gid,
- unsigned sid)
+void AppController::set_global_progress_indicator(ProgressStatusBar *prsb)
{
- wxGauge* gauge = dynamic_cast<wxGauge*>(wxWindow::FindWindowById(gid));
- wxStatusBar* sb = dynamic_cast<wxStatusBar*>(wxWindow::FindWindowById(sid));
-
- if(gauge && sb) {
- global_progress_indicator(std::make_shared<Wrapper>(gauge, sb, *this));
+ if(prsb) {
+ global_progress_indicator(std::make_shared<Wrapper>(prsb, *this));
}
}
-//PrintController::PngExportData PrintController::collect_png_export_data()
-//{
-
-// // Implement the logic of the PngExportDialog
-// class PngExportView: public PngExportDialog {
-// double ratio_, bs_ratio_;
-// PrintController& ctl_;
-// public:
-
-// PngExportView(PrintController& ctl):
-// PngExportDialog(wxTheApp->GetTopWindow()), ctl_(ctl)
-// {
-// ratio_ = double(spin_reso_width_->GetValue()) /
-// spin_reso_height_->GetValue();
-
-// bs_ratio_ = bed_width_spin_->GetValue() /
-// bed_height_spin_->GetValue();
-// }
-
-// PngExportData export_data() const {
-// PrintController::PngExportData ret;
-// ret.zippath = filepick_ctl_->GetPath();
-// ret.width_px = spin_reso_width_->GetValue();
-// ret.height_px = spin_reso_height_->GetValue();
-// ret.width_mm = bed_width_spin_->GetValue();
-// ret.height_mm = bed_height_spin_->GetValue();
-// ret.exp_time_s = exptime_spin_->GetValue();
-// ret.exp_time_first_s = exptime_first_spin_->GetValue();
-// ret.corr_x = corr_spin_x_->GetValue();
-// ret.corr_y = corr_spin_y_->GetValue();
-// ret.corr_z = corr_spin_z_->GetValue();
-// return ret;
-// }
-
-// void prefill(const PngExportData& data) {
-// filepick_ctl_->SetPath(data.zippath);
-// spin_reso_width_->SetValue(data.width_px);
-// spin_reso_height_->SetValue(data.height_px);
-// bed_width_spin_->SetValue(data.width_mm);
-// bed_height_spin_->SetValue(data.height_mm);
-// exptime_spin_->SetValue(data.exp_time_s);
-// exptime_first_spin_->SetValue(data.exp_time_first_s);
-// corr_spin_x_->SetValue(data.corr_x);
-// corr_spin_y_->SetValue(data.corr_y);
-// corr_spin_z_->SetValue(data.corr_z);
-// if(data.zippath.empty()) export_btn_->Disable();
-// else export_btn_->Enable();
-// }
-
-// virtual void ResoLock( wxCommandEvent& /*event*/ ) override {
-// ratio_ = double(spin_reso_width_->GetValue()) /
-// double(spin_reso_height_->GetValue());
-// }
-
-// virtual void BedsizeLock( wxCommandEvent& /*event*/ ) override {
-// bs_ratio_ = bed_width_spin_->GetValue() /
-// bed_height_spin_->GetValue();
-// }
-
-// virtual void EvalResoSpin( wxCommandEvent& event ) override {
-// if(reso_lock_btn_->GetValue()) {
-// if(event.GetId() == spin_reso_width_->GetId()) {
-// spin_reso_height_->SetValue(
-// std::round(spin_reso_width_->GetValue()/ratio_));
-// spin_reso_height_->Update();
-// } else {
-// spin_reso_width_->SetValue(
-// std::round(spin_reso_height_->GetValue()*ratio_));
-// spin_reso_width_->Update();
-// }
-// }
-// }
-
-// virtual void EvalBedSpin( wxCommandEvent& event ) override {
-// if(bedsize_lock_btn_->GetValue()) {
-// if(event.GetId() == bed_width_spin_->GetId()) {
-// bed_height_spin_->SetValue(
-// std::round(bed_width_spin_->GetValue()/bs_ratio_));
-// bed_height_spin_->Update();
-// } else {
-// bed_width_spin_->SetValue(
-// std::round(bed_height_spin_->GetValue()*bs_ratio_));
-// bed_width_spin_->Update();
-// }
-// }
-// }
-
-// virtual void onFileChanged( wxFileDirPickerEvent& event ) {
-// if(filepick_ctl_->GetPath().IsEmpty()) export_btn_->Disable();
-// else export_btn_->Enable();
-// }
-
-// virtual void Close( wxCommandEvent& /*event*/ ) {
-// auto ret = wxID_OK;
-
-// if(wxFileName(filepick_ctl_->GetPath()).Exists())
-// if(!ctl_.report_issue(PrintController::IssueType::WARN_Q,
-// _(L("File already exists. Overwrite?")),
-// _(L("Warning")))) ret = wxID_CANCEL;
-// EndModal(ret);
-// }
-// };
-
-// PngExportView exdlg(*this);
-
-// exdlg.prefill(prev_expdata_);
-
-// auto r = exdlg.ShowModal();
-
-// auto ret = exdlg.export_data();
-// prev_expdata_ = ret;
-
-// if(r != wxID_OK) ret.zippath.clear();
-
-// return ret;
-//}
}
diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp
index 4592e6433..d13d88d5b 100644
--- a/xs/src/slic3r/GUI/GUI.cpp
+++ b/xs/src/slic3r/GUI/GUI.cpp
@@ -202,6 +202,8 @@ void set_main_frame(wxFrame *main_frame)
g_wxMainFrame = main_frame;
}
+wxFrame* get_main_frame() { return g_wxMainFrame; }
+
void set_tab_panel(wxNotebook *tab_panel)
{
g_wxTabPanel = tab_panel;
@@ -856,10 +858,6 @@ wxWindow* get_right_panel(){
return g_right_panel;
}
-wxFrame* get_main_frame() {
- return g_wxMainFrame;
-}
-
wxNotebook * get_tab_panel() {
return g_wxTabPanel;
}
diff --git a/xs/src/slic3r/GUI/PngExportDialog.cpp b/xs/src/slic3r/GUI/PngExportDialog.cpp
deleted file mode 100644
index 6c95c1139..000000000
--- a/xs/src/slic3r/GUI/PngExportDialog.cpp
+++ /dev/null
@@ -1,286 +0,0 @@
-#include "PngExportDialog.hpp"
-
-namespace Slic3r {
-
-PngExportDialog::PngExportDialog( wxWindow* parent, wxWindowID id,
- const wxString& title, const wxPoint& pos,
- const wxSize& size, long style ) :
- wxDialog( parent, id, title, pos, size, style )
-{
- this->SetSizeHints( wxDefaultSize, wxDefaultSize );
-
- auto top_layout = new wxBoxSizer(wxHORIZONTAL);
-
- // /////////////////////////////////////////////////////////////////////////
- // Labels
- // /////////////////////////////////////////////////////////////////////////
-
- auto labels_layout = new wxGridSizer(6, 1, 0, 0);
-
- // Input File picker label
- auto filepick_text = new wxStaticText( this, wxID_ANY,
- _("Target zip file"),
- wxDefaultPosition,
- wxDefaultSize, 0 );
- filepick_text->Wrap( -1 );
- labels_layout->Add( filepick_text, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- // Config file label
- auto confpick_text = new wxStaticText( this, wxID_ANY,
- _("Config file (optional)"),
- wxDefaultPosition,
- wxDefaultSize, 0 );
- confpick_text->Wrap( -1 );
- labels_layout->Add( confpick_text, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
- confpick_text->Disable();
-
- // Resolution layout
- auto resotext = new wxStaticText( this, wxID_ANY,
- _("Resolution (w, h) [px]"),
- wxDefaultPosition, wxDefaultSize, 0 );
- resotext->Wrap( -1 );
- labels_layout->Add( resotext, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- // Bed size label
- auto bed_size_text = new wxStaticText( this, wxID_ANY,
- _("Bed size (w, h) [mm]"),
- wxDefaultPosition,
- wxDefaultSize, 0 );
- bed_size_text->Wrap( -1 );
- labels_layout->Add( bed_size_text, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- // Correction label
- auto corr_text = new wxStaticText( this, wxID_ANY, _("Scale (x, y, z)"),
- wxDefaultPosition, wxDefaultSize, 0 );
- corr_text->Wrap( -1 );
- labels_layout->Add( corr_text, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- // Exp time label
- auto exp_text = new wxStaticText( this, wxID_ANY,
- _("Exposure time [s]"),
- wxDefaultPosition, wxDefaultSize, 0 );
- exp_text->Wrap( -1 );
- labels_layout->Add( exp_text, 0, wxALIGN_CENTER_VERTICAL|wxALL, 5 );
-
- top_layout->Add( labels_layout, 0, wxEXPAND, 5 );
-
- // /////////////////////////////////////////////////////////////////////////
-
-
- // /////////////////////////////////////////////////////////////////////////
- // Body
- // /////////////////////////////////////////////////////////////////////////
-
- auto body_layout = new wxBoxSizer( wxVERTICAL );
-
- // Input file picker
- auto fpicklayout = new wxBoxSizer(wxHORIZONTAL);
- filepick_ctl_ = new wxFilePickerCtrl( this, wxID_ANY, wxEmptyString,
- _("Select a file"), wxT("*.zip"),
- wxDefaultPosition, wxDefaultSize,
- wxFLP_USE_TEXTCTRL | wxFLP_SAVE,
- wxDefaultValidator,
- wxT("filepick_ctl") );
- fpicklayout->Add( filepick_ctl_, 1, wxALL | wxALIGN_CENTER, 5);
- body_layout->Add( fpicklayout, 1, wxEXPAND, 5 );
-
- auto ctlpicklayout = new wxBoxSizer(wxHORIZONTAL);
- confpick_ctl_ = new wxFilePickerCtrl(
- this, wxID_ANY, wxEmptyString, _("Select a file"),
- wxT("*.json"), wxDefaultPosition, wxDefaultSize,
- wxFLP_USE_TEXTCTRL | wxFLP_DEFAULT_STYLE, wxDefaultValidator,
- wxT("filepick_ctl") );
- confpick_ctl_->Disable();
- ctlpicklayout->Add( confpick_ctl_, 1, wxALL | wxALIGN_CENTER, 5);
- body_layout->Add( ctlpicklayout, 1, wxEXPAND, 5 );
-
-
- // Resolution controls /////////////////////////////////////////////////////
-
- auto res_spins_layout = new wxBoxSizer( wxHORIZONTAL );
- spin_reso_width_ = new wxSpinCtrl( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS, 0, 10000, 1440 );
- res_spins_layout->Add( spin_reso_width_, 1, wxALIGN_CENTER|wxALL, 5 );
- spin_reso_height_ = new wxSpinCtrl( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS, 0, 10000, 2560 );
- res_spins_layout->Add( spin_reso_height_, 1, wxALIGN_CENTER|wxALL, 5 );
-
- reso_lock_btn_ = new wxToggleButton( this, wxID_ANY, _("Lock"),
- wxDefaultPosition, wxDefaultSize, 0 );
- reso_lock_btn_->SetValue(true);
- res_spins_layout->Add( reso_lock_btn_, 0, wxALIGN_CENTER|wxALL, 5 );
-
- body_layout->Add( res_spins_layout, 1, wxEXPAND, 5 );
-
-
- // Bed size controls ///////////////////////////////////////////////////////
-
- auto bed_spins_layout = new wxBoxSizer( wxHORIZONTAL );
- bed_width_spin_ = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS, 0, 1e6, 68.0 );
-
- bed_spins_layout->Add( bed_width_spin_, 1, wxALIGN_CENTER|wxALL, 5 );
-
- bed_height_spin_ = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS, 0, 1e6, 120.0 );
- bed_spins_layout->Add( bed_height_spin_, 1, wxALIGN_CENTER|wxALL, 5 );
-
- bedsize_lock_btn_ = new wxToggleButton( this, wxID_ANY, _("Lock"),
- wxDefaultPosition,
- wxDefaultSize, 0 );
- bedsize_lock_btn_->SetValue(true);
- bed_spins_layout->Add( bedsize_lock_btn_, 0, wxALIGN_CENTER|wxALL, 5 );
-
- body_layout->Add( bed_spins_layout, 1, wxEXPAND, 5 );
-
-
- // Scale correction controls ///////////////////////////////////////////////
-
- auto corr_layout = new wxBoxSizer( wxHORIZONTAL );
- corr_spin_x_ = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS, 0, 100, 1, 0.01 );
- corr_spin_x_->SetDigits(3);
- corr_spin_x_->SetMaxSize(wxSize(100, -1));
- corr_layout->Add( corr_spin_x_, 0, wxALIGN_CENTER|wxALL, 5 );
-
- corr_spin_y_ = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS, 0, 100, 1, 0.01 );
- corr_spin_y_->SetDigits(3);
- corr_spin_y_->SetMaxSize(wxSize(100, -1));
- corr_layout->Add( corr_spin_y_, 0, wxALIGN_CENTER|wxALL, 5 );
-
- corr_spin_z_ = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS, 0, 100, 1, 0.01 );
- corr_spin_z_->SetDigits(3);
- corr_spin_z_->SetMaxSize(wxSize(100, -1));
- corr_layout->Add( corr_spin_z_, 0, wxALIGN_CENTER|wxALL, 5 );
-
- corr_layout->Add( bedsize_lock_btn_->GetSize().GetWidth(), 0, 1, wxEXPAND, 5 );
-
- body_layout->Add( corr_layout, 1, wxEXPAND, 5 );
-
- // Exposure time controls /////////////////////////////////////////////////
-
- auto exp_layout = new wxBoxSizer( wxHORIZONTAL );
- exptime_spin_ = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition, wxDefaultSize,
- wxSP_ARROW_KEYS, 0, 100, 1, 0.01 );
- exptime_spin_->SetDigits(3);
- exptime_spin_->SetMaxSize(wxSize(100, -1));
-
- auto first_txt = new wxStaticText( this, wxID_ANY,
- _("First exp. time"),
- wxDefaultPosition,
- wxDefaultSize, wxALIGN_RIGHT );
-
- exptime_first_spin_ = new wxSpinCtrlDouble( this, wxID_ANY, wxEmptyString,
- wxDefaultPosition,
- wxDefaultSize, wxSP_ARROW_KEYS,
- 0, 100, 1, 0.01 );
- exptime_first_spin_->SetDigits(3);
- exptime_first_spin_->SetMaxSize(wxSize(100, -1));
-
- exp_layout->Add( exptime_spin_, 1, wxALIGN_CENTER|wxALL, 5 );
- exp_layout->Add( first_txt, 1, wxALIGN_CENTER|wxALL, 5);
- exp_layout->Add( exptime_first_spin_, 1, wxALIGN_CENTER|wxALL, 5 );
-
- export_btn_ = new wxButton( this, wxID_ANY, _("Export"), wxDefaultPosition,
- wxDefaultSize, 0, wxDefaultValidator,
- wxT("export_btn") );
-
- exp_layout->Add( export_btn_, 0, wxALIGN_CENTER|wxALL, 5 );
-
- body_layout->Add( exp_layout, 1, wxEXPAND, 5 );
-
- top_layout->Add( body_layout, 0, wxEXPAND, 5 );
-
- // /////////////////////////////////////////////////////////////////////////
- // Finalize
- // /////////////////////////////////////////////////////////////////////////
-
- this->SetSizer(top_layout);
- this->Layout();
-
- this->Fit();
- this->SetMinSize(this->GetSize());
- this->Centre( wxBOTH );
-
- // Connect Events
- filepick_ctl_->Connect(
- wxEVT_COMMAND_FILEPICKER_CHANGED,
- wxFileDirPickerEventHandler( PngExportDialog::onFileChanged ),
- NULL, this );
- spin_reso_width_->Connect(
- wxEVT_COMMAND_TEXT_UPDATED,
- wxCommandEventHandler( PngExportDialog::EvalResoSpin ),
- NULL, this );
- spin_reso_height_->Connect(
- wxEVT_COMMAND_TEXT_UPDATED,
- wxCommandEventHandler( PngExportDialog::EvalResoSpin ),
- NULL, this );
- reso_lock_btn_->Connect(
- wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
- wxCommandEventHandler( PngExportDialog::ResoLock ),
- NULL, this );
- bed_width_spin_->Connect(
- wxEVT_COMMAND_TEXT_UPDATED,
- wxCommandEventHandler( PngExportDialog::EvalBedSpin ),
- NULL, this );
- bed_height_spin_->Connect(
- wxEVT_COMMAND_TEXT_UPDATED,
- wxCommandEventHandler( PngExportDialog::EvalBedSpin ),
- NULL, this );
- bedsize_lock_btn_->Connect(
- wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
- wxCommandEventHandler( PngExportDialog::BedsizeLock ),
- NULL, this );
- export_btn_->Connect(
- wxEVT_COMMAND_BUTTON_CLICKED,
- wxCommandEventHandler( PngExportDialog::Close ), NULL, this );
-}
-
-PngExportDialog::~PngExportDialog()
-{
- // Disconnect Events
- filepick_ctl_->Disconnect(
- wxEVT_COMMAND_FILEPICKER_CHANGED,
- wxFileDirPickerEventHandler( PngExportDialog::onFileChanged ),
- NULL, this );
- spin_reso_width_->Disconnect(
- wxEVT_COMMAND_TEXT_UPDATED,
- wxCommandEventHandler( PngExportDialog::EvalResoSpin ),
- NULL, this );
- spin_reso_height_->Disconnect(
- wxEVT_COMMAND_TEXT_UPDATED,
- wxCommandEventHandler( PngExportDialog::EvalResoSpin ),
- NULL, this );
- reso_lock_btn_->Disconnect(
- wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
- wxCommandEventHandler( PngExportDialog::ResoLock ),
- NULL, this );
- bed_width_spin_->Disconnect(
- wxEVT_COMMAND_TEXT_UPDATED,
- wxCommandEventHandler( PngExportDialog::EvalBedSpin ),
- NULL, this );
- bed_height_spin_->Disconnect(
- wxEVT_COMMAND_TEXT_UPDATED,
- wxCommandEventHandler( PngExportDialog::EvalBedSpin ),
- NULL, this );
- bedsize_lock_btn_->Disconnect(
- wxEVT_COMMAND_TOGGLEBUTTON_CLICKED,
- wxCommandEventHandler( PngExportDialog::BedsizeLock ),
- NULL, this );
- export_btn_->Disconnect(
- wxEVT_COMMAND_BUTTON_CLICKED,
- wxCommandEventHandler( PngExportDialog::Close ), NULL, this );
-
-}
-
-}
diff --git a/xs/src/slic3r/GUI/PngExportDialog.hpp b/xs/src/slic3r/GUI/PngExportDialog.hpp
deleted file mode 100644
index bfbbd4ec4..000000000
--- a/xs/src/slic3r/GUI/PngExportDialog.hpp
+++ /dev/null
@@ -1,67 +0,0 @@
-#ifndef PNG_EXPORT_DIALOG_HPP
-#define PNG_EXPORT_DIALOG_HPP
-
-#include <wx/artprov.h>
-#include <wx/xrc/xmlres.h>
-#include <wx/intl.h>
-#include <wx/string.h>
-#include <wx/stattext.h>
-#include <wx/gdicmn.h>
-#include <wx/font.h>
-#include <wx/colour.h>
-#include <wx/settings.h>
-#include <wx/sizer.h>
-#include <wx/filepicker.h>
-#include <wx/spinctrl.h>
-#include <wx/tglbtn.h>
-#include <wx/button.h>
-#include <wx/dialog.h>
-
-#include "GUI.hpp"
-
-namespace Slic3r {
-
-///////////////////////////////////////////////////////////////////////////////
-/// Class PngExportDialog
-///////////////////////////////////////////////////////////////////////////////
-class PngExportDialog : public wxDialog
-{
-private:
-
-protected:
- wxFilePickerCtrl* filepick_ctl_;
- wxFilePickerCtrl* confpick_ctl_;
- wxSpinCtrl* spin_reso_width_;
- wxSpinCtrl* spin_reso_height_;
- wxToggleButton* reso_lock_btn_;
- wxSpinCtrlDouble* bed_width_spin_;
- wxSpinCtrlDouble* bed_height_spin_;
- wxToggleButton* bedsize_lock_btn_;
- wxSpinCtrlDouble* exptime_spin_;
- wxSpinCtrlDouble* exptime_first_spin_;
- wxSpinCtrlDouble* corr_spin_x_;
- wxSpinCtrlDouble* corr_spin_y_;
- wxSpinCtrlDouble* corr_spin_z_;
- wxButton* export_btn_;
-
- // Virtual event handlers, overide them in your derived class
- virtual void onFileChanged( wxFileDirPickerEvent& event ) { event.Skip(); }
- virtual void EvalResoSpin( wxCommandEvent& event ) { event.Skip(); }
- virtual void ResoLock( wxCommandEvent& event ) { event.Skip(); }
- virtual void EvalBedSpin( wxCommandEvent& event ) { event.Skip(); }
- virtual void BedsizeLock( wxCommandEvent& event ) { event.Skip(); }
- virtual void Close( wxCommandEvent& /*event*/ ) { EndModal(wxID_OK); }
-
-public:
-
- PngExportDialog( wxWindow* parent, wxWindowID id = wxID_ANY,
- const wxString& title = L("Slice to zipped PNG files"),
- const wxPoint& pos = wxDefaultPosition,
- const wxSize& size = wxSize( 452,170 ),
- long style = wxDEFAULT_DIALOG_STYLE );
- ~PngExportDialog();
-
-};
-
-}
-#endif //PNG_EXPORT_DIALOG_HPP
diff --git a/xs/src/slic3r/GUI/ProgressStatusBar.cpp b/xs/src/slic3r/GUI/ProgressStatusBar.cpp
new file mode 100644
index 000000000..224ad8af5
--- /dev/null
+++ b/xs/src/slic3r/GUI/ProgressStatusBar.cpp
@@ -0,0 +1,151 @@
+#include "ProgressStatusBar.hpp"
+
+#include <wx/timer.h>
+#include <wx/gauge.h>
+#include <wx/button.h>
+#include <wx/statusbr.h>
+#include <wx/frame.h>
+#include "GUI.hpp"
+
+#include <iostream>
+
+namespace Slic3r {
+
+ProgressStatusBar::ProgressStatusBar(wxWindow *parent, int id):
+ self(new wxStatusBar(parent ? parent : GUI::get_main_frame(),
+ id == -1? wxID_ANY : id)),
+ timer_(new wxTimer(self)),
+ prog_ (new wxGauge(self,
+ wxGA_HORIZONTAL,
+ 100,
+ wxDefaultPosition,
+ wxDefaultSize)),
+ cancelbutton_(new wxButton(self,
+ -1,
+ "Cancel",
+ wxDefaultPosition,
+ wxDefaultSize))
+{
+ prog_->Hide();
+ cancelbutton_->Hide();
+
+ self->SetFieldsCount(3);
+ int w[] = {-1, 150, 155};
+ self->SetStatusWidths(3, w);
+
+ self->Bind(wxEVT_TIMER, [this](const wxTimerEvent&) {
+ if (prog_->IsShown()) timer_->Stop();
+ if(is_busy()) prog_->Pulse();
+ });
+
+ self->Bind(wxEVT_SIZE, [this](wxSizeEvent& event){
+ wxRect rect;
+ self->GetFieldRect(1, rect);
+ auto offset = 0;
+ cancelbutton_->Move(rect.GetX() + offset, rect.GetY() + offset);
+ cancelbutton_->SetSize(rect.GetWidth() - offset, rect.GetHeight());
+
+ self->GetFieldRect(2, rect);
+ prog_->Move(rect.GetX() + offset, rect.GetY() + offset);
+ prog_->SetSize(rect.GetWidth() - offset, rect.GetHeight());
+
+ event.Skip();
+ });
+
+ cancelbutton_->Bind(wxEVT_BUTTON, [this](const wxCommandEvent&) {
+ if(cancel_cb_) cancel_cb_();
+ cancelbutton_->Hide();
+ });
+}
+
+ProgressStatusBar::~ProgressStatusBar() {
+ if(timer_->IsRunning()) timer_->Stop();
+}
+
+int ProgressStatusBar::get_progress() const
+{
+ return prog_->GetValue();
+}
+
+void ProgressStatusBar::set_progress(int val)
+{
+ if(!prog_->IsShown()) show_progress(true);
+
+ if(val == prog_->GetRange()) {
+ prog_->SetValue(0);
+ show_progress(false);
+ } else {
+ prog_->SetValue(val);
+ }
+}
+
+int ProgressStatusBar::get_range() const
+{
+ return prog_->GetRange();
+}
+
+void ProgressStatusBar::set_range(int val)
+{
+ if(val != prog_->GetRange()) {
+ prog_->SetRange(val);
+ }
+}
+
+void ProgressStatusBar::show_progress(bool show)
+{
+ prog_->Show(show);
+ prog_->Pulse();
+}
+
+void ProgressStatusBar::start_busy(int rate)
+{
+ busy_ = true;
+ show_progress(true);
+ if (!timer_->IsRunning()) {
+ timer_->Start(rate);
+ }
+}
+
+void ProgressStatusBar::stop_busy()
+{
+ timer_->Stop();
+ show_progress(false);
+ prog_->SetValue(0);
+ busy_ = false;
+}
+
+void ProgressStatusBar::set_cancel_callback(ProgressStatusBar::CancelFn ccb) {
+ cancel_cb_ = ccb;
+ if(ccb) cancelbutton_->Show();
+ else cancelbutton_->Hide();
+}
+
+void ProgressStatusBar::run(int rate)
+{
+ if(!timer_->IsRunning()) {
+ timer_->Start(rate);
+ }
+}
+
+void ProgressStatusBar::embed(wxFrame *frame)
+{
+ wxFrame* mf = frame? frame : GUI::get_main_frame();
+ mf->SetStatusBar(self);
+}
+
+void ProgressStatusBar::set_status_text(const std::string& txt)
+{
+ self->SetStatusText(txt);
+}
+
+void ProgressStatusBar::show_cancel_button()
+{
+ cancelbutton_->Show();
+}
+
+void ProgressStatusBar::hide_cancel_button()
+{
+ cancelbutton_->Hide();
+}
+
+}
diff --git a/xs/src/slic3r/GUI/ProgressStatusBar.hpp b/xs/src/slic3r/GUI/ProgressStatusBar.hpp
new file mode 100644
index 000000000..a117cacfb
--- /dev/null
+++ b/xs/src/slic3r/GUI/ProgressStatusBar.hpp
@@ -0,0 +1,64 @@
+#ifndef PROGRESSSTATUSBAR_HPP
+#define PROGRESSSTATUSBAR_HPP
+
+#include <memory>
+#include <functional>
+
+class wxTimer;
+class wxGauge;
+class wxButton;
+class wxTimerEvent;
+class wxStatusBar;
+class wxWindow;
+class wxFrame;
+
+namespace Slic3r {
+
+/**
+ * @brief The ProgressStatusBar class is the widgets occupying the lower area
+ * of the Slicer main window. It consists of a message area to the left and a
+ * progress indication area to the right with an optional cancel button.
+ */
+class ProgressStatusBar {
+ wxStatusBar *self; // we cheat! It should be the base class but: perl!
+ wxTimer *timer_;
+ wxGauge *prog_;
+ wxButton *cancelbutton_;
+public:
+
+ /// Cancel callback function type
+ using CancelFn = std::function<void()>;
+
+ ProgressStatusBar(wxWindow *parent = nullptr, int id = -1);
+ ~ProgressStatusBar();
+
+ int get_progress() const;
+ void set_progress(int);
+ int get_range() const;
+ void set_range(int = 100);
+ void show_progress(bool);
+ void start_busy(int = 100);
+ void stop_busy();
+ inline bool is_busy() const { return busy_; }
+ void set_cancel_callback(CancelFn = CancelFn());
+ inline void remove_cancel_callback() { set_cancel_callback(); }
+ void run(int rate);
+ void embed(wxFrame *frame = nullptr);
+ void set_status_text(const std::string& txt);
+
+ // Temporary methods to satisfy Perl side
+ void show_cancel_button();
+ void hide_cancel_button();
+
+private:
+ bool busy_ = false;
+ CancelFn cancel_cb_;
+};
+
+namespace GUI {
+ using Slic3r::ProgressStatusBar;
+}
+
+}
+
+#endif // PROGRESSSTATUSBAR_HPP
diff --git a/xs/src/slic3r/IProgressIndicator.hpp b/xs/src/slic3r/ProgressIndicator.hpp
index 704931574..4a39e84ab 100644
--- a/xs/src/slic3r/IProgressIndicator.hpp
+++ b/xs/src/slic3r/ProgressIndicator.hpp
@@ -10,9 +10,9 @@ namespace Slic3r {
/**
* @brief Generic progress indication interface.
*/
-class IProgressIndicator {
+class ProgressIndicator {
public:
- using CancelFn = std::function<void(void)>; // Cancel functio signature.
+ using CancelFn = std::function<void(void)>; // Cancel function signature.
private:
float state_ = .0f, max_ = 1.f, step_;
@@ -20,7 +20,7 @@ private:
public:
- inline virtual ~IProgressIndicator() {}
+ inline virtual ~ProgressIndicator() {}
/// Get the maximum of the progress range.
float max() const { return max_; }
@@ -28,14 +28,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) {
@@ -45,14 +45,14 @@ public:
/// Message shown on the next status update.
virtual void message(const string&) = 0;
- /// Title of the operaton.
+ /// Title of the operation.
virtual void title(const string&) = 0;
- /// Formatted message for the next status update. Works just like sprinf.
+ /// Formatted message for the next status update. Works just like sprintf.
virtual void message_fmt(const 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
@@ -60,7 +60,7 @@ public:
*/
virtual void cancel() { cancelfunc_(); }
- /// Convinience function to call message and status update in one function.
+ /// Convenience function to call message and status update in one function.
void update(float st, const string& msg) {
message(msg); state(st);
}
diff --git a/xs/xsp/AppController.xsp b/xs/xsp/AppController.xsp
index 8f189cf72..8156b0ad2 100644
--- a/xs/xsp/AppController.xsp
+++ b/xs/xsp/AppController.xsp
@@ -5,6 +5,7 @@
#include "slic3r/AppController.hpp"
#include "libslic3r/Model.hpp"
#include "libslic3r/Print.hpp"
+#include "slic3r/GUI/ProgressStatusBar.hpp"
%}
%name{Slic3r::PrintController} class PrintController {
@@ -22,7 +23,7 @@
PrintController *print_ctl();
void set_model(Model *model);
void set_print(Print *print);
- void set_global_progress_indicator(unsigned gauge_id, unsigned statusbar_id);
+ void set_global_progress_indicator(ProgressStatusBar *prs);
void arrange_model();
}; \ No newline at end of file
diff --git a/xs/xsp/ProgressStatusBar.xsp b/xs/xsp/ProgressStatusBar.xsp
new file mode 100644
index 000000000..f59895581
--- /dev/null
+++ b/xs/xsp/ProgressStatusBar.xsp
@@ -0,0 +1,48 @@
+%module{Slic3r::XS};
+
+%{
+#include <xsinit.h>
+#include "slic3r/GUI/ProgressStatusBar.hpp"
+%}
+
+%name{Slic3r::GUI::ProgressStatusBar} class ProgressStatusBar {
+ ProgressStatusBar();
+ ~ProgressStatusBar();
+
+ int GetProgress() const
+ %code%{ RETVAL=THIS->get_progress(); %};
+
+ void SetProgress(int val)
+ %code%{ THIS->set_progress(val); %};
+
+ void SetRange(int val = 100)
+ %code%{ THIS->set_range(val); %};
+
+ void ShowProgress(bool show)
+ %code%{ THIS->show_progress(show); %};
+
+ void StartBusy(int val = 100)
+ %code%{ THIS->start_busy(val); %};
+
+ void StopBusy()
+ %code%{ THIS->stop_busy(); %};
+
+ bool IsBusy() const
+ %code%{ RETVAL=THIS->is_busy(); %};
+
+ void Run(int rate)
+ %code%{ THIS->run(rate); %};
+
+ void Embed()
+ %code%{ THIS->embed(); %};
+
+ void SetStatusText(std::string txt)
+ %code%{ THIS->set_status_text(txt); %};
+
+ void ShowCancelButton()
+ %code%{ THIS->show_cancel_button(); %};
+
+ void HideCancelButton()
+ %code%{ THIS->hide_cancel_button(); %};
+
+}; \ No newline at end of file
diff --git a/xs/xsp/my.map b/xs/xsp/my.map
index d85734086..75c0783f1 100644
--- a/xs/xsp/my.map
+++ b/xs/xsp/my.map
@@ -233,8 +233,10 @@ PresetCollection* O_OBJECT_SLIC3R
Ref<PresetCollection> O_OBJECT_SLIC3R_T
PresetBundle* O_OBJECT_SLIC3R
Ref<PresetBundle> O_OBJECT_SLIC3R_T
-TabIface* O_OBJECT_SLIC3R
-Ref<TabIface> O_OBJECT_SLIC3R_T
+TabIface* O_OBJECT_SLIC3R
+Ref<TabIface> O_OBJECT_SLIC3R_T
+ProgressStatusBar* O_OBJECT_SLIC3R
+Ref<ProgressStatusBar> O_OBJECT_SLIC3R_T
PresetUpdater* O_OBJECT_SLIC3R
Ref<PresetUpdater> O_OBJECT_SLIC3R_T
diff --git a/xs/xsp/typemap.xspt b/xs/xsp/typemap.xspt
index b3d73b9b3..ee433cc01 100644
--- a/xs/xsp/typemap.xspt
+++ b/xs/xsp/typemap.xspt
@@ -213,6 +213,7 @@
%typemap{PresetHints*};
%typemap{Ref<PresetHints>}{simple};
%typemap{TabIface*};
+%typemap{ProgressStatusBar*};
%typemap{PrintRegionPtrs*};
%typemap{PrintObjectPtrs*};