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

Unified Diff: chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc

Issue 10696042: [gtk] add oauth2 scopes zippies in extension install dialog (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: i18n Created 8 years, 6 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 side-by-side diff with in-line comments
Download patch
Index: chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc
diff --git a/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc b/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc
index 28bb3e594fb035329f30d75c47cfb9c28e5f7f97..9b6d714af246ee3bae4e933832f34bbdd4adaca1 100644
--- a/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc
+++ b/chrome/browser/ui/gtk/extensions/extension_install_dialog_gtk.cc
@@ -31,6 +31,7 @@ namespace {
const int kLeftColumnMinWidth = 250;
const int kImageSize = 69;
+const int kDetailIndent = 20;
// Additional padding (beyond on ui::kControlSpacing) all sides of each
// permission in the permissions list.
@@ -48,6 +49,32 @@ void AddResourceIcon(const gfx::ImageSkia* icon, void* data) {
gtk_box_pack_start(GTK_BOX(container), icon_widget, FALSE, FALSE, 0);
}
+void OnZippyButtonRealize(GtkWidget* event_box, gpointer unused) {
+ gdk_window_set_cursor(event_box->window, gfx::GetCursor(GDK_HAND2));
+}
+
+gboolean OnZippyButtonRelease(GtkWidget* event_box,
+ GdkEvent* event,
+ GtkWidget* detail_box) {
+ if (event->button.button != 1)
+ return FALSE;
+
+ GtkWidget* arrow =
+ GTK_WIDGET(gtk_object_get_data(GTK_OBJECT(event_box), "arrow"));
+
+ if (gtk_widget_get_visible(detail_box)) {
+ gtk_widget_hide(detail_box);
+ gtk_arrow_set(GTK_ARROW(arrow), GTK_ARROW_RIGHT, GTK_SHADOW_OUT);
+ } else {
+ gtk_widget_set_no_show_all(detail_box, FALSE);
+ gtk_widget_show_all(detail_box);
+ gtk_widget_set_no_show_all(detail_box, TRUE);
+ gtk_arrow_set(GTK_ARROW(arrow), GTK_ARROW_DOWN, GTK_SHADOW_OUT);
+ }
+
+ return TRUE;
+}
+
} // namespace
namespace browser {
@@ -67,6 +94,9 @@ class ExtensionInstallDialog {
CHROMEGTK_CALLBACK_1(ExtensionInstallDialog, void, OnResponse, int);
CHROMEGTK_CALLBACK_0(ExtensionInstallDialog, void, OnStoreLinkClick);
+ GtkWidget* CreateWidgetForIssueAdvice(
+ const IssueAdviceInfoEntry& issue_advice, int pixel_width);
+
Browser* browser_;
ExtensionInstallPrompt::Delegate* delegate_;
std::string extension_id_; // Set for INLINE_INSTALL_PROMPT.
@@ -127,6 +157,7 @@ ExtensionInstallDialog::ExtensionInstallDialog(
GtkWidget* left_column_area = gtk_vbox_new(FALSE, ui::kControlSpacing);
gtk_box_pack_start(GTK_BOX(top_content_hbox), left_column_area,
TRUE, TRUE, 0);
+ gtk_widget_set_size_request(left_column_area, kLeftColumnMinWidth, -1);
GtkWidget* heading_vbox = gtk_vbox_new(FALSE, 0);
// If we are not going to show anything else, vertically center the title.
@@ -237,27 +268,25 @@ ExtensionInstallDialog::ExtensionInstallDialog(
}
if (show_oauth_issues) {
- GtkWidget* oauth_issues_container;
- if (is_inline_install) {
- oauth_issues_container = content_vbox;
- gtk_box_pack_start(GTK_BOX(content_vbox), gtk_hseparator_new(),
- FALSE, FALSE, ui::kControlSpacing);
- } else {
- oauth_issues_container = left_column_area;
- }
+ // If permissions are shown, then the scopes will go below them and take
+ // up the entire width of the dialog. Otherwise the scopes will go where
+ // the permissions usually go.
+ GtkWidget* oauth_issues_container =
+ show_permissions ? content_vbox : left_column_area;
+ int pixel_width = kLeftColumnMinWidth +
+ (show_permissions ? kImageSize : 0);
GtkWidget* oauth_issues_header = gtk_util::CreateBoldLabel(
- "The app wants these scopes:");
- gtk_util::SetLabelWidth(oauth_issues_header, kLeftColumnMinWidth);
+ UTF16ToUTF8(prompt.GetOAuthHeading()).c_str());
+ gtk_util::SetLabelWidth(oauth_issues_header, pixel_width);
gtk_box_pack_start(GTK_BOX(oauth_issues_container), oauth_issues_header,
FALSE, FALSE, 0);
// TODO(estade): display the issue details under zippies.
for (size_t i = 0; i < prompt.GetOAuthIssueCount(); ++i) {
- GtkWidget* label = gtk_label_new(
- prompt.GetOAuthIssue(i).description.c_str());
- gtk_util::SetLabelWidth(label, kLeftColumnMinWidth);
- gtk_box_pack_start(GTK_BOX(oauth_issues_container), label,
+ GtkWidget* issue_advice_widget =
+ CreateWidgetForIssueAdvice(prompt.GetOAuthIssue(i), pixel_width);
+ gtk_box_pack_start(GTK_BOX(oauth_issues_container), issue_advice_widget,
FALSE, FALSE, kPermissionsPadding);
}
}
@@ -274,11 +303,10 @@ ExtensionInstallDialog::~ExtensionInstallDialog() {
}
void ExtensionInstallDialog::OnResponse(GtkWidget* dialog, int response_id) {
- if (response_id == GTK_RESPONSE_ACCEPT) {
+ if (response_id == GTK_RESPONSE_ACCEPT)
delegate_->InstallUIProceed();
- } else {
+ else
delegate_->InstallUIAbort(true);
- }
gtk_widget_destroy(dialog_);
delete this;
@@ -294,6 +322,63 @@ void ExtensionInstallDialog::OnStoreLinkClick(GtkWidget* sender) {
OnResponse(dialog_, GTK_RESPONSE_CLOSE);
}
+GtkWidget* ExtensionInstallDialog::CreateWidgetForIssueAdvice(
+ const IssueAdviceInfoEntry& issue_advice, int pixel_width) {
+ GtkWidget* box = gtk_vbox_new(FALSE, ui::kControlSpacing);
+ GtkWidget* header = gtk_hbox_new(FALSE, 0);
+ GtkWidget* event_box = gtk_event_box_new();
+ gtk_container_add(GTK_CONTAINER(event_box), header);
+ gtk_box_pack_start(GTK_BOX(box), event_box, FALSE, FALSE,
+ kPermissionsPadding);
+
+ GtkWidget* arrow = NULL;
+ GtkWidget* label = NULL;
+ int label_pixel_width = pixel_width;
+
+ if (issue_advice.details.empty()) {
+ label = gtk_label_new(l10n_util::GetStringFUTF8(
+ IDS_EXTENSION_PERMISSION_LINE,
+ UTF8ToUTF16(issue_advice.description)).c_str());
+ } else {
+ arrow = gtk_arrow_new(GTK_ARROW_RIGHT, GTK_SHADOW_OUT);
+ GtkRequisition req;
+ gtk_widget_size_request(arrow, &req);
+ label_pixel_width -= req.width;
+
+ label = gtk_label_new(issue_advice.description.c_str());
+
+ GtkWidget* detail_box = gtk_vbox_new(FALSE, ui::kControlSpacing);
+ gtk_box_pack_start(GTK_BOX(box), detail_box, FALSE, FALSE, 0);
+ gtk_widget_set_no_show_all(detail_box, TRUE);
+ gtk_object_set_data(GTK_OBJECT(event_box), "arrow", arrow);
+
+ for (size_t i = 0; i < issue_advice.details.size(); ++i) {
+ std::string text = l10n_util::GetStringFUTF8(
+ IDS_EXTENSION_PERMISSION_LINE, UTF8ToUTF16(issue_advice.details[i]));
+ GtkWidget* label = gtk_label_new(text.c_str());
+ gtk_util::SetLabelWidth(label, pixel_width - kDetailIndent);
+
+ GtkWidget* align = gtk_alignment_new(0.0, 0.0, 1.0, 1.0);
+ gtk_alignment_set_padding(GTK_ALIGNMENT(align), 0, 0, kDetailIndent, 0);
+ gtk_container_add(GTK_CONTAINER(align), label);
+ gtk_box_pack_start(GTK_BOX(detail_box), align, FALSE, FALSE,
+ kPermissionsPadding);
+ }
+
+ g_signal_connect(event_box, "realize",
+ G_CALLBACK(OnZippyButtonRealize), NULL);
+ g_signal_connect(event_box, "button-release-event",
+ G_CALLBACK(OnZippyButtonRelease), detail_box);
+ }
+
+ gtk_util::SetLabelWidth(label, label_pixel_width);
+ if (arrow)
+ gtk_box_pack_start(GTK_BOX(header), arrow, FALSE, FALSE, 0);
+ gtk_box_pack_start(GTK_BOX(header), label, TRUE, TRUE, 0);
+
+ return box;
+}
+
} // namespace browser
void ShowExtensionInstallDialogImpl(
« chrome/app/generated_resources.grd ('K') | « chrome/browser/extensions/extension_install_prompt.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698