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
+
+