Move drag and drop code from layer element to layer selector.
This commit is contained in:
		| @@ -59,6 +59,61 @@ static GtkTargetEntry entries[] = { | |||||||
| 	{ "GTK_LIST_BOX_ROW", GTK_TARGET_SAME_APP, 0 } | 	{ "GTK_LIST_BOX_ROW", GTK_TARGET_SAME_APP, 0 } | ||||||
| }; | }; | ||||||
|  |  | ||||||
|  | static void sel_layer_element_drag_begin(GtkWidget *widget, | ||||||
|  | 				     GdkDragContext *context, | ||||||
|  | 				     gpointer data) | ||||||
|  | { | ||||||
|  | 	GtkWidget *row; | ||||||
|  | 	GtkAllocation alloc; | ||||||
|  | 	cairo_surface_t *surface; | ||||||
|  | 	cairo_t *cr; | ||||||
|  | 	int x, y; | ||||||
|  | 	(void)data; | ||||||
|  |  | ||||||
|  | 	row = gtk_widget_get_ancestor(widget, GTK_TYPE_LIST_BOX_ROW); | ||||||
|  | 	gtk_widget_get_allocation(row, &alloc); | ||||||
|  | 	surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, alloc.width, alloc.height); | ||||||
|  | 	cr = cairo_create(surface); | ||||||
|  |  | ||||||
|  | 	gtk_style_context_add_class (gtk_widget_get_style_context(row), "drag-icon"); | ||||||
|  | 	gtk_widget_draw (row, cr); | ||||||
|  | 	gtk_style_context_remove_class(gtk_widget_get_style_context(row), "drag-icon"); | ||||||
|  |  | ||||||
|  | 	gtk_widget_translate_coordinates (widget, row, 0, 0, &x, &y); | ||||||
|  | 	cairo_surface_set_device_offset (surface, -x, -y); | ||||||
|  | 	gtk_drag_set_icon_surface (context, surface); | ||||||
|  |  | ||||||
|  | 	cairo_destroy (cr); | ||||||
|  | 	cairo_surface_destroy (surface); | ||||||
|  |  | ||||||
|  | 	g_object_set_data(G_OBJECT(gtk_widget_get_parent(row)), "drag-row", row); | ||||||
|  | 	gtk_style_context_add_class(gtk_widget_get_style_context(row), "drag-row"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void sel_layer_element_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data) | ||||||
|  | { | ||||||
|  | 	GtkWidget *row; | ||||||
|  | 	(void)context; | ||||||
|  | 	(void)data; | ||||||
|  |  | ||||||
|  | 	row = gtk_widget_get_ancestor(widget, GTK_TYPE_LIST_BOX_ROW); | ||||||
|  | 	g_object_set_data(G_OBJECT(gtk_widget_get_parent(row)), "drag-row", NULL); | ||||||
|  | 	gtk_style_context_remove_class(gtk_widget_get_style_context(row), "drag-row"); | ||||||
|  | 	gtk_style_context_remove_class(gtk_widget_get_style_context(row), "drag-hover"); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | static void sel_layer_element_drag_data_get(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, | ||||||
|  | 					guint info, guint time, gpointer data) | ||||||
|  | { | ||||||
|  | 	(void)context; | ||||||
|  | 	(void)info; | ||||||
|  | 	(void)time; | ||||||
|  | 	(void)data; | ||||||
|  |  | ||||||
|  | 	gtk_selection_data_set(selection_data, gdk_atom_intern_static_string("GTK_LIST_BOX_ROW"), | ||||||
|  | 			       32, (const guchar *)&widget, sizeof(gpointer)); | ||||||
|  | } | ||||||
|  |  | ||||||
| static GtkListBoxRow *layer_selector_get_last_row (GtkListBox *list) | static GtkListBoxRow *layer_selector_get_last_row (GtkListBox *list) | ||||||
| { | { | ||||||
| 	int i; | 	int i; | ||||||
| @@ -384,6 +439,14 @@ static gboolean layer_selector_check_if_layer_widget_exists(LayerSelector *self, | |||||||
| 	return ret; | 	return ret; | ||||||
| } | } | ||||||
|  |  | ||||||
|  | static void sel_layer_element_setup_dnd_callbacks(LayerElement *element) | ||||||
|  | { | ||||||
|  | 	layer_element_set_dnd_callbacks(element, entries, 1, | ||||||
|  | 					sel_layer_element_drag_begin, | ||||||
|  | 					sel_layer_element_drag_data_get, | ||||||
|  | 					sel_layer_element_drag_end); | ||||||
|  | } | ||||||
|  |  | ||||||
| /** | /** | ||||||
|  * @brief Analyze \p cell and append used layers to list box |  * @brief Analyze \p cell and append used layers to list box | ||||||
|  * @param listbox listbox to add layer |  * @param listbox listbox to add layer | ||||||
| @@ -401,6 +464,7 @@ static void layer_selector_analyze_cell_layers(LayerSelector *self, struct gds_c | |||||||
| 		layer = (int)gfx->layer; | 		layer = (int)gfx->layer; | ||||||
| 		if (layer_selector_check_if_layer_widget_exists(self, layer) == FALSE) { | 		if (layer_selector_check_if_layer_widget_exists(self, layer) == FALSE) { | ||||||
| 			le = layer_element_new(); | 			le = layer_element_new(); | ||||||
|  | 			sel_layer_element_setup_dnd_callbacks(LAYER_ELEMENT(le)); | ||||||
| 			layer_element_set_layer(LAYER_ELEMENT(le), layer); | 			layer_element_set_layer(LAYER_ELEMENT(le), layer); | ||||||
| 			gtk_list_box_insert(self->list_box, le, -1); | 			gtk_list_box_insert(self->list_box, le, -1); | ||||||
| 			gtk_widget_show(le); | 			gtk_widget_show(le); | ||||||
| @@ -677,7 +741,7 @@ void layer_selector_force_sort(LayerSelector *selector, enum layer_selector_sort | |||||||
| 	if (!box) | 	if (!box) | ||||||
| 		return; | 		return; | ||||||
|  |  | ||||||
| 	/* Set dorting function, sort, and disable sorting function */ | 	/* Set sorting function, sort, and disable sorting function */ | ||||||
| 	gtk_list_box_set_sort_func(box, layer_selector_sort_func, (gpointer)&sort_function, NULL); | 	gtk_list_box_set_sort_func(box, layer_selector_sort_func, (gpointer)&sort_function, NULL); | ||||||
| 	gtk_list_box_invalidate_sort(box); | 	gtk_list_box_invalidate_sort(box); | ||||||
| 	gtk_list_box_set_sort_func(box, NULL, NULL, NULL); | 	gtk_list_box_set_sort_func(box, NULL, NULL, NULL); | ||||||
|   | |||||||
| @@ -57,65 +57,6 @@ static void layer_element_class_init(LayerElementClass *klass) | |||||||
| 	oclass->constructed = layer_element_constructed; | 	oclass->constructed = layer_element_constructed; | ||||||
| } | } | ||||||
|  |  | ||||||
| static GtkTargetEntry entries[] = { |  | ||||||
| 	{ "GTK_LIST_BOX_ROW", GTK_TARGET_SAME_APP, 0 } |  | ||||||
| }; |  | ||||||
|  |  | ||||||
| static void layer_element_drag_begin(GtkWidget *widget, |  | ||||||
| 				     GdkDragContext *context, |  | ||||||
| 				     gpointer data) |  | ||||||
| { |  | ||||||
| 	GtkWidget *row; |  | ||||||
| 	GtkAllocation alloc; |  | ||||||
| 	cairo_surface_t *surface; |  | ||||||
| 	cairo_t *cr; |  | ||||||
| 	int x, y; |  | ||||||
| 	(void)data; |  | ||||||
|  |  | ||||||
| 	row = gtk_widget_get_ancestor(widget, GTK_TYPE_LIST_BOX_ROW); |  | ||||||
| 	gtk_widget_get_allocation(row, &alloc); |  | ||||||
| 	surface = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, alloc.width, alloc.height); |  | ||||||
| 	cr = cairo_create(surface); |  | ||||||
|  |  | ||||||
| 	gtk_style_context_add_class (gtk_widget_get_style_context(row), "drag-icon"); |  | ||||||
| 	gtk_widget_draw (row, cr); |  | ||||||
| 	gtk_style_context_remove_class(gtk_widget_get_style_context(row), "drag-icon"); |  | ||||||
|  |  | ||||||
| 	gtk_widget_translate_coordinates (widget, row, 0, 0, &x, &y); |  | ||||||
| 	cairo_surface_set_device_offset (surface, -x, -y); |  | ||||||
| 	gtk_drag_set_icon_surface (context, surface); |  | ||||||
|  |  | ||||||
| 	cairo_destroy (cr); |  | ||||||
| 	cairo_surface_destroy (surface); |  | ||||||
|  |  | ||||||
| 	g_object_set_data(G_OBJECT(gtk_widget_get_parent(row)), "drag-row", row); |  | ||||||
| 	gtk_style_context_add_class(gtk_widget_get_style_context(row), "drag-row"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void layer_element_drag_end(GtkWidget *widget, GdkDragContext *context, gpointer data) |  | ||||||
| { |  | ||||||
| 	GtkWidget *row; |  | ||||||
| 	(void)context; |  | ||||||
| 	(void)data; |  | ||||||
|  |  | ||||||
| 	row = gtk_widget_get_ancestor(widget, GTK_TYPE_LIST_BOX_ROW); |  | ||||||
| 	g_object_set_data(G_OBJECT(gtk_widget_get_parent(row)), "drag-row", NULL); |  | ||||||
| 	gtk_style_context_remove_class(gtk_widget_get_style_context(row), "drag-row"); |  | ||||||
| 	gtk_style_context_remove_class(gtk_widget_get_style_context(row), "drag-hover"); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void layer_element_drag_data_get(GtkWidget *widget, GdkDragContext *context, GtkSelectionData *selection_data, |  | ||||||
| 					guint info, guint time, gpointer data) |  | ||||||
| { |  | ||||||
| 	(void)context; |  | ||||||
| 	(void)info; |  | ||||||
| 	(void)time; |  | ||||||
| 	(void)data; |  | ||||||
|  |  | ||||||
| 	gtk_selection_data_set(selection_data, gdk_atom_intern_static_string("GTK_LIST_BOX_ROW"), |  | ||||||
| 			       32, (const guchar *)&widget, sizeof(gpointer)); |  | ||||||
| } |  | ||||||
|  |  | ||||||
| static void layer_element_init(LayerElement *self) | static void layer_element_init(LayerElement *self) | ||||||
| { | { | ||||||
| 	GtkBuilder *builder; | 	GtkBuilder *builder; | ||||||
| @@ -131,13 +72,6 @@ static void layer_element_init(LayerElement *self) | |||||||
| 	self->priv.name = GTK_ENTRY(gtk_builder_get_object(builder, "entry")); | 	self->priv.name = GTK_ENTRY(gtk_builder_get_object(builder, "entry")); | ||||||
| 	self->priv.event_handle = GTK_EVENT_BOX(gtk_builder_get_object(builder, "event-box")); | 	self->priv.event_handle = GTK_EVENT_BOX(gtk_builder_get_object(builder, "event-box")); | ||||||
|  |  | ||||||
| 	/* Setup drag and drop */ |  | ||||||
| 	gtk_style_context_add_class (gtk_widget_get_style_context(GTK_WIDGET(self)), "row"); |  | ||||||
| 	gtk_drag_source_set(GTK_WIDGET(self->priv.event_handle), GDK_BUTTON1_MASK, entries, 1, GDK_ACTION_MOVE); |  | ||||||
| 	g_signal_connect(self->priv.event_handle, "drag-begin", G_CALLBACK(layer_element_drag_begin), NULL); |  | ||||||
| 	g_signal_connect(self->priv.event_handle, "drag-data-get", G_CALLBACK(layer_element_drag_data_get), NULL); |  | ||||||
| 	g_signal_connect(self->priv.event_handle, "drag-end", G_CALLBACK(layer_element_drag_end), NULL); |  | ||||||
|  |  | ||||||
| 	g_object_unref(builder); | 	g_object_unref(builder); | ||||||
| } | } | ||||||
|  |  | ||||||
| @@ -194,4 +128,19 @@ void layer_element_set_color(LayerElement *elem, GdkRGBA *rgba) | |||||||
| 	gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(elem->priv.color), rgba); | 	gtk_color_chooser_set_rgba(GTK_COLOR_CHOOSER(elem->priv.color), rgba); | ||||||
| } | } | ||||||
|  |  | ||||||
|  | void layer_element_set_dnd_callbacks(LayerElement *elem, GtkTargetEntry *entries, int entry_count, | ||||||
|  | 				     void (*drag_begin)(GtkWidget *, GdkDragContext *, gpointer), | ||||||
|  | 				     void (*drag_data_get)(GtkWidget *, GdkDragContext *, | ||||||
|  | 							   GtkSelectionData *, guint , guint, gpointer), | ||||||
|  | 				     void (*drag_end)(GtkWidget *, GdkDragContext *, gpointer)) | ||||||
|  | { | ||||||
|  | 	/* Setup drag and drop */ | ||||||
|  | 	gtk_style_context_add_class (gtk_widget_get_style_context(GTK_WIDGET(elem)), "row"); | ||||||
|  | 	gtk_drag_source_set(GTK_WIDGET(elem->priv.event_handle), GDK_BUTTON1_MASK, entries, entry_count, GDK_ACTION_MOVE); | ||||||
|  | 	g_signal_connect(elem->priv.event_handle, "drag-begin", G_CALLBACK(drag_begin), NULL); | ||||||
|  | 	g_signal_connect(elem->priv.event_handle, "drag-data-get", G_CALLBACK(drag_data_get), NULL); | ||||||
|  | 	g_signal_connect(elem->priv.event_handle, "drag-end", G_CALLBACK(drag_end), NULL); | ||||||
|  |  | ||||||
|  | } | ||||||
|  |  | ||||||
| /** @} */ | /** @} */ | ||||||
|   | |||||||
| @@ -118,6 +118,18 @@ void layer_element_get_color(LayerElement *elem, GdkRGBA *rgba); | |||||||
|  */ |  */ | ||||||
| void layer_element_set_color(LayerElement *elem, GdkRGBA *rgba); | void layer_element_set_color(LayerElement *elem, GdkRGBA *rgba); | ||||||
|  |  | ||||||
|  | /** | ||||||
|  |  * @brief layer_element_set_dnd_callbacks | ||||||
|  |  * @param elem | ||||||
|  |  * @param entries | ||||||
|  |  * @param entry_count | ||||||
|  |  */ | ||||||
|  | void layer_element_set_dnd_callbacks(LayerElement *elem, GtkTargetEntry *entries, int entry_count, | ||||||
|  | 				     void (*drag_begin)(GtkWidget *, GdkDragContext *, gpointer), | ||||||
|  | 				     void (*drag_data_get)(GtkWidget *, GdkDragContext *, | ||||||
|  | 							   GtkSelectionData *, guint , guint, gpointer), | ||||||
|  | 				     void (*drag_end)(GtkWidget *, GdkDragContext *, gpointer)); | ||||||
|  |  | ||||||
| G_END_DECLS | G_END_DECLS | ||||||
|  |  | ||||||
| #endif /* __LAYER_ELEMENT_H__ */ | #endif /* __LAYER_ELEMENT_H__ */ | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user