From 51b18fddeb1b22310171e27b8e606cc0d621f17d Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Mon, 3 Jun 2019 15:35:21 +0200
Subject: [PATCH] Changed data types

---
 src/libslic3r/Model.hpp             |  2 ++
 src/libslic3r/Slicing.hpp           |  3 ++
 src/slic3r/GUI/GUI_ObjectLayers.cpp | 37 ++++++++++++++----------
 src/slic3r/GUI/GUI_ObjectLayers.hpp |  1 +
 src/slic3r/GUI/GUI_ObjectList.cpp   | 45 ++++++++++++++++-------------
 src/slic3r/GUI/GUI_ObjectList.hpp   |  1 +
 6 files changed, 54 insertions(+), 35 deletions(-)

diff --git a/src/libslic3r/Model.hpp b/src/libslic3r/Model.hpp
index 41bf5bd4b..d3066f33f 100644
--- a/src/libslic3r/Model.hpp
+++ b/src/libslic3r/Model.hpp
@@ -179,6 +179,8 @@ public:
     DynamicPrintConfig      config;
     // Variation of a layer thickness for spans of Z coordinates.
     t_layer_height_ranges   layer_height_ranges;
+    // Variation of a layer thickness for spans of Z coordinates.
+    t_layer_config_ranges         layer_config_ranges;
     // Profile of increasing z to a layer height, to be linearly interpolated when calculating the layers.
     // The pairs of <z, layer_height> are packed into a 1D array.
     std::vector<coordf_t>   layer_height_profile;
diff --git a/src/libslic3r/Slicing.hpp b/src/libslic3r/Slicing.hpp
index fa5a12f9c..c3278dc0d 100644
--- a/src/libslic3r/Slicing.hpp
+++ b/src/libslic3r/Slicing.hpp
@@ -11,6 +11,8 @@
 
 #include "libslic3r.h"
 #include "Utils.hpp"
