www.gusucode.com > GUI的布局工具箱 > GUI的布局工具箱/GUI的布局工具箱/GUILayout-v1p10/+uiextras/Box.m
classdef Box < uiextras.Container %Box Box base class % % See also: uiextras.HBox % uiextras.VBox % Copyright 2009-2010 The MathWorks, Inc. % $Revision: 366 $ % $Date: 2011-02-10 15:48:11 +0000 (Thu, 10 Feb 2011) $ properties( SetObservable ) Sizes = zeros( 1, 0 ) % Vector of sizes, with positive elements for absolute sizes (pixels) and negative elements for relative sizes Padding = 0 % Padding around contents (pixels) Spacing = 0 % Spacing between contents (pixels) end % public properties properties( Dependent ) MinimumSizes % Minimum size (in pixels) for each element end % dependent properties properties( Access=private ) MinimumSizes_ = zeros( 1, 0 ) end % private properties methods function obj = Box( varargin ) %BOX Container with contents in a single row or column % First step is to create the parent class. We pass the % arguments (if any) just incase the parent needs setting obj@uiextras.Container( varargin{:} ); % Set some defaults obj.setPropertyFromDefault( 'Padding' ); obj.setPropertyFromDefault( 'Spacing' ); end % constructor function set.Sizes( obj, value ) % Check. We only count live children myChildren = obj.getValidChildren(); if ~isequal( numel( myChildren ), numel( value ) ) error( 'GUILayout:InvalidPropertyValue', ... 'Size of property ''Sizes'' must match size of property ''Children''.' ) elseif ~isnumeric( value ) || ... any( ~isreal( value ) ) || any( isnan( value ) ) || any( ~isfinite( value ) ) error( 'GUILayout:InvalidPropertyValue', ... 'Property ''Sizes'' must consist of real, finite, numeric values.' ) end % Set obj.Sizes = value(:)'; % Redraw obj.redraw(); end % set.Sizes function set.MinimumSizes( obj, value ) % Check. We only count live children if ~isequal( numel( obj.Sizes ), numel( value ) ) error( 'GUILayout:InvalidPropertyValue', ... 'Size of property ''MinimumSizes'' must match size of property ''Sizes''.' ) elseif ~isnumeric( value ) || ... any( ~isreal( value ) ) || any( isnan( value ) ) || any( ~isfinite( value ) ) error( 'GUILayout:InvalidPropertyValue', ... 'Property ''MinimumSizes'' must consist of real, finite, numeric values.' ) end % Set and redraw obj.MinimumSizes_ = value(:)'; obj.redraw(); end % set.MinimumSizes function value = get.MinimumSizes( obj ) value = obj.MinimumSizes_; end % get.MinimumSizes function set.Padding( obj, value ) % Check if ~isnumeric( value ) || ~isscalar( value ) || ... ~isreal( value ) || isnan( value ) || ~isfinite( value ) || ... value < 0 || rem( value, 1 ) ~= 0 error( 'GUILayout:InvalidPropertyValue', ... 'Property ''Padding'' must be a nonnegative integer.' ) end % Set obj.Padding = value; % Redraw obj.redraw(); end % set.Padding function set.Spacing( obj, value ) % Check if ~isnumeric( value ) || ~isscalar( value ) || ... ~isreal( value ) || isnan( value ) || ~isfinite( value ) || ... value < 0 || rem( value, 1 ) ~= 0 error( 'GUILayout:InvalidPropertyValue', ... 'Property ''Spacing'' must be a nonnegative integer.' ) end % Set obj.Spacing = value; % Redraw obj.redraw(); end % set.Spacing end % public methods methods( Access = protected ) function onChildAdded( obj, source, eventData ) %#ok<INUSD> % This callback fires when a child is added to a container. % Add an element to Sizes. This automatically triggers a % redraw. obj.MinimumSizes_(1,end+1) = 1; obj.Sizes(1,end+1) = -1; end % onChildAdded function onChildRemoved( obj, source, eventData ) %#ok<INUSL> % This callback fires when a child is destroyed or removed. % Work out which child has gone and delete the corresponding % element from Sizes. This automatically triggers a redraw. obj.MinimumSizes_( eventData.ChildIndex ) = []; obj.Sizes( eventData.ChildIndex ) = []; end % onChildRemoved end % protected methods end % classdef