From 9b8cdb95dc8d3f1b48c1c06898152b06178cb076 Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Fri, 25 Jan 2019 10:34:32 +0100
Subject: [PATCH] Updated view mode for object_list and object_menu

---
 src/slic3r/GUI/GUI_App.cpp        | 10 ++++++--
 src/slic3r/GUI/GUI_ObjectList.cpp | 40 ++++++++++++++++++++++---------
 src/slic3r/GUI/GUI_ObjectList.hpp |  4 +++-
 src/slic3r/GUI/MainFrame.cpp      |  5 ----
 src/slic3r/GUI/Plater.cpp         | 27 +++++++++------------
 5 files changed, 51 insertions(+), 35 deletions(-)

diff --git a/src/slic3r/GUI/GUI_App.cpp b/src/slic3r/GUI/GUI_App.cpp
index 3e65232f2..2488ab7c3 100644
--- a/src/slic3r/GUI/GUI_App.cpp
+++ b/src/slic3r/GUI/GUI_App.cpp
@@ -159,7 +159,7 @@ bool GUI_App::OnInit()
 
         // ! Temporary workaround for the correct behavior of the Scrolled sidebar panel 
         // Do this "manipulations" only once ( after (re)create of the application )
-        if (sidebar().obj_list()->GetMinHeight() > 200) 
+        if (plater_ && sidebar().obj_list()->GetMinHeight() > 200) 
         {
             wxWindowUpdateLocker noUpdates_sidebar(&sidebar());
             sidebar().obj_list()->SetMinSize(wxSize(-1, 200));
@@ -273,6 +273,11 @@ void GUI_App::recreate_GUI()
     std::cerr << "recreate_GUI" << std::endl;
 
     clear_tabs_list();
+    if (plater_) {
+        // before creating a new plater let's delete old one
+        plater_->Destroy();
+        plater_ = nullptr;
+    }
 
     MainFrame* topwindow = dynamic_cast<MainFrame*>(GetTopWindow());
     mainframe = new MainFrame();
@@ -531,10 +536,11 @@ void GUI_App::update_mode()
 
     const ConfigOptionMode mode = wxGetApp().get_mode();
 
-    obj_list()->get_sizer()->Show(mode == comExpert);
+    obj_list()->get_sizer()->Show(mode > comSimple);
     sidebar().set_mode_value(mode);
 //    sidebar().show_buttons(mode == comExpert);
     obj_list()->update_selections();
+    obj_list()->update_object_menu();
 
     sidebar().update_mode_sizer(mode);
 
diff --git a/src/slic3r/GUI/GUI_ObjectList.cpp b/src/slic3r/GUI/GUI_ObjectList.cpp
index a880b2cbe..ec679aa79 100644
--- a/src/slic3r/GUI/GUI_ObjectList.cpp
+++ b/src/slic3r/GUI/GUI_ObjectList.cpp
@@ -696,9 +696,11 @@ void ObjectList::get_settings_choice(const wxString& category_name)
 void ObjectList::append_menu_item_add_generic(wxMenuItem* menu, const int type) {
     auto sub_menu = new wxMenu;
 
+    if (wxGetApp().get_mode() == comExpert) {
     append_menu_item(sub_menu, wxID_ANY, _(L("Load")) + " " + dots, "",
         [this, type](wxCommandEvent&) { load_subobject(type); }, "", menu->GetMenu());
     sub_menu->AppendSeparator();
+    }
 
     std::vector<std::string> menu_items = { L("Box"), L("Cylinder"), L("Sphere"), L("Slab") };
     for (auto& item : menu_items) {
@@ -709,7 +711,7 @@ void ObjectList::append_menu_item_add_generic(wxMenuItem* menu, const int type)
     menu->SetSubMenu(sub_menu);
 }
 
-void ObjectList::append_menu_items_add_volume(wxMenu* menu)
+void ObjectList::append_menu_items_add_volume(wxMenu* menu, wxMenuItem* *item_separator)
 {
     // Note: id accords to type of the sub-object, so sequence of the menu items is important
     std::vector<std::string> menu_object_types_items = {L("Add part"),              // ~ModelVolume::MODEL_PART
@@ -723,22 +725,30 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu)
         if (settings_id != wxNOT_FOUND)
             menu->Destroy(settings_id);
     }
+    if (*item_separator)
+        menu->Destroy(*item_separator);
 
-    if (wxGetApp().get_mode() == comSimple)
+    const ConfigOptionMode mode = wxGetApp().get_mode();
+
+    if (mode < comExpert)
     {
         append_menu_item(menu, wxID_ANY, _(L("Add part")), "",
             [this](wxCommandEvent&) { load_subobject(ModelVolume::MODEL_PART); }, *m_bmp_vector[ModelVolume::MODEL_PART]);
+    }
+    if (mode == comSimple) {
         append_menu_item(menu, wxID_ANY, _(L("Add support enforcer")), "",
-            [this](wxCommandEvent&) { load_generic_subobject(_(L("Box")).ToUTF8().data(), ModelVolume::SUPPORT_ENFORCER); }, 
+            [this](wxCommandEvent&) { load_generic_subobject(_(L("Box")).ToUTF8().data(), ModelVolume::SUPPORT_ENFORCER); },
             *m_bmp_vector[ModelVolume::SUPPORT_ENFORCER]);
         append_menu_item(menu, wxID_ANY, _(L("Add support blocker")), "",
-            [this](wxCommandEvent&) { load_generic_subobject(_(L("Box")).ToUTF8().data(), ModelVolume::SUPPORT_BLOCKER); }, 
+            [this](wxCommandEvent&) { load_generic_subobject(_(L("Box")).ToUTF8().data(), ModelVolume::SUPPORT_BLOCKER); },
             *m_bmp_vector[ModelVolume::SUPPORT_BLOCKER]);
 
+        *item_separator = nullptr;
+
         return;
     }
-
-    for (int type = 0; type < menu_object_types_items.size(); type++) 
+    
+    for (int type = mode == comExpert ? 0 : 1 ; type < menu_object_types_items.size(); type++)
     {
         auto& item = menu_object_types_items[type];
 
@@ -748,6 +758,8 @@ void ObjectList::append_menu_items_add_volume(wxMenu* menu)
 
         menu->Append(menu_item);
     }
+
+    *item_separator = menu->AppendSeparator();
 }
 
 wxMenuItem* ObjectList::append_menu_item_split(wxMenu* menu) 
@@ -793,18 +805,19 @@ wxMenuItem* ObjectList::append_menu_item_instance_to_object(wxMenu* menu)
 
 void ObjectList::create_object_popupmenu(wxMenu *menu)
 {
-    append_menu_items_add_volume(menu);
-
     // Split object to parts
-    menu->AppendSeparator();
     m_menu_item_split = append_menu_item_split(menu);
-
-    // Settings
     menu->AppendSeparator();
+
+    // rest of a object_menu will be added later in:
+    // - append_menu_items_add_volume() -> for "Add (volumes)"
+    // - append_menu_item_settings() -> for "Add (settings)"
 }
 
 void ObjectList::create_sla_object_popupmenu(wxMenu *menu)
 {
+    // rest of a object_sla_menu will be added later in:
+    // - append_menu_item_settings() -> for "Add (settings)"
 }
 
 void ObjectList::create_part_popupmenu(wxMenu *menu)
@@ -1805,6 +1818,11 @@ void ObjectList::update_settings_items()
     UnselectAll();
 }
 
