summaryrefslogtreecommitdiffstats
path: root/chrome/browser/gtk/browser_actions_toolbar_gtk.cc
diff options
context:
space:
mode:
authorestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-09 21:58:02 +0000
committerestade@chromium.org <estade@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98>2010-04-09 21:58:02 +0000
commit6a8806faf9422cc503248ea0092d34eeab1be4d0 (patch)
tree09a3e3f9984e9ba2eb56871b11b2fb9ad1ce9ce5 /chrome/browser/gtk/browser_actions_toolbar_gtk.cc
parentc1af7fc19b462ba384e4897bcdce0e5500c84813 (diff)
downloadchromium_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.cc43
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();
+}