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

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

Issue 187001: GTK: Implement the bookmark bar chevron.... (Closed) Base URL: svn://chrome-svn/chrome/trunk/src/
Patch Set: update in more places Created 11 years, 4 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
« no previous file with comments | « chrome/browser/gtk/bookmark_bar_gtk.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: chrome/browser/gtk/bookmark_bar_gtk.cc
===================================================================
--- chrome/browser/gtk/bookmark_bar_gtk.cc (revision 25076)
+++ chrome/browser/gtk/bookmark_bar_gtk.cc (working copy)
@@ -184,11 +184,21 @@
SetToolBarStyle();
gtk_widget_set_name(bookmark_toolbar_.get(), "chrome-bookmark-toolbar");
gtk_widget_set_app_paintable(bookmark_toolbar_.get(), TRUE);
- g_signal_connect(G_OBJECT(bookmark_toolbar_.get()), "expose-event",
+ g_signal_connect(bookmark_toolbar_.get(), "expose-event",
G_CALLBACK(&OnToolbarExpose), this);
+ g_signal_connect(bookmark_toolbar_.get(), "size-allocate",
+ G_CALLBACK(&OnToolbarSizeAllocate), this);
gtk_box_pack_start(GTK_BOX(bookmark_hbox_), bookmark_toolbar_.get(),
TRUE, TRUE, 0);
+ overflow_button_ = theme_provider_->BuildChromeButton();
+ g_object_set_data(G_OBJECT(overflow_button_), "left-align-popup",
+ reinterpret_cast<void*>(true));
+ SetOverflowButtonAppearance();
+ ConnectFolderButtonEvents(overflow_button_);
+ gtk_box_pack_start(GTK_BOX(bookmark_hbox_), overflow_button_,
+ FALSE, FALSE, 0);
+
gtk_drag_dest_set(bookmark_toolbar_.get(), GTK_DEST_DEFAULT_DROP,
NULL, 0, kDragAction);
GtkDndUtil::SetDestTargetList(bookmark_toolbar_.get(), kDestTargetList);
@@ -304,6 +314,7 @@
item, index);
SetInstructionState();
+ SetChevronState();
}
void BookmarkBarGtk::BookmarkNodeRemoved(BookmarkModel* model,
@@ -322,6 +333,7 @@
to_remove);
SetInstructionState();
+ SetChevronState();
}
void BookmarkBarGtk::BookmarkNodeChanged(BookmarkModel* model,
@@ -337,6 +349,7 @@
GTK_TOOLBAR(bookmark_toolbar_.get()), index);
GtkWidget* button = gtk_bin_get_child(GTK_BIN(item));
bookmark_utils::ConfigureButtonForNode(node, model, button, theme_provider_);
+ SetChevronState();
}
void BookmarkBarGtk::BookmarkNodeFavIconLoaded(BookmarkModel* model,
@@ -368,6 +381,7 @@
model_, other_bookmarks_button_, theme_provider_);
SetInstructionState();
+ SetChevronState();
}
void BookmarkBarGtk::SetInstructionState() {
@@ -379,6 +393,19 @@
}
}
+void BookmarkBarGtk::SetChevronState() {
+ int extra_space = 0;
+
+ if (GTK_WIDGET_VISIBLE(overflow_button_))
+ extra_space = overflow_button_->allocation.width;
+
+ int overflow_idx = GetFirstHiddenBookmark(extra_space);
+ if (overflow_idx == -1)
+ gtk_widget_hide(overflow_button_);
+ else
+ gtk_widget_show_all(overflow_button_);
+}
+
void BookmarkBarGtk::RemoveAllBookmarkButtons() {
gtk_util::RemoveAllChildren(bookmark_toolbar_.get());
}
@@ -391,6 +418,43 @@
return count;
}
+void BookmarkBarGtk::SetOverflowButtonAppearance() {
+ GtkWidget* former_child = gtk_bin_get_child(GTK_BIN(overflow_button_));
+ if (former_child)
+ gtk_widget_destroy(former_child);
+
+ GtkWidget* new_child = theme_provider_->UseGtkTheme() ?
+ gtk_arrow_new(GTK_ARROW_DOWN, GTK_SHADOW_NONE) :
Elliot Glaysher 2009/09/02 01:19:39 This arrow, by default, is pretty big, no? You may
+ gtk_image_new_from_pixbuf(ResourceBundle::GetSharedInstance().
+ GetRTLEnabledPixbufNamed(IDR_BOOKMARK_BAR_CHEVRONS));
+
+ gtk_container_add(GTK_CONTAINER(overflow_button_), new_child);
+ SetChevronState();
+}
+
+int BookmarkBarGtk::GetFirstHiddenBookmark(int extra_space) {
+ int rv = 0;
+ bool overflow = false;
+ GList* toolbar_items =
+ gtk_container_get_children(GTK_CONTAINER(bookmark_toolbar_.get()));
+ for (GList* iter = toolbar_items; iter; iter = g_list_next(iter)) {
+ GtkWidget* tool_item = reinterpret_cast<GtkWidget*>(iter->data);
+ if (tool_item->allocation.x + tool_item->allocation.width >
+ bookmark_toolbar_.get()->allocation.width + extra_space) {
+ overflow = true;
+ break;
+ }
+ rv++;
+ }
+
+ g_list_free(toolbar_items);
+
+ if (!overflow)
+ return -1;
+
+ return rv;
+}
+
bool BookmarkBarGtk::IsAlwaysShown() {
return profile_->GetPrefs()->GetBoolean(prefs::kShowBookmarkBar);
}
@@ -430,6 +494,8 @@
// themes, we want to let the background show through the toolbar.
gtk_event_box_set_visible_window(GTK_EVENT_BOX(event_box_.get()),
theme_provider_->UseGtkTheme());
+
+ SetOverflowButtonAppearance();
}
}
@@ -504,7 +570,7 @@
// First check to see if |button| is special cased.
if (widget == other_bookmarks_button_)
return model_->other_node();
- else if (widget == event_box_.get())
+ else if (widget == event_box_.get() || widget == overflow_button_)
return model_->GetBookmarkBarNode();
// Search the contents of |bookmark_toolbar_| for the corresponding widget
@@ -651,12 +717,16 @@
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,
- 0,
+ start_child_idx,
false));
GdkEventButton* event =
reinterpret_cast<GdkEventButton*>(gtk_get_current_event());
@@ -740,6 +810,13 @@
}
// static
+void BookmarkBarGtk::OnToolbarSizeAllocate(GtkWidget* widget,
+ GtkAllocation* allocation,
+ BookmarkBarGtk* bar) {
+ bar->SetChevronState();
+}
+
+// static
void BookmarkBarGtk::OnDragReceived(GtkWidget* widget,
GdkDragContext* context,
gint x, gint y,
« no previous file with comments | « chrome/browser/gtk/bookmark_bar_gtk.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698