* Bug 13592 fixed: legend() set by hand in frame was shifted wrt mouse 99/19199/4
Samuel GOUGEON [Sat, 18 Mar 2017 21:38:45 +0000 (22:38 +0100)]
Change-Id: Ifc3abfc3df3e115862ba91533323fc8a369f7d9e

scilab/CHANGES.md
scilab/modules/graphics/macros/legend.sci
scilab/modules/graphics/tests/nonreg_tests/bug_13592.tst [new file with mode: 0644]

index cacebe4..c4a3d4f 100644 (file)
@@ -346,6 +346,7 @@ the [development mailing list](dev@lists.scilab.org) for a particular toolbox.
 * [#4276](http://bugzilla.scilab.org/show_bug.cgi?id=4276): `strsubst` replaced the first occurence in regex mode.
 * [#5278](http://bugzilla.scilab.org/show_bug.cgi?id=5278): obsolete `xset()` was still used in scripts, macros, tests and help pages.
 * [#12771](http://bugzilla.scilab.org/show_bug.cgi?id=12771): xcosPalGenerateAllIcons help example was broken
+* [#13592](http://bugzilla.scilab.org/show_bug.cgi?id=13592): In an axes in a uicontrol frame, setting a `legend` interactively might not follow the mouse accurately.
 * [#14636](http://bugzilla.scilab.org/show_bug.cgi?id=14636): Xcos model with modelica electrical blocks (created in 5.5.2) crashed Scilab 6.
 * [#14637](http://bugzilla.scilab.org/show_bug.cgi?id=14367): Some Scilab 5.5.2 diagrams didn't simulate properly in Xcos.
 * [#14886](http://bugzilla.scilab.org/show_bug.cgi?id=14886): Matplot save/load failed.
index 5390f0c..badd18f 100644 (file)
@@ -1,6 +1,7 @@
 // Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
 // Copyright (C) 2007-2010 - INRIA - Serge Steer <serge.steer@inria.fr>
 // Copyright (C) 2012 - 2016 - Scilab Enterprises
+// Copyright (C) 2017 - Samuel GOUGEON
 //
 // This file is hereby licensed under the terms of the GNU GPL v2.0,
 // pursuant to article 5.3.4 of the CeCILL v.2.1.
@@ -130,7 +131,17 @@ function c=legend(varargin)
         else
             if vis_on then drawnow(); end    // draw if figure status allows it (otherwise standby)
             bnds=get(gca(),"axes_bounds");
-            as=get(gcf(),"axes_size");
+            as = get(gcf(),"axes_size");
+            tmp = c.parent.parent   // Figure | uicontrol (frame)
+            if tmp.type=="uicontrol"  // frame
+                asf = tmp.position(3:4)
+                if tmp.units=="normalized"
+                    as = as .* asf
+                else
+                    // pixels ('points' not implemented: scale point/pixel unknown)
+                    as = asf
+                end
+            end
             while %t
                 rep=xgetmouse()
                 if rep(3)<> -1 then break,end
diff --git a/scilab/modules/graphics/tests/nonreg_tests/bug_13592.tst b/scilab/modules/graphics/tests/nonreg_tests/bug_13592.tst
new file mode 100644 (file)
index 0000000..da5ce80
--- /dev/null
@@ -0,0 +1,42 @@
+// =============================================================================
+// Scilab ( http://www.scilab.org/ ) - This file is part of Scilab
+// Copyright (C) 2017 - Samuel GOUGEON
+//
+//  This file is distributed under the same license as the Scilab package.
+// =============================================================================
+
+// <-- TEST WITH GRAPHIC -->
+// <-- INTERACTIVE TEST -->
+
+// <-- Non-regression test for bug 13592 -->
+//
+// <-- Bugzilla URL -->
+// http://bugzilla.scilab.org/13592
+//
+// <-- Short Description -->
+// When interactively setting a legend() in an axes embedded in a uicontrol frame,
+// a varying shift could exist between the mouse position and the block of legends
+
+fig = scf();
+drawlater
+fig.axes_size = [990,670];
+fig.layout = "border";
+f = uicontrol(fig, "style", "frame", ...
+    "layout", "gridbag");
+
+f1 = uicontrol(f, "style", "frame", ...
+    "layout", "gridbag", ...
+    "margins", [2,10,4,10], ...
+    "constraints", createConstraints("gridbag", [1 1 1 1], [0.5 1], "both", "left"));
+
+f2 = uicontrol(f, "style", "frame", ...
+    "layout", "gridbag", ...
+    "constraints", createConstraints("gridbag", [2 1 1 1], [0.5 1], "both", "left"));
+
+a21 = newaxes(f2);
+t = linspace(0,%pi,20);
+plot2d("ll",t+0.1,1.01+[cos(t'),cos(2*t'),cos(3*t')],[-5,2 3]);
+drawnow
+legend(['cos(t)';'cos(2*t)';'cos(3*t)'], 5);
+// Here: the upper left corner of the block of legends must follow accurately
+// the mouse pointer over the whole frame area.