diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-16 00:35:46 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2009-06-16 00:35:46 +0000 |
commit | 47c0eacb10c03f3a89c7b341c643526325b2b750 (patch) | |
tree | 8d01da0da1c07a1dee1e2a70e13c865f24406fb7 /chrome/browser | |
parent | 39ff42c1ffa0675933776c49ad66630a8701b385 (diff) | |
download | chromium_src-47c0eacb10c03f3a89c7b341c643526325b2b750.zip chromium_src-47c0eacb10c03f3a89c7b341c643526325b2b750.tar.gz chromium_src-47c0eacb10c03f3a89c7b341c643526325b2b750.tar.bz2 |
Bookmark dragging cleanup.
bookmark bar:
- re-show on buttons when done dragging
- match g_object_ref in drag-begin with g_object_unref in drag-end
bookmark manager:
- get rid of default tree view drag handling (we override it all anyway, and it was causing problems)
- fix index out of bounds crash
- when you drag onto a folder, add it at the end of the folder rather than the beginning.
TEST=single bookmark dragging should be fully functional, non crashing
BUG=14019
Review URL: http://codereview.chromium.org/126163
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@18463 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser')
-rw-r--r-- | chrome/browser/gtk/bookmark_bar_gtk.cc | 4 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_manager_gtk.cc | 53 | ||||
-rw-r--r-- | chrome/browser/gtk/bookmark_manager_gtk.h | 2 |
3 files changed, 33 insertions, 26 deletions
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.cc b/chrome/browser/gtk/bookmark_bar_gtk.cc index 33279bd..08bd6fb 100644 --- a/chrome/browser/gtk/bookmark_bar_gtk.cc +++ b/chrome/browser/gtk/bookmark_bar_gtk.cc @@ -632,6 +632,8 @@ void BookmarkBarGtk::OnButtonDragBegin(GtkWidget* button, void BookmarkBarGtk::OnButtonDragEnd(GtkWidget* button, GdkDragContext* drag_context, BookmarkBarGtk* bar) { + gtk_widget_show(button); + if (bar->toolbar_drop_item_) { g_object_unref(bar->toolbar_drop_item_); bar->toolbar_drop_item_ = NULL; @@ -639,6 +641,8 @@ void BookmarkBarGtk::OnButtonDragEnd(GtkWidget* button, DCHECK(bar->dragged_node_); bar->dragged_node_ = NULL; + + g_object_unref(button->parent); } // static diff --git a/chrome/browser/gtk/bookmark_manager_gtk.cc b/chrome/browser/gtk/bookmark_manager_gtk.cc index edc10ed..ed1c614 100644 --- a/chrome/browser/gtk/bookmark_manager_gtk.cc +++ b/chrome/browser/gtk/bookmark_manager_gtk.cc @@ -112,11 +112,7 @@ void BookmarkManagerGtk::BookmarkNodeAdded(BookmarkModel* model, // Update right store. if (parent->id() == GetFolder()->id()) { - GtkTreeIter iter = { 0, }; - if (RecursiveFind(GTK_TREE_MODEL(right_store_), &iter, - parent->GetChild(index - 1)->id())) { - AppendNodeToRightStore(node, &iter); - } + AppendNodeToRightStore(node, index); } } @@ -312,24 +308,24 @@ GtkWidget* BookmarkManagerGtk::MakeRightPane() { g_signal_connect(right_selection(), "changed", G_CALLBACK(OnRightSelectionChanged), this); - gtk_tree_view_enable_model_drag_source(GTK_TREE_VIEW(right_tree_view_), - GDK_BUTTON1_MASK, - bookmark_utils::kTargetTable, - bookmark_utils::kTargetTableSize, - GDK_ACTION_MOVE); - gtk_tree_view_enable_model_drag_dest(GTK_TREE_VIEW(right_tree_view_), - bookmark_utils::kTargetTable, - bookmark_utils::kTargetTableSize, - GDK_ACTION_MOVE); + // TODO(estade): support GDK_ACTION_COPY for dragging to other apps. + gtk_drag_source_set(right_tree_view_, + GDK_BUTTON1_MASK, + bookmark_utils::kTargetTable, + bookmark_utils::kTargetTableSize, + GDK_ACTION_MOVE); + gtk_drag_dest_set(right_tree_view_, GTK_DEST_DEFAULT_ALL, + bookmark_utils::kTargetTable, + bookmark_utils::kTargetTableSize, + GDK_ACTION_MOVE); g_signal_connect(right_tree_view_, "drag-data-get", G_CALLBACK(&OnRightTreeViewDragGet), this); g_signal_connect(right_tree_view_, "drag-data-received", G_CALLBACK(&OnRightTreeViewDragReceived), this); g_signal_connect(right_tree_view_, "drag-motion", G_CALLBACK(&OnRightTreeViewDragMotion), this); - // Connect after so we can overwrite the drag icon. - g_signal_connect_after(right_tree_view_, "drag-begin", - G_CALLBACK(&OnRightTreeViewDragBegin), this); + g_signal_connect(right_tree_view_, "drag-begin", + G_CALLBACK(&OnRightTreeViewDragBegin), this); GtkWidget* scrolled = gtk_scrolled_window_new(NULL, NULL); gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(scrolled), @@ -356,11 +352,9 @@ void BookmarkManagerGtk::BuildRightStore() { // or search), but until then we require that node != NULL. DCHECK(node); gtk_list_store_clear(right_store_); - GtkTreeIter iter; - for (int i = 0; i < node->GetChildCount(); ++i) { - AppendNodeToRightStore(node->GetChild(i), &iter); - } + for (int i = 0; i < node->GetChildCount(); ++i) + AppendNodeToRightStore(node->GetChild(i), i); } BookmarkNode* BookmarkManagerGtk::GetNodeAt(GtkTreeModel* model, @@ -401,10 +395,19 @@ std::vector<BookmarkNode*> BookmarkManagerGtk::GetRightSelection() { } void BookmarkManagerGtk::AppendNodeToRightStore(BookmarkNode* node, - GtkTreeIter* iter) { + int index) { + GtkTreeIter iter; + if (index == 0) { + gtk_tree_model_get_iter_first(GTK_TREE_MODEL(right_store_), &iter); + gtk_list_store_prepend(right_store_, &iter); + } else { + gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(right_store_), &iter, NULL, + index - 1); + gtk_list_store_append(right_store_, &iter); + } + GdkPixbuf* pixbuf = bookmark_utils::GetPixbufForNode(node, model_); - gtk_list_store_append(right_store_, iter); - gtk_list_store_set(right_store_, iter, + gtk_list_store_set(right_store_, &iter, RIGHT_PANE_PIXBUF, pixbuf, RIGHT_PANE_TITLE, WideToUTF8(node->GetTitle()).c_str(), RIGHT_PANE_URL, node->GetURL().spec().c_str(), @@ -516,7 +519,7 @@ void BookmarkManagerGtk::OnLeftTreeViewDragReceived( it != nodes.end(); ++it) { // Don't try to drop a node into one of its descendants. if (!folder->HasAncestor(*it)) - bm->model_->Move(*it, folder, 0); + bm->model_->Move(*it, folder, folder->GetChildCount()); } gtk_tree_path_free(path); diff --git a/chrome/browser/gtk/bookmark_manager_gtk.h b/chrome/browser/gtk/bookmark_manager_gtk.h index d2865bb..8d85789 100644 --- a/chrome/browser/gtk/bookmark_manager_gtk.h +++ b/chrome/browser/gtk/bookmark_manager_gtk.h @@ -76,7 +76,7 @@ class BookmarkManagerGtk : public BookmarkModelObserver { std::vector<BookmarkNode*> GetRightSelection(); // Stick node in the store that backs the right-side tree view. - void AppendNodeToRightStore(BookmarkNode* node, GtkTreeIter* iter); + void AppendNodeToRightStore(BookmarkNode* node, int index); GtkTreeSelection* left_selection() { return gtk_tree_view_get_selection(GTK_TREE_VIEW(left_tree_view_)); |