OLD | NEW |
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 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_bubble_gtk.h" | 5 #include "chrome/browser/ui/gtk/avatar_menu_bubble_gtk.h" |
6 | 6 |
7 #include "base/i18n/rtl.h" | 7 #include "base/i18n/rtl.h" |
8 #include "base/strings/utf_string_conversions.h" | 8 #include "base/strings/utf_string_conversions.h" |
9 #include "chrome/browser/browser_process.h" | 9 #include "chrome/browser/browser_process.h" |
10 #include "chrome/browser/profiles/avatar_menu_model.h" | 10 #include "chrome/browser/profiles/avatar_menu_model.h" |
(...skipping 106 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
117 return; | 117 return; |
118 avatar_menu_model_->AddNewProfile(ProfileMetrics::ADD_NEW_USER_ICON); | 118 avatar_menu_model_->AddNewProfile(ProfileMetrics::ADD_NEW_USER_ICON); |
119 CloseBubble(); | 119 CloseBubble(); |
120 } | 120 } |
121 | 121 |
122 void AvatarMenuBubbleGtk::OnSwitchProfileLinkClicked(GtkWidget* link) { | 122 void AvatarMenuBubbleGtk::OnSwitchProfileLinkClicked(GtkWidget* link) { |
123 switching_ = true; | 123 switching_ = true; |
124 OnAvatarMenuModelChanged(avatar_menu_model_.get()); | 124 OnAvatarMenuModelChanged(avatar_menu_model_.get()); |
125 } | 125 } |
126 | 126 |
127 void AvatarMenuBubbleGtk::OnRealize(GtkWidget* parent_widget) { | |
128 if (!managed_user_info_ || !theme_service_->UsingNativeTheme()) | |
129 return; | |
130 | |
131 // Use the same background color for the GtkTextView as the background color | |
132 // of the enclosing widget. | |
133 GtkStyle* style = gtk_widget_get_style(parent_widget); | |
134 GdkColor bg_color = style->bg[GTK_STATE_NORMAL]; | |
135 gtk_widget_modify_base(managed_user_info_, GTK_STATE_NORMAL, &bg_color); | |
136 } | |
137 | |
138 void AvatarMenuBubbleGtk::InitMenuContents() { | 127 void AvatarMenuBubbleGtk::InitMenuContents() { |
139 size_t profile_count = avatar_menu_model_->GetNumberOfItems(); | 128 size_t profile_count = avatar_menu_model_->GetNumberOfItems(); |
140 GtkWidget* items_vbox = gtk_vbox_new(FALSE, ui::kContentAreaSpacing); | 129 GtkWidget* items_vbox = gtk_vbox_new(FALSE, ui::kContentAreaSpacing); |
141 for (size_t i = 0; i < profile_count; ++i) { | 130 for (size_t i = 0; i < profile_count; ++i) { |
142 AvatarMenuModel::Item menu_item = avatar_menu_model_->GetItemAt(i); | 131 AvatarMenuModel::Item menu_item = avatar_menu_model_->GetItemAt(i); |
143 AvatarMenuItemGtk* item = new AvatarMenuItemGtk( | 132 AvatarMenuItemGtk* item = new AvatarMenuItemGtk( |
144 this, menu_item, i, theme_service_); | 133 this, menu_item, i, theme_service_); |
145 items_.push_back(item); | 134 items_.push_back(item); |
146 | 135 |
147 gtk_box_pack_start(GTK_BOX(items_vbox), item->widget(), TRUE, TRUE, 0); | 136 gtk_box_pack_start(GTK_BOX(items_vbox), item->widget(), TRUE, TRUE, 0); |
(...skipping 28 matching lines...) Expand all Loading... |
176 AvatarMenuModel::Item menu_item = | 165 AvatarMenuModel::Item menu_item = |
177 avatar_menu_model_->GetItemAt(active_index); | 166 avatar_menu_model_->GetItemAt(active_index); |
178 AvatarMenuItemGtk* item = new AvatarMenuItemGtk( | 167 AvatarMenuItemGtk* item = new AvatarMenuItemGtk( |
179 this, menu_item, active_index, theme_service_); | 168 this, menu_item, active_index, theme_service_); |
180 items_.push_back(item); | 169 items_.push_back(item); |
181 | 170 |
182 gtk_box_pack_start(GTK_BOX(inner_contents_), item->widget(), TRUE, TRUE, 0); | 171 gtk_box_pack_start(GTK_BOX(inner_contents_), item->widget(), TRUE, TRUE, 0); |
183 gtk_box_pack_start(GTK_BOX(inner_contents_), | 172 gtk_box_pack_start(GTK_BOX(inner_contents_), |
184 gtk_hseparator_new(), TRUE, TRUE, 0); | 173 gtk_hseparator_new(), TRUE, TRUE, 0); |
185 | 174 |
186 // Add information about managed users. | 175 // Add information about managed users within a hbox. |
187 managed_user_info_ = gtk_text_view_new(); | 176 GtkWidget* managed_user_info = gtk_hbox_new(FALSE, 5); |
188 gtk_text_view_set_editable(GTK_TEXT_VIEW(managed_user_info_), FALSE); | |
189 gtk_text_view_set_cursor_visible(GTK_TEXT_VIEW(managed_user_info_), FALSE); | |
190 GtkTextBuffer* text_buffer = | |
191 gtk_text_view_get_buffer(GTK_TEXT_VIEW(managed_user_info_)); | |
192 std::string info = | |
193 UTF16ToUTF8(avatar_menu_model_->GetManagedUserInformation()); | |
194 gtk_text_view_set_wrap_mode(GTK_TEXT_VIEW(managed_user_info_), GTK_WRAP_WORD); | |
195 | |
196 // Insert the managed user icon. Insert it inside a hbox in order to be able | |
197 // to define a padding around it. | |
198 GtkTextIter start_iter; | |
199 gtk_text_buffer_get_start_iter(text_buffer, &start_iter); | |
200 GtkWidget* icon_box = gtk_hbox_new(FALSE, 0); | |
201 GdkPixbuf* limited_user_pixbuf = | 177 GdkPixbuf* limited_user_pixbuf = |
202 avatar_menu_model_->GetManagedUserIcon().ToGdkPixbuf(); | 178 avatar_menu_model_->GetManagedUserIcon().ToGdkPixbuf(); |
203 GtkWidget* limited_user_img = gtk_image_new_from_pixbuf(limited_user_pixbuf); | 179 GtkWidget* limited_user_img = gtk_image_new_from_pixbuf(limited_user_pixbuf); |
204 gtk_box_pack_start(GTK_BOX(icon_box), limited_user_img, FALSE, FALSE, 5); | 180 GtkWidget* icon_align = gtk_alignment_new(0, 0, 0, 0); |
205 GtkTextChildAnchor* anchor = | 181 gtk_container_add(GTK_CONTAINER(icon_align), limited_user_img); |
206 gtk_text_buffer_create_child_anchor(text_buffer, &start_iter); | 182 gtk_box_pack_start(GTK_BOX(managed_user_info), icon_align, FALSE, FALSE, 0); |
207 gtk_text_view_add_child_at_anchor( | 183 GtkWidget* status_label = |
208 GTK_TEXT_VIEW(managed_user_info_), icon_box, anchor); | 184 theme_service_->BuildLabel(std::string(), ui::kGdkBlack); |
| 185 char* markup = g_markup_printf_escaped( |
| 186 "<span size='small'>%s</span>", |
| 187 UTF16ToUTF8(avatar_menu_model_->GetManagedUserInformation()).c_str()); |
| 188 const int kLabelWidth = 150; |
| 189 gtk_widget_set_size_request(status_label, kLabelWidth, -1); |
| 190 gtk_label_set_markup(GTK_LABEL(status_label), markup); |
| 191 gtk_label_set_line_wrap(GTK_LABEL(status_label), TRUE); |
| 192 gtk_misc_set_alignment(GTK_MISC(status_label), 0, 0); |
| 193 g_free(markup); |
| 194 gtk_box_pack_start(GTK_BOX(managed_user_info), status_label, FALSE, FALSE, 0); |
| 195 gtk_box_pack_start( |
| 196 GTK_BOX(inner_contents_), managed_user_info, FALSE, FALSE, 0); |
209 | 197 |
210 // Insert the information text. | |
211 GtkTextIter end_iter; | |
212 gtk_text_buffer_get_end_iter(text_buffer, &end_iter); | |
213 GtkTextTag* text_tag = gtk_text_buffer_create_tag( | |
214 text_buffer, NULL, "size-set", TRUE, "size", 10 * PANGO_SCALE, NULL); | |
215 gtk_text_buffer_insert_with_tags( | |
216 text_buffer, &end_iter, info.c_str(), info.size(), text_tag, NULL); | |
217 | |
218 gtk_box_pack_start( | |
219 GTK_BOX(inner_contents_), managed_user_info_, FALSE, FALSE, 0); | |
220 gtk_box_pack_start( | 198 gtk_box_pack_start( |
221 GTK_BOX(inner_contents_), gtk_hseparator_new(), TRUE, TRUE, 0); | 199 GTK_BOX(inner_contents_), gtk_hseparator_new(), TRUE, TRUE, 0); |
222 | 200 |
223 // The switch profile link. | 201 // The switch profile link. |
224 GtkWidget* switch_profile_link = theme_service_->BuildChromeLinkButton( | 202 GtkWidget* switch_profile_link = theme_service_->BuildChromeLinkButton( |
225 l10n_util::GetStringUTF8(IDS_PROFILES_SWITCH_PROFILE_LINK)); | 203 l10n_util::GetStringUTF8(IDS_PROFILES_SWITCH_PROFILE_LINK)); |
226 g_signal_connect(switch_profile_link, "clicked", | 204 g_signal_connect(switch_profile_link, "clicked", |
227 G_CALLBACK(OnSwitchProfileLinkClickedThunk), this); | 205 G_CALLBACK(OnSwitchProfileLinkClickedThunk), this); |
228 | 206 |
229 GtkWidget* link_align = gtk_alignment_new(0, 0, 0, 0); | 207 GtkWidget* link_align = gtk_alignment_new(0.5, 0, 0, 0); |
230 gtk_alignment_set_padding(GTK_ALIGNMENT(link_align), | |
231 0, 0, kNewProfileLinkLeftPadding, 0); | |
232 gtk_container_add(GTK_CONTAINER(link_align), switch_profile_link); | 208 gtk_container_add(GTK_CONTAINER(link_align), switch_profile_link); |
233 | 209 |
234 gtk_box_pack_start(GTK_BOX(inner_contents_), link_align, FALSE, FALSE, 0); | 210 gtk_box_pack_start(GTK_BOX(inner_contents_), link_align, FALSE, FALSE, 0); |
235 g_signal_connect( | |
236 inner_contents_, "realize", G_CALLBACK(OnRealizeThunk), this); | |
237 } | 211 } |
238 | 212 |
239 void AvatarMenuBubbleGtk::InitContents() { | 213 void AvatarMenuBubbleGtk::InitContents() { |
240 // Destroy the old inner contents to allow replacing it. | 214 // Destroy the old inner contents to allow replacing it. |
241 if (inner_contents_) | 215 if (inner_contents_) |
242 gtk_widget_destroy(inner_contents_); | 216 gtk_widget_destroy(inner_contents_); |
243 inner_contents_ = gtk_vbox_new(FALSE, ui::kControlSpacing); | 217 inner_contents_ = gtk_vbox_new(FALSE, ui::kControlSpacing); |
244 if (!contents_) | 218 if (!contents_) |
245 contents_ = gtk_vbox_new(FALSE, 0); | 219 contents_ = gtk_vbox_new(FALSE, 0); |
246 gtk_container_set_border_width(GTK_CONTAINER(inner_contents_), | 220 gtk_container_set_border_width(GTK_CONTAINER(inner_contents_), |
247 ui::kContentAreaBorder); | 221 ui::kContentAreaBorder); |
248 g_signal_connect(inner_contents_, "size-request", | 222 g_signal_connect(inner_contents_, "size-request", |
249 G_CALLBACK(OnSizeRequestThunk), this); | 223 G_CALLBACK(OnSizeRequestThunk), this); |
250 | 224 |
251 if (avatar_menu_model_->GetManagedUserInformation().empty() || switching_) | 225 if (avatar_menu_model_->GetManagedUserInformation().empty() || switching_) |
252 InitMenuContents(); | 226 InitMenuContents(); |
253 else | 227 else |
254 InitManagedUserContents(); | 228 InitManagedUserContents(); |
255 gtk_box_pack_start(GTK_BOX(contents_), inner_contents_, TRUE, TRUE, 0); | 229 gtk_box_pack_start(GTK_BOX(contents_), inner_contents_, TRUE, TRUE, 0); |
256 if (bubble_) | 230 if (bubble_) |
257 gtk_widget_show_all(contents_); | 231 gtk_widget_show_all(contents_); |
258 } | 232 } |
259 | 233 |
260 void AvatarMenuBubbleGtk::CloseBubble() { | 234 void AvatarMenuBubbleGtk::CloseBubble() { |
261 if (bubble_) { | 235 if (bubble_) { |
262 bubble_->Close(); | 236 bubble_->Close(); |
263 bubble_ = NULL; | 237 bubble_ = NULL; |
264 } | 238 } |
265 } | 239 } |
OLD | NEW |