view scripts/plot/private/__actual_axis_position__.m @ 17096:33037eddecd2

Overhaul colorbar function. Colorbar now accepts an input colorbar handle or an input axis and will act appropriately. Updated docstring. Added Matlab compatible options "hide" and "delete". Stopped random failures by deleting all listeners when cbar is deleted. Added listener to monitor SIZE of colormap. Cleaned up coding style. Used less vague internal variable name __cbar_hax__ instead of __my_handle__ for out-of-band communication with __actual_axis_position__.m. * scripts/plot/colorbar.m: Colorbar now accepts an input colorbar handle or an input axis and will act appropriately. Updated docstring. Added Matlab compatible options "hide" and "delete". Stopped random failures by deleting all listeners when cbar is deleted. Added listener to monitor SIZE of colormap. Cleaned up coding style. Used less vague internal variable name __cbar_hax__ instead of __my_handle__ for out-of-band communication with __actual_axis_position__.m. * scripts/plot/private/__actual_axis_position__.m: Rename __my_handle__ to __cbar_hax__ for clarity.
author Rik <rik@octave.org>
date Fri, 26 Jul 2013 13:15:07 -0700
parents 72c96de7a403
children abf384f5d243
line wrap: on
line source

## Copyright (C) 2009-2012 Ben Abbott
##
## 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} {} __actual_axis_position__ (@var{h})
## @deftypefnx {Function File} {} __actual_axis_position__ (@var{axis_struct})
## Undocumented internal function.
## @end deftypefn

## Author: Ben Abbott

function pos = __actual_axis_position__ (h)

  if (ishandle (h))
    axis_obj = get (h);
  elseif (isstruct (h))
    axis_obj = h;
    h = axis_obj.__cbar_hax__;
  endif

  ## Get figure size in pixels
  orig_fig_units = get (axis_obj.parent, "units");
  orig_fig_position = get (axis_obj.parent, "position");
  unwind_protect
    set (axis_obj.parent, "units", "pixels");
    fig_position = get (axis_obj.parent, "position");
  unwind_protect_cleanup
    set (axis_obj.parent, "units", orig_fig_units);
    set (axis_obj.parent, "position", orig_fig_position);
  end_unwind_protect
  ## Get axes size in pixels
  if (strcmp (get (axis_obj.parent, "__graphics_toolkit__"), "gnuplot")
      && strcmp (axis_obj.activepositionproperty, "outerposition"))
    pos_in_pixels = axis_obj.outerposition .* fig_position([3, 4, 3, 4]);
  else
    pos_in_pixels = axis_obj.position .* fig_position([3, 4, 3, 4]);
  endif

  nd = __calc_dimensions__ (h);

  if (strcmp (axis_obj.plotboxaspectratiomode, "manual")
      || strcmp (axis_obj.dataaspectratiomode, "manual"))
    ## When using {rltb}margin, Gnuplot does not handle the specified
    ## aspect ratio properly, so handle it here.
    if (nd == 2 || all (mod (axis_obj.view, 90) == 0))
      aspect_ratio_2d = axis_obj.plotboxaspectratio(1:2);
    else
      ## FIXME -- this works for "axis square", but has not been
      ##          thoroughly tested for other aspect ratios.
      aspect_ratio_2d = [max(axis_obj.plotboxaspectratio(1:2)), ...
                             axis_obj.plotboxaspectratio(3)/sqrt(2)];
    endif
    orig_aspect_ratio_2d = pos_in_pixels(3:4);
    rel_aspect_ratio_2d =  aspect_ratio_2d ./ orig_aspect_ratio_2d;
    rel_aspect_ratio_2d = rel_aspect_ratio_2d ./ max (rel_aspect_ratio_2d);
    if (rel_aspect_ratio_2d(1) < rel_aspect_ratio_2d(2));
      dx = (1.0 - rel_aspect_ratio_2d(1)) * pos_in_pixels(3);
      pos_in_pixels = pos_in_pixels + dx*[0.5, 0.0, -1.0, 0.0];
    elseif (rel_aspect_ratio_2d(1) > rel_aspect_ratio_2d(2))
      dy = (1.0 - rel_aspect_ratio_2d(2)) * pos_in_pixels(4);
      pos_in_pixels = pos_in_pixels + dy*[0.0, 0.5, 0.0, -1.0];
    endif
    pos = pos_in_pixels ./ fig_position([3, 4, 3, 4]);
  elseif (strcmp (get (axis_obj.parent, "__graphics_toolkit__"), "gnuplot")
          && strcmp (axis_obj.activepositionproperty, "outerposition"))
    pos = axis_obj.outerposition;
  else
    pos = axis_obj.position;
  endif
endfunction