Mercurial > hg > octave-lojdl
changeset 12263:c626741871a0 release-3-4-x
Allow ui file function to work if gnuplot is the selected toolkit and fltk is available
author | Kai Habel <kai.habel@gmx.de> |
---|---|
date | Thu, 27 Jan 2011 17:58:19 +0100 |
parents | b22c00315df5 |
children | 9086df10c460 |
files | scripts/ChangeLog scripts/plot/uigetdir.m scripts/plot/uigetfile.m scripts/plot/uiputfile.m src/ChangeLog src/DLD-FUNCTIONS/__fltk_uigetfile__.cc src/DLD-FUNCTIONS/__init_fltk__.cc src/DLD-FUNCTIONS/module-files |
diffstat | 8 files changed, 144 insertions(+), 102 deletions(-) [+] |
line wrap: on
line diff
--- a/scripts/ChangeLog +++ b/scripts/ChangeLog @@ -1,3 +1,8 @@ +2011-01-27 Kai Habel <kai.habel@gmx.de> + + * plot/uigetfile.m, plot/uiputfile.m, plot/uigetdir.m: Check + for __fltk_uigetfile__. + 2011-01-27 John W. Eaton <jwe@octave.org> * Makefile.am (check-missing-semicolon): New rule.
--- a/scripts/plot/uigetdir.m +++ b/scripts/plot/uigetdir.m @@ -33,11 +33,11 @@ print_usage (); endif - if (!ischar(init_path) || !ischar(dialog_name)) + if (!ischar (init_path) || !ischar (dialog_name)) error ("uigetdir: INIT_PATH and DIALOG_NAME must be string arguments"); endif - if (any (strcmp (available_graphics_toolkits (), "fltk"))) + if (exist ("__fltk_uigetfile__") == 3) if (!isdir (init_path)) init_path = fileparts (init_path); endif
--- a/scripts/plot/uigetfile.m +++ b/scripts/plot/uigetfile.m @@ -150,7 +150,7 @@ error ("uigetfile: number of input arguments must be less than eight"); endif - if (any (cellfun(@(x)strcmp (x, "fltk"), available_graphics_toolkits ()))) + if (exist("__fltk_uigetfile__") == 3) [retfile, retpath, retindex] = __fltk_uigetfile__ (outargs{:}); else error ("uigetfile: fltk graphics toolkit required");
--- a/scripts/plot/uiputfile.m +++ b/scripts/plot/uiputfile.m @@ -88,7 +88,7 @@ error ("uiputfile: number of input arguments must be less than four"); endif - if (any (cellfun(@(x)strcmp (x, "fltk"), available_graphics_toolkits ()))) + if (exist("__fltk_uigetfile__") == 3) [retfile, retpath, retindex] = __fltk_uigetfile__ (outargs{:}); else error ("uiputfile: fltk graphics toolkit required");
--- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2011-01-27 Kai Habel <kai.habel@gmx.de> + + * DLD-FUNCTIONS/__init_fltk__.cc (__fltk_uigetfile__): Remove here. + * DLD-FUNCTIONS/__fltk_uigetfile__.cc: New file. + * DLD-FUNCTIONS/module-files: Add __fltk_uigetfile__.cc. + Bug #32190. + 2011-01-27 John W. Eaton <jwe@octave.org> * DLD-FUNCTIONS/dlmread.cc (Fdlmread): Skip leading whitespace
new file mode 100644 --- /dev/null +++ b/src/DLD-FUNCTIONS/__fltk_uigetfile__.cc @@ -0,0 +1,127 @@ +/* + +Copyright (C) 2010-2011 Kai Habel + +This file is part of Octave. + +Octave is free software; you can redistribute it and/or modify it +under the terms of the GNU General Public License as published by the +Free Software Foundation; either version 3 of the License, or (at your +option) any later version. + +Octave is distributed in the hope that it will be useful, but WITHOUT +ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License +for more details. + +You should have received a copy of the GNU General Public License +along with Octave; see the file COPYING. If not, see +<http://www.gnu.org/licenses/>. + +*/ + +#ifdef HAVE_CONFIG_H +#include <config.h> +#endif + +#if defined (HAVE_FLTK) + +#include <FL/Fl.H> +#include <Fl/Fl_File_Chooser.H> +#include "defun-dld.h" +#include "file-ops.h" + + +DEFUN_DLD (__fltk_uigetfile__, args, , + "-*- texinfo -*-\n\ +@deftypefn {Built-in Function} {} __fltk_uigetfile__ (@dots{})\n\ +Undocumented internal function.\n\ +@end deftypefn") +{ + + // Expected argument list + // args(0) ... FileFilter in fltk format + // args(1) ... Title + // args(2) ... Default Filename + // args(3) ... PostionValue [x,y] + // args(4) ... SelectValue "on"/"off"/"dir"/"create" + + octave_value_list fargs, retval; + + std::string file_filter = args(0).string_value(); + std::string title = args(1).string_value(); + std::string default_name = args(2).string_value(); + Matrix pos = args(3).matrix_value(); + + int multi_type = Fl_File_Chooser::SINGLE; + std::string flabel = "Filename:"; + + std::string multi = args(4).string_value(); + if (multi == "on") + multi_type = Fl_File_Chooser::MULTI; + else if (multi == "dir") + { + multi_type = Fl_File_Chooser::DIRECTORY; + flabel = "Directory:"; + } + else if (multi == "create") + multi_type = Fl_File_Chooser::CREATE; + + Fl_File_Chooser::filename_label = flabel.c_str (); + Fl_File_Chooser *fc = new Fl_File_Chooser (default_name.c_str (), file_filter.c_str (), multi_type, title.c_str ()); + fc->preview (0); + + if (multi_type == Fl_File_Chooser::CREATE) + fc->ok_label ("Save"); + + fc->show (); + + while (fc->shown ()) + Fl::wait (); + + retval(0) = octave_value(0); + retval(1) = octave_value(0); + retval(2) = octave_value(0); + + if (fc->value()) + { + int file_count = fc->count (); + std::string fname; + std::string sep = file_ops::dir_sep_str (); + std::size_t idx; + + if (file_count == 1 && multi_type != Fl_File_Chooser::DIRECTORY) + { + fname = fc->value (); + idx = fname.find_last_of (sep); + retval(0) = fname.substr (idx + 1); + } + else + { + Cell file_cell = Cell(file_count, 1); + for (octave_idx_type n = 1; n <= file_count; n++) + { + fname = fc->value (n); + idx = fname.find_last_of (sep); + file_cell(n - 1) = fname.substr (idx + 1); + } + retval(0) = file_cell; + } + + if (multi_type == Fl_File_Chooser::DIRECTORY) + retval(0) = std::string (fc->value ()); + else + { + retval(1) = std::string (fc->directory ()) + sep; + retval(2) = fc->filter_value (); + } + } + + fc->hide (); + Fl::flush (); + delete fc; + + return retval; +} + +#endif
--- a/src/DLD-FUNCTIONS/__init_fltk__.cc +++ b/src/DLD-FUNCTIONS/__init_fltk__.cc @@ -2036,103 +2036,5 @@ return octave_value(mode_str); } -DEFUN_DLD (__fltk_uigetfile__, args, , - "-*- texinfo -*-\n\ -@deftypefn {Built-in Function} {} __fltk_uigetfile__ (@dots{})\n\ -Undocumented internal function.\n\ -@end deftypefn") -{ - // This function should be called by uigetfile.m - // Error checking should be done in uigetfile.m! - // - // Expected argument list - // args(0) ... FileFilter in fltk format - // args(1) ... Title - // args(2) ... Default Filename - // args(3) ... PostionValue [x,y] - // args(4) ... SelectValue "on"/"off"/"dir"/"create" - - std::string file_filter, title, default_name, multi; - if (args(0).is_string ()) - file_filter = args(0).string_value(); - - if (args(1).is_string ()) - title = args(1).string_value(); - - if (args(2).is_string ()) - default_name = args(2).string_value(); - - if (args(3).is_real_matrix ()) - Matrix pos = args(3).matrix_value(); - - int multi_type = Fl_File_Chooser::SINGLE; - std::string flabel = "Filename:"; - if (args(4).is_string ()) - { - multi = args(4).string_value(); - if (multi == "on") - multi_type = Fl_File_Chooser::MULTI; - else if (multi == "dir") - { - multi_type = Fl_File_Chooser::DIRECTORY; - flabel = "Directory:"; - } - else if (multi == "create") - multi_type = Fl_File_Chooser::CREATE; - } - - Fl_File_Chooser::filename_label = flabel.c_str (); - Fl_File_Chooser *fc = new Fl_File_Chooser(default_name.c_str (), file_filter.c_str (), multi_type, title.c_str ()); - fc->preview(0); - - if (multi_type == Fl_File_Chooser::CREATE) - fc->ok_label("Save"); - - fc->show(); - while (fc->shown ()) - { Fl::wait (); } - - octave_value_list fargs, retval; - - retval(0) = octave_value(0); - retval(1) = octave_value(0); - retval(2) = octave_value(0); - - if (fc->value() != NULL) - { - int file_count = fc->count (); - std::string fname; - std::string sep = file_ops::dir_sep_str (); - std::size_t idx; - - if ((file_count == 1) && (multi_type != Fl_File_Chooser::DIRECTORY)) - { - fname = fc->value (); - idx = fname.find_last_of(sep); - retval(0) = fname.substr(idx + 1); - } - else - { - Cell file_cell = Cell(file_count, 1); - for (octave_idx_type n = 1; n <= file_count; n++) - { - fname = fc->value (n); - idx = fname.find_last_of(sep); - file_cell(n - 1) = fname.substr(idx + 1); - } - retval(0) = file_cell; - } - - if (multi_type == Fl_File_Chooser::DIRECTORY) - retval(0) = std::string(fc->value ()); - else - { - retval(1) = std::string(fc->directory ()) + sep; - retval(2) = fc->filter_value(); - } - } - - return retval; -} #endif