Mercurial > octave
changeset 21843:f7a57b07c81d
Overhaul uigetfile, uiputfile, __file_filter__ (bug #48183).
* uiputfile.m: Call __file_filter__ using "uiputfile" as caller arg.
Use strcmp to check for exact match for empty '.' extension.
* uigetfile.m: Simplify input validation by using strcmpi, and
getting rid of for loop. Call __file_filter__ using "uigetfile" as caller arg.
Use isempty() rather than checking for length() > 0. Echo unknown argument
in error message so user knows what it was.
* __file_filter__.m: Accept first input which is the function which called
__file_filter__. Use 'caller' in any error messages. Allow an empty input.
author | Rik <rik@octave.org> |
---|---|
date | Wed, 08 Jun 2016 21:30:49 -0700 |
parents | 7da4671f3a5b |
children | c0a552e71ceb |
files | scripts/gui/private/__file_filter__.m scripts/gui/uigetfile.m scripts/gui/uiputfile.m |
diffstat | 3 files changed, 40 insertions(+), 49 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/gui/private/__file_filter__.m Tue Jun 07 01:09:08 2016 -0500 +++ b/scripts/gui/private/__file_filter__.m Wed Jun 08 21:30:49 2016 -0700 @@ -17,22 +17,25 @@ ## <http://www.gnu.org/licenses/>. ## -*- texinfo -*- -## @deftypefn {} {} __file_filter__ (@var{file_filter}) +## @deftypefn {} {} __file_filter__ (@var{caller}, @var{file_filter}) ## Undocumented internal function. ## @end deftypefn ## Author: Kai Habel -function [retval, defname, defdir] = __file_filter__ (file_filter, name) +function [retval, defname, defdir] = __file_filter__ (caller, file_filter) + #keyboard; revtal = {}; defname = ""; defdir = ""; - if (iscell (file_filter)) + if (nargin == 1 || isempty (file_filter)) + ## Do nothing, and just add default pattern. + elseif (iscell (file_filter)) [r, c] = size (file_filter); if (c != 1 && c != 2) - error ("%s: invalid filter specification", name); + error ("%s: invalid filter specification", caller); endif if (c == 1) retval = cell (r, 2); @@ -53,12 +56,14 @@ if (! strcmp (fname, "*")) defname = [fname, fext]; endif - if ((length (fext) > 0) && (! strcmp (fext, ".*"))) + if (! isempty (fext)) fext = ["*" fext]; retval = {fext, __default_filtername__(fext)}; endif endif + ## Delete any "*.*" pattern, and add "* All Files" + retval(strcmp (retval(1,:), "*.*"), :) = []; retval(end+1,:) = {"*", __default_filtername__("*")}; endfunction
--- a/scripts/gui/uigetfile.m Tue Jun 07 01:09:08 2016 -0500 +++ b/scripts/gui/uigetfile.m Wed Jun 08 21:30:49 2016 -0700 @@ -81,44 +81,32 @@ pwd}; # Default directory idx1 = idx2 = []; - if (length (varargin) > 0) - for i = 1 : length (varargin) - val = varargin{i}; - if (ischar (val)) - val = tolower (val); - if (strcmp (val, "multiselect")) - idx1 = i; - elseif (strcmp (val, "position")) - idx2 = i; - endif - endif - endfor + has_opts = false; + if (nargin > 0) + idx1 = find (strcmpi (varargin, "multiselect"), 1); + idx2 = find (strcmpi (varargin, "position"), 1); + if (idx1 || idx2) + has_opts = true; + endif endif - stridx = [idx1, idx2, 0]; - if (length (stridx) > 1) - stridx = min (stridx(1 : end - 1)); - endif + optidx = min ([idx1, idx2, nargin+1]); + + args = varargin(1:optidx-1); - args = varargin; - if (stridx) - args = varargin(1 : stridx - 1); - endif - - len = length (args); + len = numel (args); if (len > 0) - file_filter = args{1}; - [outargs{1}, outargs{3}, defdir] = __file_filter__ (file_filter); - if (length (defdir) > 0) + [outargs{1}, outargs{3}, defdir] = __file_filter__ ("uigetfile", args{1}); + if (! isempty (defdir)) outargs{6} = defdir; endif else - outargs{1} = __file_filter__ (outargs{1}); + outargs{1} = __file_filter__ ("uigetfile", outargs{1}); endif if (len > 1) if (ischar (args{2})) - if (length (args{2}) > 0) + if (! isempty (args{2})) outargs{2} = args{2}; endif elseif (! isempty (args{2})) @@ -134,10 +122,10 @@ else [fdir, fname, fext] = fileparts (varargin{3}); endif - if (length (fdir) > 0) + if (! isempty (fdir)) outargs{6} = fdir; endif - if (length (fname) > 0 || length (fext) > 0) + if (! isempty (fname) || ! isempty (fext)) outargs{3} = [fname fext]; endif elseif (! isempty (args{3})) @@ -145,31 +133,29 @@ endif endif - if (stridx) + if (has_opts) ## string arguments ("position" or "multiselect") ## check for even number of remaining arguments, prop/value pair(s) - if (rem (nargin - stridx + 1, 2)) + if (rem (nargin - optidx + 1, 2)) error ("uigetfile: PROPERTY/VALUE arguments must occur in pairs"); endif - for i = stridx : 2 : nargin + for i = optidx : 2 : nargin prop = varargin{i}; val = varargin{i + 1}; if (strcmpi (prop, "position")) - if (isnumeric (val) && length (val) == 2) - outargs{4} = val; - else + if (! isnumeric (val) || length (val) != 2) error ('uigetfile: "Position" must be a 2-element vector'); endif + outargs{4} = val; elseif (strcmpi (prop, "multiselect")) - if (ischar (val)) - outargs{5} = tolower (val); - else + if (! ischar (val)) error ('uigetfile: MultiSelect value must be a string ("on"/"off")'); endif + outargs{5} = tolower (val); else - error ("uigetfile: unknown argument"); + error ("uigetfile: unknown argument '%s'", prop); endif endfor endif
--- a/scripts/gui/uiputfile.m Tue Jun 07 01:09:08 2016 -0500 +++ b/scripts/gui/uiputfile.m Wed Jun 08 21:30:49 2016 -0700 @@ -71,13 +71,13 @@ pwd}; # Default directory if (nargin > 0) - file_filter = varargin{1}; - [outargs{1}, outargs{3}, defdir] = __file_filter__ (file_filter); - if (length (defdir) > 0) + [outargs{1}, outargs{3}, defdir] = __file_filter__ ("uiputfile", + varargin{1}); + if (! isempty (defdir)) outargs{6} = defdir; endif else - outargs{1} = __file_filter__ (outargs{1}); + outargs{1} = __file_filter__ ("uiputfile", outargs{1}); endif if (nargin > 1) @@ -120,7 +120,7 @@ if (isempty (ext)) ext = outargs{1}{retindex}; ext = strrep (ext, "*", ""); - if (ext != '.') + if (! strcmp (ext, '.')) [~, ~, ext] = fileparts (ext); # paranoid checking of extension retfile = [retfile ext]; endif