]> Pileus Git - ~andy/gtk/commitdiff
GtkFileChooser search fixes and recent files support. (#435342)
authorEmmanuele Bassi <ebassi@gnome.org>
Fri, 11 May 2007 19:44:32 +0000 (19:44 +0000)
committerEmmanuele Bassi <ebassi@src.gnome.org>
Fri, 11 May 2007 19:44:32 +0000 (19:44 +0000)
2007-05-11  Emmanuele Bassi  <ebassi@gnome.org>

GtkFileChooser search fixes and recent files support.  (#435342)

* gtk/gtkfilechooserdefault.c: Support drag and drop for
adding shortcuts of folders when in search or recent files
mode.

svn path=/trunk/; revision=17829

ChangeLog
gtk/gtkfilechooserdefault.c

index 21588746ee0a3731f98acdffa6dd96050f3c455e..b4025e6dd3430c47f35d75d6b54bce042193b220 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+2007-05-11  Emmanuele Bassi  <ebassi@gnome.org>
+
+       GtkFileChooser search fixes and recent files support.  (#435342)
+       
+       * gtk/gtkfilechooserdefault.c: Support drag and drop for
+       adding shortcuts of folders when in search or recent files
+       mode.
+
 2007-05-11  Emmanuele Bassi  <ebassi@gnome.org>
 
        GtkFileChooser search fixes and recent files support.  (#435342)
index 159a0628a55f047e338fcca1b1f5346176ab0865..d62981e6646dcc017015385d8a19477f5201f80f 100644 (file)
@@ -261,6 +261,13 @@ static const GtkTargetEntry file_list_dest_targets[] = {
 
 static const int num_file_list_dest_targets = G_N_ELEMENTS (file_list_dest_targets); 
 
+/* Target types for dragging from the recent files list */
+static const GtkTargetEntry recent_list_source_targets[] = {
+  { "text/uri-list", 0, TEXT_URI_LIST }
+};
+
+static const int num_recent_list_source_targets = G_N_ELEMENTS (recent_list_source_targets);
+
 static gboolean
 search_is_possible (GtkFileChooserDefault *impl)
 {
@@ -526,6 +533,56 @@ static GtkTreeModel *shortcuts_pane_model_filter_new (GtkFileChooserDefault *imp
                                                      GtkTreePath           *root);
 
 
+typedef struct {
+  GtkTreeModelSort parent;
+
+  GtkFileChooserDefault *impl;
+} RecentModelSort;
+
+typedef struct {
+  GtkTreeModelSortClass parent_class;
+} RecentModelSortClass;
+
+#define RECENT_MODEL_SORT_TYPE (_recent_model_sort_get_type ())
+#define RECENT_MODEL_SORT(obj) (G_TYPE_CHECK_INSTANCE_CAST ((obj), RECENT_MODEL_SORT_TYPE, RecentModelSort))
+
+static void recent_model_sort_drag_source_iface_init (GtkTreeDragSourceIface *iface);
+
+G_DEFINE_TYPE_WITH_CODE (RecentModelSort,
+                         _recent_model_sort,
+                         GTK_TYPE_TREE_MODEL_SORT,
+                         G_IMPLEMENT_INTERFACE (GTK_TYPE_TREE_DRAG_SOURCE,
+                                                recent_model_sort_drag_source_iface_init));
+
+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);
+
+\f
 
 G_DEFINE_TYPE_WITH_CODE (GtkFileChooserDefault, _gtk_file_chooser_default, GTK_TYPE_VBOX,
                         G_IMPLEMENT_INTERFACE (GTK_TYPE_FILE_CHOOSER,
@@ -9066,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,
@@ -9553,7 +9610,7 @@ recent_setup_model (GtkFileChooserDefault *impl)
    * real data inside the model.
    */
   impl->recent_model_sort =
-    GTK_TREE_MODEL_SORT (gtk_tree_model_sort_new_with_model (GTK_TREE_MODEL (impl->recent_model_filter)));
+    GTK_TREE_MODEL_SORT (recent_model_sort_new (impl, GTK_TREE_MODEL (impl->recent_model_filter)));
   gtk_tree_sortable_set_sort_func (GTK_TREE_SORTABLE (impl->recent_model_sort),
                                    RECENT_MODEL_COL_INFO,
                                    recent_column_mtime_sort_func,
@@ -11148,3 +11205,175 @@ shortcuts_pane_model_filter_new (GtkFileChooserDefault *impl,
 
   return GTK_TREE_MODEL (model);
 }
+
+\f
+
+static gboolean
+recent_model_sort_row_draggable (GtkTreeDragSource *drag_source,
+                                 GtkTreePath       *path)
+{
+  RecentModelSort *model;
+  GtkTreeIter iter, child_iter;
+  gboolean is_folder;
+
+  model = RECENT_MODEL_SORT (drag_source);
+  if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path))
+    return FALSE;
+
+  recent_get_valid_child_iter (model->impl, &child_iter, &iter);
+  gtk_tree_model_get (GTK_TREE_MODEL (model->impl->recent_model), &child_iter,
+                      RECENT_MODEL_COL_IS_FOLDER, &is_folder,
+                      -1);
+
+  return is_folder;
+}
+
+static gboolean
+recent_model_sort_drag_data_get (GtkTreeDragSource *drag_source,
+                                 GtkTreePath       *path,
+                                GtkSelectionData  *selection_data)
+{
+  RecentModelSort *model;
+  GtkTreeIter iter, child_iter;
+  GtkFilePath *file_path;
+  gchar **uris;
+
+  model = RECENT_MODEL_SORT (drag_source);
+  if (!gtk_tree_model_get_iter (GTK_TREE_MODEL (model), &iter, path))
+    return FALSE;
+
+  recent_get_valid_child_iter (model->impl, &child_iter, &iter);
+  gtk_tree_model_get (GTK_TREE_MODEL (model->impl->recent_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
+recent_model_sort_drag_source_iface_init (GtkTreeDragSourceIface *iface)
+{
+  iface->row_draggable = recent_model_sort_row_draggable;
+  iface->drag_data_get = recent_model_sort_drag_data_get;
+}
+
+static void
+_recent_model_sort_class_init (RecentModelSortClass *klass)
+{
+
+}
+
+static void
+_recent_model_sort_init (RecentModelSort *model)
+{
+  model->impl = NULL;
+}
+
+static GtkTreeModel *
+recent_model_sort_new (GtkFileChooserDefault *impl,
+                       GtkTreeModel          *child_model)
+{
+  RecentModelSort *model;
+
+  model = g_object_new (RECENT_MODEL_SORT_TYPE,
+                        "model", child_model,
+                        NULL);
+  model->impl = impl;
+
+  return GTK_TREE_MODEL (model);
+}
+
+\f
+
+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);
+}