1 | function move_obj(arg) |
---|
2 | % callback function for draggable objects |
---|
3 | % Any object can be made draggable via |
---|
4 | % set(obj, 'ButtonDownFcn', 'move_obj(1)'); |
---|
5 | |
---|
6 | % using deltas allows us to drag big objects |
---|
7 | global last_pos; |
---|
8 | |
---|
9 | % handle events |
---|
10 | switch arg |
---|
11 | case 2 % button motion |
---|
12 | pos = get(gca, 'CurrentPoint'); |
---|
13 | pos = pos(1,:); |
---|
14 | |
---|
15 | switch get(gco, 'type') |
---|
16 | case 'text', obj_pos = get(gco, 'Pos')'; |
---|
17 | case 'line', |
---|
18 | obj_pos(1,:) = get(gco,'xdata'); |
---|
19 | obj_pos(2,:) = get(gco,'ydata'); |
---|
20 | otherwise error(['cannot handle type ' get(gco,'type')]) |
---|
21 | end |
---|
22 | % if the scale is logarithmic then the delta is a ratio |
---|
23 | if strcmp(get(gca,'xscale'), 'log') |
---|
24 | new_pos(1,:) = obj_pos(1,:) * (pos(1)/last_pos(1)); |
---|
25 | else |
---|
26 | new_pos(1,:) = obj_pos(1,:) + (pos(1)-last_pos(1)); |
---|
27 | end |
---|
28 | if strcmp(get(gca,'yscale'), 'log') |
---|
29 | new_pos(2,:) = obj_pos(2,:) * (pos(2)/last_pos(2)); |
---|
30 | else |
---|
31 | new_pos(2,:) = obj_pos(2,:) + (pos(2)-last_pos(2)); |
---|
32 | end |
---|
33 | switch get(gco, 'type') |
---|
34 | case 'text', set(gco, 'Pos', new_pos); |
---|
35 | case 'line', |
---|
36 | set(gco, 'xdata', new_pos(1,:), ... |
---|
37 | 'ydata', new_pos(2,:)); |
---|
38 | end |
---|
39 | last_pos = pos; |
---|
40 | case 1 % buttondown |
---|
41 | % start moving |
---|
42 | % dragging looks better with double buffering on |
---|
43 | set(gcf, 'DoubleBuffer', 'on'); |
---|
44 | last_pos = get(gca,'CurrentPoint'); |
---|
45 | last_pos = last_pos(1,:); |
---|
46 | % set callbacks |
---|
47 | fig = gcf; |
---|
48 | %set(fig, 'pointer', 'fleur'); |
---|
49 | set(fig, 'windowbuttonmotionfcn', 'move_obj(2)'); |
---|
50 | set(fig, 'windowbuttonupfcn', 'move_obj(3)'); |
---|
51 | case 3 % button up |
---|
52 | % finished moving |
---|
53 | % clear callbacks |
---|
54 | fig = gcf; |
---|
55 | %set(fig, 'pointer', 'arrow'); |
---|
56 | set(fig, 'windowbuttonmotionfcn', ''); |
---|
57 | set(fig, 'windowbuttonupfcn', ''); |
---|
58 | otherwise |
---|
59 | error('invalid argument') |
---|
60 | end |
---|