diff options
author | Lukas Matena <lukasmatena@seznam.cz> | 2018-03-22 15:07:45 +0300 |
---|---|---|
committer | Lukas Matena <lukasmatena@seznam.cz> | 2018-03-22 15:07:45 +0300 |
commit | 036e41ae6952b84c32b93b9a2ce21741542cf7ea (patch) | |
tree | 4ba44ea77b7c88f80d0eccc7e11d2f8c992912d7 /xs | |
parent | e7a5bc1afefb3d051c888830e3655e8e456b6eaa (diff) |
Wiping dialog - first experiments with sizers
Diffstat (limited to 'xs')
-rw-r--r-- | xs/src/slic3r/GUI/WipeTowerDialog.cpp | 140 | ||||
-rw-r--r-- | xs/src/slic3r/GUI/WipeTowerDialog.hpp | 8 |
2 files changed, 85 insertions, 63 deletions
diff --git a/xs/src/slic3r/GUI/WipeTowerDialog.cpp b/xs/src/slic3r/GUI/WipeTowerDialog.cpp index ac35756a4..1989a82f1 100644 --- a/xs/src/slic3r/GUI/WipeTowerDialog.cpp +++ b/xs/src/slic3r/GUI/WipeTowerDialog.cpp @@ -2,6 +2,8 @@ #include <sstream> #include "WipeTowerDialog.hpp" +#include <wx/sizer.h> + //! macro used to mark string used at localization, //! return same string #define L(s) s @@ -22,9 +24,9 @@ RammingDialog::RammingDialog(wxWindow* parent,const std::string& parameters) SetSizer(main_sizer); SetMinSize(GetSize()); main_sizer->SetSizeHints(this); - + this->Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& e) { EndModal(wxCANCEL); }); - + this->Bind(wxEVT_BUTTON,[this](wxCommandEvent&) { m_output_data = m_panel_ramming->get_parameters(); EndModal(wxID_OK); @@ -101,74 +103,105 @@ std::string RammingPanel::get_parameters() - +// Parent dialog for purging volume adjustments - it fathers WipingPanel widget (that contains all controls) and a button to toggle simple/advanced mode: WipingDialog::WipingDialog(wxWindow* parent,const std::vector<float>& matrix, const std::vector<float>& extruders) : wxDialog(parent, -1, wxT(L("Wipe tower - Purging volume adjustment")), wxPoint(50,50), wxSize(800,550), wxDEFAULT_DIALOG_STYLE | wxRESIZE_BORDER) { this->Centre(); - - m_panel_wiping = new WipingPanel(this,matrix,extruders); - this->Show(); + + auto widget_button = new wxButton(this,wxID_ANY,"-",wxPoint(0,0),wxDefaultSize); + m_panel_wiping = new WipingPanel(this,matrix,extruders, widget_button); auto main_sizer = new wxBoxSizer(wxVERTICAL); main_sizer->Add(m_panel_wiping, 1, wxEXPAND); + + + main_sizer->Add(widget_button,0,wxALIGN_CENTER_HORIZONTAL|wxCENTER,10); main_sizer->Add(CreateButtonSizer(wxOK | wxCANCEL), 0, wxALIGN_CENTER_HORIZONTAL | wxBOTTOM, 10); SetSizer(main_sizer); SetMinSize(GetSize()); main_sizer->SetSizeHints(this); - + this->Bind(wxEVT_CLOSE_WINDOW, [this](wxCloseEvent& e) { EndModal(wxCANCEL); }); - this->Bind(wxEVT_BUTTON,[this](wxCommandEvent&) { - m_output_matrix = m_panel_wiping->read_matrix_values(); - m_output_extruders = m_panel_wiping->read_extruders_values(); + this->Bind(wxEVT_BUTTON,[this](wxCommandEvent&) { // if OK button is clicked.. + m_output_matrix = m_panel_wiping->read_matrix_values(); // ..query wiping panel and save returned values + m_output_extruders = m_panel_wiping->read_extruders_values(); // so they can be recovered later by calling get_...() EndModal(wxID_OK); },wxID_OK); -} + this->Show(); +} -WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, const std::vector<float>& extruders) +// This panel contains all control widgets for both simple and advanced mode (these reside in separate sizers) +WipingPanel::WipingPanel(wxWindow* parent, const std::vector<float>& matrix, const std::vector<float>& extruders, wxButton* widget_button) : wxPanel(parent,wxID_ANY,wxPoint(50,50), wxSize(500,350),wxBORDER_RAISED) { - m_number_of_extruders = (int)(sqrt(matrix.size())+0.001); // number of extruders - m_notadvanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString(L("Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded.")),wxPoint(40,25) ,wxSize(500,35))); - m_notadvanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString(L("Volume to purge (mm\u00B3) when the filament is being")),wxPoint(40,85) ,wxSize(500,25))); - m_notadvanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString(L("unloaded")),wxPoint(110,105) ,wxSize(500,25))); - m_notadvanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString(L("loaded")),wxPoint(195,105) ,wxSize(500,25))); - m_widget_button = new wxButton(this,wxID_ANY,"-",wxPoint(0,0),wxSize(170,20)); + m_widget_button = widget_button; // pointer to the button in parent dialog + m_widget_button->Bind(wxEVT_BUTTON,[this](wxCommandEvent&){ toggle_advanced(true); }); + + m_number_of_extruders = (int)(sqrt(matrix.size())+0.001); + + m_sizer_simple = new wxBoxSizer(wxVERTICAL); + m_sizer_advanced = new wxBoxSizer(wxVERTICAL); + auto gridsizer_simple = new wxGridSizer(3,10,10); + auto gridsizer_advanced = new wxGridSizer(m_number_of_extruders+1,10,10); + + + // First create controls for simple mode and assign them to m_sizer_simple: + m_sizer_simple->Add(new wxStaticText(this,wxID_ANY,wxString(L("Total purging volume is calculated by summing two values below, depending on which tools are loaded/unloaded.")),wxPoint(40,25), wxSize(450,35)),-1,wxEXPAND,10); + m_sizer_simple->Add(new wxStaticText(this,wxID_ANY,wxString(L("Volume to purge (mm\u00B3) when the filament is being")),wxPoint(40,85) ,/*wxSize(500,25)*/wxDefaultSize,wxALIGN_LEFT),-1,wxEXPAND|wxALIGN_CENTER,10); + + gridsizer_simple->Add(0,-1,wxALL,10); + gridsizer_simple->Add(new wxStaticText(this,wxID_ANY,wxString(L("unloaded")),wxPoint(110,105) ,/*wxSize(80,25)*/wxDefaultSize,wxALIGN_CENTER),-1,wxALIGN_CENTER,10); + gridsizer_simple->Add(new wxStaticText(this,wxID_ANY,wxString(L("loaded")),wxPoint(195,105) ,/*wxSize(80,25)*/wxDefaultSize,wxALIGN_CENTER),-1,wxALIGN_CENTER,10); for (unsigned int i=0;i<m_number_of_extruders;++i) { - m_notadvanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString(L("Tool #"))<<i+1<<": ",wxPoint(20,135+30*i) ,wxSize(150,25),wxALIGN_LEFT)); - m_old.push_back(new wxSpinCtrl(this,wxID_ANY,wxEmptyString,wxPoint(120,130+30*i),wxSize(50,25),wxSP_ARROW_KEYS|wxALIGN_RIGHT,0,300,extruders[2*i])); - m_new.push_back(new wxSpinCtrl(this,wxID_ANY,wxEmptyString,wxPoint(195,130+30*i),wxSize(50,25),wxSP_ARROW_KEYS|wxALIGN_RIGHT,0,300,extruders[2*i+1])); + m_old.push_back(new wxSpinCtrl(this,wxID_ANY,wxEmptyString,wxPoint(120,130+30*i),/*wxSize(50,25)*/wxDefaultSize,wxSP_ARROW_KEYS|wxALIGN_RIGHT,0,300,extruders[2*i])); + m_new.push_back(new wxSpinCtrl(this,wxID_ANY,wxEmptyString,wxPoint(195,130+30*i),/*wxSize(50,25)*/wxDefaultSize,wxSP_ARROW_KEYS|wxALIGN_RIGHT,0,300,extruders[2*i+1])); + gridsizer_simple->Add(new wxStaticText(this,wxID_ANY,wxString(L("Tool #"))<<i+1<<": ",wxPoint(20,135+30*i) ,/*wxSize(75,25)*/wxDefaultSize,wxALIGN_LEFT),-1,wxALL,10); + gridsizer_simple->Add(m_old.back(),-1,wxALIGN_CENTER,10); + gridsizer_simple->Add(m_new.back(),-1,wxALIGN_CENTER,10); } + // Now the same for advanced mode: wxPoint origin(50,85); - m_advanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString(L("Here you can adjust required purging volume (mm\u00B3) for any given pair of tools.")),wxPoint(40,25) ,wxSize(500,35))); + m_sizer_advanced->Add(new wxStaticText(this,wxID_ANY,wxString(L("Here you can adjust required purging volume (mm\u00B3) for any given pair of tools.")),wxPoint(40,25) ,/*wxSize(500,35)*/wxDefaultSize),-1,wxALL,10); + m_sizer_advanced->Add(new wxStaticText(this,wxID_ANY,wxString(L("Filament changed to")),origin+wxPoint(75,0) ,/*wxSize(500,25)*/wxDefaultSize),-1,wxALL,10); + for (unsigned int i=0;i<m_number_of_extruders;++i) { edit_boxes.push_back(std::vector<wxTextCtrl*>(0)); - m_advanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString("")<<i+1,origin+wxPoint(45+60*i,25) ,wxSize(20,25))); - m_advanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString("")<<i+1,origin+wxPoint(0,50+30*i) ,wxSize(500,25))); + for (unsigned int j=0;j<m_number_of_extruders;++j) { - edit_boxes.back().push_back(new wxTextCtrl(this,wxID_ANY,wxEmptyString,origin+wxPoint(25+60*i,45+30*j),wxSize(50,25))); + edit_boxes.back().push_back(new wxTextCtrl(this,wxID_ANY,wxEmptyString,origin+wxPoint(25+60*i,45+30*j),/*wxSize(50,25)*/wxDefaultSize)); if (i==j) edit_boxes[i][j]->Disable(); else edit_boxes[i][j]->SetValue(wxString("")<<int(matrix[m_number_of_extruders*j+i])); } - m_advanced_widgets.push_back(new wxStaticText(this,wxID_ANY,wxString(L("Filament changed to")),origin+wxPoint(75,0) ,wxSize(500,25))); } - m_widget_button->Bind(wxEVT_BUTTON,[this](wxCommandEvent&){toggle_advanced(true);}); - toggle_advanced(); -} + gridsizer_advanced->Add(0,-1,wxALL,10); + for (unsigned int i=0;i<m_number_of_extruders;++i) + gridsizer_advanced->Add(new wxStaticText(this,wxID_ANY,wxString("")<<i+1,origin+wxPoint(45+60*i,25) ,/*wxSize(20,25)*/wxDefaultSize),-1,wxALL,10); + for (unsigned int i=0;i<m_number_of_extruders;++i) { + gridsizer_advanced->Add(new wxStaticText(this,wxID_ANY,wxString("")<<i+1,origin+wxPoint(0,50+30*i) ,/*wxSize(500,25)*/wxDefaultSize),-1,wxALL,10); + for (unsigned int j=0;j<m_number_of_extruders;++j) + gridsizer_advanced->Add(edit_boxes[j][i],-1,wxALL,10); + } + m_sizer_simple->Add(gridsizer_simple,-1,wxALL,10); + m_sizer_advanced->Add(gridsizer_advanced,-1,wxALL,10); + toggle_advanced(); // to show/hide what is appropriate +} + +// Reads values from the (advanced) wiping matrix: std::vector<float> WipingPanel::read_matrix_values() { if (!m_advanced) fill_in_matrix(); @@ -183,7 +216,7 @@ std::vector<float> WipingPanel::read_matrix_values() { return output; } - +// Reads values from simple mode to save them for next time: std::vector<float> WipingPanel::read_extruders_values() { std::vector<float> output; for (unsigned int i=0;i<m_number_of_extruders;++i) { @@ -193,7 +226,7 @@ std::vector<float> WipingPanel::read_extruders_values() { return output; } - +// This updates the "advanced" matrix based on values from "simple" mode void WipingPanel::fill_in_matrix() { for (unsigned i=0;i<m_number_of_extruders;++i) { for (unsigned j=0;j<m_number_of_extruders;++j) { @@ -205,7 +238,7 @@ void WipingPanel::fill_in_matrix() { - +// Function to check if simple and advanced settings are matching bool WipingPanel::advanced_matches_simple() { for (unsigned i=0;i<m_number_of_extruders;++i) { for (unsigned j=0;j<m_number_of_extruders;++j) { @@ -218,40 +251,27 @@ bool WipingPanel::advanced_matches_simple() { } - -void WipingPanel::toggle_advanced(bool user_button) { - if (m_advanced && !advanced_matches_simple() && user_button) { +// Switches the dialog from simple to advanced mode and vice versa +void WipingPanel::toggle_advanced(bool user_action) { + if (m_advanced && !advanced_matches_simple() && user_action) { if (wxMessageDialog(this,wxString(L("Switching to simple settings will discard changes done in the advanced mode!\n\nDo you want to proceed?")), wxString(L("Warning")),wxYES_NO|wxICON_EXCLAMATION).ShowModal() != wxID_YES) return; } - - m_advanced = !m_advanced; - - if (!user_button) { // we were called from constructor - if (advanced_matches_simple()) // advanced and simple match - let's show simple version - m_advanced = false; - else - m_advanced = true; + if (user_action) + m_advanced = !m_advanced; // user demands a change -> toggle + else { + m_advanced = !advanced_matches_simple(); // if called from constructor, show what is appropriate + (m_advanced ? m_sizer_advanced : m_sizer_simple)->SetSizeHints(this); + SetSizer(m_advanced ? m_sizer_advanced : m_sizer_simple); } - for (unsigned i=0;i<m_number_of_extruders;++i) { // shows/hides input controls - for (unsigned j=0;j<m_number_of_extruders;++j) - edit_boxes[i][j]->Show(m_advanced); - m_old[i]->Show(!m_advanced); - m_new[i]->Show(!m_advanced); - } - for (const auto& widget : m_advanced_widgets) // shows/hides other widgets - widget->Show(m_advanced); - for (const auto& widget : m_notadvanced_widgets) - widget->Show(!m_advanced); - - if (m_advanced) { - if (user_button) fill_in_matrix(); // otherwise keep values loaded from config - m_widget_button->SetLabel(L("Show simplified settings")); - } - else - m_widget_button->SetLabel(L("Show advanced settings")); + m_sizer_simple->Show(!m_advanced); + m_sizer_advanced->Show(m_advanced); + + m_widget_button->SetLabel(m_advanced ? L("Show simplified settings") : L("Show advanced settings")); + if (m_advanced) + if (user_action) fill_in_matrix(); // otherwise keep values loaded from config this->Refresh(); }
\ No newline at end of file diff --git a/xs/src/slic3r/GUI/WipeTowerDialog.hpp b/xs/src/slic3r/GUI/WipeTowerDialog.hpp index 54ae9596d..c8e7bd480 100644 --- a/xs/src/slic3r/GUI/WipeTowerDialog.hpp +++ b/xs/src/slic3r/GUI/WipeTowerDialog.hpp @@ -46,13 +46,13 @@ private: class WipingPanel : public wxPanel { public: - WipingPanel(wxWindow* parent, const std::vector<float>& matrix, const std::vector<float>& extruders); + WipingPanel(wxWindow* parent, const std::vector<float>& matrix, const std::vector<float>& extruders, wxButton* widget_button); std::vector<float> read_matrix_values(); std::vector<float> read_extruders_values(); + void toggle_advanced(bool user_action = false); private: void fill_in_matrix(); - void toggle_advanced(bool user_button = false); bool advanced_matches_simple(); std::vector<wxSpinCtrl*> m_old; @@ -60,9 +60,11 @@ private: std::vector<wxWindow*> m_advanced_widgets; std::vector<wxWindow*> m_notadvanced_widgets; std::vector<std::vector<wxTextCtrl*>> edit_boxes; - wxButton* m_widget_button = nullptr; unsigned int m_number_of_extruders = 0; bool m_advanced = false; + wxBoxSizer*m_sizer_simple = nullptr; + wxBoxSizer*m_sizer_advanced = nullptr; + wxButton* m_widget_button = nullptr; }; |