From cfa2ef4c2f37222b9220cafd6c49af0318e2de6d Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Fri, 2 Dec 2011 15:56:25 +0000
Subject: [PATCH] remove & set visible by view name

---
 Common/Options.cpp  |  2 +-
 Fltk/menuWindow.cpp | 77 ++++++++++++++++++++++++---------------------
 2 files changed, 42 insertions(+), 37 deletions(-)

diff --git a/Common/Options.cpp b/Common/Options.cpp
index f8a430a4fe..eaf89490e4 100644
--- a/Common/Options.cpp
+++ b/Common/Options.cpp
@@ -1207,7 +1207,7 @@ std::string opt_view_name(OPT_ARGS_STR)
     FlGui::instance()->options->view.input[0]->value(data->getName().c_str());
   }
 #endif
-  return data->getName().c_str();
+  return data->getName();
 #else
   return "";
 #endif
diff --git a/Fltk/menuWindow.cpp b/Fltk/menuWindow.cpp
index abb8b7feb0..bf96d81849 100644
--- a/Fltk/menuWindow.cpp
+++ b/Fltk/menuWindow.cpp
@@ -2156,34 +2156,29 @@ static void view_remove_other_cb(Fl_Widget *w, void *data)
 static void view_remove_all_cb(Fl_Widget *w, void *data)
 {
   if(PView::list.empty()) return;
-  while(PView::list.size()) delete PView::list[0];
-  FlGui::instance()->updateViews();
-  drawContext::global()->draw();
-}
-
-static void view_remove_visible_cb(Fl_Widget *w, void *data)
-{
-  if(PView::list.empty()) return;
-  for(int i = PView::list.size() - 1; i >= 0; i--)
-    if(opt_view_visible(i, GMSH_GET, 0)) delete PView::list[i];
-  FlGui::instance()->updateViews();
-  drawContext::global()->draw();
-}
-
-static void view_remove_invisible_cb(Fl_Widget *w, void *data)
-{
-  if(PView::list.empty()) return;
-  for(int i = PView::list.size() - 1; i >= 0; i--)
-    if(!opt_view_visible(i, GMSH_GET, 0)) delete PView::list[i];
-  FlGui::instance()->updateViews();
-  drawContext::global()->draw();
-}
-
-static void view_remove_empty_cb(Fl_Widget *w, void *data)
-{
-  if(PView::list.empty()) return;
-  for(int i = PView::list.size() - 1; i >= 0; i--)
-    if(PView::list[i]->getData()->empty()) delete PView::list[i];
+  int mode = (intptr_t)data;
+  if(mode == -1){ // remove all
+    if(PView::list.empty()) return;
+    while(PView::list.size()) delete PView::list[0];
+  }
+  else if(mode == -2){ // remove all visible
+    for(int i = PView::list.size() - 1; i >= 0; i--)
+      if(opt_view_visible(i, GMSH_GET, 0)) delete PView::list[i];
+  }
+  else if(mode == -3){ // remove all invisible
+    for(int i = PView::list.size() - 1; i >= 0; i--)
+      if(!opt_view_visible(i, GMSH_GET, 0)) delete PView::list[i];
+  }
+  else if(mode == -4){ // remove all empty
+    for(int i = PView::list.size() - 1; i >= 0; i--)
+      if(PView::list[i]->getData()->empty()) delete PView::list[i];
+  }
+  else if(mode >=0 && mode < (int)PView::list.size()){ // remove by name
+    std::string name = PView::list[mode]->getData()->getName();
+    for(int i = PView::list.size() - 1; i >= 0; i--)
+      if(PView::list[i]->getData()->getName() == name) delete PView::list[i];
+  }
+  
   FlGui::instance()->updateViews();
   drawContext::global()->draw();
 }
@@ -2292,10 +2287,16 @@ static void view_combine_time_by_name_cb(Fl_Widget *w, void *data)
 
 static void view_all_visible_cb(Fl_Widget *w, void *data)
 {
+  int mode = (intptr_t)data;
+  std::string name;
+  if(mode >= 0) name = PView::list[mode]->getData()->getName();
   for(unsigned int i = 0; i < PView::list.size(); i++)
     opt_view_visible(i, GMSH_SET | GMSH_GUI, 
-                     (intptr_t)data < 0 ? !opt_view_visible(i, GMSH_GET, 0) :
-                     (intptr_t)data > 0 ? 1 : 0);
+                     (mode == -1) ? 1 :
+                     (mode == -2) ? 0 :
+                     (mode == -3) ? !opt_view_visible(i, GMSH_GET, 0) :
+                     (name == PView::list[i]->getData()->getName()) ? 1 : 
+                     0);
   drawContext::global()->draw();
 }
 
@@ -2918,12 +2919,14 @@ void menuWindow::setContext(contextItem *menu_asked, int flag)
         p[j]->add("Remove/Other Views", 0, 
                   (Fl_Callback *) view_remove_other_cb, (void *)nb, 0);
         p[j]->add("Remove/Visible Views", 0, 
-                  (Fl_Callback *) view_remove_visible_cb, (void *)nb, 0);
+                  (Fl_Callback *) view_remove_all_cb, (void *)-2, 0);
         p[j]->add("Remove/Invisible Views", 0, 
-                  (Fl_Callback *) view_remove_invisible_cb, (void *)nb, 0);
+                  (Fl_Callback *) view_remove_all_cb, (void *)-3, 0);
         p[j]->add("Remove/Empty Views", 0, 
-                  (Fl_Callback *) view_remove_empty_cb, (void *)nb, 0);
+                  (Fl_Callback *) view_remove_all_cb, (void *)-4, 0);
         p[j]->add("Remove/All Views", 0, 
+                  (Fl_Callback *) view_remove_all_cb, (void *)-1, 0);
+        p[j]->add("Remove/By Name", 0, 
                   (Fl_Callback *) view_remove_all_cb, (void *)nb, 0);
         p[j]->add("Alias/View without Options", 0, 
                   (Fl_Callback *) view_alias_cb, (void *)nb, 0);
@@ -2942,11 +2945,13 @@ void menuWindow::setContext(contextItem *menu_asked, int flag)
         p[j]->add("Combine Time Steps/By View Name", 0, 
                  (Fl_Callback *) view_combine_time_by_name_cb, (void *)nb, 0);
         p[j]->add("Set Visibility/All On", 0, 
-                  (Fl_Callback *) view_all_visible_cb, (void *)1, 0);
+                  (Fl_Callback *) view_all_visible_cb, (void *)-1, 0);
         p[j]->add("Set Visibility/All Off", 0, 
-                  (Fl_Callback *) view_all_visible_cb, (void *)0, 0);
+                  (Fl_Callback *) view_all_visible_cb, (void *)-2, 0);
         p[j]->add("Set Visibility/Invert", 0, 
-                  (Fl_Callback *) view_all_visible_cb, (void *)-1, 0);
+                  (Fl_Callback *) view_all_visible_cb, (void *)-3, 0);
+        p[j]->add("Set Visibility/By name", 0, 
+                  (Fl_Callback *) view_all_visible_cb, (void *)nb, 0);
         p[j]->add("Apply As Background Mesh", 0, 
                   (Fl_Callback *) view_applybgmesh_cb, (void *)nb, 0);
         p[j]->add("Save As...", 0, 
-- 
GitLab