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

Side by Side Diff: ash/system/network/tray_network.cc

Issue 9664056: ash uber tray: Add the detailed network popup (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: . Created 8 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 | « ash/system/network/tray_network.h ('k') | ash/system/tray/system_tray.h » ('j') | 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) 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 "ash/system/network/tray_network.h" 5 #include "ash/system/network/tray_network.h"
6 6
7 #include "ash/shell.h" 7 #include "ash/shell.h"
8 #include "ash/system/tray/system_tray.h"
8 #include "ash/system/tray/system_tray_delegate.h" 9 #include "ash/system/tray/system_tray_delegate.h"
10 #include "base/utf_string_conversions.h"
11 #include "grit/ash_strings.h"
12 #include "grit/ui_resources.h"
13 #include "ui/base/resource/resource_bundle.h"
14 #include "ui/gfx/font.h"
15 #include "ui/gfx/image/image.h"
9 #include "ui/views/controls/image_view.h" 16 #include "ui/views/controls/image_view.h"
10 #include "ui/views/controls/label.h" 17 #include "ui/views/controls/label.h"
18 #include "ui/views/controls/scroll_view.h"
11 #include "ui/views/layout/fill_layout.h" 19 #include "ui/views/layout/fill_layout.h"
12 #include "ui/views/layout/box_layout.h" 20 #include "ui/views/layout/box_layout.h"
13 #include "ui/views/view.h" 21 #include "ui/views/view.h"
22 #include "ui/views/widget/widget.h"
23
24 namespace {
25
26 // Padding for items that do not have any icons.
27 const int kItemPaddingLeft = 27;
28
29 class ViewClickListener {
30 public:
31 virtual void ClickedOn(views::View* sender) = 0;
32 };
33
34 class HoverHighlightView : public views::View {
35 public:
36 explicit HoverHighlightView(ViewClickListener* listener)
37 : listener_(listener) {
38 set_notify_enter_exit_on_child(true);
39 }
40
41 virtual ~HoverHighlightView() {}
42
43 private:
44 // Overridden from views::View.
45 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE {
46 if (!listener_)
47 return false;
48 listener_->ClickedOn(this);
49 return true;
50 }
51
52 virtual void OnMouseEntered(const views::MouseEvent& event) OVERRIDE {
53 set_background(views::Background::CreateSolidBackground(
54 SkColorSetARGB(10, 0, 0, 0)));
55 SchedulePaint();
56 }
57
58 virtual void OnMouseExited(const views::MouseEvent& event) OVERRIDE {
59 set_background(NULL);
60 SchedulePaint();
61 }
62
63 ViewClickListener* listener_;
64
65 DISALLOW_COPY_AND_ASSIGN(HoverHighlightView);
66 };
67
68 }
14 69
15 namespace ash { 70 namespace ash {
16 namespace internal { 71 namespace internal {
17 72
18 namespace tray { 73 namespace tray {
19 74
20 enum ResourceSize { 75 enum ResourceSize {
21 SMALL, 76 SMALL,
22 LARGE, 77 LARGE,
23 }; 78 };
24 79
25 class NetworkTrayView : public views::View { 80 class NetworkTrayView : public views::View {
26 public: 81 public:
27 explicit NetworkTrayView(ResourceSize size) : resource_size_(size) { 82 explicit NetworkTrayView(ResourceSize size) : resource_size_(size) {
28 SetLayoutManager(new views::FillLayout()); 83 SetLayoutManager(new views::FillLayout());
29 84
30 image_view_ = new views::ImageView; 85 image_view_ = new views::ImageView;
31 AddChildView(image_view_); 86 AddChildView(image_view_);
32 87
33 Update(Shell::GetInstance()->tray_delegate()->GetMostRelevantNetworkIcon()); 88 Update(Shell::GetInstance()->tray_delegate()->
89 GetMostRelevantNetworkIcon(resource_size_ == LARGE));
34 } 90 }
35 91
36 virtual ~NetworkTrayView() {} 92 virtual ~NetworkTrayView() {}
37 93
38 void Update(const NetworkIconInfo& info) { 94 void Update(const NetworkIconInfo& info) {
39 image_view_->SetImage(info.image); 95 image_view_->SetImage(info.image);
40 SchedulePaint(); 96 SchedulePaint();
41 } 97 }
42 98
43 private: 99 private:
44 views::ImageView* image_view_; 100 views::ImageView* image_view_;
45 ResourceSize resource_size_; 101 ResourceSize resource_size_;
46 102
47 DISALLOW_COPY_AND_ASSIGN(NetworkTrayView); 103 DISALLOW_COPY_AND_ASSIGN(NetworkTrayView);
48 }; 104 };
49 105
50 class NetworkDefaultView : public views::View { 106 class NetworkDefaultView : public views::View {
51 public: 107 public:
52 NetworkDefaultView() { 108 explicit NetworkDefaultView(SystemTrayItem* owner) : owner_(owner) {
53 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal, 109 SetLayoutManager(new views::BoxLayout(views::BoxLayout::kHorizontal,
54 0, 0, 5)); 110 0, 0, 5));
55 111
56 icon_ = new NetworkTrayView(LARGE); 112 icon_ = new NetworkTrayView(LARGE);
57 AddChildView(icon_); 113 AddChildView(icon_);
58 114
59 label_ = new views::Label(); 115 label_ = new views::Label();
60 AddChildView(label_); 116 AddChildView(label_);
61 117
62 Update(Shell::GetInstance()->tray_delegate()->GetMostRelevantNetworkIcon()); 118 views::ImageView* more = new views::ImageView;
119 more->SetImage(ui::ResourceBundle::GetSharedInstance().GetImageNamed(
120 IDR_AURA_UBER_TRAY_MORE).ToSkBitmap());
121 AddChildView(more);
122
123 Update(Shell::GetInstance()->tray_delegate()->
124 GetMostRelevantNetworkIcon(true));
63 } 125 }
64 126
65 virtual ~NetworkDefaultView() {} 127 virtual ~NetworkDefaultView() {}
66 128
67 void Update(const NetworkIconInfo& info) { 129 void Update(const NetworkIconInfo& info) {
68 icon_->Update(info); 130 icon_->Update(info);
69 label_->SetText(info.description); 131 label_->SetText(info.description);
70 } 132 }
71 133
72 private: 134 private:
135 // Overridden from views::View.
136 virtual bool OnMousePressed(const views::MouseEvent& event) OVERRIDE {
137 owner_->PopupDetailedView(0, true);
138 return true;
139 }
140
141 SystemTrayItem* owner_;
73 NetworkTrayView* icon_; 142 NetworkTrayView* icon_;
74 views::Label* label_; 143 views::Label* label_;
75 144
76 DISALLOW_COPY_AND_ASSIGN(NetworkDefaultView); 145 DISALLOW_COPY_AND_ASSIGN(NetworkDefaultView);
77 }; 146 };
78 147
148 class NetworkDetailedView : public views::View,
149 public ViewClickListener {
150 public:
151 explicit NetworkDetailedView(user::LoginStatus login)
152 : login_(login) {
153 SetLayoutManager(new views::BoxLayout(
154 views::BoxLayout::kVertical, 1, 1, 1));
155 Update();
156 }
157
158 virtual ~NetworkDetailedView() {}
159
160 void Update() {
Ben Goodger (Google) 2012/03/13 14:55:50 huge functions like this are easier to read/modify
sadrul 2012/03/13 15:19:37 Did some refactoring. PTAL
161 RemoveAllChildViews(true);
162 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
163
164 views::View* container = new HoverHighlightView(this);
165 container->SetLayoutManager(new
166 views::BoxLayout(views::BoxLayout::kHorizontal, 0, 3, 5));
167 views::ImageView* back = new views::ImageView;
168 back->SetImage(rb.GetImageNamed(IDR_AURA_UBER_TRAY_LESS).ToSkBitmap());
169 container->AddChildView(back);
170 views::Label* header = new views::Label(rb.GetLocalizedString(
171 IDS_ASH_STATUS_TRAY_NETWORK));
172 header->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
173 header->SetFont(header->font().DeriveFont(4));
174 container->AddChildView(header);
175 AddChildView(container);
176 header_ = container;
177
178 // List the networks.
179 views::View* networks = new views::View;
180 networks->SetLayoutManager(new views::BoxLayout(
181 views::BoxLayout::kVertical, 0, 0, 1));
182 std::vector<NetworkIconInfo> list;
183 Shell::GetInstance()->tray_delegate()->GetAvailableNetworks(&list);
184 for (size_t i = 0; i < list.size(); i++) {
185 container = new HoverHighlightView(this);
186 container->SetLayoutManager(new views::BoxLayout(
187 views::BoxLayout::kHorizontal, 0, 3, 5));
188 views::ImageView* image = new views::ImageView;
189 image->SetImage(list[i].image);
190 container->AddChildView(image);
191 container->AddChildView(new views::Label(list[i].name));
192 networks->AddChildView(container);
193
194 network_map_[container] = list[i].unique_id;
195 }
196 networks->set_border(views::Border::CreateSolidSidedBorder(1, 0, 1, 0,
197 SkColorSetARGB(25, 0, 0, 0)));
198 AddChildView(networks);
199
200 // Airplane mode.
201 container = new HoverHighlightView(this);
202 container->SetLayoutManager(new views::BoxLayout(
203 views::BoxLayout::kHorizontal, 0, 3, 5));
204 views::ImageView* image = new views::ImageView;
205 image->SetImage(rb.GetImageNamed(
206 IDR_AURA_UBER_TRAY_NETWORK_AIRPLANE).ToSkBitmap());
207 container->AddChildView(image);
208 container->AddChildView(new views::Label(rb.GetLocalizedString(
209 IDS_ASH_STATUS_TRAY_AIRPLANE_MODE)));
210 AddChildView(container);
211 airplane_ = container;
212
213 // Settings, only if logged in.
214 if (login_ != user::LOGGED_IN_NONE) {
215 container = new HoverHighlightView(this);
216 views::Label* settings = new views::Label(rb.GetLocalizedString(
217 IDS_ASH_STATUS_TRAY_NETWORK_SETTINGS));
218 settings->set_border(views::Border::CreateEmptyBorder(5, kItemPaddingLeft,
219 5, 0));
220 settings->SetHorizontalAlignment(views::Label::ALIGN_LEFT);
221 container->AddChildView(settings);
222 container->SetLayoutManager(new views::FillLayout());
223 AddChildView(container);
224 settings_ = container;
225 }
226 }
227
228 private:
229 // Overridden from ViewClickListener.
230 virtual void ClickedOn(views::View* sender) OVERRIDE {
231 ash::SystemTrayDelegate* delegate =
232 ash::Shell::GetInstance()->tray_delegate();
233 if (sender == header_) {
234 Shell::GetInstance()->tray()->ShowDefaultView();
235 } else if (sender == settings_) {
236 delegate->ShowNetworkSettings();
237 } else if (sender == airplane_) {
238 delegate->ToggleAirplaneMode();
239 } else {
240 std::map<views::View*, std::string>::iterator find;
241 find = network_map_.find(sender);
242 if (find != network_map_.end()) {
243 std::string network_id = find->second;
244 delegate->ConnectToNetwork(network_id);
245 }
246 }
247 }
248
249 user::LoginStatus login_;
250 std::map<views::View*, std::string> network_map_;
251 views::View* header_;
252 views::View* airplane_;
253 views::View* settings_;
254 DISALLOW_COPY_AND_ASSIGN(NetworkDetailedView);
255 };
256
79 } // namespace tray 257 } // namespace tray
80 258
81 TrayNetwork::TrayNetwork() { 259 TrayNetwork::TrayNetwork() {
82 } 260 }
83 261
84 TrayNetwork::~TrayNetwork() { 262 TrayNetwork::~TrayNetwork() {
85 } 263 }
86 264
87 views::View* TrayNetwork::CreateTrayView(user::LoginStatus status) { 265 views::View* TrayNetwork::CreateTrayView(user::LoginStatus status) {
88 tray_.reset(new tray::NetworkTrayView(tray::SMALL)); 266 tray_.reset(new tray::NetworkTrayView(tray::SMALL));
89 return tray_.get(); 267 return tray_.get();
90 } 268 }
91 269
92 views::View* TrayNetwork::CreateDefaultView(user::LoginStatus status) { 270 views::View* TrayNetwork::CreateDefaultView(user::LoginStatus status) {
93 default_.reset(new tray::NetworkDefaultView); 271 default_.reset(new tray::NetworkDefaultView(this));
94 return default_.get(); 272 return default_.get();
95 } 273 }
96 274
97 views::View* TrayNetwork::CreateDetailedView(user::LoginStatus status) { 275 views::View* TrayNetwork::CreateDetailedView(user::LoginStatus status) {
98 return NULL; 276 detailed_.reset(new tray::NetworkDetailedView(status));
277 return detailed_.get();
99 } 278 }
100 279
101 void TrayNetwork::DestroyTrayView() { 280 void TrayNetwork::DestroyTrayView() {
102 tray_.reset(); 281 tray_.reset();
103 } 282 }
104 283
105 void TrayNetwork::DestroyDefaultView() { 284 void TrayNetwork::DestroyDefaultView() {
106 default_.reset(); 285 default_.reset();
107 } 286 }
108 287
109 void TrayNetwork::DestroyDetailedView() { 288 void TrayNetwork::DestroyDetailedView() {
289 detailed_.reset();
110 } 290 }
111 291
112 void TrayNetwork::OnNetworkRefresh(const NetworkIconInfo& info) { 292 void TrayNetwork::OnNetworkRefresh(const NetworkIconInfo& info) {
113 if (tray_.get()) 293 if (tray_.get())
114 tray_->Update(info); 294 tray_->Update(info);
115 if (default_.get()) 295 if (default_.get())
116 default_->Update(info); 296 default_->Update(info);
297 if (detailed_.get())
298 detailed_->Update();
117 } 299 }
118 300
119 } // namespace internal 301 } // namespace internal
120 } // namespace ash 302 } // namespace ash
OLDNEW
« no previous file with comments | « ash/system/network/tray_network.h ('k') | ash/system/tray/system_tray.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698