From bf56d79354cd74d645ea3e030c476c41d9c649eb Mon Sep 17 00:00:00 2001 From: YuSanka Date: Thu, 30 May 2019 12:41:16 +0200 Subject: [PATCH] Layers sizer updating --- src/slic3r/GUI/GUI_ObjectLayers.cpp | 173 +++++++++++++++++----------- src/slic3r/GUI/GUI_ObjectLayers.hpp | 9 +- src/slic3r/GUI/GUI_ObjectList.cpp | 4 + src/slic3r/GUI/OptionsGroup.cpp | 11 ++ src/slic3r/GUI/OptionsGroup.hpp | 2 + 5 files changed, 128 insertions(+), 71 deletions(-) diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp index 31a17bbf6..80aa6bcca 100644 --- a/src/slic3r/GUI/GUI_ObjectLayers.cpp +++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp @@ -14,13 +14,17 @@ namespace Slic3r { namespace GUI -{ +{ + +typedef std::map t_layer_height_ranges; + +#define field_width 8 ObjectLayers::ObjectLayers(wxWindow* parent) : OG_Settings(parent, true) { - m_og->label_width = 0; - m_og->set_grid_vgap(5); + m_og->label_width = 1; +// m_og->set_grid_vgap(5); // Legend for object layers Line line = Line{ "", "" }; @@ -36,6 +40,8 @@ ObjectLayers::ObjectLayers(wxWindow* parent) : std::string label = boost::algorithm::replace_all_copy(axis, " ", "_"); boost::algorithm::to_lower(label); line.append_option(Option(def, label + "_legend")); + + m_legends.push_back(label + "_legend"); } m_og->append_line(line); @@ -44,6 +50,83 @@ ObjectLayers::ObjectLayers(wxWindow* parent) : m_bmp_add = ScalableBitmap(parent, "add_copies"); } +static Line create_new_layer(const t_layer_height_ranges::value_type& layer) +{ + Line line = Line{ "", "" }; + ConfigOptionDef def; + def.label = ""; + def.gui_type = ""; + def.type = coFloat; + def.width = field_width; + + std::string label = (boost::format("min_z_%.2f") % layer.first.first).str(); + def.set_default_value(new ConfigOptionFloat(layer.first.first)); + line.append_option(Option(def, label)); + + label = (boost::format("max_z_%.2f") % layer.first.second).str(); + def.set_default_value(new ConfigOptionFloat(layer.first.second)); + line.append_option(Option(def, label)); + + label = (boost::format("layer_height_%.2f_%.2f") % layer.first.first % layer.first.second).str(); + def.set_default_value(new ConfigOptionFloat(layer.second)); + line.append_option(Option(def, label)); + + return line; +} + +void ObjectLayers::create_layers_list() +{ + auto create_btns = [this](wxWindow* parent) { + auto sizer = new wxBoxSizer(wxHORIZONTAL); + + auto del_btn = new ScalableButton(parent, wxID_ANY, m_bmp_delete); + del_btn->SetToolTip(_(L("Remove layer"))); + + sizer->Add(del_btn, 0, wxRIGHT, em_unit(parent)); + + del_btn->Bind(wxEVT_BUTTON, [this](wxEvent &event) { + del_layer(); +// wxTheApp->CallAfter([this]() { +// wxWindowUpdateLocker noUpdates(m_parent); +// update_layers_list(); +// m_parent->Layout(); +// }); + }); + + auto add_btn = new ScalableButton(parent, wxID_ANY, m_bmp_add); + add_btn->SetToolTip(_(L("Add layer"))); + + sizer->Add(add_btn, 0, wxRIGHT, em_unit(parent)); + + add_btn->Bind(wxEVT_BUTTON, [this](wxEvent &event) { + add_layer(); +// wxTheApp->CallAfter([this]() { +// wxWindowUpdateLocker noUpdates(m_parent); +// update_layers_list(); +// m_parent->Layout(); +// }); + }); + + return sizer; + }; + + for (const auto layer : m_object->layer_height_ranges) + { + Line line = create_new_layer(layer); + line.append_widget(create_btns); + m_og->append_line(line); + } +} + +void ObjectLayers::create_layer() +{ + for (const auto layer : m_object->layer_height_ranges) + { + m_og->append_line(create_new_layer(layer)); + break; + } +} + void ObjectLayers::update_layers_list() { ObjectList* objects_ctrl = wxGetApp().obj_list(); @@ -58,78 +141,32 @@ void ObjectLayers::update_layers_list() const ItemType type = objects_ctrl->GetModel()->GetItemType(item); if (!(type & (itLayerRoot | itLayer))) return; - ModelObject* object = objects_ctrl->object(obj_idx); - if (!object || object->layer_height_ranges.empty()) return; + m_object = objects_ctrl->object(obj_idx); + if (!m_object || m_object->layer_height_ranges.empty()) return; + + // Delete all controls from options group except of the legends auto grid_sizer = m_og->get_grid_sizer(); - - const int cols = grid_sizer->GetCols(); - const int rows = grid_sizer->GetRows(); + const int cols = grid_sizer->GetEffectiveColsCount(); + const int rows = grid_sizer->GetEffectiveRowsCount(); for (int idx = cols*rows-1; idx >= cols; idx--) { - grid_sizer->Remove(idx); + wxSizerItem* t = grid_sizer->GetItem(idx); + if (t->IsSizer()) + t->GetSizer()->Clear(true); + grid_sizer->Remove(idx); } - ConfigOptionDef def; - def.label = ""; - def.gui_type = ""; - def.type = coFloat; - def.width = field_width; + m_og->clear_fields_except_of(m_legends); + + + // Add new control according to the selected item if (type & itLayerRoot) - { - auto create_btns = [this](wxWindow* parent) { - auto sizer = new wxBoxSizer(wxHORIZONTAL); - auto del_btn = new ScalableButton(parent, wxID_ANY, m_bmp_delete); - del_btn->SetToolTip(_(L("Remove layer"))); - - sizer->Add(del_btn, 0, wxRIGHT, em_unit(parent)); - - del_btn->Bind(wxEVT_BUTTON, [this](wxEvent &event) { - del_layer(); -// wxTheApp->CallAfter([this]() { -// wxWindowUpdateLocker noUpdates(m_parent); -// update_layers_list(); -// m_parent->Layout(); -// }); - }); - - auto add_btn = new ScalableButton(parent, wxID_ANY, m_bmp_add); - add_btn->SetToolTip(_(L("Add layer"))); - - sizer->Add(add_btn, 0, wxRIGHT, em_unit(parent)); - - add_btn->Bind(wxEVT_BUTTON, [this](wxEvent &event) { - add_layer(); -// wxTheApp->CallAfter([this]() { -// wxWindowUpdateLocker noUpdates(m_parent); -// update_layers_list(); -// m_parent->Layout(); -// }); - }); - - return sizer; - }; - - Line line{"",""}; - for (const auto layer : object->layer_height_ranges) - { - std::string label = (boost::format("min_z_%.2f") % layer.first.first).str(); - def.set_default_value(new ConfigOptionFloat(layer.first.first)); - line.append_option(Option(def, label)); - - label = (boost::format("max_z_%.2f") % layer.first.second).str(); - def.set_default_value(new ConfigOptionFloat(layer.first.second)); - line.append_option(Option(def, label)); - - label = (boost::format("layer_height_%.2f_%.2f") % layer.first.first % layer.first.second).str(); - def.set_default_value(new ConfigOptionFloat(layer.second)); - line.append_option(Option(def, label)); - - line.append_widget(create_btns); - } - - m_og->append_line(line); - } + create_layers_list(); + else + create_layer(); + + m_parent->Layout(); } void ObjectLayers::UpdateAndShow(const bool show) diff --git a/src/slic3r/GUI/GUI_ObjectLayers.hpp b/src/slic3r/GUI/GUI_ObjectLayers.hpp index 8f8b55998..13a3da911 100644 --- a/src/slic3r/GUI/GUI_ObjectLayers.hpp +++ b/src/slic3r/GUI/GUI_ObjectLayers.hpp @@ -14,15 +14,18 @@ class ConfigOptionsGroup; class ObjectLayers : public OG_Settings { - ScalableBitmap m_bmp_delete; - ScalableBitmap m_bmp_add; + ScalableBitmap m_bmp_delete; + ScalableBitmap m_bmp_add; + ModelObject* m_object {nullptr}; - int field_width {8}; + std::vector m_legends; public: ObjectLayers(wxWindow* parent); ~ObjectLayers() {} + void create_layers_list(); + void create_layer(); void update_layers_list(); void add_layer() {}; void del_layer() {}; diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp index 080ebbe21..00eb3e7de 100644 --- a/src/slic3r/GUI/GUI_ObjectList.cpp +++ b/src/slic3r/GUI/GUI_ObjectList.cpp @@ -1803,6 +1803,10 @@ void ObjectList::layers_editing() { const t_layer_height_range first_range = { 0.0f, 0.2f }; object(obj_idx)->layer_height_ranges[first_range] = 0.1f; + + const t_layer_height_range second_range = { 0.2f, 0.4f }; + object(obj_idx)->layer_height_ranges[second_range] = 0.05f; + layers_item = m_objects_model->AddLayersRoot(obj_item); } diff --git a/src/slic3r/GUI/OptionsGroup.cpp b/src/slic3r/GUI/OptionsGroup.cpp index 2ac6b00af..67feefa3f 100644 --- a/src/slic3r/GUI/OptionsGroup.cpp +++ b/src/slic3r/GUI/OptionsGroup.cpp @@ -320,6 +320,17 @@ Line OptionsGroup::create_single_option_line(const Option& option) const { return retval; } +void OptionsGroup::clear_fields_except_of(const std::vector left_fields) +{ + auto it = m_fields.begin(); + while (it != m_fields.end()) { + if (std::find(left_fields.begin(), left_fields.end(), it->first) == left_fields.end()) + it = m_fields.erase(it); + else + it++; + } +} + void OptionsGroup::on_set_focus(const std::string& opt_key) { if (m_set_focus != nullptr) diff --git a/src/slic3r/GUI/OptionsGroup.hpp b/src/slic3r/GUI/OptionsGroup.hpp index 73b2c5110..422a5c2a2 100644 --- a/src/slic3r/GUI/OptionsGroup.hpp +++ b/src/slic3r/GUI/OptionsGroup.hpp @@ -160,6 +160,8 @@ public: m_show_modified_btns = show; } + void clear_fields_except_of(const std::vector left_fields); + OptionsGroup( wxWindow* _parent, const wxString& title, bool is_tab_opt = false, column_t extra_clmn = nullptr) : m_parent(_parent), title(title),