www.gusucode.com > mbclayouts 工具箱 matlab 源码程序 > mbclayouts/@xregslidefxlayout/set.m
function varargout=set(obj,varargin) % Synopsis % function set(obj,parameter,value) % % Description % Set the parameter of the handles. This works very similar % to the set methods for handles. The only difference is that % some methods have been overloaded to perform differently % on the package. Non overload methods just perform the set % recursively on all submembers. % % % Overloaded set methods % POSITION : [xmin ymin width height] of the whole package. % VISIBLE : 'on' or 'off' % SLIDEDIRECTION : North/South/East/West % SLIDEFX : 'on'/'off' % CENTER : Layout to use % % Copyright 2000-2011 The MathWorks, Inc. and Ford Global Technologies, Inc. norepack = 1; if ~isa(obj,'xregslidefxlayout') set(mbcgui.hgclassesutil.toHandle(obj),varargin{:}); else ud=obj.g.info; for arg=1:2:nargin-1 parameter = varargin{arg}; value = varargin{arg+1}; reqnorepack=0; switch upper(parameter) case 'POSITION' position=value; position(3:4)=max(position(3:4),[1 1]); set(obj.xregcontainer,'Position',position); case 'VISIBLE' vis=find( strcmp( value,{ 'off'; 'on' } ) )-1; if vis~=ud.visible ud.visible=vis; if vis % vis ON FX ud=i_vison(obj,ud); else % vis OFF FX ud=i_visoff(obj,ud); end end reqnorepack=1; case 'CENTER' set(obj.xregcontainer,'elements',{value}); case 'SLIDEDIRECTION' ud.slidedir=find( strcmpi( value,{'north'; 'east'; 'south'; 'west'} ) ); reqnorepack=1; case 'SLIDEFX' ud.slidefx=find( strcmp( value,{ 'off'; 'on' } ) )-1; reqnorepack=1; otherwise [obj.xregcontainer,reqnorepack]=set(obj.xregcontainer,parameter,value); end norepack=(norepack & reqnorepack); end obj.g.info=ud; end if nargout>1 varargout{1}=obj; varargout{2}=norepack; else varargout{1}=obj; if ~norepack && get(obj,'boolpackstatus') repack(obj); end end function ud=i_vison(obj,ud) h=get(obj,'elements'); if ~isempty(h) h=h{1}; if ud.slidefx % slide layout in pos=get(obj.xregcontainer,'innerposition'); figpos=get(get(obj,'Parent'),'Position'); switch ud.slidedir case 1 dist=figpos(4)-pos(2); case 2 dist=figpos(3)-pos(1); case 3 dist=pos(2)+pos(4)-1; case 4 dist=pos(1)+pos(3)-1; end delt=i_deltas(dist); nsteps=length(delt); pos2=repmat(pos,nsteps,1); switch ud.slidedir case 1 pos2(:,2)=pos2(:,2)+delt; case 2 pos2(:,1)=pos2(:,1)+delt; case 3 pos2(:,2)=pos2(:,2)-delt; case 4 pos2(:,1)=pos2(:,1)-delt; end % move layout offscreen set(h,'Position',pos2(end,:),'Visible','on'); drawnow; for n=(nsteps-1):-1:1 set(h,'Position',pos2(n,:)); drawnow; end % move to final position set(h,'Position',pos); else set(h,'Visible','on'); end end return function ud=i_visoff(obj,ud) h=get(obj.xregcontainer,'elements'); if ~isempty(h) h=h{1}; if ud.slidefx % slide layout out pos=get(obj.xregcontainer,'innerposition'); figpos=get(get(obj,'Parent'),'Position'); switch ud.slidedir case 1 dist=figpos(4)-pos(2); case 2 dist=figpos(3)-pos(1); case 3 dist=pos(2)+pos(4)-1; case 4 dist=pos(1)+pos(3)-1; end delt=i_deltas(dist); nsteps=length(delt); pos2=repmat(pos,nsteps,1); switch ud.slidedir case 1 pos2(:,2)=pos2(:,2)+delt; case 2 pos2(:,1)=pos2(:,1)+delt; case 3 pos2(:,2)=pos2(:,2)-delt; case 4 pos2(:,1)=pos2(:,1)-delt; end for n=1:nsteps set(h,'Position',pos2(n,:)); drawnow; end set(h,'Visible','off','Position',pos); else set(h,'Visible','off'); end end return function delt=i_deltas(dist) % return the position offsets needed to achieve distance dist steps=(1:50)'; delt=cumsum((steps.^2)./10); delt=delt([1; delt(1:end-1)]<dist); return