EmojiAvatarPickerViewController.swift 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145
  1. //
  2. // SPDX-FileCopyrightText: 2023 Nextcloud GmbH and Nextcloud contributors
  3. // SPDX-License-Identifier: GPL-3.0-or-later
  4. //
  5. import UIKit
  6. @objc protocol EmojiAvatarPickerViewControllerDelegate {
  7. func didSelectEmoji(emoji: NSString, color: NSString, image: UIImage)
  8. }
  9. @objcMembers class EmojiAvatarPickerViewController: UIViewController, UITextFieldDelegate {
  10. @IBOutlet weak var emojiTextField: EmojiTextField!
  11. @IBOutlet weak var emojiContainerView: UIView!
  12. @IBOutlet weak var colorsStackView: UIStackView!
  13. @IBOutlet weak var removeColorButton: UIButton!
  14. @IBOutlet weak var colorWell: UIColorWell!
  15. public weak var delegate: EmojiAvatarPickerViewControllerDelegate?
  16. let defaultEmoji: String = "🙂"
  17. var defaultColors: [UIColor] = []
  18. var selectedEmoji: String = ""
  19. var selectedColor: String = ""
  20. override func viewDidLoad() {
  21. super.viewDidLoad()
  22. self.navigationController?.navigationBar.titleTextAttributes = [NSAttributedString.Key.foregroundColor: NCAppBranding.themeTextColor()]
  23. self.navigationController?.navigationBar.tintColor = NCAppBranding.themeTextColor()
  24. self.navigationController?.navigationBar.barTintColor = NCAppBranding.themeColor()
  25. self.navigationController?.navigationBar.isTranslucent = false
  26. let appearance = UINavigationBarAppearance()
  27. appearance.configureWithOpaqueBackground()
  28. appearance.titleTextAttributes = [.foregroundColor: NCAppBranding.themeTextColor()]
  29. appearance.backgroundColor = NCAppBranding.themeColor()
  30. self.navigationItem.standardAppearance = appearance
  31. self.navigationItem.compactAppearance = appearance
  32. self.navigationItem.scrollEdgeAppearance = appearance
  33. self.emojiTextField.delegate = self
  34. self.emojiTextField.text = self.defaultEmoji
  35. self.selectedEmoji = self.defaultEmoji
  36. self.emojiContainerView.layer.cornerRadius = self.emojiContainerView.frame.height / 2
  37. self.emojiContainerView.clipsToBounds = true
  38. self.emojiContainerView.backgroundColor = NCAppBranding.avatarPlaceholderColor()
  39. self.removeColorButton.layer.cornerRadius = self.removeColorButton.frame.height / 2
  40. self.removeColorButton.backgroundColor = NCAppBranding.avatarPlaceholderColor()
  41. self.colorWell.addTarget(self, action: #selector(self.colorWellChanged), for: .valueChanged)
  42. self.colorWell.supportsAlpha = false
  43. self.generateColorButtons()
  44. self.navigationItem.leftBarButtonItem = UIBarButtonItem(barButtonSystemItem: .cancel, target: self, action: #selector(self.cancelButtonPressed))
  45. self.navigationItem.leftBarButtonItem?.tintColor = NCAppBranding.themeTextColor()
  46. self.navigationItem.rightBarButtonItem = UIBarButtonItem(barButtonSystemItem: .done, target: self, action: #selector(self.doneButtonPressed))
  47. self.navigationItem.rightBarButtonItem?.tintColor = NCAppBranding.themeTextColor()
  48. }
  49. override func viewDidAppear(_ animated: Bool) {
  50. self.emojiTextField.becomeFirstResponder()
  51. }
  52. func cancelButtonPressed() {
  53. self.dismiss(animated: true, completion: nil)
  54. }
  55. func doneButtonPressed() {
  56. self.delegate?.didSelectEmoji(emoji: selectedEmoji as NSString, color: selectedColor as NSString, image: emojiContainerView.asImage())
  57. self.dismiss(animated: true, completion: nil)
  58. }
  59. func colorWellChanged() {
  60. self.setSelectedColor(color: self.colorWell.selectedColor ?? .black)
  61. }
  62. // MARK: - Color buttons
  63. func generateColorButtons() {
  64. self.defaultColors = ColorGenerator.genColors(2)
  65. for (index, color) in self.defaultColors.enumerated() {
  66. let colorButton = UIButton(frame: CGRect(x: 0, y: 0, width: 44, height: 44))
  67. colorButton.layer.cornerRadius = colorButton.frame.height / 2
  68. colorButton.widthAnchor.constraint(equalToConstant: 44).isActive = true
  69. colorButton.heightAnchor.constraint(equalToConstant: 44).isActive = true
  70. colorButton.backgroundColor = color
  71. colorButton.tag = index
  72. colorButton.addTarget(self, action: #selector(colorButtonPressed(_ :)), for: .touchUpInside)
  73. self.colorsStackView.addArrangedSubview(colorButton)
  74. }
  75. }
  76. func colorButtonPressed(_ sender: UIButton) {
  77. let color = self.defaultColors[sender.tag]
  78. self.setSelectedColor(color: color)
  79. self.colorWell.selectedColor = nil
  80. }
  81. func setSelectedColor(color: UIColor) {
  82. self.selectedColor = NCUtils.hexString(fromColor: color)
  83. self.emojiContainerView.backgroundColor = color
  84. }
  85. @IBAction func removeColorButtonPressed(_ sender: Any) {
  86. self.selectedColor = ""
  87. self.emojiContainerView.backgroundColor = NCAppBranding.avatarPlaceholderColor()
  88. self.colorWell.selectedColor = nil
  89. }
  90. // MARK: - UITextField delegate
  91. func textFieldShouldReturn(_ textField: UITextField) -> Bool {
  92. self.emojiTextField.resignFirstResponder()
  93. }
  94. func textFieldDidEndEditing(_ textField: UITextField) {
  95. self.navigationItem.rightBarButtonItem?.isEnabled = !self.selectedEmoji.isEmpty
  96. }
  97. func textField(_ textField: UITextField, shouldChangeCharactersIn range: NSRange, replacementString string: String) -> Bool {
  98. if textField is EmojiTextField {
  99. if string.isSingleEmoji == false {
  100. self.selectedEmoji = ""
  101. self.emojiTextField.text = ""
  102. } else {
  103. self.selectedEmoji = string
  104. self.emojiTextField.text = string
  105. }
  106. self.navigationItem.rightBarButtonItem?.isEnabled = !self.selectedEmoji.isEmpty
  107. return false
  108. }
  109. return true
  110. }
  111. }