From eb2b56a87f1d16f334c6d1df4933a26014a4731b Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Fri, 14 Sep 2018 13:59:56 +0200
Subject: [PATCH] Fixed settings list for objects

+ fixed showing of an info_manifold_warning_icon
---
 lib/Slic3r/GUI/Plater.pm              | 15 +++++++------
 xs/src/slic3r/GUI/GUI.cpp             | 14 ++++++++++--
 xs/src/slic3r/GUI/GUI.hpp             |  2 +-
 xs/src/slic3r/GUI/GUI_ObjectParts.cpp | 31 ++++++++++++++++-----------
 xs/src/slic3r/GUI/GUI_ObjectParts.hpp |  2 ++
 5 files changed, 41 insertions(+), 23 deletions(-)

diff --git a/lib/Slic3r/GUI/Plater.pm b/lib/Slic3r/GUI/Plater.pm
index 050d2dee8..0cb07023c 100644
--- a/lib/Slic3r/GUI/Plater.pm
+++ b/lib/Slic3r/GUI/Plater.pm
@@ -607,11 +607,12 @@ sub new {
                     #$self->{object_info_manifold_warning_icon}->Hide;
                     $self->{"object_info_manifold_warning_icon_show"} = sub {
                         if ($self->{object_info_manifold_warning_icon}->IsShown() != $_[0]) {
+                            # this fuction show/hide info_manifold_warning_icon on the c++ side now
                             Slic3r::GUI::set_show_manifold_warning_icon($_[0]);
-                            my $mode = wxTheApp->{app_config}->get("view_mode");
-                            return if ($mode eq "" || $mode eq "simple");
-                            $self->{object_info_manifold_warning_icon}->Show($_[0]); 
-                            $self->Layout
+                            #my $mode = wxTheApp->{app_config}->get("view_mode");
+                            #return if ($mode eq "" || $mode eq "simple");
+                            #$self->{object_info_manifold_warning_icon}->Show($_[0]);
+                            #$self->Layout
                         }
                     };
                     $self->{"object_info_manifold_warning_icon_show"}->(0);
@@ -2478,11 +2479,11 @@ sub select_object {
     if (defined $obj_idx) {
         $self->{objects}->[$obj_idx]->selected(1);
         # Select current object in the list on c++ side, if item isn't child
-        if (!defined $child){
-            Slic3r::GUI::select_current_object($obj_idx);}
+#        if (!defined $child){
+#            Slic3r::GUI::select_current_object($obj_idx);} # all selections in the object list is on c++ side
     } else {
         # Unselect all objects in the list on c++ side
-        Slic3r::GUI::unselect_objects();
+#        Slic3r::GUI::unselect_objects(); # all selections in the object list is on c++ side
     }
     $self->selection_changed(1);
 }
diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp
index 7d8a9b9d5..433acea1d 100644
--- a/xs/src/slic3r/GUI/GUI.cpp
+++ b/xs/src/slic3r/GUI/GUI.cpp
@@ -259,6 +259,15 @@ void set_show_print_info(bool show)
 void set_show_manifold_warning_icon(bool show)
 {
 	g_show_manifold_warning_icon = show;
+    if (!g_manifold_warning_icon)
+        return;
+
+    // update manifold_warning_icon showing
+    if (show && !g_info_sizer->IsShown(static_cast<size_t>(0)))
+        g_show_manifold_warning_icon = false;
+
+    g_manifold_warning_icon->Show(g_show_manifold_warning_icon);
+    g_manifold_warning_icon->GetParent()->Layout();
 }
 
 void set_objects_list_sizer(wxBoxSizer *objects_list_sizer){
@@ -1118,11 +1127,11 @@ void show_buttons(bool show)
 	}
 }
 
-void show_info_sizer(const bool show, const bool is_update_settings/* = false*/)
+void show_info_sizer(const bool show)
 {
 	g_info_sizer->Show(static_cast<size_t>(0), show); 
 	g_info_sizer->Show(1, show && g_show_print_info);
-	g_manifold_warning_icon->Show(show && (!is_update_settings && g_show_manifold_warning_icon));
+	g_manifold_warning_icon->Show(show && g_show_manifold_warning_icon);
 }
 
 void show_object_name(bool show)
@@ -1142,6 +1151,7 @@ void update_mode()
 	show_info_sizer(mode == ConfigMenuModeExpert);
 	show_buttons(mode == ConfigMenuModeExpert);
     show_object_name(mode == ConfigMenuModeSimple);
