summaryrefslogtreecommitdiffstats
path: root/chrome
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
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')
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.cc31
-rw-r--r--chrome/browser/gtk/bookmark_bar_gtk.h7
2 files changed, 37 insertions, 1 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) {
diff --git a/chrome/browser/gtk/bookmark_bar_gtk.h b/chrome/browser/gtk/bookmark_bar_gtk.h
index 04c9eaa..22cfa0d 100644
--- a/chrome/browser/gtk/bookmark_bar_gtk.h
+++ b/chrome/browser/gtk/bookmark_bar_gtk.h
@@ -120,7 +120,6 @@ class BookmarkBarGtk : public AnimationDelegate,
virtual void BookmarkNodeChildrenReordered(BookmarkModel* model,
const BookmarkNode* node);
- private:
GtkWidget* CreateBookmarkButton(const BookmarkNode* node);
GtkToolItem* CreateBookmarkToolItem(const BookmarkNode* node);
@@ -158,6 +157,12 @@ class BookmarkBarGtk : public AnimationDelegate,
static gboolean OnFolderButtonReleased(GtkWidget* sender,
GdkEventButton* event,
BookmarkBarGtk* bar);
+ static void OnFolderDragReceived(GtkWidget* widget,
+ GdkDragContext* context,
+ gint x, gint y,
+ GtkSelectionData* selection_data,
+ guint target_type, guint time,
+ BookmarkBarGtk* bar);
// GtkToolbar callbacks
static gboolean OnToolbarExpose(GtkWidget* widget, GdkEventExpose* event,