Chromium Code Reviews| OLD | NEW |
|---|---|
| 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2011 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/ui/gtk/avatar_menu_item_gtk.h" | 5 #include "chrome/browser/ui/gtk/avatar_menu_item_gtk.h" |
| 6 | 6 |
| 7 #include <gdk/gdkkeysyms.h> | 7 #include <gdk/gdkkeysyms.h> |
| 8 | 8 |
| 9 #include "base/bind.h" | 9 #include "base/bind.h" |
| 10 #include "base/message_loop.h" | 10 #include "base/message_loop.h" |
| (...skipping 102 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 113 gtk_widget_hide(link_alignment_); | 113 gtk_widget_hide(link_alignment_); |
| 114 } | 114 } |
| 115 | 115 |
| 116 void AvatarMenuItemGtk::ShowEditLink() { | 116 void AvatarMenuItemGtk::ShowEditLink() { |
| 117 gtk_widget_hide(status_label_); | 117 gtk_widget_hide(status_label_); |
| 118 gtk_widget_show(link_alignment_); | 118 gtk_widget_show(link_alignment_); |
| 119 } | 119 } |
| 120 | 120 |
| 121 gboolean AvatarMenuItemGtk::OnProfileFocusIn(GtkWidget* widget, | 121 gboolean AvatarMenuItemGtk::OnProfileFocusIn(GtkWidget* widget, |
| 122 GdkEventFocus* event) { | 122 GdkEventFocus* event) { |
| 123 gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, &highlighted_color_); | |
| 124 if (item_.active) | 123 if (item_.active) |
| 125 ShowEditLink(); | 124 ShowEditLink(); |
| 126 | 125 |
| 127 return FALSE; | 126 return FALSE; |
| 128 } | 127 } |
| 129 | 128 |
| 130 gboolean AvatarMenuItemGtk::OnProfileFocusOut(GtkWidget* widget, | 129 gboolean AvatarMenuItemGtk::OnProfileFocusOut(GtkWidget* widget, |
| 131 GdkEventFocus* event) { | 130 GdkEventFocus* event) { |
| 132 gtk_widget_modify_bg(widget, GTK_STATE_NORMAL, unhighlighted_color_); | |
| 133 if (item_.active) | 131 if (item_.active) |
| 134 ShowStatusLabel(); | 132 ShowStatusLabel(); |
| 135 | 133 |
| 136 return FALSE; | 134 return FALSE; |
| 137 } | 135 } |
| 138 | 136 |
| 139 gboolean AvatarMenuItemGtk::OnProfileEnter(GtkWidget* widget, | 137 gboolean AvatarMenuItemGtk::OnProfileEnter(GtkWidget* widget, |
| 140 GdkEventCrossing* event) { | 138 GdkEventCrossing* event) { |
| 141 if (event->detail == GDK_NOTIFY_INFERIOR) | 139 if (event->detail == GDK_NOTIFY_INFERIOR) |
| 142 return FALSE; | 140 return FALSE; |
| (...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 194 // delegate_->EditProfile() will close the avatar bubble which in turn | 192 // delegate_->EditProfile() will close the avatar bubble which in turn |
| 195 // try to destroy this AvatarMenuItemGtk. | 193 // try to destroy this AvatarMenuItemGtk. |
| 196 // This is not OK to do this from the signal handler, so we'll | 194 // This is not OK to do this from the signal handler, so we'll |
| 197 // defer it. | 195 // defer it. |
| 198 MessageLoop::current()->PostTask( | 196 MessageLoop::current()->PostTask( |
| 199 FROM_HERE, | 197 FROM_HERE, |
| 200 base::Bind(&AvatarMenuItemGtk::EditProfile, | 198 base::Bind(&AvatarMenuItemGtk::EditProfile, |
| 201 weak_factory_.GetWeakPtr())); | 199 weak_factory_.GetWeakPtr())); |
| 202 } | 200 } |
| 203 | 201 |
| 202 gboolean AvatarMenuItemGtk::OnEventBoxExpose(GtkWidget* widget, | |
| 203 GdkEventExpose* event) { | |
| 204 // Draw the focus rectangle. | |
| 205 if (gtk_widget_has_focus(widget)) { | |
| 206 GtkAllocation allocation; | |
| 207 gtk_widget_get_allocation(widget, &allocation); | |
|
Elliot Glaysher
2011/12/12 20:48:24
Thank you for getting this right.
(Sadly, there's
| |
| 208 gtk_paint_focus(widget->style, widget->window, | |
| 209 gtk_widget_get_state(widget), | |
| 210 &event->area, widget, NULL, | |
| 211 0, 0, | |
| 212 allocation.width, allocation.height); | |
| 213 } | |
| 214 | |
| 215 return TRUE; | |
| 216 } | |
| 217 | |
| 204 void AvatarMenuItemGtk::Init(GtkThemeService* theme_service) { | 218 void AvatarMenuItemGtk::Init(GtkThemeService* theme_service) { |
| 205 widget_.Own(gtk_event_box_new()); | 219 widget_.Own(gtk_event_box_new()); |
| 206 | 220 |
| 207 g_signal_connect(widget_.get(), "button-press-event", | 221 g_signal_connect(widget_.get(), "button-press-event", |
| 208 G_CALLBACK(OnProfileClickThunk), this); | 222 G_CALLBACK(OnProfileClickThunk), this); |
| 209 g_signal_connect(widget_.get(), "enter-notify-event", | 223 g_signal_connect(widget_.get(), "enter-notify-event", |
| 210 G_CALLBACK(OnProfileEnterThunk), this); | 224 G_CALLBACK(OnProfileEnterThunk), this); |
| 211 g_signal_connect(widget_.get(), "leave-notify-event", | 225 g_signal_connect(widget_.get(), "leave-notify-event", |
| 212 G_CALLBACK(OnProfileLeaveThunk), this); | 226 G_CALLBACK(OnProfileLeaveThunk), this); |
| 213 g_signal_connect(widget_.get(), "focus-in-event", | 227 g_signal_connect(widget_.get(), "focus-in-event", |
| 214 G_CALLBACK(OnProfileFocusInThunk), this); | 228 G_CALLBACK(OnProfileFocusInThunk), this); |
| 215 g_signal_connect(widget_.get(), "focus-out-event", | 229 g_signal_connect(widget_.get(), "focus-out-event", |
| 216 G_CALLBACK(OnProfileFocusOutThunk), this); | 230 G_CALLBACK(OnProfileFocusOutThunk), this); |
| 217 g_signal_connect(widget_.get(), "key-press-event", | 231 g_signal_connect(widget_.get(), "key-press-event", |
| 218 G_CALLBACK(OnProfileKeyPressThunk), this); | 232 G_CALLBACK(OnProfileKeyPressThunk), this); |
| 233 g_signal_connect_after(widget_.get(), "expose-event", | |
| 234 G_CALLBACK(OnEventBoxExposeThunk), this); | |
| 219 | 235 |
| 220 GtkWidget* item_hbox = gtk_hbox_new(FALSE, ui::kControlSpacing); | 236 GtkWidget* item_hbox = gtk_hbox_new(FALSE, ui::kControlSpacing); |
| 221 GdkPixbuf* avatar_pixbuf = NULL; | 237 GdkPixbuf* avatar_pixbuf = NULL; |
| 222 | 238 |
| 223 // If this profile is active then draw a check mark on the bottom right | 239 // If this profile is active then draw a check mark on the bottom right |
| 224 // of the profile icon. | 240 // of the profile icon. |
| 225 if (item_.active) { | 241 if (item_.active) { |
| 226 const SkBitmap* avatar_image = item_.icon.ToSkBitmap(); | 242 const SkBitmap* avatar_image = item_.icon.ToSkBitmap(); |
| 227 gfx::CanvasSkia canvas(avatar_image->width(), | 243 gfx::CanvasSkia canvas(avatar_image->width(), |
| 228 avatar_image->height(), | 244 avatar_image->height(), |
| (...skipping 66 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 295 | 311 |
| 296 GtkSizeGroup* size_group = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); | 312 GtkSizeGroup* size_group = gtk_size_group_new(GTK_SIZE_GROUP_BOTH); |
| 297 gtk_size_group_add_widget(size_group, status_label_); | 313 gtk_size_group_add_widget(size_group, status_label_); |
| 298 gtk_size_group_add_widget(size_group, link_alignment_); | 314 gtk_size_group_add_widget(size_group, link_alignment_); |
| 299 g_object_unref(size_group); | 315 g_object_unref(size_group); |
| 300 } | 316 } |
| 301 | 317 |
| 302 gtk_box_pack_start(GTK_BOX(item_hbox), item_vbox, TRUE, TRUE, 0); | 318 gtk_box_pack_start(GTK_BOX(item_hbox), item_vbox, TRUE, TRUE, 0); |
| 303 gtk_container_add(GTK_CONTAINER(widget_.get()), item_hbox); | 319 gtk_container_add(GTK_CONTAINER(widget_.get()), item_hbox); |
| 304 } | 320 } |
| OLD | NEW |