source: prextra/im_update.m @ 113

Last change on this file since 113 was 5, checked in by bduin, 14 years ago
File size: 4.7 KB
Line 
1function im_update(arg1)
2% im_update(arg1)
3%
4% Auxiliary function for impaint.m It takes care for the callbacks when
5% the mouse button is clicked or released.
6%
7% See also  impaint.m
8
9    fig = gcbf;
10    allUD = get(fig,'userdata');
11    UD=allUD.impaint; % our portion of UD
12
13    switch lower(arg1)
14     case 'fill'
15      % Check if it is inside the image:
16      set(fig,'units','normalized');
17      pos = get(fig,'currentpoint');
18      if pos(1)<UD.pos(1) | pos(1)>UD.pos(3) | pos(2)<UD.pos(2) | pos(2)>UD.pos(4)
19          return
20      end
21      % Compute the position:
22      pos(1) = round((pos(1)-UD.pos(1))*UD.W);
23      pos(2) = round(UD.sz(1) - (pos(2)-UD.pos(2))*UD.H);
24
25      switch get(fig,'SelectionType')
26       case 'normal'    % left click
27                        %disp('left click');
28                        t=floor((UD.brushsz-1)/2);
29                        I = -t:t;
30                        % just paint it foreground:
31                        cdata = get(UD.msk_im,'cdata');
32                        cdata(pos(2)+I,pos(1)+I,1) = UD.msk_fg(UD.currlab,1);
33                        cdata(pos(2)+I,pos(1)+I,2) = UD.msk_fg(UD.currlab,2);
34                        cdata(pos(2)+I,pos(1)+I,3) = UD.msk_fg(UD.currlab,3);
35                        set(UD.msk_im,'cdata',cdata);
36                        UD.labels(pos(2)+I,pos(1)+I) = UD.currlab;
37       case 'alt'       % right click
38                        %disp('right click');
39                        % just paint it background:
40                        t=floor((UD.brushsz-1)/2);
41                        I = -t:t;
42                        cdata = get(UD.msk_im,'cdata');
43                        cdata(pos(2)+I,pos(1)+I,1) = UD.msk_bg(1);
44                        cdata(pos(2)+I,pos(1)+I,2) = UD.msk_bg(2);
45                        cdata(pos(2)+I,pos(1)+I,3) = UD.msk_bg(3);
46                        set(UD.msk_im,'cdata',cdata);
47                        UD.labels(pos(2)+I,pos(1)+I) = 0;
48      end
49      % now I want to trace the cursor:
50      set(fig,'WindowButtonMotionFcn','im_update(''fill'')');
51     
52     case 'stopfill'
53      % stop tracing the cursor:
54      set(fig,'WindowButtonMotionFcn',[]);
55
56     case 'keypress-hidden'
57      t=get(fig,'currentchar'); 
58      if strcmp(UD.state,'off') & strcmp(t,'t')
59
60          UD.state='on';
61
62          % show the overlay axes:
63          set(UD.msk_im,'visible','on');
64
65          % use our impaint handlers (previous are stored)
66          set(fig,'WindowButtonDownFcn','im_update(''fill'')');
67          set(fig,'WindowButtonUpFcn','im_update(''stopfill'')');
68          set(fig,'KeyPressFcn','im_update(''keypress'')');     
69         
70          % change the window title
71          set(fig,'Name',sprintf('imprint on, brush: %d, class: %d',UD.brushsz,UD.currlab));
72         
73      else
74          % invoke old handler
75          eval(UD.oldhandlers.keypress);
76      end
77     
78     case 'keypress'
79      t=get(fig,'currentchar');
80      if double(t)==46
81          % first allow decimal point
82          UD.charbuffer=[UD.charbuffer '.'];
83      else
84          t2=str2num(t); % is is a number?
85          if ~isempty(t2)
86              % it's a diggit -> add to the buffer
87              UD.charbuffer=[UD.charbuffer t];
88          else
89              % it's a letter command: execute
90              % get the current numerical content from buffer:
91              num=str2num(UD.charbuffer);
92
93              switch t
94               case 't' % toggle the impaint on and off
95                if strcmp(UD.state,'on')
96                    UD.state='off';
97
98                    % hide the overlay axes:
99                    set(UD.msk_im,'visible','off');
100                   
101                    % supply original handlers
102                    set(fig,'WindowButtonDownFcn',UD.oldhandlers.btndown);
103                    set(fig,'WindowButtonUpFcn',UD.oldhandlers.btnup);
104                   
105                    % keypress handler must allow to return back
106                    set(fig,'KeyPressFcn','im_update(''keypress-hidden'')');   
107                   
108                    % change the window title
109                    set(fig,'Name','imprint off');
110
111                    set(fig,'UserData',[]);
112                    allUD.impaint=UD;
113                    set(fig,'UserData',allUD);
114                    return
115                   
116                end
117               case 'b' % change the brush size
118                if isempty(num)
119                    fprintf(1,'impaint: use a numerical prefix followed by letter command!');
120                end
121                if num>0
122                    UD.brushsz=num;
123                end
124               case 'c' % class selector
125                if isempty(num)
126                    fprintf(1,'impaint: use a numerical prefix followed by letter command!');
127                end
128                if num>0
129                    UD.currlab=num;
130                end
131               case 'a' % alpha level
132                if isempty(num)
133                    fprintf(1,'impaint: use a numerical prefix followed by letter command!');
134                end
135                if num>=0 & num<=1
136                    msk2 = findobj(get(UD.msk_ax,'children'),'type','image');
137                    set(msk2,'alphadata',num);
138                end
139               case 's' % save labels
140                def='lab';
141                if ~isempty(num), def=[def num2str(num)]; end
142                name=inputdlg('Enter label vector name','Assign labels to a workspace variable',1,{def});
143                if ~isempty(name)
144                    lab=UD.labels;
145                    lab=lab(1:UD.labsize(1),1:UD.labsize(2));
146                    assignin('base',name{1},lab);
147                end
148               otherwise
149%               fprintf(1,'unknown command');
150              end
151              set(fig,'Name',sprintf('imprint on, brush: %d, class: %d',UD.brushsz,UD.currlab));           
152              UD.charbuffer=''; % clear the buffer
153          end
154      end
155    end
156
157    set(fig,'UserData',[]);
158    allUD.impaint=UD;
159    set(fig,'UserData',allUD);
160
161    % DXD it does not seem to work....:
162    %set(UD.msk_im,'erasemode','normal');
163
164    return
Note: See TracBrowser for help on using the repository browser.