diff options
author | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-09 21:58:02 +0000 |
---|---|---|
committer | estade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2010-04-09 21:58:02 +0000 |
commit | 6a8806faf9422cc503248ea0092d34eeab1be4d0 (patch) | |
tree | 09a3e3f9984e9ba2eb56871b11b2fb9ad1ce9ce5 /chrome/browser/gtk/browser_actions_toolbar_gtk.cc | |
parent | c1af7fc19b462ba384e4897bcdce0e5500c84813 (diff) | |
download | chromium_src-6a8806faf9422cc503248ea0092d34eeab1be4d0.zip chromium_src-6a8806faf9422cc503248ea0092d34eeab1be4d0.tar.gz chromium_src-6a8806faf9422cc503248ea0092d34eeab1be4d0.tar.bz2 |
GTK: fix corner case where we'd show the overflow chevron for the browser action toolbar even without overflow.
The show/hide is async following the size_request change, so gtk_chrome_shrinkable_hbox_get_visible_child_count was not appropriate. Instead, show/hide the chevron when buttons show/hide.
BUG=40763
TEST=see bug. Also, removing extensions still updates the chevron state.
Review URL: http://codereview.chromium.org/1558035
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@44136 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'chrome/browser/gtk/browser_actions_toolbar_gtk.cc')
-rw-r--r-- | chrome/browser/gtk/browser_actions_toolbar_gtk.cc | 43 |
1 files changed, 29 insertions, 14 deletions
diff --git a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc index f74a35a..bbd54db 100644 --- a/chrome/browser/gtk/browser_actions_toolbar_gtk.cc +++ b/chrome/browser/gtk/browser_actions_toolbar_gtk.cc @@ -428,11 +428,8 @@ void BrowserActionsToolbarGtk::CreateAllButtons() { void BrowserActionsToolbarGtk::SetContainerWidth() { int showing_actions = model_->GetVisibleIconCount(); - if (showing_actions >= 0) { + if (showing_actions >= 0) SetButtonHBoxWidth(WidthForIconCount(showing_actions)); - if (showing_actions < button_count()) - gtk_widget_show(overflow_button_.widget()); - } } void BrowserActionsToolbarGtk::CreateButtonForExtension(Extension* extension, @@ -449,7 +446,6 @@ void BrowserActionsToolbarGtk::CreateButtonForExtension(Extension* extension, gtk_chrome_shrinkable_hbox_pack_start( GTK_CHROME_SHRINKABLE_HBOX(button_hbox_.get()), button->widget(), 0); gtk_box_reorder_child(GTK_BOX(button_hbox_.get()), button->widget(), index); - gtk_widget_show(button->widget()); extension_button_map_[extension->id()] = button; GtkTargetEntry drag_target = GetDragTargetEntry(); @@ -461,6 +457,15 @@ void BrowserActionsToolbarGtk::CreateButtonForExtension(Extension* extension, g_signal_connect(button->widget(), "drag-failed", G_CALLBACK(&OnDragFailedThunk), this); + // Any time a browser action button is shown or hidden we have to update + // the chevron state. + g_signal_connect(button->widget(), "show", + G_CALLBACK(&OnButtonShowOrHideThunk), this); + g_signal_connect(button->widget(), "hide", + G_CALLBACK(&OnButtonShowOrHideThunk), this); + + gtk_widget_show(button->widget()); + UpdateVisibility(); } @@ -477,6 +482,7 @@ GtkWidget* BrowserActionsToolbarGtk::GetBrowserActionWidget( void BrowserActionsToolbarGtk::RemoveButtonForExtension(Extension* extension) { if (extension_button_map_.erase(extension->id())) UpdateVisibility(); + UpdateChevronVisibility(); } void BrowserActionsToolbarGtk::UpdateVisibility() { @@ -536,8 +542,6 @@ void BrowserActionsToolbarGtk::BrowserActionRemoved(Extension* extension) { if (!GTK_WIDGET_VISIBLE(overflow_button_.widget())) { AnimateToShowNIcons(button_count()); model_->SetVisibleIconCount(button_count()); - } else if (button_count() <= model_->GetVisibleIconCount()) { - gtk_widget_hide(overflow_button_.widget()); } } @@ -619,20 +623,27 @@ void BrowserActionsToolbarGtk::SetButtonHBoxWidth(int new_width) { new_width = std::min(max_width, new_width); new_width = std::max(new_width, 0); gtk_widget_set_size_request(button_hbox_.get(), new_width, -1); +} +void BrowserActionsToolbarGtk::UpdateChevronVisibility() { int showing_icon_count = gtk_chrome_shrinkable_hbox_get_visible_child_count( GTK_CHROME_SHRINKABLE_HBOX(button_hbox_.get())); if (button_count() > showing_icon_count) { if (!GTK_WIDGET_VISIBLE(overflow_button_.widget())) { - // When the overflow chevron shows for the first time, take that - // much space away from |button_hbox_| to make the drag look smoother. - GtkRequisition req; - gtk_widget_size_request(overflow_button_.widget(), &req); - new_width -= req.width; - new_width = std::max(new_width, 0); - gtk_widget_set_size_request(button_hbox_.get(), new_width, -1); + if (drag_button_) { + // During drags, when the overflow chevron shows for the first time, + // take that much space away from |button_hbox_| to make the drag look + // smoother. + GtkRequisition req; + gtk_widget_size_request(overflow_button_.widget(), &req); + gint overflow_width = req.width; + gtk_widget_size_request(button_hbox_.get(), &req); + gint button_hbox_width = req.width; + button_hbox_width = std::max(button_hbox_width - overflow_width, 0); + gtk_widget_set_size_request(button_hbox_.get(), button_hbox_width, -1); + } gtk_widget_show(overflow_button_.widget()); } @@ -828,3 +839,7 @@ gboolean BrowserActionsToolbarGtk::OnOverflowMenuButtonPress( button->GetContextMenu()->PopupAsContext(event->time); return TRUE; } + +void BrowserActionsToolbarGtk::OnButtonShowOrHide(GtkWidget* sender) { + UpdateChevronVisibility(); +} |