classdef VButtonBox < uiextras.ButtonBox %VButtonBox Arrange buttons vertically in a single column % % obj = uiextras.VButtonBox() is a type of VBox specialised for % arranging a column of buttons, check-boxes or similar graphical % elements. All buttons are given equal size and by default are % centered in the drawing area. The justification can be changed as % required. % % obj = uiextras.VButtonBox(param,value,...) also sets one or more % parameter values. % % See the documentation for more detail and the list of properties. % % Examples: % >> f = figure(); % >> b = uiextras.VButtonBox( 'Parent', f ); % >> uicontrol( 'Parent', b, 'String', 'One' ); % >> uicontrol( 'Parent', b, 'String', 'Two' ); % >> uicontrol( 'Parent', b, 'String', 'Three' ); % >> set( b, 'ButtonSize', [130 35], 'Spacing', 5 ); % % See also: uiextras.HButtonBox % uiextras.VBox % Copyright 2009-2010 The MathWorks, Inc. % $Revision: 300 $ % $Date: 2010-07-22 16:33:47 +0100 (Thu, 22 Jul 2010) $ methods function obj = VButtonBox( varargin ) %VButtonBox Create a new horizontal button box % First step is to create the parent class. We pass the % arguments (if any) just incase the parent needs setting obj@uiextras.ButtonBox( varargin{:} ); % Set properties if nargin > 0 set( obj, varargin{:} ); end end % constructor end % public methods methods( Access = protected ) function redraw( obj ) % First we need to work out how much space is available - if % there's not enough for the desired size then the buttons may % have to shrink children = obj.getValidChildren(); nChildren = numel( children ); pos = ceil( getpixelposition( obj.UIContainer ) ); availableWidth = pos(3) - 2*obj.Padding; availableHeight = pos(4) - 2*obj.Padding - (nChildren-1)*obj.Spacing; buttonWidth = min( obj.ButtonSize(1), availableWidth ); buttonHeight = min( obj.ButtonSize(2), availableHeight/nChildren ); % The positioning depends on the alignment buttonsHeight = buttonHeight*nChildren + (nChildren-1)*obj.Spacing; switch upper( obj.VerticalAlignment ) case 'TOP' y0 = pos(4) - obj.Padding - buttonsHeight; case 'MIDDLE' y0 = 1 + round( ( pos(4) - buttonsHeight ) / 2 ); case 'BOTTOM' y0 = 1 + obj.Padding; otherwise error( 'GUILayout:InvalidState', ... 'Invalid vertical alignment ''%s''.', obj.VerticalAlignment ) end switch upper( obj.HorizontalAlignment ) case 'LEFT' x0 = 1+ obj.Padding; case 'CENTER' x0 = 1 + round( (pos(3) - buttonWidth ) / 2 ); case 'RIGHT' x0 = pos(3) - obj.Padding - buttonWidth; otherwise error( 'GUILayout:InvalidState', ... 'Invalid horizontal alignment ''%s''.', obj.HorizontalAlignment ) end % OK, we now know the start coords, so position each child for ii=1:nChildren child = children(nChildren-ii+1); contentPos = [x0, y0 + (ii-1)*(obj.Spacing+buttonHeight), buttonWidth, buttonHeight]; obj.repositionChild( child, contentPos ) end end % redraw end % protected methods end % classdef