Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(492)

Side by Side Diff: chrome/browser/ui/gtk/one_click_signin_bubble_gtk.cc

Issue 10332185: Update behavior of one-click infobar to remove modal dialog, add "undo". (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Fix mac compiler error Created 8 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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/one_click_signin_bubble_gtk.h" 5 #include "chrome/browser/ui/gtk/one_click_signin_bubble_gtk.h"
6 6
7 #include <gtk/gtk.h> 7 #include <gtk/gtk.h>
8 8
9 #include "base/callback_helpers.h"
10 #include "base/logging.h"
9 #include "base/i18n/rtl.h" 11 #include "base/i18n/rtl.h"
10 #include "base/logging.h"
11 #include "chrome/browser/ui/browser.h" 12 #include "chrome/browser/ui/browser.h"
12 #include "chrome/browser/ui/gtk/browser_toolbar_gtk.h" 13 #include "chrome/browser/ui/gtk/browser_toolbar_gtk.h"
13 #include "chrome/browser/ui/gtk/browser_window_gtk.h" 14 #include "chrome/browser/ui/gtk/browser_window_gtk.h"
14 #include "chrome/browser/ui/gtk/gtk_theme_service.h" 15 #include "chrome/browser/ui/gtk/gtk_theme_service.h"
15 #include "chrome/browser/ui/gtk/gtk_util.h" 16 #include "chrome/browser/ui/gtk/gtk_util.h"
16 #include "grit/chromium_strings.h" 17 #include "grit/chromium_strings.h"
17 #include "grit/generated_resources.h" 18 #include "grit/generated_resources.h"
18 #include "ui/base/l10n/l10n_util.h" 19 #include "ui/base/l10n/l10n_util.h"
19 20
20 namespace { 21 namespace {
21 22
22 // Padding between content and edge of bubble (in pixels). 23 // Padding between content and edge of bubble (in pixels).
23 const int kContentBorder = 7; 24 const int kContentBorder = 7;
24 25
25 } // namespace 26 } // namespace
26 27
27 OneClickSigninBubbleGtk::OneClickSigninBubbleGtk( 28 OneClickSigninBubbleGtk::OneClickSigninBubbleGtk(
28 BrowserWindowGtk* browser_window_gtk, 29 BrowserWindowGtk* browser_window_gtk,
29 const base::Closure& learn_more_callback, 30 const OneClickSigninBubbleCallback& start_sync_callback)
30 const base::Closure& advanced_callback)
31 : bubble_(NULL), 31 : bubble_(NULL),
32 learn_more_callback_(learn_more_callback), 32 start_sync_callback_(start_sync_callback) {
33 advanced_callback_(advanced_callback) {
34 33
35 // Setup the BubbleGtk content. 34 // Setup the BubbleGtk content.
36 GtkWidget* bubble_content = gtk_vbox_new(FALSE, 0); 35 GtkWidget* bubble_content = gtk_vbox_new(FALSE, 0);
37 gtk_container_set_border_width(GTK_CONTAINER(bubble_content), 36 gtk_container_set_border_width(GTK_CONTAINER(bubble_content),
38 kContentBorder); 37 kContentBorder);
39 38
40 // Message. 39 // Message.
41 GtkWidget* message_label = gtk_label_new( 40 GtkWidget* message_label = gtk_label_new(
42 l10n_util::GetStringFUTF8( 41 l10n_util::GetStringFUTF8(
43 IDS_SYNC_PROMO_NTP_BUBBLE_MESSAGE, 42 IDS_SYNC_PROMO_NTP_BUBBLE_MESSAGE,
44 l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)).c_str()); 43 l10n_util::GetStringUTF16(IDS_SHORT_PRODUCT_NAME)).c_str());
45 gtk_label_set_line_wrap(GTK_LABEL(message_label), TRUE); 44 gtk_label_set_line_wrap(GTK_LABEL(message_label), TRUE);
46 gtk_misc_set_alignment(GTK_MISC(message_label), 0.0, 0.5); 45 gtk_misc_set_alignment(GTK_MISC(message_label), 0.0, 0.5);
47 gtk_box_pack_start(GTK_BOX(bubble_content), message_label, FALSE, FALSE, 0); 46 gtk_box_pack_start(GTK_BOX(bubble_content), message_label, FALSE, FALSE, 0);
48 47
49 GtkThemeService* const theme_provider = GtkThemeService::GetFrom( 48 GtkThemeService* const theme_provider = GtkThemeService::GetFrom(
50 browser_window_gtk->browser()->profile()); 49 browser_window_gtk->browser()->profile());
51 50
52 GtkWidget* learn_more_line = gtk_hbox_new(FALSE, kContentBorder);
53 gtk_box_pack_start(GTK_BOX(bubble_content),
54 learn_more_line, FALSE, FALSE, 0);
55
56 // Learn more link.
57 GtkWidget* learn_more_link = theme_provider->BuildChromeLinkButton(
58 l10n_util::GetStringUTF8(IDS_SYNC_PROMO_NTP_BUBBLE_LEARN_MORE));
59 g_signal_connect(learn_more_link, "clicked",
60 G_CALLBACK(OnClickLearnMoreLinkThunk), this);
61 gtk_box_pack_start(GTK_BOX(learn_more_line),
62 learn_more_link, FALSE, FALSE, 0);
63
64 GtkWidget* bottom_line = gtk_hbox_new(FALSE, kContentBorder); 51 GtkWidget* bottom_line = gtk_hbox_new(FALSE, kContentBorder);
65 gtk_box_pack_start(GTK_BOX(bubble_content), 52 gtk_box_pack_start(GTK_BOX(bubble_content),
66 bottom_line, FALSE, FALSE, 0); 53 bottom_line, FALSE, FALSE, 0);
67 54
68 // Advanced link. 55 // Advanced link.
69 GtkWidget* advanced_link = theme_provider->BuildChromeLinkButton( 56 GtkWidget* advanced_link = theme_provider->BuildChromeLinkButton(
70 l10n_util::GetStringUTF8(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED)); 57 l10n_util::GetStringUTF8(IDS_SYNC_PROMO_NTP_BUBBLE_ADVANCED));
71 g_signal_connect(advanced_link, "clicked", 58 g_signal_connect(advanced_link, "clicked",
72 G_CALLBACK(OnClickAdvancedLinkThunk), this); 59 G_CALLBACK(OnClickAdvancedLinkThunk), this);
73 gtk_box_pack_start(GTK_BOX(bottom_line), 60 gtk_box_pack_start(GTK_BOX(bottom_line),
74 advanced_link, FALSE, FALSE, 0); 61 advanced_link, FALSE, FALSE, 0);
75 62
76 // OK Button. 63 // OK Button.
77 GtkWidget* ok_button = gtk_button_new_with_label( 64 GtkWidget* ok_button = gtk_button_new_with_label(
78 l10n_util::GetStringUTF8(IDS_OK).c_str()); 65 l10n_util::GetStringUTF8(IDS_OK).c_str());
79 g_signal_connect(ok_button, "clicked", 66 g_signal_connect(ok_button, "clicked",
80 G_CALLBACK(OnClickOKThunk), this); 67 G_CALLBACK(OnClickOKThunk), this);
81 gtk_box_pack_end(GTK_BOX(bottom_line), 68 gtk_box_pack_end(GTK_BOX(bottom_line),
82 ok_button, FALSE, FALSE, 0); 69 ok_button, FALSE, FALSE, 0);
83 70
71 // Undo Button.
72 // TODO(akalin): at the moment, the OK and undo buttons are not the same
73 // size and look kind of ugly. Figure out how to make it nicer.
74 GtkWidget* undo_button = gtk_button_new_with_label(
75 l10n_util::GetStringUTF8(IDS_ONE_CLICK_BUBBLE_UNDO).c_str());
76 g_signal_connect(undo_button, "clicked",
77 G_CALLBACK(OnClickUndoThunk), this);
78 gtk_box_pack_end(GTK_BOX(bottom_line),
79 undo_button, FALSE, FALSE, 0);
80
84 GtkWidget* const app_menu_widget = 81 GtkWidget* const app_menu_widget =
85 browser_window_gtk->GetToolbar()->GetAppMenuButton(); 82 browser_window_gtk->GetToolbar()->GetAppMenuButton();
86 gfx::Rect bounds = gtk_util::WidgetBounds(app_menu_widget); 83 gfx::Rect bounds = gtk_util::WidgetBounds(app_menu_widget);
87 BubbleGtk::ArrowLocationGtk arrow_location = base::i18n::IsRTL() ? 84 BubbleGtk::ArrowLocationGtk arrow_location = base::i18n::IsRTL() ?
88 BubbleGtk::ARROW_LOCATION_TOP_LEFT : BubbleGtk::ARROW_LOCATION_TOP_RIGHT; 85 BubbleGtk::ARROW_LOCATION_TOP_LEFT : BubbleGtk::ARROW_LOCATION_TOP_RIGHT;
89 bubble_ = 86 bubble_ =
90 BubbleGtk::Show(app_menu_widget, &bounds, bubble_content, 87 BubbleGtk::Show(app_menu_widget, &bounds, bubble_content,
91 arrow_location, 88 arrow_location,
92 true, // match_system_theme 89 true, // match_system_theme
93 true, // grab_input 90 true, // grab_input
94 theme_provider, this); 91 theme_provider, this);
95 gtk_widget_grab_focus(ok_button); 92 gtk_widget_grab_focus(ok_button);
96 } 93 }
97 94
98 void OneClickSigninBubbleGtk::BubbleClosing( 95 void OneClickSigninBubbleGtk::BubbleClosing(
99 BubbleGtk* bubble, bool closed_by_escape) { 96 BubbleGtk* bubble, bool closed_by_escape) {
97 if (!start_sync_callback_.is_null())
98 base::ResetAndReturn(&start_sync_callback_).Run(true);
99
100 delete this; 100 delete this;
101 } 101 }
102 102
103 void OneClickSigninBubbleGtk::ClickOKForTest() { 103 void OneClickSigninBubbleGtk::ClickOKForTest() {
104 OnClickOK(NULL); 104 OnClickOK(NULL);
105 } 105 }
106 106
107 void OneClickSigninBubbleGtk::ClickLearnMoreForTest() { 107 void OneClickSigninBubbleGtk::ClickUndoForTest() {
108 OnClickLearnMoreLink(NULL); 108 OnClickUndo(NULL);
109 } 109 }
110 110
111 void OneClickSigninBubbleGtk::ClickAdvancedForTest() { 111 void OneClickSigninBubbleGtk::ClickAdvancedForTest() {
112 OnClickAdvancedLink(NULL); 112 OnClickAdvancedLink(NULL);
113 } 113 }
114 114
115 void OneClickSigninBubbleGtk::OnClickLearnMoreLink(GtkWidget* link) { 115 void OneClickSigninBubbleGtk::CloseForTest() {
116 learn_more_callback_.Run();
117 bubble_->Close(); 116 bubble_->Close();
118 } 117 }
119 118
120 void OneClickSigninBubbleGtk::OnClickAdvancedLink(GtkWidget* link) { 119 void OneClickSigninBubbleGtk::OnClickAdvancedLink(GtkWidget* link) {
121 advanced_callback_.Run(); 120 base::ResetAndReturn(&start_sync_callback_).Run(false);
122 bubble_->Close(); 121 bubble_->Close();
123 } 122 }
124 123
125 void OneClickSigninBubbleGtk::OnClickOK(GtkWidget* link) { 124 void OneClickSigninBubbleGtk::OnClickOK(GtkWidget* link) {
125 base::ResetAndReturn(&start_sync_callback_).Run(true);
126 bubble_->Close(); 126 bubble_->Close();
127 } 127 }
128 128
129 OneClickSigninBubbleGtk::~OneClickSigninBubbleGtk() {} 129 void OneClickSigninBubbleGtk::OnClickUndo(GtkWidget* link) {
130 start_sync_callback_.Reset();
131 bubble_->Close();
132 }
133
134 OneClickSigninBubbleGtk::~OneClickSigninBubbleGtk() {
135 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698