diff src/gl-render.cc @ 11385:71e7467fbd34

Disable auto-positioning of manually positioned title and axes labels.
author Konstantinos Poulios <logari81@googlemail.com>
date Fri, 17 Dec 2010 21:23:52 +0100
parents be710ed252ff
children 2be9e22796d2
line wrap: on
line diff
--- a/src/gl-render.cc
+++ b/src/gl-render.cc
@@ -1089,38 +1089,55 @@
 
       xlabel_props.set_visible ("on");
 
-      // FIXME: auto-positioning should be disabled if the 
-      //        label has been positioned manually
       if (! xlabel_props.get_string ().empty ())
         {
-          xlabel_props.set_horizontalalignment (xstate > AXE_DEPTH_DIR ? "center" : (xySym ? "left" : "right"));
-          xlabel_props.set_verticalalignment (xstate == AXE_VERT_DIR ? "bottom" : (zd*zv(2) <= 0 ? "top" : "bottom"));
-
-          double angle = 0;
-          ColumnVector p = graphics_xform::xform_vector ((x_min+x_max)/2, yPlaneN, zPlane);
-
-          if (tick_along_z)
-            p(2) += (signum(zPlane-zPlaneN)*fz*xtickoffset);
-          else
-            p(1) += (signum(yPlaneN-yPlane)*fy*xtickoffset);
-          p = xform.transform (p(0), p(1), p(2), false);
-          switch (xstate)
+          if (xlabel_props.horizontalalignmentmode_is("auto"))
+            {
+              xlabel_props.set_horizontalalignment (xstate > AXE_DEPTH_DIR ? "center" : (xySym ? "left" : "right"));
+              xlabel_props.set_horizontalalignmentmode("auto");
+            }
+          if (xlabel_props.verticalalignmentmode_is("auto"))
+            {
+              xlabel_props.set_verticalalignment (xstate == AXE_VERT_DIR ? "bottom" : (zd*zv(2) <= 0 ? "top" : "bottom"));
+              xlabel_props.set_verticalalignmentmode("auto");
+            }
+
+          if (xlabel_props.positionmode_is("auto") || xlabel_props.rotationmode_is("auto"))
             {
-              case AXE_ANY_DIR:
-                p(0) += (xySym ? wmax : -wmax);
-                p(1) += (zd*zv(2) <= 0 ? hmax : -hmax);
-                break;
-              case AXE_VERT_DIR:
-                p(0) -= wmax;
-                angle = 90;
-                break;
-              case AXE_HORZ_DIR:
-                p(1) += hmax;
-                break;
+              double angle = 0;
+              ColumnVector p = graphics_xform::xform_vector ((x_min+x_max)/2, yPlaneN, zPlane);
+
+              if (tick_along_z)
+                p(2) += (signum(zPlane-zPlaneN)*fz*xtickoffset);
+              else
+                p(1) += (signum(yPlaneN-yPlane)*fy*xtickoffset);
+              p = xform.transform (p(0), p(1), p(2), false);
+              switch (xstate)
+                {
+                  case AXE_ANY_DIR:
+                    p(0) += (xySym ? wmax : -wmax);
+                    p(1) += (zd*zv(2) <= 0 ? hmax : -hmax);
+                    break;
+                  case AXE_VERT_DIR:
+                    p(0) -= wmax;
+                    angle = 90;
+                    break;
+                  case AXE_HORZ_DIR:
+                    p(1) += hmax;
+                    break;
+                }
+              if (xlabel_props.positionmode_is("auto"))
+                {
+                  p = xform.untransform (p(0), p(1), p(2), true);
+                  xlabel_props.set_position (p.extract_n (0, 3).transpose ());
+                  xlabel_props.set_positionmode ("auto");
+	        }
+              if (xlabel_props.rotationmode_is("auto"))
+                {
+                  xlabel_props.set_rotation (angle);
+                  xlabel_props.set_rotationmode ("auto");
+	        }
             }
-          p = xform.untransform (p(0), p(1), p(2), true);
-          xlabel_props.set_position (p.extract_n (0, 3).transpose ());
-          xlabel_props.set_rotation (angle);
         }
     }
   else
@@ -1322,38 +1339,55 @@
 
       ylabel_props.set_visible ("on");
 
