www.gusucode.com > mbcguitools 工具箱 matlab 源码程序 > mbcguitools/@xregcolorbar/linedragcb.m
function cb = linedragcb(gr) %XREGCOLORBAR/LINEDRAGCB Callback function % % Callback function for XREGCOLORBAR object. Handles dragging of the % range indicator objects on the colourbar. % Copyright 2000-2013 The MathWorks, Inc. and Ford Global Technologies, Inc. % Altered by Mungo Stacy % 15/6/01 cb = []; cb.ButtonDown = @i_ButtonDown; cb.ButtonUp = @i_ButtonUp; cb.Motion = @i_Motion; %------------------------------------------------ function i_ButtonDown(src,event,gr,line) %------------------------------------------------ % Get up-to-date version of object gr = builtin('get',gr.colorbar.axes,'userdata'); obj=gr.colorbar.([line 'range']); figh = ancestor(gr.patch,'figure'); gr.colorbar.Manager=MotionManager(figh); gr.colorbar.Manager.EnableTree=false; PR = xregGui.PointerRepository; ud = get(gr.patch,'UserData'); ud.pointerID = PR.stackSetPointer(figh,'top'); % create a text object to indicate variable value cfactor=get(gr.cfactor,'String'); if ~strcmp(cfactor,' '); cfactor=cfactor{get(gr.cfactor,'Value')}; else cfactor='Y'; end % Anything longer falls out of box cfactor = cfactor(1); th=uicontrol('Parent',gr.patch,... 'Style','text',... 'Visible','off',... 'BackgroundColor',[1 1 0.6],... 'UserData',cfactor); ud.upfcn=get(figh,'WindowButtonUpFcn'); set(gr.patch,'UserData',ud); set(obj,'FaceVertexCData',1-get(obj,'FaceVertexCData')); set(figh,'WindowButtonUpFcn',{gr.colorbar.linebupcb, gr, line, th}); gr.colorbar.Manager.MouseMoveFcn={gr.colorbar.linemotioncb, gr, line, th}; % store manager builtin('set',gr.colorbar.axes,'userdata',gr); % easy way to pop up text box immediately i_Motion([],[],gr,line,th); set(th,'Visible','on'); %------------------------------------------------ function i_ButtonUp(src,event,gr,line,th) %------------------------------------------------ % Get up-to-date version of object gr = builtin('get',gr.colorbar.axes,'userdata'); figh = ancestor(gr.patch,'figure'); obj=gr.colorbar.([line 'range']); ud=get(gr.patch,'UserData'); set(obj,'FaceVertexCData',1-get(obj,'FaceVertexCData')); gr.colorbar.Manager.MouseMoveFcn=''; gr.colorbar.Manager.EnableTree=true; set(figh,'WindowButtonUpFcn',ud.upfcn); delete(th); PR = xregGui.PointerRepository; PR.stackRemovePointer(figh,ud.pointerID); % update axes pr_cbarfaces(gr.colorbar.bar,get(gr.colorbar.bar,'FaceVertexCData'),gr); pr_setMotionRegions(gr); pr_plot(gr); %------------------------------------------------ function i_Motion(src,event,gr,line,th,axcp) %------------------------------------------------ if nargin<6, axcp = []; end % Get up-to-date version of object gr = builtin('get',gr.colorbar.axes,'userdata'); figh = ancestor(gr.patch,'figure'); % get current cursor point from figure cp=get(figh,'CurrentPoint'); cp = mbcgui.util.convertLocation(cp, gr.patch); % translate to a data point in the colourbar axes! cbpos=get(gr.colorbar.axes,'Position'); ylim=get(gr.colorbar.axes,'YLim'); switch lower(line) case 'min' % need to drag min to position of cursor. Special cases are: % (1) if min is dragged above max, it stops at max % (2) if min is dragged below axes, it stops at bottom of axes % Note that the midrange object needs to be moved too to keep it in the middle if isempty(axcp) axcp=(ylim(2)-ylim(1))*(cp(2)-cbpos(2))/cbpos(4); end % do checks to limit axcp if necessary if axcp<0.5 axcp=0.5; end cmax=get(gr.colorbar.maxrange,'UserData'); if axcp>cmax axcp=cmax; end strnum=axcp; % reset position of line % work out delta delta=2*(ylim(2)-ylim(1))/(cbpos(4)); newvert=[0 axcp+delta/4; 0.5 axcp+2*delta; 1 axcp+delta/4;.... 0 axcp-delta/4; 0.5 axcp-2*delta; 1 axcp-delta/4]; set(gr.colorbar.minrange,'Vertices',newvert,'UserData',axcp); % move midrange bar axcp=(cmax+axcp)/2; newvert=[0 axcp+delta/4; 0.5 axcp+2*delta; 1 axcp+delta/4;.... 0 axcp-delta/4; 0.5 axcp-2*delta; 1 axcp-delta/4]; set(gr.colorbar.midrange,'Vertices',newvert,'UserData',axcp); case 'mid' if isempty(axcp) midcp=(ylim(2)-ylim(1))*(cp(2)-cbpos(2))/cbpos(4); else midcp = axcp; end % do checks to limit axcp if necessary oldmin=get(gr.colorbar.minrange,'UserData'); oldmax=get(gr.colorbar.maxrange,'UserData'); mincp=midcp-(oldmax-oldmin)/2; maxcp=midcp+(oldmax-oldmin)/2; if mincp<ylim(1) % push maxcp back up maxcp=maxcp+ylim(1)-mincp; mincp=ylim(1); end if maxcp>ylim(2) % push mincp back down mincp=mincp-maxcp+ylim(2); maxcp=ylim(2); end % rework midcp according to max and min midcp=(mincp+maxcp)/2; strnum=midcp; delta=2*(ylim(2)-ylim(1))/(cbpos(4)); newvert=[0 mincp+delta/4; 0.5 mincp+2*delta; 1 mincp+delta/4;.... 0 mincp-delta/4; 0.5 mincp-2*delta; 1 mincp-delta/4]; set(gr.colorbar.minrange,'Vertices',newvert,'UserData',mincp); newvert=[0 midcp+delta/4; 0.5 midcp+2*delta; 1 midcp+delta/4;.... 0 midcp-delta/4; 0.5 midcp-2*delta; 1 midcp-delta/4]; set(gr.colorbar.midrange,'Vertices',newvert,'UserData',midcp); newvert=[0 maxcp+delta/4; 0.5 maxcp+2*delta; 1 maxcp+delta/4;.... 0 maxcp-delta/4; 0.5 maxcp-2*delta; 1 maxcp-delta/4]; set(gr.colorbar.maxrange,'Vertices',newvert,'UserData',maxcp); case 'max' if isempty(axcp) axcp=(ylim(2)-ylim(1))*(cp(2)-cbpos(2))/cbpos(4); end % do checks to limit axcp if necessary if axcp>ylim(2) axcp=ylim(2); end cmin=get(gr.colorbar.minrange,'UserData'); if axcp<cmin axcp=cmin; end strnum=axcp; % reset position of line % work out delta delta=2*(ylim(2)-ylim(1))/(cbpos(4)); newvert=[0 axcp+delta/4; 0.5 axcp+2*delta; 1 axcp+delta/4;.... 0 axcp-delta/4; 0.5 axcp-2*delta; 1 axcp-delta/4]; set(gr.colorbar.maxrange,'Vertices',newvert,'UserData',axcp); % move midrange bar axcp=(cmin+axcp)/2; newvert=[0 axcp+delta/4; 0.5 axcp+2*delta; 1 axcp+delta/4;.... 0 axcp-delta/4; 0.5 axcp-2*delta; 1 axcp-delta/4]; set(gr.colorbar.midrange,'Vertices',newvert,'UserData',axcp); end % redraw text box if isgraphics(th) %position tpos(1)=cp(1)-55;tpos(2)=cp(2);tpos(3)=50;tpos(4)=16; %string cfactor=get(th,'UserData'); % need to scale number to actual values. ud=get(gr.ctext,'UserData'); clim = ud.clim; strnum=clim(1)+(clim(2)-clim(1)).*strnum./(ylim(2)-ylim(1)); tstr=[cfactor '=' sprintf('%5.3f',strnum)]; set(th,'Position',tpos,'String',tstr); end