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

Side by Side Diff: ui/message_center/views/notifier_settings_view.cc

Issue 12465011: Redesign notifier settings view. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 7 years, 9 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
« no previous file with comments | « ui/message_center/views/notifier_settings_view.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2013 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2013 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 "ui/message_center/views/notifier_settings_view.h" 5 #include "ui/message_center/views/notifier_settings_view.h"
6 6
7 #include "grit/ui_strings.h" 7 #include "grit/ui_strings.h"
8 #include "third_party/skia/include/core/SkColor.h" 8 #include "third_party/skia/include/core/SkColor.h"
9 #include "ui/base/l10n/l10n_util.h" 9 #include "ui/base/l10n/l10n_util.h"
10 #include "ui/base/resource/resource_bundle.h"
11 #include "ui/gfx/canvas.h"
10 #include "ui/gfx/image/image.h" 12 #include "ui/gfx/image/image.h"
11 #include "ui/gfx/size.h" 13 #include "ui/gfx/size.h"
12 #include "ui/message_center/message_center_constants.h" 14 #include "ui/message_center/message_center_constants.h"
13 #include "ui/views/background.h" 15 #include "ui/views/background.h"
14 #include "ui/views/border.h" 16 #include "ui/views/border.h"
15 #include "ui/views/controls/button/checkbox.h" 17 #include "ui/views/controls/button/checkbox.h"
16 #include "ui/views/controls/button/custom_button.h" 18 #include "ui/views/controls/button/custom_button.h"
17 #include "ui/views/controls/image_view.h" 19 #include "ui/views/controls/image_view.h"
18 #include "ui/views/controls/label.h" 20 #include "ui/views/controls/label.h"
21 #include "ui/views/controls/scroll_view.h"
19 #include "ui/views/layout/box_layout.h" 22 #include "ui/views/layout/box_layout.h"
20 #include "ui/views/widget/widget.h" 23 #include "ui/views/widget/widget.h"
21 24
22 #if defined(USE_AURA) 25 #if defined(USE_AURA)
23 #include "ui/aura/window.h" 26 #include "ui/aura/window.h"
24 #endif 27 #endif
25 28
26 namespace message_center { 29 namespace message_center {
27 namespace { 30 namespace {
28 31
29 const int kSpaceInButtonComponents = 16; 32 const int kSpaceInButtonComponents = 16;
30 const int kMarginWidth = 16; 33 const int kMarginWidth = 16;
34 const int kMinimumWindowWidth = 320;
35 const int kMinimumWindowHeight = 480;
36 const int kEntryHeight = kMinimumWindowHeight / 10;
37 const SkColor kSeparatorColor = SkColorSetRGB(0xcc, 0xcc, 0xcc);
31 38
32 NotifierSettingsView* settings_view_ = NULL; 39 NotifierSettingsView* settings_view_ = NULL;
33 40
41 // The layout manager to guarantee the 48px height and place the view at the
42 // middle. It also guarantee the left margin.
43 class NotifierSettingsEntryLayoutManager : public views::LayoutManager {
dharcourt 2013/03/13 23:33:56 Nit: Since this class is private to NotifierSettin
dharcourt 2013/03/13 23:33:56 Suggestion: Having an EntryView that implements th
Jun Mukai 2013/03/14 06:47:48 Changed to EntryView. The code gets more concise.
44 public:
45 NotifierSettingsEntryLayoutManager() {}
46 virtual ~NotifierSettingsEntryLayoutManager() {}
dharcourt 2013/03/13 23:33:56 Nit: Chromium style recommends against inlining ev
Jun Mukai 2013/03/14 06:47:48 fixed...
47
48 virtual void Layout(views::View* host) OVERRIDE;
49 virtual gfx::Size GetPreferredSize(views::View* host) OVERRIDE;
50
51 private:
52 DISALLOW_COPY_AND_ASSIGN(NotifierSettingsEntryLayoutManager);
53 };
54
55 void NotifierSettingsEntryLayoutManager::Layout(views::View* host) {
56 if (!host->has_children())
57 return;
58
59 views::View* child = host->child_at(0);
60 gfx::Size size = child->GetPreferredSize();
61 int y = 0;
62 if (size.height() < host->height())
63 y = (host->height() - size.height()) / 2;
64 child->SetBounds(
65 kMarginWidth, y, host->width() - kMarginWidth, size.height());
66 }
67
68 gfx::Size NotifierSettingsEntryLayoutManager::GetPreferredSize(
69 views::View* host) {
70 DCHECK_EQ(1, host->child_count());
dharcourt 2013/03/13 23:33:56 Q: Why is this a DCHECK whereas a similar check in
Jun Mukai 2013/03/14 06:47:48 Added DCHECK to both.
71 gfx::Size size = host->child_at(0)->GetPreferredSize();
72 size.ClampToMin(gfx::Size(kMinimumWindowWidth, kEntryHeight));
73 return size;
74 }
75
76 // The horizontal bar between title and scroller.
77 class SeparatorView : public views::View {
dharcourt 2013/03/13 23:33:56 Suggestion: It's kind of a hack, but you could rep
Jun Mukai 2013/03/14 06:47:48 Thinking about this more, I decided to change it t
78 public:
79 SeparatorView() {}
80 virtual ~SeparatorView() {}
81
82 virtual void OnPaint(gfx::Canvas* canvas) OVERRIDE;
83
84 private:
85 DISALLOW_COPY_AND_ASSIGN(SeparatorView);
86 };
87
88 void SeparatorView::OnPaint(gfx::Canvas* canvas) {
89 canvas->DrawLine(gfx::Point(kMarginWidth, 0),
90 gfx::Point(width() - kMarginWidth, 0),
91 kSeparatorColor);
92 }
93
34 } // namespace 94 } // namespace
35 95
36 NotifierSettingsDelegate* ShowSettings(NotifierSettingsProvider* provider, 96 NotifierSettingsDelegate* ShowSettings(NotifierSettingsProvider* provider,
37 gfx::NativeView context) { 97 gfx::NativeView context) {
38 if (!settings_view_) { 98 if (!settings_view_) {
39 settings_view_ = NotifierSettingsView::Create(provider, context); 99 settings_view_ = NotifierSettingsView::Create(provider, context);
40 } 100 }
41 return settings_view_; 101 return settings_view_;
42 } 102 }
43 103
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after
145 return; 205 return;
146 } 206 }
147 } 207 }
148 } 208 }
149 209
150 NotifierSettingsView::NotifierSettingsView( 210 NotifierSettingsView::NotifierSettingsView(
151 NotifierSettingsProvider* delegate) 211 NotifierSettingsProvider* delegate)
152 : delegate_(delegate) { 212 : delegate_(delegate) {
153 DCHECK(delegate_); 213 DCHECK(delegate_);
154 214
155 SetLayoutManager(new views::BoxLayout(
156 views::BoxLayout::kVertical, kMarginWidth, kMarginWidth, kMarginWidth));
157 set_background(views::Background::CreateSolidBackground(SK_ColorWHITE)); 215 set_background(views::Background::CreateSolidBackground(SK_ColorWHITE));
158 216
159 views::Label* top_label = new views::Label( 217 title_entry_ = new views::View();
160 l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_FOOTER_TITLE)); 218 title_entry_->SetLayoutManager(new NotifierSettingsEntryLayoutManager());
219 gfx::Font title_font =
220 ResourceBundle::GetSharedInstance().GetFont(ResourceBundle::MediumFont);
221 views::Label* title_label = new views::Label(
222 l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_SETTINGS_BUTTON_LABEL),
223 title_font);
224 title_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
225 title_label->SetMultiLine(true);
226 title_entry_->AddChildView(title_label);
227 AddChildView(title_entry_);
228
229 separator_ = new SeparatorView();
230 AddChildView(separator_);
231
232 scroller_ = new views::ScrollView();
233 // TODO(mukai): set kennedy scroll bar here.
234 AddChildView(scroller_);
235
236 views::View* contents_view = new views::View();
237 contents_view->SetLayoutManager(new views::BoxLayout(
238 views::BoxLayout::kVertical, 0, 0, 0));
239
240 views::View* top_entry = new views::View();
241 top_entry->SetLayoutManager(new NotifierSettingsEntryLayoutManager());
242 views::Label* top_label = new views::Label(l10n_util::GetStringUTF16(
243 IDS_MESSAGE_CENTER_SETTINGS_DIALOG_DESCRIPTION));
161 top_label->SetHorizontalAlignment(gfx::ALIGN_LEFT); 244 top_label->SetHorizontalAlignment(gfx::ALIGN_LEFT);
162 AddChildView(top_label); 245 top_label->SetMultiLine(true);
163 246 top_label->SizeToFit(kMinimumWindowWidth - kMarginWidth);
164 views::View* items = new views::View(); 247 top_entry->AddChildView(top_label);
165 items->SetLayoutManager(new views::BoxLayout( 248 contents_view->AddChildView(top_entry);
166 views::BoxLayout::kVertical, 0, 0, kMarginWidth));
167 items->set_border(views::Border::CreateEmptyBorder(0, kMarginWidth, 0, 0));
168 AddChildView(items);
169 249
170 std::vector<Notifier*> notifiers; 250 std::vector<Notifier*> notifiers;
171 delegate_->GetNotifierList(&notifiers); 251 delegate_->GetNotifierList(&notifiers);
172 for (size_t i = 0; i < notifiers.size(); ++i) { 252 for (size_t i = 0; i < notifiers.size(); ++i) {
173 NotifierButton* button = new NotifierButton(notifiers[i], this); 253 NotifierButton* button = new NotifierButton(notifiers[i], this);
174 items->AddChildView(button); 254 views::View* button_entry = new views::View();
255 button_entry->SetLayoutManager(new NotifierSettingsEntryLayoutManager());
256 button_entry->AddChildView(button);
257 contents_view->AddChildView(button_entry);
175 buttons_.insert(button); 258 buttons_.insert(button);
176 } 259 }
260 scroller_->SetContents(contents_view);
261
262 gfx::Size contents_size = contents_view->GetPreferredSize();
263 if (kMinimumWindowWidth <
dharcourt 2013/03/13 23:33:56 Typo? Shouldn't this be kMinimumWindowHeight, and
Jun Mukai 2013/03/14 06:47:48 Aww, right. fixed. Thanks!
264 title_entry_->GetPreferredSize().height() + contents_size.height()) {
265 contents_size.Enlarge(-scroller_->GetScrollBarWidth(), 0);
266 }
267 contents_view->SetBoundsRect(gfx::Rect(contents_size));
177 } 268 }
178 269
179 NotifierSettingsView::~NotifierSettingsView() { 270 NotifierSettingsView::~NotifierSettingsView() {
180 settings_view_ = NULL; 271 settings_view_ = NULL;
181 } 272 }
182 273
183 bool NotifierSettingsView::CanResize() const {
184 return true;
185 }
186
187 string16 NotifierSettingsView::GetWindowTitle() const {
188 return l10n_util::GetStringUTF16(IDS_MESSAGE_CENTER_SETTINGS_BUTTON_LABEL);
189 }
190
191 void NotifierSettingsView::WindowClosing() { 274 void NotifierSettingsView::WindowClosing() {
192 if (delegate_) 275 if (delegate_)
193 delegate_->OnNotifierSettingsClosing(); 276 delegate_->OnNotifierSettingsClosing();
194 } 277 }
195 278
196 views::View* NotifierSettingsView::GetContentsView() { 279 views::View* NotifierSettingsView::GetContentsView() {
197 return this; 280 return this;
198 } 281 }
199 282
283 void NotifierSettingsView::Layout() {
284 int title_height = title_entry_->GetPreferredSize().height();
285 title_entry_->SetBounds(0, 0, width(), title_height);
286 separator_->SetBounds(0, title_height,
287 width() - scroller_->GetScrollBarWidth(), 1);
288 scroller_->SetBounds(0, title_height, width(), height() - title_height);
dharcourt 2013/03/13 23:33:56 Typo? Shouldn't y be (title_height + 1) and height
Jun Mukai 2013/03/14 06:47:48 Since separator_ is gone (it now belongs to scroll
289 }
290
291 gfx::Size NotifierSettingsView::GetMinimumSize() {
292 return gfx::Size(kMinimumWindowWidth, kMinimumWindowHeight);
293 }
294
200 void NotifierSettingsView::ButtonPressed(views::Button* sender, 295 void NotifierSettingsView::ButtonPressed(views::Button* sender,
201 const ui::Event& event) { 296 const ui::Event& event) {
202 std::set<NotifierButton*>::iterator iter = buttons_.find( 297 std::set<NotifierButton*>::iterator iter = buttons_.find(
203 static_cast<NotifierButton*>(sender)); 298 static_cast<NotifierButton*>(sender));
204 DCHECK(iter != buttons_.end()); 299 DCHECK(iter != buttons_.end());
205 300
206 (*iter)->SetChecked(!(*iter)->checked()); 301 (*iter)->SetChecked(!(*iter)->checked());
207 if (delegate_) 302 if (delegate_)
208 delegate_->SetNotifierEnabled((*iter)->notifier(), (*iter)->checked()); 303 delegate_->SetNotifierEnabled((*iter)->notifier(), (*iter)->checked());
209 } 304 }
210 305
211 } // namespace message_center 306 } // namespace message_center
OLDNEW
« no previous file with comments | « ui/message_center/views/notifier_settings_view.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698