[37] | 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 |
---|