summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/bookmark_bar_gtk.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-08 21:06:14 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2009-07-08 21:06:14 +0000
commit877b0af33e0379bc6b381d37cfdb2c17079c5bf4 (patch)
treece6a152ed866f07f621675a5c64866105665faf3 /chrome/browser/gtk/bookmark_bar_gtk.cc
parent5be20ecdd5b71ecfc80639e5656878bd52a0a0b1 (diff)
downloadchromium_src-877b0af33e0379bc6b381d37cfdb2c17079c5bf4.zip
chromium_src-877b0af33e0379bc6b381d37cfdb2c17079c5bf4.tar.gz
chromium_src-877b0af33e0379bc6b381d37cfdb2c17079c5bf4.tar.bz2
GTK: Allow user to drag onto folder in bookmark bar.
This is only half of the bug fix. We also should match windows in that a drag held over a folder for more than a second or so shows the folder's contents and allows the user to continue the drag into the folder. Also, it's kind of hard to use this new feature since the bookmark items float around when you are dragging out of the same bookmark bar you're dragging into, but the fix for that would be separate (and would require some design decisions). BUG=14222 TEST=drag single or multiple bookmarks onto a bookmark bar folder Review URL: http://codereview.chromium.org/149307 git-svn-id: svn://svn.chromium.org/chrome/trunk/src@20186 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/bookmark_bar_gtk.cc')
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.cc31
1 files changed, 31 insertions, 0 deletions
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.cc b/chrome/browser/gtk/bookmark_bar_gtk.cc
index 1a36e71..9151986 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.cc
+++ b/chrome/browser/gtk/bookmark_bar_gtk.cc
@@ -440,6 +440,12 @@ GtkToolItem* BookmarkBarGtk::CreateBookmarkToolItem(const BookmarkNode* node) {
}
void BookmarkBarGtk::ConnectFolderButtonEvents(GtkWidget* widget) {
+ gtk_drag_dest_set(widget, GTK_DEST_DEFAULT_ALL, NULL, 0, GDK_ACTION_MOVE);
+ GtkDndUtil::SetDestTargetListFromCodeMask(widget,
+ GtkDndUtil::X_CHROME_BOOKMARK_ITEM);
+ g_signal_connect(widget, "drag-data-received",
+ G_CALLBACK(&OnFolderDragReceived), this);
+
// Connect to 'button-release-event' instead of 'clicked' because we need
// access to the modifier keys and we do different things on each
// button.
@@ -646,6 +652,31 @@ gboolean BookmarkBarGtk::OnFolderButtonReleased(GtkWidget* sender,
}
// static
+void BookmarkBarGtk::OnFolderDragReceived(GtkWidget* widget,
+ GdkDragContext* context, gint x, gint y, GtkSelectionData* selection_data,
+ guint target_type, guint time, BookmarkBarGtk* bar) {
+ gboolean dnd_success = FALSE;
+ gboolean delete_selection_data = FALSE;
+
+ const BookmarkNode* dest_node = bar->GetNodeForToolButton(widget);
+ DCHECK(dest_node->is_folder());
+ std::vector<const BookmarkNode*> nodes =
+ bookmark_utils::GetNodesFromSelection(context, selection_data,
+ target_type,
+ bar->profile_,
+ &delete_selection_data,
+ &dnd_success);
+ DCHECK(!nodes.empty());
+
+ for (std::vector<const BookmarkNode*>::iterator it = nodes.begin();
+ it != nodes.end(); ++it) {
+ bar->model_->Move(*it, dest_node, dest_node->GetChildCount());
+ }
+
+ gtk_drag_finish(context, dnd_success, delete_selection_data, time);
+}
+
+// static
gboolean BookmarkBarGtk::OnToolbarExpose(GtkWidget* widget,
GdkEventExpose* event,
BookmarkBarGtk* bar) {