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: chrome/browser/ui/cocoa/chooser_content_view_cocoa.mm

Issue 2257743003: Add signal strength indicator icon to WebBluetooth chooser on Mac (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@bluetooth_signal_strength
Patch Set: added signal strength indicator icon to WebBluetooth chooser on Mac Created 4 years, 4 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
OLDNEW
1 // Copyright 2016 The Chromium Authors. All rights reserved. 1 // Copyright 2016 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 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h" 5 #import "chrome/browser/ui/cocoa/chooser_content_view_cocoa.h"
6 6
7 #include <algorithm> 7 #include <algorithm>
8 8
9 #include "base/macros.h" 9 #include "base/macros.h"
10 #include "base/strings/sys_string_conversions.h" 10 #include "base/strings/sys_string_conversions.h"
11 #include "chrome/browser/chooser_controller/chooser_controller.h" 11 #include "chrome/browser/chooser_controller/chooser_controller.h"
12 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h" 12 #import "chrome/browser/ui/cocoa/constrained_window/constrained_window_button.h"
13 #include "chrome/browser/ui/cocoa/spinner_view.h" 13 #include "chrome/browser/ui/cocoa/spinner_view.h"
14 #include "chrome/grit/generated_resources.h" 14 #include "chrome/grit/generated_resources.h"
15 #include "grit/ui_resources.h"
15 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw eaker.h" 16 #import "third_party/google_toolbox_for_mac/src/AppKit/GTMUILocalizerAndLayoutTw eaker.h"
16 #import "ui/base/cocoa/controls/hyperlink_button_cell.h" 17 #import "ui/base/cocoa/controls/hyperlink_button_cell.h"
17 #include "ui/base/l10n/l10n_util_mac.h" 18 #include "ui/base/l10n/l10n_util_mac.h"
19 #include "ui/base/resource/resource_bundle.h"
18 20
19 namespace { 21 namespace {
20 22
21 // Chooser width. 23 // Chooser width.
22 const CGFloat kChooserWidth = 350.0f; 24 const CGFloat kChooserWidth = 350.0f;
23 25
24 // Chooser height. 26 // Chooser height.
25 const CGFloat kChooserHeight = 300.0f; 27 const CGFloat kChooserHeight = 300.0f;
26 28
29 // Signal strength level image size.
30 const CGFloat kSignalStrengthLevelImageSize = 20.0f;
31
32 // Table row view height.
33 const CGFloat kTableRowViewHeight = 23.0f;
34
27 // Spinner size. 35 // Spinner size.
28 const CGFloat kSpinnerSize = 24.0f; 36 const CGFloat kSpinnerSize = 24.0f;
29 37
30 // Distance between the chooser border and the view that is closest to the 38 // Distance between the chooser border and the view that is closest to the
31 // border. 39 // border.
32 const CGFloat kMarginX = 20.0f; 40 const CGFloat kMarginX = 20.0f;
33 const CGFloat kMarginY = 20.0f; 41 const CGFloat kMarginY = 20.0f;
34 42
35 // Distance between two views inside the chooser. 43 // Distance between two views inside the chooser.
36 const CGFloat kHorizontalPadding = 10.0f; 44 const CGFloat kHorizontalPadding = 10.0f;
37 const CGFloat kVerticalPadding = 10.0f; 45 const CGFloat kVerticalPadding = 10.0f;
38 46
39 // Separator alpha value. 47 // Separator alpha value.
40 const CGFloat kSeparatorAlphaValue = 0.6f; 48 const CGFloat kSeparatorAlphaValue = 0.6f;
41 49
42 // Separator height. 50 // Separator height.
43 const CGFloat kSeparatorHeight = 1.0f; 51 const CGFloat kSeparatorHeight = 1.0f;
44 52
53 // The lookup table for signal strength level image.
54 const int signalStrengthLevelImageIds[5] = {IDR_SIGNAL_0_BAR, IDR_SIGNAL_1_BAR,
Jeffrey Yasskin 2016/08/19 18:30:05 Use kConstant naming: https://google.github.io/sty
juncai 2016/08/22 19:18:20 Done.
55 IDR_SIGNAL_2_BAR, IDR_SIGNAL_3_BAR,
56 IDR_SIGNAL_4_BAR};
57
45 } // namespace 58 } // namespace
46 59
60 // A table row view that contains one line of text, and optionally contains an
61 // image in front of the text.
62 @interface TableRowView : NSView {
63 @private
64 base::scoped_nsobject<NSImageView> image_;
65 base::scoped_nsobject<NSTextField> text_;
66 }
67
68 // Designated initializer.
69 - (instancetype)initWithText:(NSString*)text
70 signalStrengthLevel:(NSInteger)level;
71
72 // Gets the image in front of the text.
73 - (NSImageView*)image;
74
75 // Gets the text.
76 - (NSTextField*)text;
77
78 @end
79
80 @implementation TableRowView
81
82 - (instancetype)initWithText:(NSString*)text
83 signalStrengthLevel:(NSInteger)level {
84 if ((self = [super initWithFrame:NSZeroRect])) {
85 if (level != -1) {
86 DCHECK_GE(level, 0);
87 DCHECK_LT(level, base::checked_cast<NSInteger>(
88 arraysize(signalStrengthLevelImageIds)));
89 ui::ResourceBundle& rb = ui::ResourceBundle::GetSharedInstance();
90 NSImage* signalStrengthLevelImage =
91 rb.GetNativeImageNamed(signalStrengthLevelImageIds[level])
92 .ToNSImage();
93
94 image_.reset([[NSImageView alloc]
95 initWithFrame:NSMakeRect(0, (kTableRowViewHeight -
96 kSignalStrengthLevelImageSize) /
97 2,
98 kSignalStrengthLevelImageSize,
99 kSignalStrengthLevelImageSize)]);
100 [image_ setImage:signalStrengthLevelImage];
101 [self addSubview:image_];
102 }
103
104 text_.reset([[NSTextField alloc] initWithFrame:NSZeroRect]);
105 [text_ setDrawsBackground:NO];
106 [text_ setBezeled:NO];
107 [text_ setEditable:NO];
108 [text_ setSelectable:NO];
109 [text_ setStringValue:text];
110 [text_ setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]];
111 [text_ sizeToFit];
112 CGFloat textHeight = NSHeight([text_ frame]);
113 [text_ setFrameOrigin:NSMakePoint(
114 level == -1 ? 0 : kSignalStrengthLevelImageSize +
115 kVerticalPadding,
Jeffrey Yasskin 2016/08/19 18:30:05 Shouldn't this be kHorizontalPadding?
juncai 2016/08/22 19:18:20 Done.
116 (kTableRowViewHeight - textHeight) / 2)];
117 [self addSubview:text_];
118 }
119
120 return self;
121 }
122
123 - (NSImageView*)image {
124 return image_.get();
125 }
126
127 - (NSTextField*)text {
128 return text_.get();
129 }
130
131 @end
132
47 class ChooserContentViewController : public ChooserController::View { 133 class ChooserContentViewController : public ChooserController::View {
48 public: 134 public:
49 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view, 135 ChooserContentViewController(ChooserContentViewCocoa* chooser_content_view,
50 ChooserController* chooser_controller, 136 ChooserController* chooser_controller,
51 NSTableView* table_view, 137 NSTableView* table_view,
52 SpinnerView* spinner, 138 SpinnerView* spinner,
53 NSTextField* status, 139 NSTextField* status,
54 NSButton* rescan_button); 140 NSButton* rescan_button);
55 ~ChooserContentViewController() override; 141 ~ChooserContentViewController() override;
56 142
(...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 // When refreshing, show |status_| and hide |rescan_button_|. 254 // When refreshing, show |status_| and hide |rescan_button_|.
169 // When complete, show |rescan_button_| and hide |status_|. 255 // When complete, show |rescan_button_| and hide |status_|.
170 [status_ setHidden:refreshing ? NO : YES]; 256 [status_ setHidden:refreshing ? NO : YES];
171 [rescan_button_ setHidden:refreshing ? YES : NO]; 257 [rescan_button_ setHidden:refreshing ? YES : NO];
172 258
173 [chooser_content_view_ updateView]; 259 [chooser_content_view_ updateView];
174 } 260 }
175 261
176 void ChooserContentViewController::UpdateTableView() { 262 void ChooserContentViewController::UpdateTableView() {
177 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0]; 263 [table_view_ setEnabled:chooser_controller_->NumOptions() > 0];
264 // For NSView-based table views, calling reloadData will deselect the
265 // currently selected row, so |selected_row| stores the currently selected
266 // row in order to select it again.
267 NSInteger selected_row = [table_view_ selectedRow];
178 [table_view_ reloadData]; 268 [table_view_ reloadData];
269 if (selected_row != -1) {
270 [table_view_ selectRowIndexes:[NSIndexSet indexSetWithIndex:selected_row]
271 byExtendingSelection:NO];
272 }
179 } 273 }
180 274
181 @implementation ChooserContentViewCocoa 275 @implementation ChooserContentViewCocoa
182 276
183 // TODO(juncai): restructure this function to be some smaller methods to 277 // TODO(juncai): restructure this function to be some smaller methods to
184 // create the pieces for the view. By doing so, the methods that calculate 278 // create the pieces for the view. By doing so, the methods that calculate
185 // the frame and origins can be moved into those methods, rather than as 279 // the frame and origins can be moved into those methods, rather than as
186 // helper functions. 280 // helper functions.
187 - (instancetype)initWithChooserTitle:(NSString*)chooserTitle 281 - (instancetype)initWithChooserTitle:(NSString*)chooserTitle
188 chooserController: 282 chooserController:
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after
388 [titleView setEditable:NO]; 482 [titleView setEditable:NO];
389 [titleView setSelectable:NO]; 483 [titleView setSelectable:NO];
390 [titleView setStringValue:title]; 484 [titleView setStringValue:title];
391 [titleView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]]; 485 [titleView setFont:[NSFont systemFontOfSize:[NSFont systemFontSize]]];
392 // The height is arbitrary as it will be adjusted later. 486 // The height is arbitrary as it will be adjusted later.
393 [titleView setFrameSize:NSMakeSize(kChooserWidth - 2 * kMarginX, 0.0f)]; 487 [titleView setFrameSize:NSMakeSize(kChooserWidth - 2 * kMarginX, 0.0f)];
394 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleView]; 488 [GTMUILocalizerAndLayoutTweaker sizeToFitFixedWidthTextField:titleView];
395 return titleView; 489 return titleView;
396 } 490 }
397 491
492 - (NSView*)createTableRowView:(NSInteger)rowIndex {
493 NSInteger level = -1;
494 size_t numOptions = chooserController_->NumOptions();
495 if (chooserController_->ShouldShowIconBeforeText() && numOptions > 0) {
Jeffrey Yasskin 2016/08/19 18:30:05 Dumb question: why is createTableRowView called wi
juncai 2016/08/22 19:18:20 If numOptions == 0, the actual number rows is 1 si
Jeffrey Yasskin 2016/08/22 21:59:24 Ah, I see. Could you comment that here? Like "This
juncai 2016/08/23 00:30:40 Done.
496 DCHECK_GE(rowIndex, 0);
497 DCHECK_LT(rowIndex, base::checked_cast<NSInteger>(numOptions));
498 level = base::checked_cast<NSInteger>(
499 chooserController_->GetSignalStrengthLevel(
500 base::checked_cast<size_t>(rowIndex)));
501 }
502
503 base::scoped_nsobject<TableRowView> tableRowView([[TableRowView alloc]
504 initWithText:[self optionAtIndex:rowIndex]
Jeffrey Yasskin 2016/08/19 18:30:05 This indentation looks kinda weird.
juncai 2016/08/22 19:18:20 I used "git cl format" to format it. I guess here
Jeffrey Yasskin 2016/08/22 21:59:24 If `git cl format` did it, it's fine with me. :)
juncai 2016/08/23 00:30:40 Acknowledged.
505 signalStrengthLevel:level]);
506 return tableRowView.autorelease();
507 }
508
509 - (CGFloat)tableRowViewHeight:(NSInteger)row {
510 return kTableRowViewHeight;
511 }
512
398 - (base::scoped_nsobject<NSButton>)createButtonWithTitle:(NSString*)title { 513 - (base::scoped_nsobject<NSButton>)createButtonWithTitle:(NSString*)title {
399 base::scoped_nsobject<NSButton> button( 514 base::scoped_nsobject<NSButton> button(
400 [[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]); 515 [[ConstrainedWindowButton alloc] initWithFrame:NSZeroRect]);
401 [button setButtonType:NSMomentaryPushInButton]; 516 [button setButtonType:NSMomentaryPushInButton];
402 [button setTitle:title]; 517 [button setTitle:title];
403 [button sizeToFit]; 518 [button sizeToFit];
404 return button; 519 return button;
405 } 520 }
406 521
407 - (base::scoped_nsobject<NSButton>)createConnectButton { 522 - (base::scoped_nsobject<NSButton>)createConnectButton {
(...skipping 160 matching lines...) Expand 10 before | Expand all | Expand 10 after
568 } 683 }
569 684
570 - (void)onRescan:(id)sender { 685 - (void)onRescan:(id)sender {
571 chooserController_->RefreshOptions(); 686 chooserController_->RefreshOptions();
572 } 687 }
573 688
574 - (void)onHelpPressed:(id)sender { 689 - (void)onHelpPressed:(id)sender {
575 chooserController_->OpenHelpCenterUrl(); 690 chooserController_->OpenHelpCenterUrl();
576 } 691 }
577 692
693 - (NSImageView*)tableRowViewImage:(NSInteger)row {
694 TableRowView* tableRowView =
695 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES];
696 return [tableRowView image];
697 }
698
699 - (NSTextField*)tableRowViewText:(NSInteger)row {
700 TableRowView* tableRowView =
701 [tableView_ viewAtColumn:0 row:row makeIfNecessary:YES];
702 return [tableRowView text];
703 }
704
578 @end 705 @end
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698