# HG changeset patch # User Rik # Date 1399431464 25200 # Node ID adb948d7fae4a3ef4d3d5fe340e1bfb7b44d9b77 # Parent 65f19ac3cd1bace5fd80a27d0e0489391e7feb01 legend.m: Don't create legend for some inputs for Matlab compatibility (bug #42034) * legend.m: Don't create legend for 'boxon', 'boxoff', 'hide', and null input. Do create legend if just a location or orientation is passed in. diff -r 65f19ac3cd1b -r adb948d7fae4 scripts/plot/appearance/legend.m --- a/scripts/plot/appearance/legend.m Mon May 05 13:14:17 2014 -0700 +++ b/scripts/plot/appearance/legend.m Tue May 06 19:57:44 2014 -0700 @@ -166,11 +166,27 @@ nargs = numel (varargin); nkids = numel (kids); + ## Find any existing legend object on figure + hlegend = []; + fkids = get (fig, "children"); + for i = 1 : numel (fkids) + if ( strcmp (get (fkids(i), "type"), "axes") + && strcmp (get (fkids(i), "tag"), "legend")) + udata = get (fkids(i), "userdata"); + if (any (udata.handle == ca)) + hlegend = fkids(i); + break; + endif + endif + endfor + orientation = "default"; location = "default"; show = "create"; textpos = "default"; box = "default"; + delete_leg = false; + find_leg_hdl = (nargs == 0); ## Process old way of specifying location with a number rather than a string. if (nargs > 0) @@ -229,20 +245,6 @@ error ("legend: unrecognized legend location"); endswitch - ## Find any existing legend object on figure - hlegend = []; - fkids = get (fig, "children"); - for i = 1 : numel (fkids) - if ( strcmp (get (fkids(i), "type"), "axes") - && strcmp (get (fkids(i), "tag"), "legend")) - udata = get (fkids(i), "userdata"); - if (any (udata.handle == ca)) - hlegend = fkids(i); - break; - endif - endif - endfor - if (nargs == 1) arg = varargin{1}; if (ischar (arg)) @@ -250,8 +252,7 @@ str = tolower (strtrim (arg)); switch (str) case "off" - delete (hlegend); - return; + delete_leg = true; case "hide" show = "off"; nargs--; @@ -305,24 +306,26 @@ endif have_labels = (nargs > 0); + hobjects = []; + hplots = []; + text_strings = {}; - if (strcmp (show, "off")) + if (delete_leg) + delete (hlegend); + hlegend = []; + elseif (find_leg_hdl) + ## Don't change anything about legend. + ## hleg output will be assigned hlegend value at end of function. + elseif (strcmp (show, "off")) if (! isempty (hlegend)) set (findobj (hlegend), "visible", "off"); hlegend = []; endif - hobjects = []; - hplots = []; - text_strings = {}; elseif (strcmp (show, "on")) if (! isempty (hlegend)) set (findobj (hlegend), "visible", "on"); - ## NOTE - Matlab sets both "visible", and "box" to "on" + ## NOTE: Matlab sets both "visible" and "box" to "on" set (hlegend, "visible", get (hlegend, "box")); - else - hobjects = []; - hplots = []; - text_strings = {}; endif elseif (strcmp (box, "on")) if (! isempty (hlegend)) @@ -332,26 +335,24 @@ if (! isempty (hlegend)) set (hlegend, "box", "off", "visible", "off"); endif - elseif (! have_labels && ! (strcmp (location, "default") && - strcmp (orientation, "default"))) + elseif (! have_labels && ! isempty (hlegend) + && ! (strcmp (location, "default") && strcmp (orientation, "default"))) ## Changing location or orientation of existing legend - if (! isempty (hlegend)) - if (strcmp (location, "default")) - set (hlegend, "orientation", orientation); - elseif (strcmp (orientation, "default")) - if (outside) - set (hlegend, "location", [location "outside"]); - else - set (hlegend, "location", location); - endif + if (strcmp (location, "default")) + set (hlegend, "orientation", orientation); + elseif (strcmp (orientation, "default")) + if (outside) + set (hlegend, "location", [location "outside"]); else - if (outside) - set (hlegend, "location", [location "outside"], - "orientation", orientation); - else - set (hlegend, "location", location, - "orientation", orientation); - endif + set (hlegend, "location", location); + endif + else + if (outside) + set (hlegend, "location", [location "outside"], + "orientation", orientation); + else + set (hlegend, "location", location, + "orientation", orientation); endif endif else @@ -1253,8 +1254,8 @@ %!demo %! clf; %! plot (rand (3)); -%! title ('legend() without inputs creates default labels'); -%! h = legend (); +%! title ('legend("show") without inputs creates default labels'); +%! h = legend ('show'); %!demo %! clf;