+#include "PrintConfig.hpp"
+
 namespace Slic3r
 {
 
@@ -129,6 +131,7 @@ inline bool equal_layering(const SlicingParameters &sp1, const SlicingParameters
 
 typedef std::pair<coordf_t,coordf_t> t_layer_height_range;
 typedef std::map<t_layer_height_range,coordf_t> t_layer_height_ranges;
+typedef std::map<t_layer_height_range, DynamicPrintConfig> t_layer_config_ranges;
 
 extern std::vector<coordf_t> layer_height_profile_from_ranges(
     const SlicingParameters     &slicing_params,
diff --git a/src/slic3r/GUI/GUI_ObjectLayers.cpp b/src/slic3r/GUI/GUI_ObjectLayers.cpp
index 5ff650e86..8dae64f3c 100644
--- a/src/slic3r/GUI/GUI_ObjectLayers.cpp
+++ b/src/slic3r/GUI/GUI_ObjectLayers.cpp
@@ -23,6 +23,8 @@ ObjectLayers::ObjectLayers(wxWindow* parent) :
 {
     m_og->label_width = 1;
     m_og->set_grid_vgap(5);
+
+    m_og->m_on_change = std::bind(&ObjectLayers::on_change, this, std::placeholders::_1, std::placeholders::_2);
     
     // Legend for object layers
     Line line = Line{ "", "" };
@@ -33,9 +35,9 @@ ObjectLayers::ObjectLayers(wxWindow* parent) :
     def.type = coString;
     def.width = field_width;
 
-    for (const std::string axis : { "Min Z", "Max Z", "Layer height" }) {
-        def.set_default_value(new ConfigOptionString{ axis });
-        std::string label = boost::algorithm::replace_all_copy(axis, " ", "_");
+    for (const std::string col : { "Min Z", "Max Z", "Layer height" }) {
+        def.set_default_value(new ConfigOptionString{ col });
+        std::string label = boost::algorithm::replace_all_copy(col, " ", "_");
         boost::algorithm::to_lower(label);
         line.append_option(Option(def, label + "_legend"));
 
@@ -48,7 +50,7 @@ ObjectLayers::ObjectLayers(wxWindow* parent) :
     m_bmp_add       = ScalableBitmap(parent, "add_copies");
 }
 
-static Line create_new_layer(const t_layer_height_ranges::value_type& layer)
+static Line create_new_layer(const t_layer_config_ranges::value_type& layer, const int idx)
 {
     Line line = Line{ "", "" };
     ConfigOptionDef def;
@@ -57,16 +59,16 @@ static Line create_new_layer(const t_layer_height_ranges::value_type& layer)
     def.type = coFloat;
     def.width = field_width;
 
-    std::string label = (boost::format("min_z_%.2f") % layer.first.first).str();
+    std::string label = (boost::format("min_z_%d") % idx).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();
+    label = (boost::format("max_z_%d") % idx).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));
+    label = (boost::format("layer_height_%d") % idx).str();
+    def.set_default_value(new ConfigOptionFloat(layer.second.option("layer_height")->getFloat()));
     line.append_option(Option(def, label));
 
     return line;
@@ -74,7 +76,7 @@ static Line create_new_layer(const t_layer_height_ranges::value_type& layer)
 
 void ObjectLayers::create_layers_list()
 {
-    for (const auto layer : m_object->layer_height_ranges)
+    for (const auto layer : m_object->layer_config_ranges)
     {
         auto create_btns = [this, layer](wxWindow* parent) {
             auto sizer = new wxBoxSizer(wxHORIZONTAL);
@@ -100,7 +102,7 @@ void ObjectLayers::create_layers_list()
             return sizer;
         };
 
-        Line line = create_new_layer(layer);
+        Line line = create_new_layer(layer, m_og->get_grid_sizer()->GetEffectiveRowsCount()-1);
         line.append_widget(create_btns);
         m_og->append_line(line);
     }
@@ -108,15 +110,15 @@ void ObjectLayers::create_layers_list()
 
 void ObjectLayers::create_layer(int id)
 {
-    t_layer_height_ranges::iterator layer_range = m_object->layer_height_ranges.begin();
+    t_layer_config_ranges::iterator layer_range = m_object->layer_config_ranges.begin();
 
     // May be not a best solution #ys_FIXME
-    while (id > 0 && layer_range != m_object->layer_height_ranges.end()) {
-        layer_range++;
+    while (id > 0 && layer_range != m_object->layer_config_ranges.end()) {
+        ++layer_range;
         id--;
     }
         
-    m_og->append_line(create_new_layer(*layer_range));
+    m_og->append_line(create_new_layer(*layer_range, m_og->get_grid_sizer()->GetEffectiveRowsCount()-1));
 }
 
 void ObjectLayers::update_layers_list()
@@ -134,7 +136,7 @@ void ObjectLayers::update_layers_list()
     if (!(type & (itLayerRoot | itLayer))) return;
 
     m_object = objects_ctrl->object(obj_idx);
-    if (!m_object || m_object->layer_height_ranges.empty()) return;
+    if (!m_object || m_object->layer_config_ranges.empty()) return;
 
     // Delete all controls from options group except of the legends
 
@@ -175,5 +177,10 @@ void ObjectLayers::msw_rescale()
     m_bmp_add.msw_rescale();
 }
 
+void ObjectLayers::on_change(t_config_option_key opt_key, const boost::any& value)
+{
+
+}
+
 } //namespace GUI
 } //namespace Slic3r 
\ No newline at end of file
diff --git a/src/slic3r/GUI/GUI_ObjectLayers.hpp b/src/slic3r/GUI/GUI_ObjectLayers.hpp
index 0b209d523..6280a7554 100644
--- a/src/slic3r/GUI/GUI_ObjectLayers.hpp
+++ b/src/slic3r/GUI/GUI_ObjectLayers.hpp
@@ -30,6 +30,7 @@ public:
 
     void        UpdateAndShow(const bool show) override;
     void        msw_rescale();
+    void        on_change(t_config_option_key opt_key, const boost::any& value);
 };
 
 }}
diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index d9e1e8e82..9b826f5d8 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -700,10 +700,11 @@ void ObjectList::show_context_menu()
     if (item)
     {
         const ItemType type = m_objects_model->GetItemType(item);
-        if (!(type & (itObject | itVolume | itInstance)))
+        if (!(type & (itObject | itVolume | itLayer | itInstance)))
             return;
 
         wxMenu* menu = type & itInstance ? &m_menu_instance :
+                       type & itLayer ? &m_menu_layer :
                        m_objects_model->GetParent(item) != wxDataViewItem(0) ? &m_menu_part :
                        printer_technology() == ptFFF ? &m_menu_object : &m_menu_sla_object;
 
@@ -1694,7 +1695,7 @@ void ObjectList::del_instances_from_object(const int obj_idx)
 
 void ObjectList::del_layers_from_object(const int obj_idx)
 {
-    object(obj_idx)->layer_height_ranges.clear(); // ? #ys_FIXME
+    object(obj_idx)->layer_config_ranges.clear();
 
     changed_object(obj_idx);
 }
@@ -1739,13 +1740,13 @@ bool ObjectList::del_subobject_from_object(const int obj_idx, const int idx, con
         object->delete_instance(idx);
     }
     else if (type == itLayer) {
-        t_layer_height_ranges::iterator layer_range = object->layer_height_ranges.begin();
+        t_layer_config_ranges::iterator layer_range = object->layer_config_ranges.begin();
         int id = idx;
-        while (id > 0 && layer_range != object->layer_height_ranges.end()) {
+        while (id > 0 && layer_range != object->layer_config_ranges.end()) {
             layer_range++;
             id--;
         }
-        object->layer_height_ranges.erase(layer_range);
+        object->layer_config_ranges.erase(layer_range);
     }
     else
         return false;
@@ -1816,14 +1817,16 @@ void ObjectList::layers_editing()
     // if it doesn't exist now
     if (!layers_item.IsOk())
     {
-        // create LayerRoor item
+        // create LayerRoot item
         layers_item = m_objects_model->AddLayersRoot(obj_item);
-        
-        if (object(obj_idx)->layer_height_ranges.empty())
-            object(obj_idx)->layer_height_ranges[{ 0.0f, 0.2f }] = 0.1f;// some default value
 
-        // and create Layer item(s) according to the layer_height_ranges
-        for (const auto range : object(obj_idx)->layer_height_ranges)
+        t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
+        
+        if (ranges.empty())
+            ranges[{ 0.0f, 0.2f }] = *DynamicPrintConfig::new_from_defaults_keys({"layer_height"});// some default value
+
+        // and create Layer item(s) according to the layer_config_ranges
+        for (const auto range : ranges)
             add_layer_item(range.first, layers_item);
     }
 
@@ -2239,10 +2242,10 @@ void ObjectList::add_layer_range(const t_layer_height_range& range)
 
     wxDataViewItem layers_item = GetSelection();
 
-    t_layer_height_ranges& ranges = object(obj_idx)->layer_height_ranges;
+    t_layer_config_ranges& ranges = object(obj_idx)->layer_config_ranges;
 
-    const t_layer_height_ranges::iterator selected_range = ranges.find(range);
-    const t_layer_height_ranges::iterator last_range = --ranges.end();   
+    const t_layer_config_ranges::iterator selected_range = ranges.find(range);
+    const t_layer_config_ranges::iterator last_range = --ranges.end();   
     
     if (selected_range->first == last_range->first)
     {
@@ -2253,13 +2256,13 @@ void ObjectList::add_layer_range(const t_layer_height_range& range)
     else
     {
         int layer_idx = 0;
-        t_layer_height_ranges::iterator next_range = ++ranges.find(range);
+        t_layer_config_ranges::iterator next_range = ++ranges.find(range);
 
         // May be not a best solution #ys_FIXME
-        t_layer_height_ranges::iterator it = ranges.begin();
+        t_layer_config_ranges::iterator it = ranges.begin();
         while (it != next_range && it != ranges.end()) {
             layer_idx++;
-            it++;
+            ++it;
         }
 
         if (selected_range->first.second == next_range->first.first)
@@ -2269,7 +2272,8 @@ void ObjectList::add_layer_range(const t_layer_height_range& range)
                 return; 
 
             const coordf_t midl_layer = next_range->first.first + 0.5f * delta;
-            const coordf_t old_height = next_range->second;
+            // #ys_FIXME  May be it should be copied just a "layer_height" option
+            const /*coordf_t*/auto old_config = next_range->second;
             t_layer_height_range new_range = { midl_layer, next_range->first.second };
 
             // delete old layer
@@ -2279,7 +2283,7 @@ void ObjectList::add_layer_range(const t_layer_height_range& range)
 
             // create new 2 layers instead of deleted one
 
-            ranges[new_range] = old_height;
+            ranges[new_range] = old_config;
             add_layer_item(new_range, layers_item, layer_idx);
 
             new_range = { selected_range->first.second, midl_layer };
@@ -2996,7 +3000,8 @@ void ObjectList::msw_rescale()
     for (MenuWithSeparators* menu : { &m_menu_object, 
                                       &m_menu_part, 
                                       &m_menu_sla_object, 
-                                      &m_menu_instance })
+                                      &m_menu_instance, 
+                                      &m_menu_layer })
         msw_rescale_menu(menu);
 
     Layout();
diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp
index 15cddd318..5b4fd4c49 100644
--- a/src/slic3r/GUI/GUI_ObjectList.hpp
+++ b/src/slic3r/GUI/GUI_ObjectList.hpp
@@ -119,6 +119,7 @@ class ObjectList : public wxDataViewCtrl
     MenuWithSeparators  m_menu_part;
     MenuWithSeparators  m_menu_sla_object;
     MenuWithSeparators  m_menu_instance;
+    MenuWithSeparators  m_menu_layer;
     wxMenuItem* m_menu_item_settings { nullptr };
     wxMenuItem* m_menu_item_split_instances { nullptr };