summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Neumair <cneumair@gnome.org>2008-07-09 19:52:52 +0000
committerChristian Neumair <cneumair@src.gnome.org>2008-07-09 19:52:52 +0000
commitc1dde067de31ac0d8471cafdcbf3599c01236530 (patch)
treeec87968e9bd054f396d51b2f6c10c2c810b54988
parente56e2514d45221376ff3d41fd73888fd48afb496 (diff)
downloadnautilus-c1dde067de31ac0d8471cafdcbf3599c01236530.tar.gz
Bookmark DND fix galore. Properly handle reordering when non-existing
2008-07-09 Christian Neumair <cneumair@gnome.org> * src/nautilus-places-sidebar.c (compute_drop_position), (drag_motion_callback), (reorder_bookmarks), (drag_data_received_callback), (nautilus_places_sidebar_init): Bookmark DND fix galore. Properly handle reordering when non-existing bookmarks are present. They are ignored by the view, but not by the Nautilus bookmark list. Make DND indication consistent with the GTK+ file chooser. svn path=/trunk/; revision=14332
-rw-r--r--ChangeLog10
-rw-r--r--src/nautilus-places-sidebar.c78
2 files changed, 60 insertions, 28 deletions
diff --git a/ChangeLog b/ChangeLog
index f2359f815..2231263a7 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,15 @@
2008-07-09 Christian Neumair <cneumair@gnome.org>
+ * src/nautilus-places-sidebar.c (compute_drop_position),
+ (drag_motion_callback), (reorder_bookmarks),
+ (drag_data_received_callback), (nautilus_places_sidebar_init):
+ Bookmark DND fix galore. Properly handle reordering when non-existing
+ bookmarks are present. They are ignored by the view, but not by the
+ Nautilus bookmark list. Make DND indication consistent with the GTK+
+ file chooser.
+
+2008-07-09 Christian Neumair <cneumair@gnome.org>
+
* libnautilus-private/nautilus-window-slot-info.h:
Actually add it.
diff --git a/src/nautilus-places-sidebar.c b/src/nautilus-places-sidebar.c
index 7ad698583..0bdf71634 100644
--- a/src/nautilus-places-sidebar.c
+++ b/src/nautilus-places-sidebar.c
@@ -72,6 +72,7 @@ typedef struct {
/* DnD */
GList *drag_list;
gboolean drag_data_received;
+ int drag_data_info;
gboolean drop_occured;
GtkWidget *popup_menu;
@@ -748,19 +749,19 @@ compute_drop_position (GtkTreeView *tree_view,
NautilusPlacesSidebar *sidebar)
{
int bookmarks_index;
- int num_bookmarks;
+ int num_rows;
int row;
bookmarks_index = get_bookmark_index (tree_view);
- num_bookmarks = nautilus_bookmark_list_length (sidebar->bookmarks);
+ num_rows = gtk_tree_model_iter_n_children (GTK_TREE_MODEL (sidebar->filter_model), NULL);
if (!gtk_tree_view_get_dest_row_at_pos (tree_view,
x,
y,
path,
pos)) {
- row = bookmarks_index + num_bookmarks - 1;
+ row = num_rows - 1;
*path = gtk_tree_path_new_from_indices (row, -1);
*pos = GTK_TREE_VIEW_DROP_AFTER;
return;
@@ -769,12 +770,19 @@ compute_drop_position (GtkTreeView *tree_view,
row = *gtk_tree_path_get_indices (*path);
gtk_tree_path_free (*path);
- if (row < bookmarks_index) {
+ if (row == bookmarks_index - 1) {
+ /* Only allow to drop after separator */
+ *pos = GTK_TREE_VIEW_DROP_AFTER;
+ } else if (row < bookmarks_index) {
/* Hardcoded shortcuts can only be dragged into */
*pos = GTK_TREE_VIEW_DROP_INTO_OR_BEFORE;
- }
- else if (row > bookmarks_index + num_bookmarks - 1) {
- row = bookmarks_index + num_bookmarks - 1;
+ } else if (row >= num_rows) {
+ row = num_rows - 1;
+ *pos = GTK_TREE_VIEW_DROP_AFTER;
+ } else if (*pos != GTK_TREE_VIEW_DROP_BEFORE &&
+ sidebar->drag_data_received &&
+ sidebar->drag_data_info == GTK_TREE_MODEL_ROW) {
+ /* bookmark rows are never dragged into other bookmark rows */
*pos = GTK_TREE_VIEW_DROP_AFTER;
}
@@ -867,7 +875,10 @@ drag_motion_callback (GtkTreeView *tree_view,
if (pos == GTK_TREE_VIEW_DROP_BEFORE ||
pos == GTK_TREE_VIEW_DROP_AFTER ) {
- if (can_accept_items_as_bookmarks (sidebar->drag_list)) {
+ if (sidebar->drag_data_received &&
+ sidebar->drag_data_info == GTK_TREE_MODEL_ROW) {
+ action = GDK_ACTION_MOVE;
+ } else if (can_accept_items_as_bookmarks (sidebar->drag_list)) {
action = GDK_ACTION_COPY;
} else {
action = 0;
@@ -1030,26 +1041,25 @@ reorder_bookmarks (NautilusPlacesSidebar *sidebar,
int new_position)
{
GtkTreeIter iter;
- GtkTreePath *path;
NautilusBookmark *bookmark;
+ PlaceType type;
int old_position;
- int bookmarks_index;
/* Get the selected path */
if (!get_selected_iter (sidebar, &iter))
g_assert_not_reached ();
- path = gtk_tree_model_get_path (GTK_TREE_MODEL (sidebar->store), &iter);
- old_position = *gtk_tree_path_get_indices (path);
- gtk_tree_path_free (path);
+ gtk_tree_model_get (GTK_TREE_MODEL (sidebar->store), &iter,
+ PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type,
+ PLACES_SIDEBAR_COLUMN_INDEX, &old_position,
+ -1);
- bookmarks_index = get_bookmark_index (sidebar->tree_view);
- old_position -= bookmarks_index;
- if (old_position < 0) {
+ if (type != PLACES_BOOKMARK ||
+ old_position < 0 ||
+ old_position >= nautilus_bookmark_list_length (sidebar->bookmarks)) {
return;
}
- g_assert (old_position < nautilus_bookmark_list_length (sidebar->bookmarks));
/* Remove the path from the old position and insert it in the new one */
@@ -1078,10 +1088,11 @@ drag_data_received_callback (GtkWidget *widget,
GtkTreePath *tree_path;
GtkTreeViewDropPosition tree_pos;
GtkTreeIter iter;
- int position, bookmarks_index;
+ int position;
GtkTreeModel *model;
char *drop_uri;
GList *selection_list, *uris;
+ PlaceType type;
gboolean success;
tree_view = GTK_TREE_VIEW (widget);
@@ -1094,6 +1105,7 @@ drag_data_received_callback (GtkWidget *widget,
sidebar->drag_list = NULL;
}
sidebar->drag_data_received = TRUE;
+ sidebar->drag_data_info = info;
}
g_signal_stop_emission_by_name (widget, "drag-data-received");
@@ -1109,17 +1121,26 @@ drag_data_received_callback (GtkWidget *widget,
if (tree_pos == GTK_TREE_VIEW_DROP_BEFORE ||
tree_pos == GTK_TREE_VIEW_DROP_AFTER) {
- /* bookmark addition requested */
- bookmarks_index = get_bookmark_index (tree_view);
- position = *gtk_tree_path_get_indices (tree_path);
-
- if (tree_pos == GTK_TREE_VIEW_DROP_AFTER) {
+ model = gtk_tree_view_get_model (tree_view);
+
+ if (!gtk_tree_model_get_iter (model, &iter, tree_path)) {
+ goto out;
+ }
+
+ gtk_tree_model_get (model, &iter,
+ PLACES_SIDEBAR_COLUMN_ROW_TYPE, &type,
+ PLACES_SIDEBAR_COLUMN_INDEX, &position,
+ -1);
+
+ if (type != PLACES_SEPARATOR && type != PLACES_BOOKMARK) {
+ goto out;
+ }
+
+ if (type == PLACES_BOOKMARK &&
+ tree_pos == GTK_TREE_VIEW_DROP_AFTER) {
position++;
}
-
- g_assert (position >= bookmarks_index);
- position -= bookmarks_index;
-
+
switch (info) {
case TEXT_URI_LIST:
bookmarks_drop_uris (sidebar, selection_data, position);
@@ -1172,6 +1193,7 @@ drag_data_received_callback (GtkWidget *widget,
}
}
+out:
sidebar->drop_occured = FALSE;
free_drag_data (sidebar);
gtk_drag_finish (context, success, FALSE, time);
@@ -2110,7 +2132,7 @@ nautilus_places_sidebar_init (NautilusPlacesSidebar *sidebar)
cell = gtk_cell_renderer_text_new ();
gtk_tree_view_column_pack_end (col, cell, FALSE);
- g_object_set (G_OBJECT (cell), "editable", TRUE, "editable-set", TRUE, NULL);
+ g_object_set (G_OBJECT (cell), "editable", FALSE, "editable-set", TRUE, NULL);
gtk_tree_view_column_set_attributes (col, cell,
"text", PLACES_SIDEBAR_COLUMN_NAME,
"visible", PLACES_SIDEBAR_COLUMN_BELOW_SEPARATOR,