From 98ab903d5d7e247cbb11b298db06143273cb4ae5 Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Sun, 8 Sep 2013 18:55:08 +0000
Subject: [PATCH] call quick visibility menu with double-click in graphic
 window (with memory of last clicked item)

---
 Fltk/graphicWindow.cpp | 17 +++++++++++++----
 Fltk/openglWindow.cpp  | 17 ++++++++++++-----
 2 files changed, 25 insertions(+), 9 deletions(-)

diff --git a/Fltk/graphicWindow.cpp b/Fltk/graphicWindow.cpp
index 872a899e0f..d2a2f61683 100644
--- a/Fltk/graphicWindow.cpp
+++ b/Fltk/graphicWindow.cpp
@@ -2302,7 +2302,8 @@ void status_options_cb(Fl_Widget *w, void *data)
       perspectiveEditor();
     drawContext::global()->draw();
   }
-  else if(!strcmp(str, "M")){ // quick visibility menu
+  else if(!strcmp(str, "quickvis") ||
+          !strcmp(str, "quickvis_toggle")){ // quick visibility menu
     static Fl_Menu_Item menu[] = {
       { "Axes", 0, quick_visibility_cb, (void*)"axes",
         FL_MENU_TOGGLE|FL_MENU_DIVIDER },
@@ -2362,8 +2363,16 @@ void status_options_cb(Fl_Widget *w, void *data)
         break;
       }
     }
-    const Fl_Menu_Item *m = menu->popup(Fl::event_x(), Fl::event_y(), 0, &menu[22], 0);
-    if(m) m->do_callback(0, m->user_data());
+    if(!strcmp(str, "quickvis_toggle")){
+      const Fl_Menu_Item *m = menu->popup(Fl::event_x(), Fl::event_y(), 0, &menu[22], 0);
+      if(m) m->do_callback(0, m->user_data());
+    }
+    else{
+      static Fl_Menu_Item *picked = &menu[22];
+      picked = (Fl_Menu_Item*)menu->popup(Fl::event_x(), Fl::event_y(), 0,
+                                          picked ? picked : &menu[22], 0);
+      if(picked) picked->do_callback(0, picked->user_data());
+    }
     drawContext::global()->draw();
   }
   else if(!strcmp(str, "clscale")){
@@ -2715,7 +2724,7 @@ graphicWindow::graphicWindow(bool main, int numTiles, bool detachedMenu)
   _butt[8]->tooltip("Toggle projection mode (Alt+o or Alt+Shift+o)");
   x += sw;
   _butt[12] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "M");
-  _butt[12]->callback(status_options_cb, (void *)"M");
+  _butt[12]->callback(status_options_cb, (void *)"quickvis_toggle");
   _butt[12]->tooltip("Quick visibility menu (Alt+m to toggle mesh display)");
   x += sw;
   _butt[13] = new Fl_Button(x, mh + glheight + mheight + 2, sw, sht, "@-1gmsh_clscale");
diff --git a/Fltk/openglWindow.cpp b/Fltk/openglWindow.cpp
index 34061b8c77..372031c0a3 100644
--- a/Fltk/openglWindow.cpp
+++ b/Fltk/openglWindow.cpp
@@ -22,19 +22,21 @@
 #include "Trackball.h"
 #include "GamePad.h"
 
-// Navigator handler (read gamepad event if gamepad exists or question presence of gamepad)
+// Navigator handler (read gamepad event if gamepad exists or question presence
+// of gamepad)
 static void navigator_handler(void *data)
 {
   openglWindow* gl_win = (openglWindow*)data;
   if (CTX::instance()->gamepad && CTX::instance()->gamepad->active) {
     if (gl_win->Nautilus ==0){
-      gl_win->Nautilus = new Navigator(CTX::instance()->gamepad->frequency,gl_win->getDrawContext());
+      gl_win->Nautilus = new Navigator(CTX::instance()->gamepad->frequency,
+                                       gl_win->getDrawContext());
     }
     gl_win->moveWithGamepad();
     Fl::add_timeout(CTX::instance()->gamepad->frequency, navigator_handler, data);
   }
   else{
-    if (gl_win->Nautilus){ delete      gl_win->Nautilus;  gl_win->Nautilus=0; }
+    if (gl_win->Nautilus){ delete gl_win->Nautilus; gl_win->Nautilus = 0; }
     Fl::add_timeout(3., navigator_handler, data);
   }
 }
@@ -255,8 +257,8 @@ void openglWindow::draw()
 		cam->up.x,cam->up.y,cam->up.z);
       _ctx->draw3d();
       _ctx->draw2d();
-      if(CTX::instance()->gamepad && CTX::instance()->gamepad->active && Nautilus) Nautilus->drawIcons();
-     
+      if(CTX::instance()->gamepad && CTX::instance()->gamepad->active && Nautilus)
+        Nautilus->drawIcons();
       _drawScreenMessage();
       _drawBorder();
     }
@@ -340,6 +342,11 @@ int openglWindow::handle(int event)
     return Fl_Gl_Window::handle(event);
 
   case FL_PUSH:
+    if(Fl::event_clicks() == 1){ // double-click
+      status_options_cb(0, (void*)"quickvis");
+      Fl::event_clicks(-1);
+      return 1;
+    }
     _setLastHandled(this);
     take_focus(); // force keyboard focus when we click in the window
     _curr.set(_ctx, Fl::event_x(), Fl::event_y());
-- 
GitLab