InfoManager.swift 3.3 KB

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