diff --git a/gui/treeview.c b/gui/treeview.c index d6ddd2da..5d3b6b7b 100644 --- a/gui/treeview.c +++ b/gui/treeview.c @@ -160,6 +160,43 @@ void __gui_treeview_row_activated(GtkTreeView *treeview, GtkTreePath *path, can_scroll = true; } +void __gui_treeview_drag_data_received(GtkTreeView *treeview, GdkDragContext *context, + gint x, gint y, GtkSelectionData *data, + guint info, guint time, gpointer user_data) +{ + struct gui_model_drag_data *drag_data; + unsigned int to, from; + GtkTreePath *path; + + drag_data = (void *)gtk_selection_data_get_data(data); + if (gtk_tree_view_get_path_at_pos(gui_treeview(), x, y, + &path, NULL, NULL, NULL)) + gtk_tree_path_prev(path); + else if (!gtk_tree_view_get_visible_range(gui_treeview(), NULL, &path)) + return; + + from = drag_data->drag_row; + to = gui_filter_path_get_index(path); + + if (playlist_rearrange(gui_model_get_playlist(), from, to)) { + gtk_tree_selection_unselect_all(gui_treeview_selection()); + gtk_tree_selection_select_path(gui_treeview_selection(), path); + __gui_treeview_set_sort_indicators(); + } + + g_signal_stop_emission_by_name(treeview, "drag_data_received"); + gtk_drag_finish(context, true, true, time); + gtk_tree_path_free(path); +} + +bool __gui_treeview_drag_drop(GtkTreeView *treeview, GdkDragContext *context, + gint x, gint y, guint time, gpointer user_data) +{ + gtk_drag_get_data(GTK_WIDGET(treeview), context, + gdk_atom_intern(GUI_DRAG_DATA, false), time); + return true; +} + void gui_treeview_init() { GtkTreeViewColumn *col; @@ -170,6 +207,9 @@ void gui_treeview_init() gtk_tree_view_enable_model_drag_source(gui_treeview(), GDK_BUTTON1_MASK, gui_model_drag_targets, gui_model_n_targets, GDK_ACTION_MOVE); + gtk_tree_view_enable_model_drag_dest(gui_treeview(), + gui_model_drag_targets, gui_model_n_targets, + GDK_ACTION_MOVE); for (i = 0; i < GUI_MODEL_N_COLUMNS; i++) { col = gtk_tree_view_get_column(gui_treeview(), i); diff --git a/share/ocarina/ocarina.ui b/share/ocarina/ocarina.ui index 08ed48b7..50e8cce7 100644 --- a/share/ocarina/ocarina.ui +++ b/share/ocarina/ocarina.ui @@ -912,6 +912,8 @@ audio-volume-medium True 9 + +