diff options
author | tamasmeszaros <meszaros.q@gmail.com> | 2018-08-30 16:21:41 +0300 |
---|---|---|
committer | tamasmeszaros <meszaros.q@gmail.com> | 2018-08-30 18:35:49 +0300 |
commit | 4f53fc2a5f2ed179f857398e9f9ff3fe5956e52f (patch) | |
tree | ea6a927058fc7e4fe2095b7a9f89ccd7c7df246d /xs | |
parent | 3750bd781eb2b48bc9ac6ac5acf8ce1bf99da0be (diff) | |
parent | f5b1729af3e09ffc5ac64d2540227a0286cdb465 (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.txt | 7 | ||||
-rw-r--r-- | xs/src/libslic3r/Print.cpp | 2 | ||||
-rw-r--r-- | xs/src/libslic3r/Print.hpp | 4 | ||||
-rw-r--r-- | xs/src/perlglue.cpp | 1 | ||||
-rw-r--r-- | xs/src/slic3r/AppController.cpp | 94 | ||||
-rw-r--r-- | xs/src/slic3r/AppController.hpp | 8 | ||||
-rw-r--r-- | xs/src/slic3r/AppControllerWx.cpp | 176 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/GUI.cpp | 6 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/PngExportDialog.cpp | 286 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/PngExportDialog.hpp | 67 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/ProgressStatusBar.cpp | 151 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/ProgressStatusBar.hpp | 64 | ||||
-rw-r--r-- | xs/src/slic3r/ProgressIndicator.hpp (renamed from xs/src/slic3r/IProgressIndicator.hpp) | 18 | ||||
-rw-r--r-- | xs/xsp/AppController.xsp | 3 | ||||
-rw-r--r-- | xs/xsp/ProgressStatusBar.xsp | 48 | ||||
-rw-r--r-- | xs/xsp/my.map | 6 | ||||
-rw-r--r-- | xs/xsp/typemap.xspt | 1 |
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*}; |