+    show_manipulation_sizer(mode == ConfigMenuModeSimple);
 
 	// TODO There is a not the best place of it!
 	// *** Update showing of the collpane_settings
diff --git a/xs/src/slic3r/GUI/GUI.hpp b/xs/src/slic3r/GUI/GUI.hpp
index 7e9acfabf..448c37773 100644
--- a/xs/src/slic3r/GUI/GUI.hpp
+++ b/xs/src/slic3r/GUI/GUI.hpp
@@ -182,7 +182,7 @@ bool select_language(wxArrayString & names, wxArrayLong & identifiers);
 // update right panel of the Plater according to view mode
 void update_mode();
 
-void show_info_sizer(const bool show, const bool is_update_settinfs = false);
+void show_info_sizer(const bool show);
 
 std::vector<Tab *>& get_tabs_list();
 bool checked_tab(Tab* tab);
diff --git a/xs/src/slic3r/GUI/GUI_ObjectParts.cpp b/xs/src/slic3r/GUI/GUI_ObjectParts.cpp
index ff69eaffe..40b066b1d 100644
--- a/xs/src/slic3r/GUI/GUI_ObjectParts.cpp
+++ b/xs/src/slic3r/GUI/GUI_ObjectParts.cpp
@@ -731,11 +731,8 @@ void select_current_object(int idx)
 {
 	g_prevent_list_events = true;
 	m_objects_ctrl->UnselectAll();
-	if (idx < 0) {
-		g_prevent_list_events = false;
-		return;
-	}
-	m_objects_ctrl->Select(m_objects_model->GetItemById(idx));
+    if (idx>=0)
+        m_objects_ctrl->Select(m_objects_model->GetItemById(idx));
 	part_selection_changed();
 	g_prevent_list_events = false;
 }
@@ -748,12 +745,8 @@ void select_current_volume(int idx, int vol_idx)
     }
     g_prevent_list_events = true;
     m_objects_ctrl->UnselectAll();
-    if (idx < 0) {
-        g_prevent_list_events = false;
-        return;
-    }
-
-    m_objects_ctrl->Select(m_objects_model->GetItemByVolumeId(idx, vol_idx));
+    if (idx >= 0)
+        m_objects_ctrl->Select(m_objects_model->GetItemByVolumeId(idx, vol_idx));
     part_selection_changed();
     g_prevent_list_events = false;
 }
@@ -1186,8 +1179,8 @@ wxMenu *create_add_settings_popupmenu(bool is_part)
 		menu->Append(menu_item);
 	}
 #ifndef __WXMSW__
-	menu->Bind(wxEVT_MENU, [menu](wxEvent &event) {
-		get_settings_choice(menu, event.GetId(), true);
+    menu->Bind(wxEVT_MENU, [menu,is_part](wxEvent &event) {
+        get_settings_choice(menu, event.GetId(), is_part);
 	});
 #endif //no __WXMSW__
 	return menu;
@@ -2027,5 +2020,17 @@ void update_double_slider_from_canvas(wxKeyEvent& event)
         event.Skip();
 }
 
+void show_manipulation_sizer(const bool is_simple_mode)
+{
+    auto item = m_objects_ctrl->GetSelection();
+    if (!item || !is_simple_mode)
+        return;
+
+    if (m_objects_model->IsSettingsItem(item)) {
+        m_objects_ctrl->Select(m_objects_model->GetParent(item));
+        part_selection_changed();
+    }
+}
+
 } //namespace GUI
 } //namespace Slic3r 
\ No newline at end of file
diff --git a/xs/src/slic3r/GUI/GUI_ObjectParts.hpp b/xs/src/slic3r/GUI/GUI_ObjectParts.hpp
index 70c077bd7..e66b4d1db 100644
--- a/xs/src/slic3r/GUI/GUI_ObjectParts.hpp
+++ b/xs/src/slic3r/GUI/GUI_ObjectParts.hpp
@@ -140,6 +140,8 @@ void reset_double_slider();
 // update DoubleSlider after keyDown in canvas
 void update_double_slider_from_canvas(wxKeyEvent& event);
 
+void show_manipulation_sizer(const bool is_simple_mode);
+
 } //namespace GUI
 } //namespace Slic3r 
 #endif  //slic3r_GUI_ObjectParts_hpp_
\ No newline at end of file