diff options
author | Carlos Soriano <csoriano@gnome.org> | 2015-05-11 19:12:32 +0200 |
---|---|---|
committer | Carlos Soriano <csoriano@gnome.org> | 2015-06-16 16:19:37 +0200 |
commit | 4499174e32f73aeb24494c3e8d309c7486170cd7 (patch) | |
tree | 4f60bb5134d4e732fbb4b671827a3a9afc68a03a /gtk/gtkplacessidebar.c | |
parent | fb034f38b31e31b1e4a4cc67889d45ee8615ade4 (diff) | |
download | gtk+-4499174e32f73aeb24494c3e8d309c7486170cd7.tar.gz |
gtkplacessidebar: make insensitive invalid drop targets
https://bugzilla.gnome.org/show_bug.cgi?id=747793
Diffstat (limited to 'gtk/gtkplacessidebar.c')
-rw-r--r-- | gtk/gtkplacessidebar.c | 55 |
1 files changed, 54 insertions, 1 deletions
diff --git a/gtk/gtkplacessidebar.c b/gtk/gtkplacessidebar.c index 959de450cf..a2ba83d6f5 100644 --- a/gtk/gtkplacessidebar.c +++ b/gtk/gtkplacessidebar.c @@ -219,6 +219,7 @@ enum { PLACES_SIDEBAR_COLUMN_TOOLTIP, PLACES_SIDEBAR_COLUMN_SECTION_TYPE, PLACES_SIDEBAR_COLUMN_HEADING_TEXT, + PLACES_SIDEBAR_COLUMN_SENSITIVE, PLACES_SIDEBAR_COLUMN_COUNT }; @@ -525,6 +526,7 @@ add_place (GtkPlacesSidebar *sidebar, PLACES_SIDEBAR_COLUMN_BOOKMARK, place_type != PLACES_BOOKMARK, PLACES_SIDEBAR_COLUMN_TOOLTIP, tooltip_escaped, PLACES_SIDEBAR_COLUMN_SECTION_TYPE, section_type, + PLACES_SIDEBAR_COLUMN_SENSITIVE, TRUE, -1); g_free (tooltip_escaped); @@ -1441,6 +1443,50 @@ pos_is_into_or_before (GtkTreeViewDropPosition pos) return (pos == GTK_TREE_VIEW_DROP_BEFORE || pos == GTK_TREE_VIEW_DROP_INTO_OR_BEFORE); } +static void +update_possible_drop_targets (GtkPlacesSidebar *sidebar, + gboolean dragging) +{ + GtkTreeIter iter; + PlaceType place_type; + gchar *uri; + gboolean sensitive; + + if (!gtk_tree_model_get_iter_first (GTK_TREE_MODEL (sidebar->store), &iter)) + return; + + do + { + sensitive = TRUE; + gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter, + PLACES_SIDEBAR_COLUMN_ROW_TYPE, &place_type, + PLACES_SIDEBAR_COLUMN_URI, &uri, + -1); + if (dragging) + { + switch (place_type) + { + case PLACES_CONNECT_TO_SERVER: + sensitive = FALSE; + break; + case PLACES_BUILT_IN: + if (g_strcmp0 (uri, "recent:///") == 0) + sensitive = FALSE; + + break; + default: + break; + } + } + + gtk_list_store_set (sidebar->store, &iter, + PLACES_SIDEBAR_COLUMN_SENSITIVE, sensitive, + -1); + g_free (uri); + } + while (gtk_tree_model_iter_next (GTK_TREE_MODEL (sidebar->store), &iter)); +} + /* Computes the appropriate row and position for dropping */ static gboolean compute_drop_position (GtkTreeView *tree_view, @@ -1715,12 +1761,15 @@ start_drop_feedback (GtkPlacesSidebar *sidebar, show_new_bookmark_row (sidebar, path); else gtk_tree_view_set_drag_dest_row (sidebar->tree_view, path, pos); + + update_possible_drop_targets (sidebar, TRUE); } static void stop_drop_feedback (GtkPlacesSidebar *sidebar) { gtk_tree_view_set_drag_dest_row (sidebar->tree_view, NULL, 0); + update_possible_drop_targets (sidebar, FALSE); } static gboolean @@ -4191,6 +4240,7 @@ gtk_places_sidebar_init (GtkPlacesSidebar *sidebar) gtk_tree_view_column_pack_start (col, cell, FALSE); gtk_tree_view_column_set_attributes (col, cell, "gicon", PLACES_SIDEBAR_COLUMN_GICON, + "sensitive", PLACES_SIDEBAR_COLUMN_SENSITIVE, NULL); gtk_tree_view_column_set_cell_data_func (col, cell, icon_cell_renderer_func, @@ -4236,6 +4286,7 @@ gtk_places_sidebar_init (GtkPlacesSidebar *sidebar) "text", PLACES_SIDEBAR_COLUMN_NAME, "visible", PLACES_SIDEBAR_COLUMN_NO_EJECT, "editable-set", PLACES_SIDEBAR_COLUMN_BOOKMARK, + "sensitive", PLACES_SIDEBAR_COLUMN_SENSITIVE, NULL); g_object_set (cell, "ellipsize", PANGO_ELLIPSIZE_END, @@ -4851,7 +4902,8 @@ shortcuts_model_new (GtkPlacesSidebar *sidebar) G_TYPE_BOOLEAN, G_TYPE_STRING, G_TYPE_INT, - G_TYPE_STRING + G_TYPE_STRING, + G_TYPE_BOOLEAN }; model = g_object_new (shortcuts_model_get_type (), NULL); @@ -5449,6 +5501,7 @@ gtk_places_sidebar_set_drop_targets_visible (GtkPlacesSidebar *sidebar, if (visible) { show_new_bookmark_row (sidebar, NULL); + update_possible_drop_targets (sidebar, TRUE); sidebar->drop_state = DROP_STATE_NEW_BOOKMARK_ARMED_PERMANENT; } else |