Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "chrome/browser/gtk/browser_actions_toolbar_gtk.h" | 5 #include "chrome/browser/gtk/browser_actions_toolbar_gtk.h" |
| 6 | 6 |
| 7 #include <vector> | 7 #include <vector> |
| 8 | 8 |
| 9 #include "base/i18n/rtl.h" | 9 #include "base/i18n/rtl.h" |
| 10 #include "chrome/browser/browser.h" | 10 #include "chrome/browser/browser.h" |
| (...skipping 332 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 343 model_(NULL), | 343 model_(NULL), |
| 344 hbox_(gtk_hbox_new(FALSE, 0)), | 344 hbox_(gtk_hbox_new(FALSE, 0)), |
| 345 button_hbox_(gtk_chrome_shrinkable_hbox_new(TRUE, FALSE, kButtonPadding)), | 345 button_hbox_(gtk_chrome_shrinkable_hbox_new(TRUE, FALSE, kButtonPadding)), |
| 346 overflow_button_(browser->profile()), | 346 overflow_button_(browser->profile()), |
| 347 separator_(theme_provider_->CreateToolbarSeparator()), | 347 separator_(theme_provider_->CreateToolbarSeparator()), |
| 348 drag_button_(NULL), | 348 drag_button_(NULL), |
| 349 drop_index_(-1), | 349 drop_index_(-1), |
| 350 resize_animation_(this), | 350 resize_animation_(this), |
| 351 desired_width_(0), | 351 desired_width_(0), |
| 352 start_width_(0), | 352 start_width_(0), |
| 353 draw_gripper_(false), | |
| 353 method_factory_(this) { | 354 method_factory_(this) { |
| 354 ExtensionsService* extension_service = profile_->GetExtensionsService(); | 355 ExtensionsService* extension_service = profile_->GetExtensionsService(); |
| 355 // The |extension_service| can be NULL in Incognito. | 356 // The |extension_service| can be NULL in Incognito. |
| 356 if (!extension_service) | 357 if (!extension_service) |
| 357 return; | 358 return; |
| 358 | 359 |
| 359 GtkWidget* gripper = gtk_button_new(); | 360 GtkWidget* gripper = gtk_button_new(); |
| 360 GTK_WIDGET_UNSET_FLAGS(gripper, GTK_CAN_FOCUS); | 361 GTK_WIDGET_UNSET_FLAGS(gripper, GTK_CAN_FOCUS); |
| 361 gtk_widget_add_events(gripper, GDK_POINTER_MOTION_MASK); | 362 gtk_widget_add_events(gripper, GDK_POINTER_MOTION_MASK); |
| 362 signals_.Connect(gripper, "motion-notify-event", | 363 signals_.Connect(gripper, "motion-notify-event", |
| (...skipping 383 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 746 -event->x : | 747 -event->x : |
| 747 event->x - widget->allocation.width; | 748 event->x - widget->allocation.width; |
| 748 gint new_width = button_hbox_->allocation.width - distance_dragged; | 749 gint new_width = button_hbox_->allocation.width - distance_dragged; |
| 749 SetButtonHBoxWidth(new_width); | 750 SetButtonHBoxWidth(new_width); |
| 750 | 751 |
| 751 return FALSE; | 752 return FALSE; |
| 752 } | 753 } |
| 753 | 754 |
| 754 gboolean BrowserActionsToolbarGtk::OnGripperExpose(GtkWidget* gripper, | 755 gboolean BrowserActionsToolbarGtk::OnGripperExpose(GtkWidget* gripper, |
| 755 GdkEventExpose* expose) { | 756 GdkEventExpose* expose) { |
| 757 if (!draw_gripper_) | |
| 758 return TRUE; | |
| 759 | |
| 756 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(expose->window)); | 760 cairo_t* cr = gdk_cairo_create(GDK_DRAWABLE(expose->window)); |
| 757 | 761 |
| 758 CairoCachedSurface* surface = theme_provider_->GetSurfaceNamed( | 762 CairoCachedSurface* surface = theme_provider_->GetSurfaceNamed( |
| 759 IDR_RESIZE_GRIPPER, gripper); | 763 IDR_RESIZE_GRIPPER, gripper); |
| 760 gfx::Point center = gfx::Rect(gripper->allocation).CenterPoint(); | 764 gfx::Point center = gfx::Rect(gripper->allocation).CenterPoint(); |
| 761 center.Offset(-surface->Width() / 2, -surface->Height() / 2); | 765 center.Offset(-surface->Width() / 2, -surface->Height() / 2); |
| 762 surface->SetSource(cr, center.x(), center.y()); | 766 surface->SetSource(cr, center.x(), center.y()); |
| 763 gdk_cairo_rectangle(cr, &expose->area); | 767 gdk_cairo_rectangle(cr, &expose->area); |
| 764 cairo_fill(cr); | 768 cairo_fill(cr); |
| 765 | 769 |
| 766 cairo_destroy(cr); | 770 cairo_destroy(cr); |
| 767 | 771 |
| 768 return TRUE; | 772 return TRUE; |
| 769 } | 773 } |
| 770 | 774 |
| 771 // These three signal handlers (EnterNotify, LeaveNotify, and ButtonRelease) | 775 // These three signal handlers (EnterNotify, LeaveNotify, and ButtonRelease) |
| 772 // are used to give the gripper the resize cursor. Since it doesn't have its | 776 // are used to give the gripper the resize cursor. Since it doesn't have its |
| 773 // own window, we have to set the cursor whenever the pointer moves into the | 777 // own window, we have to set the cursor whenever the pointer moves into the |
| 774 // button or leaves the button, and be sure to leave it on when the user is | 778 // button or leaves the button, and be sure to leave it on when the user is |
| 775 // dragging. | 779 // dragging. |
| 776 gboolean BrowserActionsToolbarGtk::OnGripperEnterNotify( | 780 gboolean BrowserActionsToolbarGtk::OnGripperEnterNotify( |
| 777 GtkWidget* gripper, GdkEventCrossing* event) { | 781 GtkWidget* gripper, GdkEventCrossing* event) { |
| 778 gdk_window_set_cursor(gripper->window, | 782 gdk_window_set_cursor(gripper->window, |
| 779 gtk_util::GetCursor(GDK_SB_H_DOUBLE_ARROW)); | 783 gtk_util::GetCursor(GDK_SB_H_DOUBLE_ARROW)); |
| 784 draw_gripper_ = true; | |
|
sky
2010/07/01 16:40:14
How come you don't queue_draw here and @ 793?
Evan Stade
2010/07/01 17:35:08
GtkButtons already queue_draw when the mouse enter
| |
| 785 | |
| 780 return FALSE; | 786 return FALSE; |
| 781 } | 787 } |
| 782 | 788 |
| 783 gboolean BrowserActionsToolbarGtk::OnGripperLeaveNotify( | 789 gboolean BrowserActionsToolbarGtk::OnGripperLeaveNotify( |
| 784 GtkWidget* gripper, GdkEventCrossing* event) { | 790 GtkWidget* gripper, GdkEventCrossing* event) { |
| 785 if (!(event->state & GDK_BUTTON1_MASK)) | 791 if (!(event->state & GDK_BUTTON1_MASK)) { |
| 786 gdk_window_set_cursor(gripper->window, NULL); | 792 gdk_window_set_cursor(gripper->window, NULL); |
| 793 draw_gripper_ = false; | |
| 794 } | |
| 795 | |
| 787 return FALSE; | 796 return FALSE; |
| 788 } | 797 } |
| 789 | 798 |
| 790 gboolean BrowserActionsToolbarGtk::OnGripperButtonRelease( | 799 gboolean BrowserActionsToolbarGtk::OnGripperButtonRelease( |
| 791 GtkWidget* gripper, GdkEventButton* event) { | 800 GtkWidget* gripper, GdkEventButton* event) { |
| 792 gfx::Rect gripper_rect(0, 0, | 801 gfx::Rect gripper_rect(0, 0, |
| 793 gripper->allocation.width, gripper->allocation.height); | 802 gripper->allocation.width, gripper->allocation.height); |
| 794 gfx::Point release_point(event->x, event->y); | 803 gfx::Point release_point(event->x, event->y); |
| 795 if (!gripper_rect.Contains(release_point)) | 804 if (!gripper_rect.Contains(release_point)) { |
| 796 gdk_window_set_cursor(gripper->window, NULL); | 805 gdk_window_set_cursor(gripper->window, NULL); |
| 806 draw_gripper_ = false; | |
| 807 gtk_widget_queue_draw(gripper); | |
| 808 } | |
| 797 | 809 |
| 798 // After the user resizes the toolbar, we want to smartly resize it to be | 810 // After the user resizes the toolbar, we want to smartly resize it to be |
| 799 // the perfect size to fit the buttons. | 811 // the perfect size to fit the buttons. |
| 800 int visible_icon_count = | 812 int visible_icon_count = |
| 801 gtk_chrome_shrinkable_hbox_get_visible_child_count( | 813 gtk_chrome_shrinkable_hbox_get_visible_child_count( |
| 802 GTK_CHROME_SHRINKABLE_HBOX(button_hbox_.get())); | 814 GTK_CHROME_SHRINKABLE_HBOX(button_hbox_.get())); |
| 803 AnimateToShowNIcons(visible_icon_count); | 815 AnimateToShowNIcons(visible_icon_count); |
| 804 model_->SetVisibleIconCount(visible_icon_count); | 816 model_->SetVisibleIconCount(visible_icon_count); |
| 805 | 817 |
| 806 return FALSE; | 818 return FALSE; |
| (...skipping 68 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 875 } | 887 } |
| 876 | 888 |
| 877 it->second.get()->GetContextMenu()->PopupAsContext(event->time); | 889 it->second.get()->GetContextMenu()->PopupAsContext(event->time); |
| 878 return TRUE; | 890 return TRUE; |
| 879 } | 891 } |
| 880 | 892 |
| 881 void BrowserActionsToolbarGtk::OnButtonShowOrHide(GtkWidget* sender) { | 893 void BrowserActionsToolbarGtk::OnButtonShowOrHide(GtkWidget* sender) { |
| 882 if (!resize_animation_.is_animating()) | 894 if (!resize_animation_.is_animating()) |
| 883 UpdateChevronVisibility(); | 895 UpdateChevronVisibility(); |
| 884 } | 896 } |
| OLD | NEW |