session-ios/Signal/src/ViewControllers/ColorPickerViewController.swift

142 lines
4.3 KiB
Swift
Raw Normal View History

2018-06-28 19:28:14 +02:00
//
// Copyright (c) 2018 Open Whisper Systems. All rights reserved.
//
import Foundation
2018-07-02 23:37:53 +02:00
let colorSwatchHeight: CGFloat = 40
2018-06-28 19:28:14 +02:00
class ColorView: UIView {
let color: UIColor
let swatchView: UIView
required init(color: UIColor) {
self.color = color
self.swatchView = UIView()
super.init(frame: .zero)
swatchView.backgroundColor = color
self.swatchView.layer.cornerRadius = colorSwatchHeight / 2
self.addSubview(swatchView)
swatchView.autoVCenterInSuperview()
swatchView.autoSetDimension(.height, toSize: colorSwatchHeight)
swatchView.autoPinEdge(toSuperviewMargin: .top, relation: .greaterThanOrEqual)
swatchView.autoPinEdge(toSuperviewMargin: .bottom, relation: .greaterThanOrEqual)
swatchView.autoPinLeadingToSuperviewMargin()
swatchView.autoPinTrailingToSuperviewMargin()
}
required init?(coder aDecoder: NSCoder) {
2018-08-27 16:21:03 +02:00
notImplemented()
2018-06-28 19:28:14 +02:00
}
}
@objc
protocol ColorPickerDelegate: class {
func colorPickerDidCancel(_ colorPicker: ColorPickerViewController)
func colorPicker(_ colorPicker: ColorPickerViewController, didPickColorName colorName: String)
}
@objc
class ColorPickerViewController: UIViewController, UIPickerViewDelegate, UIPickerViewDataSource {
private let pickerView: UIPickerView
private let thread: TSThread
private let colorNames: [String]
2018-06-28 19:28:14 +02:00
@objc public weak var delegate: ColorPickerDelegate?
@objc
required init(thread: TSThread) {
self.thread = thread
self.pickerView = UIPickerView()
self.colorNames = UIColor.ows_conversationColorNames
2018-06-28 19:28:14 +02:00
super.init(nibName: nil, bundle: nil)
self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(didTapCancel))
self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .save, target: self, action: #selector(didTapSave))
pickerView.dataSource = self
pickerView.delegate = self
}
required init?(coder aDecoder: NSCoder) {
2018-08-27 16:21:03 +02:00
notImplemented()
2018-06-28 19:28:14 +02:00
}
override func loadView() {
self.view = UIView()
2018-08-08 15:52:27 +02:00
view.backgroundColor = Theme.backgroundColor
2018-06-28 19:28:14 +02:00
view.addSubview(pickerView)
pickerView.autoVCenterInSuperview()
pickerView.autoPinLeadingToSuperviewMargin()
pickerView.autoPinTrailingToSuperviewMargin()
}
override func viewDidLoad() {
super.viewDidLoad()
if let colorName = thread.conversationColorName,
let index = colorNames.index(of: colorName) {
2018-06-28 19:28:14 +02:00
pickerView.selectRow(index, inComponent: 0, animated: false)
}
}
// MARK: UIPickerViewDataSource
public func numberOfComponents(in pickerView: UIPickerView) -> Int {
return 1
}
public func pickerView(_ pickerView: UIPickerView, numberOfRowsInComponent component: Int) -> Int {
return self.colorNames.count
2018-06-28 19:28:14 +02:00
}
// MARK: UIPickerViewDelegate
public func pickerView(_ pickerView: UIPickerView, rowHeightForComponent component: Int) -> CGFloat {
2018-07-02 23:37:53 +02:00
let vMargin: CGFloat = 16
2018-06-28 19:28:14 +02:00
return colorSwatchHeight + vMargin * 2
}
public func pickerView(_ pickerView: UIPickerView, viewForRow row: Int, forComponent component: Int, reusing view: UIView?) -> UIView {
guard let colorName = colorNames[safe: row] else {
2018-08-27 16:27:48 +02:00
owsFailDebug("color was unexpectedly nil")
2018-06-28 19:28:14 +02:00
return ColorView(color: .white)
}
guard let color = UIColor.ows_conversationThemeColor(colorName: colorName) else {
owsFailDebug("unknown color name")
return ColorView(color: .white)
}
2018-06-28 19:28:14 +02:00
return ColorView(color: color)
}
// MARK: Actions
var currentColorName: String {
2018-06-28 19:28:14 +02:00
let index = pickerView.selectedRow(inComponent: 0)
guard let colorName = colorNames[safe: index] else {
2018-08-27 16:27:48 +02:00
owsFailDebug("index was unexpectedly nil")
return UIColor.ows_defaultConversationColorName()
2018-06-28 19:28:14 +02:00
}
return colorName
2018-06-28 19:28:14 +02:00
}
@objc
public func didTapSave() {
let colorName = self.currentColorName
2018-06-28 19:28:14 +02:00
self.delegate?.colorPicker(self, didPickColorName: colorName)
}
@objc
public func didTapCancel() {
self.delegate?.colorPickerDidCancel(self)
}
}