-      // FIXME: auto-positioning should be disabled if the 
-      //        label has been positioned manually
       if (! ylabel_props.get_string ().empty ())
         {
-          ylabel_props.set_horizontalalignment (ystate > AXE_DEPTH_DIR ? "center" : (!xySym ? "left" : "right"));
-          ylabel_props.set_verticalalignment (ystate == AXE_VERT_DIR ? "bottom" : (zd*zv(2) <= 0 ? "top" : "bottom"));
-
-          double angle = 0;
-          ColumnVector p = graphics_xform::xform_vector (xPlaneN, (y_min+y_max)/2, zPlane);
-
-          if (tick_along_z)
-            p(2) += (signum(zPlane-zPlaneN)*fz*ytickoffset);
-          else
-            p(0) += (signum(xPlaneN-xPlane)*fx*ytickoffset);
-          p = xform.transform (p(0), p(1), p(2), false);
-          switch (ystate)
+          if (ylabel_props.horizontalalignmentmode_is("auto"))
+            {
+              ylabel_props.set_horizontalalignment (ystate > AXE_DEPTH_DIR ? "center" : (!xySym ? "left" : "right"));
+              ylabel_props.set_horizontalalignmentmode("auto");
+            }
+          if (ylabel_props.verticalalignmentmode_is("auto"))
+            {
+              ylabel_props.set_verticalalignment (ystate == AXE_VERT_DIR ? "bottom" : (zd*zv(2) <= 0 ? "top" : "bottom"));
+              ylabel_props.set_verticalalignmentmode("auto");
+            }
+
+          if (ylabel_props.positionmode_is("auto") || ylabel_props.rotationmode_is("auto"))
             {
-              case AXE_ANY_DIR:
-                p(0) += (!xySym ? wmax : -wmax);
-                p(1) += (zd*zv(2) <= 0 ? hmax : -hmax);
-                break;
-              case AXE_VERT_DIR:
-                p(0) -= wmax;
-                angle = 90;
-                break;
-              case AXE_HORZ_DIR:
-                p(1) += hmax;
-                break;
+              double angle = 0;
+              ColumnVector p = graphics_xform::xform_vector (xPlaneN, (y_min+y_max)/2, zPlane);
+
+              if (tick_along_z)
+                p(2) += (signum(zPlane-zPlaneN)*fz*ytickoffset);
+              else
+                p(0) += (signum(xPlaneN-xPlane)*fx*ytickoffset);
+              p = xform.transform (p(0), p(1), p(2), false);
+              switch (ystate)
+                {
+                  case AXE_ANY_DIR:
+                    p(0) += (!xySym ? wmax : -wmax);
+                    p(1) += (zd*zv(2) <= 0 ? hmax : -hmax);
+                    break;
+                  case AXE_VERT_DIR:
+                    p(0) -= wmax;
+                    angle = 90;
+                    break;
+                  case AXE_HORZ_DIR:
+                    p(1) += hmax;
+                    break;
+                }
+              if (ylabel_props.positionmode_is("auto"))
+                {
+                  p = xform.untransform (p(0), p(1), p(2), true);
+                  ylabel_props.set_position (p.extract_n (0, 3).transpose ());
+                  ylabel_props.set_positionmode ("auto");
+	        }
+              if (ylabel_props.rotationmode_is("auto"))
+                {
+                  ylabel_props.set_rotation (angle);
+                  ylabel_props.set_rotationmode ("auto");
+	        }
             }
-          p = xform.untransform(p(0), p(1), p(2), true);
-          ylabel_props.set_position (p.extract_n (0, 3).transpose ());
-          ylabel_props.set_rotation (angle);
         }
     }
   else
@@ -1624,59 +1658,76 @@
 
       zlabel_props.set_visible ("on");
 
