Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(437)

Unified Diff: chrome/browser/gtk/bookmark_bar_gtk.cc

Issue 200029: Make the bookmark toolbar folders act like a menu bar.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: lint Created 11 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: chrome/browser/gtk/bookmark_bar_gtk.cc
===================================================================
--- chrome/browser/gtk/bookmark_bar_gtk.cc (revision 25344)
+++ chrome/browser/gtk/bookmark_bar_gtk.cc (working copy)
@@ -101,7 +101,8 @@
dragged_node_(NULL),
toolbar_drop_item_(NULL),
theme_provider_(GtkThemeProvider::GetFrom(profile)),
- show_instructions_(true) {
+ show_instructions_(true),
+ menu_bar_helper_(this) {
Init(profile);
SetProfile(profile);
@@ -309,9 +310,12 @@
}
DCHECK(index >= 0 && index <= GetBookmarkButtonCount());
- GtkToolItem* item = CreateBookmarkToolItem(parent->GetChild(index));
+ const BookmarkNode* node = parent->GetChild(index);
+ GtkToolItem* item = CreateBookmarkToolItem(node);
gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()),
item, index);
+ if (node->is_folder())
+ menu_bar_helper_.Add(gtk_bin_get_child(GTK_BIN(item)));
SetInstructionState();
SetChevronState();
@@ -329,6 +333,7 @@
GtkWidget* to_remove = GTK_WIDGET(gtk_toolbar_get_nth_item(
GTK_TOOLBAR(bookmark_toolbar_.get()), old_index));
+ menu_bar_helper_.Remove(gtk_bin_get_child(GTK_BIN(to_remove)));
gtk_container_remove(GTK_CONTAINER(bookmark_toolbar_.get()),
to_remove);
@@ -375,6 +380,8 @@
for (int i = 0; i < node->GetChildCount(); ++i) {
GtkToolItem* item = CreateBookmarkToolItem(node->GetChild(i));
gtk_toolbar_insert(GTK_TOOLBAR(bookmark_toolbar_.get()), item, -1);
+ if (node->is_folder())
+ menu_bar_helper_.Add(gtk_bin_get_child(GTK_BIN(item)));
}
bookmark_utils::ConfigureButtonForNode(model_->other_node(),
@@ -399,7 +406,7 @@
if (GTK_WIDGET_VISIBLE(overflow_button_))
extra_space = overflow_button_->allocation.width;
- int overflow_idx = GetFirstHiddenBookmark(extra_space);
+ int overflow_idx = GetFirstHiddenBookmark(extra_space, NULL);
if (overflow_idx == -1)
gtk_widget_hide(overflow_button_);
else
@@ -408,6 +415,9 @@
void BookmarkBarGtk::RemoveAllBookmarkButtons() {
gtk_util::RemoveAllChildren(bookmark_toolbar_.get());
+ menu_bar_helper_.Clear();
+ menu_bar_helper_.Add(other_bookmarks_button_);
+ menu_bar_helper_.Add(overflow_button_);
}
int BookmarkBarGtk::GetBookmarkButtonCount() {
@@ -432,7 +442,8 @@
SetChevronState();
}
-int BookmarkBarGtk::GetFirstHiddenBookmark(int extra_space) {
+int BookmarkBarGtk::GetFirstHiddenBookmark(
+ int extra_space, std::vector<GtkWidget*>* showing_folders) {
int rv = 0;
bool overflow = false;
GList* toolbar_items =
@@ -444,6 +455,10 @@
overflow = true;
break;
}
+ if (showing_folders &&
+ model_->GetBookmarkBarNode()->GetChild(rv)->is_folder()) {
+ showing_folders->push_back(gtk_bin_get_child(GTK_BIN(tool_item)));
+ }
rv++;
}
@@ -530,7 +545,6 @@
G_CALLBACK(OnClicked), this);
gtk_util::SetButtonTriggersNavigation(button);
} else {
- // TODO(erg): This button can also be a drop target.
ConnectFolderButtonEvents(button);
}
@@ -713,24 +727,7 @@
// static
void BookmarkBarGtk::OnFolderClicked(GtkWidget* sender,
BookmarkBarGtk* bar) {
- const BookmarkNode* node = bar->GetNodeForToolButton(sender);
- DCHECK(node);
- DCHECK(bar->page_navigator_);
-
- int start_child_idx = 0;
- if (sender == bar->overflow_button_)
- start_child_idx = bar->GetFirstHiddenBookmark(0);
-
- bar->current_menu_.reset(
- new BookmarkMenuController(bar->browser_, bar->profile_,
- bar->page_navigator_,
- GTK_WINDOW(gtk_widget_get_toplevel(sender)),
- node,
- start_child_idx,
- false));
- GdkEventButton* event =
- reinterpret_cast<GdkEventButton*>(gtk_get_current_event());
- bar->current_menu_->Popup(sender, event->button, event->time);
+ bar->PopupForButton(sender);
}
// static
@@ -964,3 +961,57 @@
return TRUE;
}
+
+// MenuBarHelper::Delegate implementation --------------------------------------
+void BookmarkBarGtk::PopupForButton(GtkWidget* button) {
+ const BookmarkNode* node = GetNodeForToolButton(button);
+ DCHECK(node);
+ DCHECK(page_navigator_);
+
+ int first_hidden = GetFirstHiddenBookmark(0, NULL);
+ if (button != overflow_button_ && button != other_bookmarks_button_ &&
+ node->GetParent()->IndexOfChild(node) >= first_hidden) {
+ return;
+ }
+
+ current_menu_.reset(
+ new BookmarkMenuController(browser_, profile_,
+ page_navigator_,
+ GTK_WINDOW(gtk_widget_get_toplevel(button)),
+ node,
+ button == overflow_button_ ?
+ first_hidden : 0,
+ false));
+ menu_bar_helper_.MenuStartedShowing(button, current_menu_->widget());
+ GdkEventButton* event =
+ reinterpret_cast<GdkEventButton*>(gtk_get_current_event());
+ current_menu_->Popup(button, event->button, event->time);
+}
+
+void BookmarkBarGtk::PopupForButtonNextTo(GtkWidget* button,
+ GtkMenuDirectionType dir) {
+ const BookmarkNode* relative_node = GetNodeForToolButton(button);
+ DCHECK(relative_node);
+
+ // Find out the order of the buttons.
+ std::vector<GtkWidget*> folder_list;
+ const int first_hidden = GetFirstHiddenBookmark(0, &folder_list);
+ if (first_hidden != -1)
+ folder_list.push_back(overflow_button_);
+ folder_list.push_back(other_bookmarks_button_);
+
+ // Find the position of |button|.
+ int button_idx = -1;
+ for (size_t i = 0; i < folder_list.size(); ++i) {
+ if (folder_list[i] == button) {
+ button_idx = i;
+ break;
+ }
+ }
+ DCHECK_NE(button_idx, -1);
+
+ // Find the GtkWidget* for the actual target button.
+ int shift = dir == GTK_MENU_DIR_PARENT ? -1 : 1;
+ button_idx = (button_idx + shift + folder_list.size()) % folder_list.size();
+ PopupForButton(folder_list[button_idx]);
+}

Powered by Google App Engine
This is Rietveld 408576698