From c07f347ff6cc952cf7cd8853cb89c6b5984d3272 Mon Sep 17 00:00:00 2001
From: YuSanka <yusanka@gmail.com>
Date: Wed, 9 May 2018 14:36:20 +0200
Subject: [PATCH] CollapsiblePanes are putted to ScrolledWindow

---
 xs/src/slic3r/GUI/GUI.cpp          | 148 +++++++++++------------------
 xs/src/slic3r/GUI/wxExtensions.cpp |  12 +--
 xs/src/slic3r/GUI/wxExtensions.hpp |   6 +-
 3 files changed, 65 insertions(+), 101 deletions(-)

diff --git a/xs/src/slic3r/GUI/GUI.cpp b/xs/src/slic3r/GUI/GUI.cpp
index 0be77b6ba..0e2893b57 100644
--- a/xs/src/slic3r/GUI/GUI.cpp
+++ b/xs/src/slic3r/GUI/GUI.cpp
@@ -809,17 +809,25 @@ wxString from_u8(const std::string &str)
 
 void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFlexGridSizer* preset_sizer)
 {
+ 	sizer->SetMinSize(-1, 300);
+	auto main_sizer = new wxBoxSizer(wxVERTICAL);
+	auto main_page = new wxScrolledWindow(parent, wxID_ANY, wxDefaultPosition, wxDefaultSize, wxTAB_TRAVERSAL);
+	main_page->SetSizer(main_sizer);
+	main_page->SetScrollbars(1, 1, 1, 1);
+	sizer->Add(main_page, 1, wxEXPAND | wxALL, 1);
+
 	// Experiments with new UI
-	wxCollapsiblePane *collpane = new wxCollapsiblePane(parent, wxID_ANY, "Print settings:");
-	collpane->Bind(wxEVT_COLLAPSIBLEPANE_CHANGED, ([parent, collpane](wxCommandEvent e){
+	wxCollapsiblePane *collpane = new wxCollapsiblePane(main_page, wxID_ANY, "Frequently Changing Parameters:");
+	collpane->Bind(wxEVT_COLLAPSIBLEPANE_CHANGED, ([parent, main_page, collpane](wxCommandEvent e){
 		wxWindowUpdateLocker noUpdates_cp(collpane);
-		wxWindowUpdateLocker noUpdates(parent);
-  		parent->Layout();
+		wxWindowUpdateLocker noUpdates(main_page);
+		parent->Layout();
+		main_page->Layout();
 		collpane->Refresh();
 	}));
 
 	// add the pane with a zero proportion value to the sizer which contains it
-	sizer->Add(collpane, 0, wxGROW | wxALL, 0);
+	main_sizer->Add(collpane, 0, wxGROW | wxALL, 0);
 
 	wxWindow *win = collpane->GetPane();
 #ifdef __WXMSW__
@@ -943,8 +951,36 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl
 		};
 		m_optgroup->append_line(line);
 
-	auto common_sizer = new wxBoxSizer(wxVERTICAL);
-	common_sizer->Add(m_optgroup->sizer);
+	wxSizer *paneSz = new wxBoxSizer(wxVERTICAL);
+	paneSz->Add(m_optgroup->sizer, 1, wxGROW | wxEXPAND | /*wxBOTTOM*/wxALL, /*2*/5);
+	win->SetSizer(paneSz);
+	paneSz->SetSizeHints(win);
+
+
+
+
+	wxCollapsiblePane *collpane_objects = new wxCollapsiblePane(main_page, wxID_ANY, "Objects List:");
+	collpane_objects->Bind(wxEVT_COLLAPSIBLEPANE_CHANGED, ([parent, main_page, collpane_objects](wxCommandEvent e){
+		wxWindowUpdateLocker noUpdates_cp(collpane_objects);
+		wxWindowUpdateLocker noUpdates(main_page);
+		parent->Layout();
+		main_page->Layout();
+		collpane_objects->Refresh();
+	}));
+
+	// add the pane with a zero proportion value to the sizer which contains it
+	main_sizer->Add(collpane_objects, 0, wxGROW | wxALL, 0);
+
+	wxWindow *win_objects = collpane_objects->GetPane();
+#ifdef __WXMSW__
+	collpane_objects->GetControlWidget()->SetWindowStyleFlag(wxNO_BORDER);
+	collpane_objects->GetControlWidget()->SetBackgroundColour(clr);
+	collpane_objects->SetBackgroundColour(clr);
+	win_objects->SetBackgroundColour(clr);
+#endif //__WXMSW__
+
+// 	auto common_sizer = new wxBoxSizer(wxVERTICAL);
+// 	common_sizer->Add(m_optgroup->sizer);
 
 // 	auto listctrl = new wxDataViewListCtrl(win, wxID_ANY, wxDefaultPosition, wxSize(-1, 100));
 // 	listctrl->AppendToggleColumn("Toggle");
@@ -964,9 +1000,10 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl
 // 	common_sizer->Add(listctrl, 0, wxEXPAND | wxALL, 1);
 
 	// **********************************************************************************************
-	auto objects_ctrl = new wxDataViewCtrl(win, wxID_ANY, wxDefaultPosition, wxDefaultSize);
+	auto objects_ctrl = new wxDataViewCtrl(win_objects, wxID_ANY, wxDefaultPosition, wxDefaultSize);
 	wxSizer *objects_sz = new wxBoxSizer(wxVERTICAL);
-	objects_ctrl->SetMinSize(wxSize(-1, 200));
+	objects_ctrl->SetBestFittingSize(wxSize(-1, 200));
+//	objects_ctrl->SetMinSize(wxSize(-1, 200));
 	objects_sz->Add(objects_ctrl, 1, wxGROW | wxALL, 5);
 
 	auto objects_model = new MyObjectTreeModel;
@@ -979,108 +1016,31 @@ void add_frequently_changed_parameters(wxWindow* parent, wxBoxSizer* sizer, wxFl
 	// column 0 of the view control:
 
 	wxDataViewTextRenderer *tr = new wxDataViewTextRenderer("string", wxDATAVIEW_CELL_INERT);
-	wxDataViewColumn *column00 = new wxDataViewColumn("Name", tr, 0, 150, wxALIGN_LEFT,
+	wxDataViewColumn *column00 = new wxDataViewColumn("Name", tr, 0, 140, wxALIGN_LEFT,
 		wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
 	objects_ctrl->AppendColumn(column00);
 
 	// column 1 of the view control:
 
 	tr = new wxDataViewTextRenderer("string", wxDATAVIEW_CELL_INERT);
-	wxDataViewColumn *column01 = new wxDataViewColumn("Copy", tr, 1, 95, wxALIGN_CENTER_HORIZONTAL,
+	wxDataViewColumn *column01 = new wxDataViewColumn("Copy", tr, 1, 75, wxALIGN_CENTER_HORIZONTAL,
 		wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
 	objects_ctrl->AppendColumn(column01);
 
 	// column 2 of the view control:
 
 	tr = new wxDataViewTextRenderer("string", wxDATAVIEW_CELL_INERT);
-	wxDataViewColumn *column02 = new wxDataViewColumn("Scale", tr, 2, 95, wxALIGN_CENTER_HORIZONTAL,
+	wxDataViewColumn *column02 = new wxDataViewColumn("Scale", tr, 2, 80, wxALIGN_CENTER_HORIZONTAL,
 		wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
 	objects_ctrl->AppendColumn(column02);
 
-	common_sizer->Add(objects_sz, 0, wxEXPAND | wxALL, 1);
+// 	common_sizer->Add(objects_sz, 0, wxEXPAND | wxALL, 1);
 
-	// **********************************************************************************************
-/*	auto view_ctrl = new wxDataViewCtrl(win, wxID_ANY, wxDefaultPosition, wxDefaultSize);
-	wxSizer *PanelSz = new wxBoxSizer(wxVERTICAL);
-	view_ctrl->SetMinSize(wxSize(-1, 200));
-	PanelSz->Add(view_ctrl, 1, wxGROW | wxALL, 5);
-	PanelSz->Add( new wxStaticText(win, wxID_ANY, "Most of the cells above are editable!"), 0, wxGROW | wxALL, 5);
-	
-	auto m_music_model = new MyMusicTreeModel;
-	view_ctrl->AssociateModel(m_music_model);
+	wxSizer *paneSz_objects = new wxBoxSizer(wxVERTICAL);
+	paneSz_objects->Add(objects_sz, 1, wxGROW | wxEXPAND | wxBOTTOM, 2);
+	win_objects->SetSizer(paneSz_objects);
+	paneSz_objects->SetSizeHints(win_objects);
 
-#if wxUSE_DRAG_AND_DROP && wxUSE_UNICODE
-	view_ctrl->EnableDragSource(wxDF_UNICODETEXT);
-	view_ctrl->EnableDropTarget(wxDF_UNICODETEXT);
-#endif // wxUSE_DRAG_AND_DROP && wxUSE_UNICODE
-
-	// column 0 of the view control:
-
-	tr = new wxDataViewTextRenderer("string", wxDATAVIEW_CELL_INERT);
-	wxDataViewColumn *column0 =
-		new wxDataViewColumn("title", tr, 0, 150, wxALIGN_LEFT,
-		wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_RESIZABLE);
-	view_ctrl->AppendColumn(column0);
-#if 0
-	// Call this and sorting is enabled
-	// immediately upon start up.
-	column0->SetAsSortKey();
-#endif
-
-	// column 1 of the view control:
-
-	tr = new wxDataViewTextRenderer("string", wxDATAVIEW_CELL_EDITABLE);
-	wxDataViewColumn *column1 =
-		new wxDataViewColumn("artist", tr, 1, 150, wxALIGN_LEFT,
-		wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_REORDERABLE |
-		wxDATAVIEW_COL_RESIZABLE);
-	column1->SetMinWidth(100); // this column can't be resized to be smaller
-	view_ctrl->AppendColumn(column1);
-
-	// column 2 of the view control:
-
-	wxDataViewSpinRenderer *sr =
-		new wxDataViewSpinRenderer(0, 2010, wxDATAVIEW_CELL_EDITABLE,
-		wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL);
-	wxDataViewColumn *column2 =
-		new wxDataViewColumn("year", sr, 2, 60, wxALIGN_LEFT,
-		wxDATAVIEW_COL_SORTABLE | wxDATAVIEW_COL_REORDERABLE);
-	view_ctrl->AppendColumn(column2);
-
-	// column 3 of the view control:
-
-	wxArrayString choices;
-	choices.Add("good");
-	choices.Add("bad");
-	choices.Add("lousy");
-	wxDataViewChoiceRenderer *c =
-		new wxDataViewChoiceRenderer(choices, wxDATAVIEW_CELL_EDITABLE,
-		wxALIGN_RIGHT | wxALIGN_CENTRE_VERTICAL);
-	wxDataViewColumn *column3 =
-		new wxDataViewColumn("rating", c, 3, 100, wxALIGN_LEFT,
-		wxDATAVIEW_COL_REORDERABLE | wxDATAVIEW_COL_RESIZABLE);
-	view_ctrl->AppendColumn(column3);
-
-	// column 4 of the view control:
-
-	view_ctrl->AppendProgressColumn("popularity", 4, wxDATAVIEW_CELL_INERT, 80);
-
-	// column 5 of the view control:
-
-	MyCustomRenderer *cr = new MyCustomRenderer(wxDATAVIEW_CELL_ACTIVATABLE);
-	wxDataViewColumn *column5 =
-		new wxDataViewColumn("custom", cr, 5, -1, wxALIGN_LEFT,
-		wxDATAVIEW_COL_RESIZABLE);
-	view_ctrl->AppendColumn(column5);
-
-	// **********************************************************************************************
-	common_sizer->Add(PanelSz, 0, wxEXPAND | wxALL, 1);
-*/
-
-	wxSizer *paneSz = new wxBoxSizer(wxVERTICAL);
-	paneSz->Add(common_sizer/*m_optgroup->sizer*/, 1, wxGROW | wxEXPAND | wxBOTTOM, 2);
-	win->SetSizer(paneSz);
-	paneSz->SetSizeHints(win);
 }
 
 ConfigOptionsGroup* get_optgroup()
diff --git a/xs/src/slic3r/GUI/wxExtensions.cpp b/xs/src/slic3r/GUI/wxExtensions.cpp
index 9d691b1aa..0fb335118 100644
--- a/xs/src/slic3r/GUI/wxExtensions.cpp
+++ b/xs/src/slic3r/GUI/wxExtensions.cpp
@@ -186,9 +186,9 @@ MyObjectTreeModel::MyObjectTreeModel()
 	m_objects.emplace(root3);
 	auto root4 = new MyObjectTreeModelNode("Object4");
 	m_objects.emplace(root4);
-	root4->Append(new MyObjectTreeModelNode(root2, "SubObject1"));
-	root4->Append(new MyObjectTreeModelNode(root2, "SubObject2"));
-	root4->Append(new MyObjectTreeModelNode(root2, "SubObject3"));
+	root4->Append(new MyObjectTreeModelNode(root4, "SubObject1"));
+	root4->Append(new MyObjectTreeModelNode(root4, "SubObject2"));
+	root4->Append(new MyObjectTreeModelNode(root4, "SubObject3"));
 }
 
 wxString MyObjectTreeModel::GetName(const wxDataViewItem &item) const
@@ -200,7 +200,7 @@ wxString MyObjectTreeModel::GetName(const wxDataViewItem &item) const
 	return node->m_name;
 }
 
-wxString MyObjectTreeModel::GetCopyCnt(const wxDataViewItem &item) const
+wxString MyObjectTreeModel::GetCopy(const wxDataViewItem &item) const
 {
 	MyObjectTreeModelNode *node = (MyObjectTreeModelNode*)item.GetID();
 	if (!node)      // happens if item.IsOk()==false
@@ -302,8 +302,8 @@ unsigned int MyObjectTreeModel::GetChildren(const wxDataViewItem &parent, wxData
 	MyObjectTreeModelNode *node = (MyObjectTreeModelNode*)parent.GetID();
 	if (!node)
 	{
-		for (auto object: m_objects)
-		array.Add(wxDataViewItem((void*)object));
+		for (auto object : m_objects)
+			array.Add(wxDataViewItem((void*)object));
 		return m_objects.size();
 	}
 
diff --git a/xs/src/slic3r/GUI/wxExtensions.hpp b/xs/src/slic3r/GUI/wxExtensions.hpp
index 0ed27ab74..6ebdbe8b2 100644
--- a/xs/src/slic3r/GUI/wxExtensions.hpp
+++ b/xs/src/slic3r/GUI/wxExtensions.hpp
@@ -148,7 +148,7 @@ public:
 	// helper method for wxLog
 
 	wxString GetName(const wxDataViewItem &item) const;
-	wxString GetCopyCnt(const wxDataViewItem &item) const;
+	wxString GetCopy(const wxDataViewItem &item) const;
 	wxString GetScale(const wxDataViewItem &item) const;
 
 	// helper methods to change the model
@@ -172,6 +172,10 @@ public:
 	virtual bool IsContainer(const wxDataViewItem &item) const override;
 	virtual unsigned int GetChildren(const wxDataViewItem &parent,
 		wxDataViewItemArray &array) const override;
+
+	// Is the container just a header or an item with all columns
+	// In our case it is an item with all columns 
+	virtual bool HasContainerColumns(const wxDataViewItem& WXUNUSED(item)) const override {	return true; }
 };