-      // FIXME: auto-positioning should be disabled if the 
-      //        label has been positioned manually
       if (! zlabel_props.get_string ().empty ())
         {
           bool camAuto = props.cameraupvectormode_is ("auto");
 
-          zlabel_props.set_horizontalalignment ((zstate > AXE_DEPTH_DIR || camAuto) ? "center" : "right");
-          zlabel_props.set_verticalalignment(zstate == AXE_VERT_DIR ? "bottom" : ((zd*zv(2) < 0 || camAuto) ? "bottom" : "top"));
-
-          double angle = 0;
-          ColumnVector p;
-
-          if (xySym)
+          if (zlabel_props.horizontalalignmentmode_is("auto"))
             {
-              p = graphics_xform::xform_vector (xPlaneN, yPlane, (z_min+z_max)/2);
-              if (xisinf (fy))
-                p(0) += (signum(xPlaneN-xPlane)*fx*ztickoffset);
-              else
-                p(1) += (signum(yPlane-yPlaneN)*fy*ztickoffset);
+              zlabel_props.set_horizontalalignment ((zstate > AXE_DEPTH_DIR || camAuto) ? "center" : "right");
+              zlabel_props.set_horizontalalignmentmode("auto");
+            }
+          if (zlabel_props.verticalalignmentmode_is("auto"))
+            {
+              zlabel_props.set_verticalalignment(zstate == AXE_VERT_DIR ? "bottom" : ((zd*zv(2) < 0 || camAuto) ? "bottom" : "top"));
+              zlabel_props.set_verticalalignmentmode("auto");
             }
-          else
+
+          if (zlabel_props.positionmode_is("auto") || zlabel_props.rotationmode_is("auto"))
             {
-              p = graphics_xform::xform_vector (xPlane, yPlaneN, (z_min+z_max)/2);
-              if (xisinf (fx))
-                p(1) += (signum(yPlaneN-yPlane)*fy*ztickoffset);
+              double angle = 0;
+              ColumnVector p;
+
+              if (xySym)
+                {
+                  p = graphics_xform::xform_vector (xPlaneN, yPlane, (z_min+z_max)/2);
+                  if (xisinf (fy))
+                    p(0) += (signum(xPlaneN-xPlane)*fx*ztickoffset);
+                  else
+                    p(1) += (signum(yPlane-yPlaneN)*fy*ztickoffset);
+                }
               else
-                p(0) += (signum(xPlane-xPlaneN)*fx*ztickoffset);
-            }
-          p = xform.transform (p(0), p(1), p(2), false);
-          switch (zstate)
-            {
-              case AXE_ANY_DIR:
-                if (camAuto)
-                  {
+                {
+                  p = graphics_xform::xform_vector (xPlane, yPlaneN, (z_min+z_max)/2);
+                  if (xisinf (fx))
+                    p(1) += (signum(yPlaneN-yPlane)*fy*ztickoffset);
+                  else
+                    p(0) += (signum(xPlane-xPlaneN)*fx*ztickoffset);
+                }
+              p = xform.transform (p(0), p(1), p(2), false);
+              switch (zstate)
+                {
+                  case AXE_ANY_DIR:
+                    if (camAuto)
+                      {
+                        p(0) -= wmax;
+                        angle = 90;
+                      }
+                    /* FIXME: what's the correct offset?
+                       p[0] += (!xySym ? wmax : -wmax);
+                       p[1] += (zd*zv[2] <= 0 ? hmax : -hmax);
+                       */
+                    break;
+                  case AXE_VERT_DIR:
                     p(0) -= wmax;
                     angle = 90;
-                  }
-                /* FIXME: what's the correct offset?
-                   p[0] += (!xySym ? wmax : -wmax);
-                   p[1] += (zd*zv[2] <= 0 ? hmax : -hmax);
-                   */
-                break;
-              case AXE_VERT_DIR:
-                p(0) -= wmax;
-                angle = 90;
-                break;
-              case AXE_HORZ_DIR:
-                p(1) += hmax;
-                break;
+                    break;
+                  case AXE_HORZ_DIR:
+                    p(1) += hmax;
+                    break;
+                }
+              if (zlabel_props.positionmode_is("auto"))
+                {
+                  p = xform.untransform (p(0), p(1), p(2), true);
+                  zlabel_props.set_position (p.extract_n (0, 3).transpose ());
+                  zlabel_props.set_positionmode ("auto");
+	        }
+              if (zlabel_props.rotationmode_is("auto"))
+                {
+                  zlabel_props.set_rotation (angle);
+                  zlabel_props.set_rotationmode ("auto");
+	        }
             }
-          p = xform.untransform (p(0), p(1), p(2), true);
-          zlabel_props.set_position (p.extract_n (0, 3).transpose ());
-          zlabel_props.set_rotation (angle);
         }
     }
   else
@@ -1691,9 +1742,7 @@
   text::properties& title_props =
     reinterpret_cast<text::properties&> (gh_manager::get_object (props.get_title ()).get_properties ());
       
-  // FIXME: auto-positioning should be disabled if the 
-  //        title has been positioned manually
-  if (! title_props.get_string ().empty ())
+  if (! title_props.get_string ().empty () && title_props.positionmode_is("auto"))
     {
       Matrix bb = props.get_boundingbox (true);
       ColumnVector p = xform.untransform (bb(0)+bb(2)/2, (bb(1)-10),