+void ObjectList::update_object_menu()
+{
+    append_menu_items_add_volume(&m_menu_object, &m_mi_volumes_settings_separator);
+}
+
 void ObjectList::instances_to_separated_object(const int obj_idx, const std::set<int>& inst_idxs)
 {
     // create new object from selected instance  
diff --git a/src/slic3r/GUI/GUI_ObjectList.hpp b/src/slic3r/GUI/GUI_ObjectList.hpp
index f24eb95b0..cac85f020 100644
--- a/src/slic3r/GUI/GUI_ObjectList.hpp
+++ b/src/slic3r/GUI/GUI_ObjectList.hpp
@@ -112,6 +112,7 @@ class ObjectList : public wxDataViewCtrl
     wxMenuItem* m_menu_item_split_part { nullptr };
     wxMenuItem* m_menu_item_settings { nullptr };
     wxMenuItem* m_menu_item_split_instances { nullptr };
+    wxMenuItem* m_mi_volumes_settings_separator { nullptr };
 
     std::vector<wxBitmap*> m_bmp_vector;
 
@@ -162,7 +163,7 @@ public:
 
     void                get_settings_choice(const wxString& category_name);
     void                append_menu_item_add_generic(wxMenuItem* menu, const int type);
-    void                append_menu_items_add_volume(wxMenu* menu);
+    void                append_menu_items_add_volume(wxMenu* menu, wxMenuItem* *item_separator);
     wxMenuItem*         append_menu_item_split(wxMenu* menu);
     wxMenuItem*         append_menu_item_settings(wxMenu* menu);
     wxMenuItem*         append_menu_item_change_type(wxMenu* menu);
@@ -243,6 +244,7 @@ public:
     void last_volume_is_deleted(const int obj_idx);
     bool has_multi_part_objects();
     void update_settings_items();
+    void update_object_menu();
 
     void instances_to_separated_object(const int obj_idx, const std::set<int>& inst_idx);
     void split_instances();
diff --git a/src/slic3r/GUI/MainFrame.cpp b/src/slic3r/GUI/MainFrame.cpp
index f234ca1a4..46a46e950 100644
--- a/src/slic3r/GUI/MainFrame.cpp
+++ b/src/slic3r/GUI/MainFrame.cpp
@@ -121,11 +121,6 @@ void MainFrame::init_tabpanel()
         }
     });
 
