Chromium Code Reviews| Index: chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc |
| diff --git a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc |
| index 6bfece7f18862c5704c1ee453701bb69516d6d1c..015141ab1cbfee4a47eca1e95d85582924200d83 100644 |
| --- a/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc |
| +++ b/chrome/browser/ui/views/passwords/manage_passwords_bubble_view.cc |
| @@ -17,6 +17,7 @@ |
| #include "chrome/browser/ui/views/passwords/manage_credential_item_view.h" |
| #include "chrome/browser/ui/views/passwords/manage_password_items_view.h" |
| #include "chrome/browser/ui/views/passwords/manage_passwords_icon_view.h" |
| +#include "chrome/browser/ui/views/passwords/save_account_more_combobox_model.h" |
| #include "chrome/grit/generated_resources.h" |
| #include "content/public/browser/render_view_host.h" |
| #include "ui/base/l10n/l10n_util.h" |
| @@ -48,22 +49,26 @@ enum ColumnSetType { |
| // | | (FILL, FILL) | | |
| // Used for the bubble's header, the credentials list, and for simple |
| // messages like "No passwords". |
| - SINGLE_VIEW_COLUMN_SET = 0, |
|
Mike West
2015/03/19 12:50:24
Nit: Why kill the assignments? Don't we need to en
vasilii
2015/03/19 14:48:57
There is no reason for them to be zero-based. Note
|
| + SINGLE_VIEW_COLUMN_SET, |
| // | | (TRAILING, CENTER) | | (TRAILING, CENTER) | | |
| // Used for buttons at the bottom of the bubble which should nest at the |
| // bottom-right corner. |
| - DOUBLE_BUTTON_COLUMN_SET = 1, |
| + DOUBLE_BUTTON_COLUMN_SET, |
| // | | (LEADING, CENTER) | | (TRAILING, CENTER) | | |
| // Used for buttons at the bottom of the bubble which should occupy |
| // the corners. |
| - LINK_BUTTON_COLUMN_SET = 2, |
| + LINK_BUTTON_COLUMN_SET, |
| // | | (TRAILING, CENTER) | | |
| // Used when there is only one button which should next at the bottom-right |
| // corner. |
| - SINGLE_BUTTON_COLUMN_SET = 3, |
| + SINGLE_BUTTON_COLUMN_SET, |
| + |
| + // | | (LEADING, CENTER) | | (TRAILING, CENTER) | | (TRAILING, CENTER) | | |
| + // Used when there are three buttons. |
| + TRIPLE_BUTTON_COLUMN_SET, |
| }; |
| enum TextRowType { ROW_SINGLE, ROW_MULTILINE }; |
| @@ -121,6 +126,28 @@ void BuildColumnSet(views::GridLayout* layout, ColumnSetType type) { |
| views::GridLayout::USE_PREF, |
| 0, |
| 0); |
| + case TRIPLE_BUTTON_COLUMN_SET: |
| + column_set->AddColumn(views::GridLayout::LEADING, |
| + views::GridLayout::CENTER, |
| + 1, |
| + views::GridLayout::USE_PREF, |
| + 0, |
| + 0); |
| + column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing); |
| + column_set->AddColumn(views::GridLayout::TRAILING, |
| + views::GridLayout::CENTER, |
| + 0, |
| + views::GridLayout::USE_PREF, |
| + 0, |
| + 0); |
| + column_set->AddPaddingColumn(0, views::kRelatedButtonHSpacing); |
| + column_set->AddColumn(views::GridLayout::TRAILING, |
| + views::GridLayout::CENTER, |
| + 0, |
| + views::GridLayout::USE_PREF, |
| + 0, |
| + 0); |
| + break; |
| } |
| column_set->AddPaddingColumn(0, views::kPanelHorizMargin); |
| } |
| @@ -387,7 +414,107 @@ void ManagePasswordsBubbleView::PendingView::OnPerformAction( |
| } |
| } |
| -// ManagePasswordsBubbleView::ConfirmNeverView --------------------------------- |
| +// ManagePasswordsBubbleView::SaveAccountView --------------------------------- |
| + |
| +// A view offering the user the ability to save credentials. Contains 2 buttons |
| +// and a "More" combobox. |
| +class ManagePasswordsBubbleView::SaveAccountView |
| + : public views::View, |
| + public views::ButtonListener, |
| + public views::ComboboxListener { |
| + public: |
| + explicit SaveAccountView(ManagePasswordsBubbleView* parent); |
| + |
| + private: |
| + // views::ButtonListener: |
| + void ButtonPressed(views::Button* sender, const ui::Event& event) override; |
| + |
| + // Handles the event when the user changes an index of a combobox. |
| + void OnPerformAction(views::Combobox* source) override; |
| + |
| + ManagePasswordsBubbleView* parent_; |
| + |
| + views::BlueButton* save_button_; |
| + views::LabelButton* no_button_; |
| + |
| + // The combobox doesn't take ownership of its model. If we created a |
| + // combobox we need to ensure that we delete the model here, and because the |
| + // combobox uses the model in it's destructor, we need to make sure we |
| + // delete the model _after_ the combobox itself is deleted. |
| + SaveAccountMoreComboboxModel combobox_model_; |
| + scoped_ptr<views::Combobox> more_combobox_; |
| +}; |
| + |
| +ManagePasswordsBubbleView::SaveAccountView::SaveAccountView( |
| + ManagePasswordsBubbleView* parent) |
| + : parent_(parent) { |
| + views::GridLayout* layout = new views::GridLayout(this); |
|
Mike West
2015/03/19 12:50:23
Nit: Can you DCHECK that the new UI amazingness is
vasilii
2015/03/19 14:48:57
Yeah. But it's one more line to fix later, right?
|
| + layout->set_minimum_size(gfx::Size(kDesiredBubbleWidth, 0)); |
| + SetLayoutManager(layout); |
| + |
| + save_button_ = new views::BlueButton( |
| + this, |
| + l10n_util::GetStringUTF16(IDS_PASSWORD_MANAGER_SAVE_ACCOUNT_BUTTON)); |
| + save_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( |
| + ui::ResourceBundle::SmallFont)); |
| + |
| + no_button_ = new views::LabelButton(this, l10n_util::GetStringUTF16( |
| + IDS_PASSWORD_MANAGER_SAVE_PASSWORD_SMART_LOCK_NO_THANKS_BUTTON)); |
| + no_button_->SetStyle(views::Button::STYLE_BUTTON); |
| + no_button_->SetFontList(ui::ResourceBundle::GetSharedInstance().GetFontList( |
| + ui::ResourceBundle::SmallFont)); |
| + |
| + more_combobox_.reset(new views::Combobox(&combobox_model_)); |
| + more_combobox_->set_owned_by_client(); |
| + more_combobox_->set_listener(this); |
| + more_combobox_->SetStyle(views::Combobox::STYLE_ACTION); |
| + |
| + // Title row. |
| + BuildColumnSet(layout, SINGLE_VIEW_COLUMN_SET); |
| + AddTitleRow(layout, parent_->model()); |
| + |
| + // Button row. |
| + BuildColumnSet(layout, TRIPLE_BUTTON_COLUMN_SET); |
| + layout->StartRow(0, TRIPLE_BUTTON_COLUMN_SET); |
| + layout->AddView(more_combobox_.get()); |
| + layout->AddView(save_button_); |
| + layout->AddView(no_button_); |
| + // Extra padding for visual awesomeness. |
|
Mike West
2015/03/19 12:50:24
I smile every time I see this comment. :)
vasilii
2015/03/19 14:48:57
Should I write it somewhere here once more? ;-)
|
| + layout->AddPaddingRow(0, views::kRelatedControlVerticalSpacing); |
| + |
| + parent_->set_initially_focused_view(save_button_); |
| +} |
| + |
| +void ManagePasswordsBubbleView::SaveAccountView::ButtonPressed( |
| + views::Button* sender, |
| + const ui::Event& event) { |
| + if (sender == save_button_) { |
| + parent_->model()->OnSaveClicked(); |
| + } else if (sender == no_button_) { |
| + parent_->model()->OnNopeClicked(); |
| + } else { |
| + NOTREACHED(); |
| + } |
|
Mike West
2015/03/19 12:50:24
Nit: Don't need {} here.
vasilii
2015/03/19 14:48:57
Done.
|
| + parent_->Close(); |
| +} |
| + |
| +void ManagePasswordsBubbleView::SaveAccountView::OnPerformAction( |
| + views::Combobox* source) { |
| + DCHECK_EQ(source, more_combobox_); |
| + switch (more_combobox_->selected_index()) { |
| + case SaveAccountMoreComboboxModel::INDEX_MORE: |
| + break; |
| + case SaveAccountMoreComboboxModel::INDEX_NEVER_FOR_THIS_SITE: |
| + parent_->NotifyNeverForThisSiteClicked(); |
| + break; |
| + case SaveAccountMoreComboboxModel::INDEX_SETTINGS: |
| + parent_->model()->OnManageLinkClicked(); |
| + parent_->Close(); |
| + break; |
| + } |
| +} |
| + |
| +// ManagePasswordsBubbleView::ConfirmNeverView -------------------------------- |
| // A view offering the user the ability to undo her decision to never save |
| // passwords for a particular site. |
| @@ -982,10 +1109,14 @@ void ManagePasswordsBubbleView::Refresh() { |
| RemoveAllChildViews(true); |
| initially_focused_view_ = NULL; |
| if (model()->state() == password_manager::ui::PENDING_PASSWORD_STATE) { |
| - if (model()->never_save_passwords()) |
| + if (model()->never_save_passwords()) { |
| AddChildView(new ConfirmNeverView(this)); |
| - else |
| - AddChildView(new PendingView(this)); |
| + } else { |
| + if (model()->IsNewUIActive()) |
| + AddChildView(new SaveAccountView(this)); |
| + else |
| + AddChildView(new PendingView(this)); |
| + } |
| } else if (model()->state() == password_manager::ui::BLACKLIST_STATE) { |
| AddChildView(new BlacklistedView(this)); |
| } else if (model()->state() == password_manager::ui::CONFIRMATION_STATE) { |
| @@ -1012,6 +1143,7 @@ void ManagePasswordsBubbleView::NotifyConfirmedNeverForThisSite() { |
| void ManagePasswordsBubbleView::NotifyUndoNeverForThisSite() { |
| model()->OnUndoNeverForThisSite(); |
| Refresh(); |
| + SizeToContents(); |
| } |
| void ManagePasswordsBubbleView::NotifyNeverForThisSiteClicked() { |
| @@ -1021,5 +1153,6 @@ void ManagePasswordsBubbleView::NotifyNeverForThisSiteClicked() { |
| } else { |
| model()->OnConfirmationForNeverForThisSite(); |
| Refresh(); |
| + SizeToContents(); |
| } |
| } |