From 99614ee8cad55cff449337bf137ce183432ea19c Mon Sep 17 00:00:00 2001
From: Christophe Geuzaine <cgeuzaine@ulg.ac.be>
Date: Sun, 28 Feb 2016 18:11:44 +0000
Subject: [PATCH] simple coord freeze

---
 Fltk/contextWindow.cpp | 21 +++++++++++++++++++++
 Fltk/contextWindow.h   |  3 +++
 Fltk/openglWindow.cpp  | 24 ++++++++++--------------
 3 files changed, 34 insertions(+), 14 deletions(-)

diff --git a/Fltk/contextWindow.cpp b/Fltk/contextWindow.cpp
index 836bb882c8..784f656024 100644
--- a/Fltk/contextWindow.cpp
+++ b/Fltk/contextWindow.cpp
@@ -90,6 +90,10 @@ elementaryContextWindow::elementaryContextWindow(int deltaFontSize)
       input[3]->value("0");
       input[4] = new Fl_Input(2 * WB, 2 * WB + 3 * BH, IW, BH, "Z coordinate");
       input[4]->value("0");
+      for(int i = 0; i < 3; i++)
+        _butt[i] = new Fl_Check_Button
+          (width - 2 * WB - IW, 2 * WB + (i+1) * BH, IW, BH, "Freeze");
+
       input[5] = new Fl_Input(2 * WB, 2 * WB + 4 * BH, IW, BH,
                               "Prescribed mesh element size at point");
       input[5]->value("1.0");
@@ -203,6 +207,23 @@ elementaryContextWindow::elementaryContextWindow(int deltaFontSize)
   FL_NORMAL_SIZE += deltaFontSize;
 }
 
+bool elementaryContextWindow::frozenPointCoord(int coord)
+{
+  if(coord < 0 || coord > 2) return false;
+  return _butt[coord]->value() ? true : false;
+}
+
+void elementaryContextWindow::updatePoint(double pt[3])
+{
+  for(int i = 0; i < 3; i++){
+    if(!frozenPointCoord(i)){
+      char str[32];
+      sprintf(str, "%g", pt[i]);
+      input[2 + i]->value(str);
+    }
+  }
+}
+
 void elementaryContextWindow::show(int pane)
 {
   for(int i = 0; i < 6; i++)
diff --git a/Fltk/contextWindow.h b/Fltk/contextWindow.h
index 25777d054d..d72cdd572d 100644
--- a/Fltk/contextWindow.h
+++ b/Fltk/contextWindow.h
@@ -20,9 +20,12 @@ class elementaryContextWindow{
   Fl_Input *input[30];
   Fl_Value_Input *value[10];
   Fl_Group *group[10];
+  Fl_Check_Button *_butt[3];
  public:
   elementaryContextWindow(int deltaFontSize=0);
   void show(int pane);
+  void updatePoint(double pt[3]);
+  bool frozenPointCoord(int coord);
 };
 
 class physicalContextWindow{
diff --git a/Fltk/openglWindow.cpp b/Fltk/openglWindow.cpp
index 9bb13c10cd..baf3730f8d 100644
--- a/Fltk/openglWindow.cpp
+++ b/Fltk/openglWindow.cpp
@@ -625,22 +625,18 @@ int openglWindow::handle(int event)
                      CTX::instance()->cg[2] - p[2]}, t;
       prosca(r, d, &t);
       for(int i = 0; i < 3; i++){
-        _point[i] = p[i] + t * d[i];
-        if(CTX::instance()->geom.snap[i]){
-          double d = _point[i] / CTX::instance()->geom.snap[i];
-          double f = floor(d);
-          double c = ceil(d);
-          double n = (d - f < c - d) ? f : c;
-          _point[i] = n * CTX::instance()->geom.snap[i];
+        if(!FlGui::instance()->elementaryContext->frozenPointCoord(i)){
+          _point[i] = p[i] + t * d[i];
+          if(CTX::instance()->geom.snap[i]){
+            double d = _point[i] / CTX::instance()->geom.snap[i];
+            double f = floor(d);
+            double c = ceil(d);
+            double n = (d - f < c - d) ? f : c;
+            _point[i] = n * CTX::instance()->geom.snap[i];
+          }
         }
       }
-      char str[32];
-      sprintf(str, "%g", _point[0]);
-      FlGui::instance()->elementaryContext->input[2]->value(str);
-      sprintf(str, "%g", _point[1]);
-      FlGui::instance()->elementaryContext->input[3]->value(str);
-      sprintf(str, "%g", _point[2]);
-      FlGui::instance()->elementaryContext->input[4]->value(str);
+      FlGui::instance()->elementaryContext->updatePoint(_point);
       redraw();
     }
     else{ // hover mode
-- 
GitLab