chromium/remoting/ios/app/settings/settings_view_cell.mm

// Copyright 2018 The Chromium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#import "remoting/ios/app/settings/settings_view_cell.h"

#import <MaterialComponents/MaterialTypography.h>

#import "remoting/ios/app/remoting_theme.h"

static const CGFloat kImageViewSize = 24;
static const CGFloat kImageViewPaddingLeading = 16;
static const CGFloat kLabelViewsPaddingLeading = 16;
static const CGFloat kLabelViewsPaddingTrailing = 10;

@implementation SettingsViewCell {
  UIImageView* _imageView;
  UILabel* _titleLabel;
  UILabel* _detailsLabel;
}

- (instancetype)initWithFrame:(CGRect)frame {
  if ((self = [super initWithFrame:frame])) {
    [self setupCell];
  }
  return self;
}

- (void)setupCell {
  self.isAccessibilityElement = YES;
  self.translatesAutoresizingMaskIntoConstraints = NO;

  _imageView = [[UIImageView alloc] initWithFrame:CGRectZero];
  _imageView.translatesAutoresizingMaskIntoConstraints = NO;
  [self addSubview:_imageView];

  _titleLabel = [[UILabel alloc] initWithFrame:CGRectZero];
  _titleLabel.translatesAutoresizingMaskIntoConstraints = NO;
  UIFont* subheadFont = MDCTypography.subheadFont;
  UIFontDescriptor* subheadFontDescriptor = [subheadFont.fontDescriptor
      fontDescriptorWithSymbolicTraits:UIFontDescriptorTraitBold];
  subheadFontDescriptor = subheadFontDescriptor ?: subheadFont.fontDescriptor;
  UIFont* boldSubheadFont = [UIFont fontWithDescriptor:subheadFontDescriptor
                                                  size:subheadFont.pointSize];
  _titleLabel.font = boldSubheadFont;
  _titleLabel.textColor = RemotingTheme.menuTextColor;
  _titleLabel.numberOfLines = 1;
  [self addSubview:_titleLabel];

  _detailsLabel = [[UILabel alloc] initWithFrame:CGRectZero];
  _detailsLabel.translatesAutoresizingMaskIntoConstraints = NO;
  _detailsLabel.font = MDCTypography.body1Font;
  _detailsLabel.textColor = RemotingTheme.menuTextColor;
  _detailsLabel.numberOfLines = 1;
  [self addSubview:_detailsLabel];

  UILayoutGuide* labelLayoutGuide = [[UILayoutGuide alloc] init];
  [self addLayoutGuide:labelLayoutGuide];
  [NSLayoutConstraint activateConstraints:@[
    [_imageView.centerYAnchor constraintEqualToAnchor:self.centerYAnchor],
    [_imageView.leadingAnchor constraintEqualToAnchor:self.leadingAnchor
                                             constant:kImageViewPaddingLeading],
    [_imageView.widthAnchor constraintEqualToConstant:kImageViewSize],
    [_imageView.heightAnchor constraintEqualToConstant:kImageViewSize],

    [labelLayoutGuide.centerYAnchor constraintEqualToAnchor:self.centerYAnchor],
    [labelLayoutGuide.leadingAnchor
        constraintEqualToAnchor:_imageView.trailingAnchor
                       constant:kLabelViewsPaddingLeading],
    [labelLayoutGuide.trailingAnchor
        constraintEqualToAnchor:self.trailingAnchor
                       constant:kLabelViewsPaddingTrailing],

    [_titleLabel.topAnchor constraintEqualToAnchor:labelLayoutGuide.topAnchor],
    [_titleLabel.leadingAnchor
        constraintEqualToAnchor:labelLayoutGuide.leadingAnchor],
    [_titleLabel.trailingAnchor
        constraintEqualToAnchor:labelLayoutGuide.trailingAnchor],

    [_detailsLabel.topAnchor constraintEqualToAnchor:_titleLabel.bottomAnchor],
    [_detailsLabel.leadingAnchor
        constraintEqualToAnchor:labelLayoutGuide.leadingAnchor],
    [_detailsLabel.trailingAnchor
        constraintEqualToAnchor:labelLayoutGuide.trailingAnchor],
    [_detailsLabel.bottomAnchor
        constraintEqualToAnchor:labelLayoutGuide.bottomAnchor],
  ]];
}

- (void)setSettingOption:(SettingOption*)option {
  self.accessibilityLabel =
      option.subtext
          ? [NSString stringWithFormat:@"%@\n%@", option.title, option.subtext]
          : option.title;

  _titleLabel.text = option.title;
  _detailsLabel.text = option.subtext;

  switch (option.style) {
    case OptionCheckbox:
      if (option.checked) {
        _imageView.image = RemotingTheme.checkboxCheckedIcon;
      } else {
        _imageView.image = RemotingTheme.checkboxOutlineIcon;
      }
      break;
    case OptionSelector:
      if (option.checked) {
        _imageView.image = RemotingTheme.radioCheckedIcon;
      } else {
        _imageView.image = RemotingTheme.radioOutlineIcon;
      }
      break;
    case FlatButton:  // Fall-through.
    default:
      _imageView.image = [[UIImage alloc] init];
  }
}

@end