Mercurial > hg > octave-lyh
diff scripts/plot/__fltk_ginput__.m @ 10517:9cdd6c8c05a4
[mq]: fltk_cb
author | Shai Ayal <shaiay@users.sourceforge.net> |
---|---|
date | Tue, 13 Apr 2010 20:26:08 +0300 |
parents | |
children | 8b9aeb20c03c |
line wrap: on
line diff
new file mode 100644 --- /dev/null +++ b/scripts/plot/__fltk_ginput__.m @@ -0,0 +1,92 @@ +## Copyright (C) 2010 Shai Ayal +## +## 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/>. + +## -*- texinfo -*- +## @deftypefn {Function File} {[@var{x}, @var{y}, @var{buttons}] =} __fltk_ginput__ (@var{f}, @var{n}) +## Undocumented internal function. +## @end deftypefn + +## This is ginput.m implementation for fltk. + +function [x, y, button] = __fltk_ginput__ (f, n = -1) + + if (isempty (get (f, "currentaxes"))) + error ("ginput: must have at least one axes"); + endif + + x = []; + y = []; + button = []; + ginput_aggregator (0, 0, 0); + + unwind_protect + + orig_windowbuttondownfcn = get (f, "windowbuttondownfcn"); + set (f, "windowbuttondownfcn", @ginput_windowbuttondownfcn); + + orig_ginput_keypressfcn = get (f, "keypressfcn"); + set (f, "keypressfcn", @ginput_keypressfcn); + + while (true) + __fltk_redraw__ (); + + ## release CPU + sleep (0.01); + + [x, y, n0] = ginput_aggregator (-1, 0, 0); + if (n0 == n | n0 < 0) + break; + endif + endwhile + + ## FIXME -- got to get the buttons somehow + button = ones (size (x)); + unwind_protect_cleanup + set (f, "windowbuttondownfcn", orig_windowbuttondownfcn); + set (f, "keypressfcn", orig_ginput_keypressfcn); + end_unwind_protect + +endfunction + +function [x, y, n] = ginput_aggregator (mode , xn, yn) + persistent x y n + + if (mode == 0), + x = []; + y = []; + n = 0; + elseif (mode == 1) + x = [x, xn]; + y = [y, yn]; + n += 1; + elseif (mode == 2) + n = -1 + endif +endfunction + +function ginput_windowbuttondownfcn (src, data) + point = get (get (src,"currentaxes"), "currentpoint"); + ginput_aggregator (1, point(1,1), point(2,1)); +endfunction + +function ginput_keypressfcn (src, evt) + if (evt.Key == 10) + ginput_aggregator (2, 0, 0) + endif +endfunction +