27
28
2 - follow mouse pointer and waiting for a BUTTON_RELEASE */
29
30
static gc_drag_mode_type gc_drag_mode;
30
static GnomeCanvasItem *gc_drag_item;
31
static GooCanvasItem *gc_drag_item;
32
static GooCanvasItem *gc_drag_target;
31
33
static double gc_drag_offset_x, gc_drag_offset_y;
33
GnomeCanvasItem * gc_drag_item_get(void)
38
void gc_drag_item_set(GnomeCanvasItem *item)
40
if(gc_drag_status != 0)
41
g_warning("Don't use gc_drag_set_item during a dragging");
46
void gc_drag_item_move(GdkEvent *event)
48
double item_x, item_y;
50
item_x = event->button.x;
51
item_y = event->button.y;
52
gnome_canvas_item_w2i(gc_drag_item->parent, &item_x, &item_y);
54
gnome_canvas_item_set(gc_drag_item,
55
"x", item_x - gc_drag_offset_x,
56
"y", item_y - gc_drag_offset_y, NULL);
59
void gc_drag_offset_get(double *x, double *y)
61
*x = gc_drag_offset_x;
62
*y = gc_drag_offset_y;
65
void gc_drag_offset_set(double x, double y)
71
void gc_drag_offset_save(GdkEvent *event)
73
double x, y, item_x, item_y;
77
gnome_canvas_item_w2i(gc_drag_item->parent, &x, &y);
79
gnome_canvas_item_get_bounds(gc_drag_item, &item_x, &item_y, NULL, NULL);
81
gc_drag_offset_set(x - item_x, y - item_y);
84
gint gc_drag_event(GnomeCanvasItem *item, GdkEvent *event, gpointer data)
88
case GDK_BUTTON_PRESS:
89
if(gc_drag_status ==0 && event->button.button == 1)
92
if(gc_drag_mode == GC_DRAG_MODE_GRAB)
97
gc_drag_func(item, event, data);
100
case GDK_BUTTON_RELEASE:
101
if(gc_drag_status == 2)
103
gc_drag_func(gc_drag_item, event, data);
107
else if (gc_drag_status == 1 && gc_drag_mode & GC_DRAG_MODE_2CLICKS)
116
gint gc_drag_event_root(GnomeCanvasItem * item, GdkEvent *event, gpointer data)
120
case GDK_MOTION_NOTIFY:
121
if(gc_drag_status > 0)
123
if(gc_drag_status==1 && gc_drag_mode & GC_DRAG_MODE_GRAB)
125
gc_drag_func(gc_drag_item, event, data);
134
void gc_drag_start(GnomeCanvasGroup *root_item, gc_Drag_Func function, gc_drag_mode_type mode)
136
gtk_signal_connect(GTK_OBJECT(root_item), "event",
137
(GtkSignalFunc) gc_drag_event_root, NULL);
138
gc_drag_func = function;
141
gc_drag_offset_x = gc_drag_offset_y = 0;
36
gc_drag_item_get(void)
42
gc_drag_item_set(GooCanvasItem *item)
44
/* Don't use gc_drag_set_item during a dragging */
45
g_assert(gc_drag_status == 0);
51
/* Move the current dragging item of the group if given */
53
gc_drag_item_move(GdkEvent *event, GooCanvasItem *group)
55
double new_x = event->button.x;
56
double new_y = event->button.y;
57
GooCanvasBounds bounds;
59
/* Check board boundaries */
60
goo_canvas_item_get_bounds(gc_drag_item, &bounds);
61
if((bounds.x1 < 0 && new_x < gc_drag_offset_x)
62
|| (bounds.x2 > BOARDWIDTH && new_x > gc_drag_offset_x))
63
new_x = gc_drag_offset_x;
65
if((bounds.y1 < 0 && new_y < gc_drag_offset_y)
66
|| (bounds.y2 > BOARDHEIGHT && new_y > gc_drag_offset_y))
67
new_y = gc_drag_offset_y;
69
goo_canvas_item_translate ((group ? group : gc_drag_item),
70
new_x - gc_drag_offset_x,
71
new_y - gc_drag_offset_y);
75
gc_drag_offset_get(double *x, double *y)
77
*x = gc_drag_offset_x;
78
*y = gc_drag_offset_y;
82
gc_drag_offset_set(double x, double y)
89
gc_drag_offset_save(GdkEvent *event)
92
GooCanvasBounds bounds;
97
goo_canvas_item_get_bounds(gc_drag_item, &bounds);
98
goo_canvas_convert_to_item_space(goo_canvas_item_get_canvas(gc_drag_item),
99
gc_drag_item, &bounds.x1, &bounds.y1);
101
gc_drag_offset_set(x - bounds.x1, y - bounds.y1);
105
gc_drag_event (GooCanvasItem *item,
106
GooCanvasItem *target,
107
GdkEventButton *event,
112
case GDK_BUTTON_PRESS:
113
if(gc_drag_status == 0 && event->button == 1)
116
gc_drag_target = target;
117
if(gc_drag_mode == GC_DRAG_MODE_GRAB)
122
gc_drag_user_data = data;
123
gc_drag_func(item, target, (GdkEvent*)event, data);
126
case GDK_BUTTON_RELEASE:
127
if(gc_drag_status == 2)
129
gc_drag_func(gc_drag_item,
135
gc_drag_target = NULL;
136
gc_drag_user_data = NULL;
138
else if (gc_drag_status == 1 && gc_drag_mode & GC_DRAG_MODE_2CLICKS)
148
gc_drag_event_root(GooCanvasItem * item,
149
GooCanvasItem *target,
150
GdkEventMotion *event,
153
if(gc_drag_target != target)
158
case GDK_MOTION_NOTIFY:
159
if(gc_drag_status > 0)
161
if(gc_drag_status==1 && gc_drag_mode & GC_DRAG_MODE_GRAB)
164
gc_drag_func(gc_drag_item,
177
gc_drag_start(GooCanvasItem *root_item,
179
gc_drag_mode_type mode)
181
g_signal_connect(root_item, "motion_notify_event",
182
(GtkSignalFunc) gc_drag_event_root, NULL);
183
gc_drag_func = function;
184
gc_drag_user_data = NULL;
187
gc_drag_target = NULL;
188
gc_drag_offset_x = gc_drag_offset_y = 0;
189
if (mode == GC_DRAG_MODE_DEFAULT)
190
gc_drag_mode = gc_prop_get()->drag_mode;
196
gc_drag_stop(GooCanvasItem *root_item)
198
if(gc_drag_status > 0)
201
event.type = GDK_BUTTON_RELEASE;
202
event.button.x = event.button.y =0;
203
event.button.button = 1;
204
gc_drag_func(gc_drag_item, NULL, &event, gc_drag_user_data);
206
g_signal_handlers_disconnect_by_func(root_item,
207
(GtkSignalFunc) gc_drag_event_root,
210
gc_drag_user_data = NULL;
213
gc_drag_target = NULL;
218
gc_drag_change_mode (gc_drag_mode_type mode)
220
if(gc_drag_status != 0)
221
g_warning("Don't use gc_change_mode during a dragging");
142
223
if (mode == GC_DRAG_MODE_DEFAULT)
143
224
gc_drag_mode = gc_prop_get()->drag_mode;
145
226
gc_drag_mode = mode;
148
void gc_drag_stop(GnomeCanvasGroup *root_item)
153
event.type = GDK_BUTTON_RELEASE;
154
event.button.x = event.button.y =0;
155
event.button.button = 1;
156
gc_drag_func(gc_drag_item, &event, NULL);
158
gtk_signal_disconnect_by_func(GTK_OBJECT(root_item),
159
(GtkSignalFunc) gc_drag_event_root, NULL);
166
void gc_drag_change_mode (gc_drag_mode_type mode)
168
if(gc_drag_status != 0)
169
g_warning("Don't use gc_change_mode during a dragging");
171
if (mode == GC_DRAG_MODE_DEFAULT)
172
gc_drag_mode = gc_prop_get()->drag_mode;