InfoManager.swift 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788
  1. // LoopFollow
  2. // InfoManager.swift
  3. import Foundation
  4. import HealthKit
  5. import UIKit
  6. class InfoManager {
  7. var tableData: [InfoData]
  8. weak var tableView: UITableView?
  9. init(tableView: UITableView) {
  10. tableData = InfoType.allCases.map { InfoData(name: $0.name) }
  11. self.tableView = tableView
  12. }
  13. func updateInfoData(type: InfoType, value: String) {
  14. tableData[type.rawValue].value = value
  15. tableView?.reloadData()
  16. }
  17. func updateInfoData(type: InfoType, value: HKQuantity) {
  18. let formattedValue = Localizer.formatQuantity(value)
  19. updateInfoData(type: type, value: formattedValue)
  20. }
  21. func updateInfoData(type: InfoType, firstValue: HKQuantity, secondValue: HKQuantity, separator: InfoDataSeparator) {
  22. let formattedFirstValue = Localizer.formatQuantity(firstValue)
  23. let formattedSecondValue = Localizer.formatQuantity(secondValue)
  24. if formattedFirstValue != formattedSecondValue {
  25. let combinedValue = "\(formattedFirstValue) \(separator.rawValue) \(formattedSecondValue)"
  26. updateInfoData(type: type, value: combinedValue)
  27. } else {
  28. updateInfoData(type: type, value: formattedFirstValue)
  29. }
  30. }
  31. func updateInfoData(type: InfoType, value: Double, maxFractionDigits: Int = 1, minFractionDigits: Int = 0) {
  32. let formattedValue = Localizer.formatToLocalizedString(value, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  33. updateInfoData(type: type, value: formattedValue)
  34. }
  35. func updateInfoData(type: InfoType, value: Double, enactedValue: Double, separator: InfoDataSeparator, maxFractionDigits: Int = 1, minFractionDigits: Int = 0) {
  36. let formattedValue = Localizer.formatToLocalizedString(value, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  37. let formattedEnactedValue = Localizer.formatToLocalizedString(enactedValue, maxFractionDigits: maxFractionDigits, minFractionDigits: minFractionDigits)
  38. let separatorString = separator.rawValue
  39. let combinedValue = "\(formattedValue) \(separatorString) \(formattedEnactedValue)"
  40. updateInfoData(type: type, value: combinedValue)
  41. }
  42. func updateInfoData(type: InfoType, value: Metric) {
  43. let formattedValue = value.formattedValue()
  44. updateInfoData(type: type, value: formattedValue)
  45. }
  46. func clearInfoData(type: InfoType) {
  47. tableData[type.rawValue].value = ""
  48. tableView?.reloadData()
  49. }
  50. func clearInfoData(types: [InfoType]) {
  51. for type in types {
  52. tableData[type.rawValue].value = ""
  53. }
  54. tableView?.reloadData()
  55. }
  56. func numberOfRows() -> Int {
  57. return Storage.shared.infoSort.value.filter { Storage.shared.infoVisible.value[$0] }.count
  58. }
  59. func dataForIndexPath(_ indexPath: IndexPath) -> InfoData? {
  60. let sortedAndVisibleIndexes = Storage.shared.infoSort.value.filter { Storage.shared.infoVisible.value[$0] }
  61. guard indexPath.row < sortedAndVisibleIndexes.count else {
  62. return nil
  63. }
  64. let infoIndex = sortedAndVisibleIndexes[indexPath.row]
  65. guard infoIndex < tableData.count else {
  66. return nil
  67. }
  68. return tableData[infoIndex]
  69. }
  70. }