From bba0eb7116f1c3d2bbc31baf4b9948dd1f783dc5 Mon Sep 17 00:00:00 2001 From: Emmanuele Bassi Date: Fri, 11 May 2007 18:17:16 +0100 Subject: [PATCH] Add shortcut via drag and drop in search mode Like for OPERATION_MODE_RECENT, subclass GtkTreeModelSort to override GtkTreeDragSourceIface vfuncs and allow dragging and dropping rows containing folders from the search list to the shortcut pane. --- gtk/gtkfilechooserdefault.c | 114 ++++++++++++++++++++++++++++++++++++++++++- 1 files changed, 113 insertions(+), 1 deletions(-) diff --git a/gtk/gtkfilechooserdefault.c b/gtk/gtkfilechooserdefault.c index f4b5ed8..d62981e 100644 --- a/gtk/gtkfilechooserdefault.c +++ b/gtk/gtkfilechooserdefault.c @@ -558,6 +558,32 @@ static GtkTreeModel *recent_model_sort_new (GtkFileChooserDefault *impl, GtkTreeModel *child_model); +typedef struct { + GtkTreeModelSort parent; + + GtkFileChooserDefault *impl; +} SearchModelSort; + +typedef struct { + GtkTreeModelSortClass parent_class; +} SearchModelSortClass; + +#define SEARCH_MODEL_SORT_TYPE (_search_model_sort_get_type ()) +#define SEARCH_MODEL_SORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), SEARCH_MODEL_SORT_TYPE, SearchModelSort)) + +static void search_model_sort_drag_source_iface_init (GtkTreeDragSourceIface *iface); + +G_DEFINE_TYPE_WITH_CODE (SearchModelSort, + _search_model_sort, + GTK_TYPE_TREE_MODEL_SORT, + G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE, + search_model_sort_drag_source_iface_init)); + +static GtkTreeModel *search_model_sort_new (GtkFileChooserDefault *impl, + GtkTreeModel *child_model); + + + G_DEFINE_TYPE_WITH_CODE (GtkFileChooserDefault, _gtk_file_chooser_default, GTK_TYPE_VBOX, G_IMPLEMENT_INTERFACE (GTK_TYPE_FILE_CHOOSER, gtk_file_chooser_default_iface_init) @@ -9097,7 +9123,7 @@ search_setup_model (GtkFileChooserDefault *impl) impl, NULL); impl->search_model_sort = - GTK_TREE_MODEL_SORT (gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (impl->search_model_filter))); + GTK_TREE_MODEL_SORT (search_model_sort_new (impl, GTK_TREE_MODEL (impl->search_model_filter))); gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->search_model_sort), SEARCH_MODEL_COL_PATH, search_column_path_sort_func, @@ -11265,3 +11291,89 @@ recent_model_sort_new (GtkFileChooserDefault *impl, return GTK_TREE_MODEL (model); } + + + +static gboolean +search_model_sort_row_draggable (GtkTreeDragSource *drag_source, + GtkTreePath *path) +{ + SearchModelSort *model; + GtkTreeIter iter, child_iter; + gboolean is_folder; + + model = SEARCH_MODEL_SORT (drag_source); + if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path)) + return FALSE; + + search_get_valid_child_iter (model->impl, &child_iter, &iter); + gtk_tree_model_get (GTK_TREE_MODEL (model->impl->search_model), &child_iter, + SEARCH_MODEL_COL_IS_FOLDER, &is_folder, + -1); + + return is_folder; +} + +static gboolean +search_model_sort_drag_data_get (GtkTreeDragSource *drag_source, + GtkTreePath *path, + GtkSelectionData *selection_data) +{ + SearchModelSort *model; + GtkTreeIter iter, child_iter; + GtkFilePath *file_path; + gchar **uris; + + model = SEARCH_MODEL_SORT (drag_source); + if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path)) + return FALSE; + + search_get_valid_child_iter (model->impl, &child_iter, &iter); + gtk_tree_model_get (GTK_TREE_MODEL (model->impl->search_model), &child_iter, + RECENT_MODEL_COL_PATH, &file_path, + -1); + g_assert (file_path != NULL); + + uris = g_new (gchar *, 2); + uris[0] = gtk_file_system_path_to_uri (model->impl->file_system, file_path); + uris[1] = NULL; + + gtk_selection_data_set_uris (selection_data, uris); + + g_strfreev (uris); + + return TRUE; +} + +static void +search_model_sort_drag_source_iface_init (GtkTreeDragSourceIface *iface) +{ + iface->row_draggable = search_model_sort_row_draggable; + iface->drag_data_get = search_model_sort_drag_data_get; +} + +static void +_search_model_sort_class_init (SearchModelSortClass *klass) +{ + +} + +static void +_search_model_sort_init (SearchModelSort *model) +{ + model->impl = NULL; +} + +static GtkTreeModel * +search_model_sort_new (GtkFileChooserDefault *impl, + GtkTreeModel *child_model) +{ + SearchModelSort *model; + + model = g_object_new (SEARCH_MODEL_SORT_TYPE, + "model", child_model, + NULL); + model->impl = impl; + + return GTK_TREE_MODEL (model); +} -- 1.4.4.2