# HG changeset patch # User Rik # Date 1642177867 28800 # Node ID 1aa0456ecb18c88e8839dec04913227a2b894c8b # Parent 805c443ebf18307a4db5a723e6022f26de33a966 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. diff -r 805c443ebf18 -r 1aa0456ecb18 scripts/plot/appearance/legend.m --- 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");