-    if (wxGetApp().plater_) {
-        // before creating a new plater let's delete old one
-        wxGetApp().plater_->Destroy();
-        wxGetApp().plater_ = nullptr;
-    }
     m_plater = new Slic3r::GUI::Plater(m_tabpanel, this);
     wxGetApp().plater_ = m_plater;
     m_tabpanel->AddPage(m_plater, _(L("Plater")));
diff --git a/src/slic3r/GUI/Plater.cpp b/src/slic3r/GUI/Plater.cpp
index 2ecb37211..1f565ca70 100644
--- a/src/slic3r/GUI/Plater.cpp
+++ b/src/slic3r/GUI/Plater.cpp
@@ -940,6 +940,8 @@ struct Plater::priv
     // SLA-Object popup menu
     wxMenu sla_object_menu;
 
+    wxMenuItem* separator_volumes_settings{ nullptr };
+
     // Data
     Slic3r::DynamicPrintConfig *config;        // FIXME: leak?
     Slic3r::Print               fff_print;
@@ -2312,7 +2314,7 @@ void Plater::priv::on_right_click(Vec2dEvent& evt)
         return;
 
     wxMenu* menu = printer_technology == ptSLA ? &sla_object_menu :
-                   get_selection().is_single_full_instance/*object*/() ? // show "Object menu" for each FullInstance instead of FullObject
+                   get_selection().is_single_full_instance() ? // show "Object menu" for each FullInstance instead of FullObject
                    &object_menu : &part_menu;
 
     sidebar->obj_list()->append_menu_item_settings(menu);
@@ -2425,18 +2427,9 @@ bool Plater::priv::complit_init_object_menu()
         [this](wxCommandEvent&) { split_volume(); }, "shape_ungroup_p.png", &object_menu);
 
     wxMenuItem* item_split = append_submenu(&object_menu, split_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object")), "shape_ungroup.png");
-
-//     append_menu_item(&object_menu, wxID_ANY, _(L("Reload from Disk")), _(L("Reload the selected file from Disk")),
-//         [this](wxCommandEvent&) { reload_from_disk(); });
-// 
-//     append_menu_item(&object_menu, wxID_ANY, _(L("Export object as STL")) + dots, _(L("Export this single object as STL file")),
-//         [this](wxCommandEvent&) { q->export_stl(true); });
-
-    // Append "Add..." popupmenu
     object_menu.AppendSeparator();
-    sidebar->obj_list()->append_menu_items_add_volume(&object_menu);
 
-//     object_menu.AppendSeparator();
+    // "Add (volumes)" popupmenu will be added later in append_menu_items_add_volume()
 
     // ui updates needs to be binded to the parent panel
     if (q != nullptr)
@@ -2453,11 +2446,13 @@ bool Plater::priv::complit_init_sla_object_menu()
     wxMenuItem* item_split = append_menu_item(&sla_object_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object into individual objects")),
         [this](wxCommandEvent&) { split_object(); }, "shape_ungroup_o.png");
 
+    sla_object_menu.AppendSeparator();
+
     // Add the automatic rotation sub-menu
     append_menu_item(&sla_object_menu, wxID_ANY, _(L("Optimize orientation")), _(L("Optimize the rotation of the object for better print results.")),
         [this](wxCommandEvent&) { sla_optimize_rotation(); });
 
-//     sla_object_menu.AppendSeparator();
+    sla_object_menu.AppendSeparator();
 
     // ui updates needs to be binded to the parent panel
     if (q != nullptr)
@@ -2473,10 +2468,12 @@ bool Plater::priv::complit_init_part_menu()
     wxMenuItem* item_split = append_menu_item(&part_menu, wxID_ANY, _(L("Split")), _(L("Split the selected object into individual sub-parts")),
         [this](wxCommandEvent&) { split_volume(); }, "shape_ungroup_p.png");
 
+    part_menu.AppendSeparator();
+
     auto obj_list = sidebar->obj_list();
     obj_list->append_menu_item_change_type(&part_menu);
 
-//     part_menu.AppendSeparator();
+    part_menu.AppendSeparator();
 
     // ui updates needs to be binded to the parent panel
     if (q != nullptr)
@@ -2578,8 +2575,6 @@ bool Plater::priv::can_split_to_volumes() const
 
 bool Plater::priv::can_split() const
 {
-    if (printer_technology == ptSLA)
-        return false;
     return sidebar->obj_list()->is_splittable();
 }
 
@@ -2606,7 +2601,7 @@ bool Plater::priv::can_mirror() const
 
 void Plater::priv::update_object_menu()
 {
-    sidebar->obj_list()->append_menu_items_add_volume(&object_menu);
+    sidebar->obj_list()->append_menu_items_add_volume(&object_menu, &separator_volumes_settings);
 }
 
 // Plater / Public