changeset 30644:1aa0456ecb18

Fix legend key size for '.' marker (bug #61814) * legend.m (create_item): Add new property "markertruesize" to line object hmarker used to display marker in legend key. Change listener for "markersize" property on hmarker to pass additional argument of true to update_marker_cb(). Add new listener for property "marker" on hmarker which calls update_marker_cb() with a false argument. Add demo BIST for '.' markers. * legend.m (update_marker_cb): Change function prototype to take an argument (true/false) which indicates whether "markersize" or "marker" was updated. Declare persistent variable "is_updating" used to stop set() commands re-triggering calls. To the existing code which caps "markersize" at 8, add code that checks for '.' marker and enforces a cap of 24.
author Rik <rik@octave.org>
date Fri, 14 Jan 2022 08:31:07 -0800
parents 805c443ebf18
children 7677d53497c9
files scripts/plot/appearance/legend.m
diffstat 1 files changed, 55 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/scripts/plot/appearance/legend.m	Fri Jan 14 15:49:35 2022 +0100
+++ b/scripts/plot/appearance/legend.m	Fri Jan 14 08:31:07 2022 -0800
@@ -1091,6 +1091,7 @@
                              "pickableparts", "all", ...
                              "buttondownfcn", ...
                              {@execute_itemhit, hl, hplt, "icon"});
+      addproperty ("markertruesize", hmarker, "double", NaN);
       update_marker_cb (hmarker);
 
       ## Listeners
@@ -1102,7 +1103,8 @@
                    @(h, ~) set (hmarker, "xdata", get (h, "markerxdata")));
       addlistener (hicon, "visible", ...
                    @(h, ~) set (hmarker, "visible", get (h, "visible")));
-      addlistener (hmarker, "markersize", @update_marker_cb);
+      addlistener (hmarker, "markersize", {@update_marker_cb, true});
+      addlistener (hmarker, "marker", {@update_marker_cb, false});
       add_safe_listener (hl, hplt(1), "beingdeleted",
                          @(~, ~) delete ([hicon hmarker]))
       if (! strcmp (typ, "__errplot__"))
@@ -1246,10 +1248,47 @@
 
 endfunction
 
-function update_marker_cb (h, ~)
+## Enforce maximum size of marker so it doesn't overflow legend key
+function update_marker_cb (h, ~, sz_updated = true)
+  persistent is_updating = false;
+
+  if (is_updating)
+    return;
+  endif
+
+  if (sz_updated)
+    ## Size was changed
+    sz = get (h, "markersize");
+    set (h, "markertruesize", sz);  # store true marker size
+
+    if (sz > 8)
+      is_updating = true;
 
-  if (get (h, "markersize") > 8)
-    set (h, "markersize", 8);
+      mark = get (h, "marker");
+      if (strcmp (mark, '.'))
+        set (h, "markersize", min ([sz, 24]));
+      else
+        set (h, "markersize", 8);
+      endif
+
+      is_updating = false;
+    endif
+
+  else
+    ## Marker style was changed
+    sz = get (h, "markertruesize");
+    if (sz > 8)
+      is_updating = true;
+
+      mark = get (h, "marker");
+      if (strcmp (mark, '.'))
+        set (h, "markersize", min ([sz, 24]));
+      else
+        set (h, "markersize", 8);
+      endif
+
+      is_updating = false;
+    endif
   endif
 
 endfunction
@@ -2073,6 +2112,18 @@
 %! legend ("Legend Text");
 %! title ({"Multi-line", "titles", "are *not* a", "problem"});
 
+%!demo  # bug 61814
+%! clf;
+%! data = [ [1:5]' , [5:-1:1]', 2.5*ones(5,1) ];
+%! hp = plot (data);
+%! set (hp(1), "marker", 'x', "markersize", 15);
+%! set (hp(2), "marker", 'o', "markersize", 30);
+%! set (hp(3), "marker", '.', "markersize", 30);
+%! legend ({"data1", "data2", "data3"}, "location", "north");
+%! set (hp(2), "marker", '.');
+%! set (hp(3), "marker", 'o');
+%! title ("Marker sizes do not overflow legend box");
+
 ## Test input validation
 %!test
 %! hf = figure ("visible", "off");