Commit 6914dab5 by Dmitriy Stepanets

Working on settings storage

parent fb14d803
......@@ -94,6 +94,7 @@
CDC6126225E8DAB800188DA7 /* CityMoonCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC6126125E8DAB800188DA7 /* CityMoonCell.swift */; };
CDC6126625E9085600188DA7 /* GraphLine.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC6126525E9085600188DA7 /* GraphLine.swift */; };
CDC6126A25E90C8800188DA7 /* GraphLineSettings.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC6126925E90C8800188DA7 /* GraphLineSettings.swift */; };
CDC70833260FBFD4004A1974 /* UnitPressure+Atmosphere.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDC70832260FBFD3004A1974 /* UnitPressure+Atmosphere.swift */; };
CDD0F1E52572425200CF5017 /* SF-Pro.ttf in Resources */ = {isa = PBXBuildFile; fileRef = CDD0F1E42572425200CF5017 /* SF-Pro.ttf */; };
CDD0F1E82572429E00CF5017 /* AppFont.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0F1E72572429E00CF5017 /* AppFont.swift */; };
CDD0F1EE25725BCF00CF5017 /* ThemeManager.swift in Sources */ = {isa = PBXBuildFile; fileRef = CDD0F1ED25725BCF00CF5017 /* ThemeManager.swift */; };
......@@ -222,6 +223,7 @@
CDC6126125E8DAB800188DA7 /* CityMoonCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CityMoonCell.swift; sourceTree = "<group>"; };
CDC6126525E9085600188DA7 /* GraphLine.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphLine.swift; sourceTree = "<group>"; };
CDC6126925E90C8800188DA7 /* GraphLineSettings.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = GraphLineSettings.swift; sourceTree = "<group>"; };
CDC70832260FBFD3004A1974 /* UnitPressure+Atmosphere.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UnitPressure+Atmosphere.swift"; sourceTree = "<group>"; };
CDD0F1E42572425200CF5017 /* SF-Pro.ttf */ = {isa = PBXFileReference; lastKnownFileType = file; path = "SF-Pro.ttf"; sourceTree = "<group>"; };
CDD0F1E72572429E00CF5017 /* AppFont.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = AppFont.swift; sourceTree = "<group>"; };
CDD0F1ED25725BCF00CF5017 /* ThemeManager.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ThemeManager.swift; sourceTree = "<group>"; };
......@@ -348,6 +350,7 @@
CD593BDB2608CDF100C93428 /* Date+Now.swift */,
CD2B213F260A366B00AB918A /* UIView+InterfaceStyle.swift */,
CD866A61260F596B00E96A5C /* Dimension+Name.swift */,
CDC70832260FBFD3004A1974 /* UnitPressure+Atmosphere.swift */,
);
path = Extensions;
sourceTree = "<group>";
......@@ -907,6 +910,7 @@
CEDE4E8325EEFD56007457E9 /* WdtLocationResponse.swift in Sources */,
CD37D3FE260DF726002669D6 /* SettingsCellFactory.swift in Sources */,
CD8E041625F8F91B001785B6 /* ForecastCellFactory.swift in Sources */,
CDC70833260FBFD4004A1974 /* UnitPressure+Atmosphere.swift in Sources */,
CDC6125325E79C8F00188DA7 /* DayTimeView.swift in Sources */,
CD251EDC26036E5400ED7A65 /* DayTimePrecipitationView.swift in Sources */,
CD32CE04260C742300235081 /* MenuViewController.swift in Sources */,
......
......@@ -7,7 +7,7 @@
<key>1Weather.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>3</integer>
<integer>5</integer>
</dict>
<key>PG (Playground) 1.xcscheme</key>
<dict>
......
......@@ -17,5 +17,9 @@ extension Dimension {
var name:String {
return Dimension.fmt.string(from: self)
}
var identifier:String {
return "self."
}
}
......@@ -31,6 +31,6 @@ extension Measurement {
extension Temperature {
var localizedValue:Double {
return self.converted(to: Settings.shared.temperatureType.unit).value.rounded(.down)
return self.converted(to: Settings.shared.temperatureType).value.rounded(.down)
}
}
//
// UnitPressure+Atmosphere.swift
// 1Weather
//
// Created by Dmitry Stepanets on 28.03.2021.
//
import UIKit
extension UnitPressure {
static let atmosphere = UnitPressure(symbol: "atm", converter: UnitConverterLinear(coefficient: 101325))
}
......@@ -50,80 +50,6 @@ public enum WeatherType: String, CaseIterable {
}
}
public enum TemperatureType:String, CaseIterable {
case kelvin = "temp.kelvin"
case celsius = "temp.celsius"
case fahrenheit = "temp.fahrenheit"
var unit:UnitTemperature {
switch self {
case .kelvin:
return .kelvin
case .celsius:
return .celsius
case .fahrenheit:
return .fahrenheit
}
}
}
public enum WindSpeedType:String, CaseIterable {
case metersPerSecond = "windSpeed.mps"
case kilometersPerHour = "windSpeed.kph"
case milesPerHour = "windSpeed.mph"
case knots = "windSpeed.knots"
var unit:UnitSpeed {
switch self {
case .metersPerSecond:
return .metersPerSecond
case .kilometersPerHour:
return .kilometersPerHour
case .milesPerHour:
return .milesPerHour
case .knots:
return .knots
}
}
}
public enum PressureType:String, CaseIterable {
case inchesOfMercury = "pressure.inch"
case millibars = "pressure.mb"
case millimetersOfMercury = "pressure.mm"
case atmosphere = "pressure.atm"
case kilopascals = "pressure.kpa"
var unit:UnitPressure {
switch self {
case .inchesOfMercury:
return .inchesOfMercury
case .millibars:
return .millibars
case .millimetersOfMercury:
return .millimetersOfMercury
case .atmosphere:
return UnitPressure(symbol: "atm", converter: UnitConverterLinear(coefficient: 101325))
case .kilopascals:
return .kilopascals
}
}
}
public enum DistanceType:String, CaseIterable {
case miles = "distance.mi"
case kilometers = "distance.km"
var unit:UnitLength {
switch self {
case .miles:
return .miles
case .kilometers:
return .kilometers
}
}
}
public enum WeatherConditionType: CaseIterable {
case precipitation
case humidity
......
......@@ -12,11 +12,21 @@ import Localize_Swift
struct UserDefaultsValue<T> {
var wrappedValue: T {
get {
let value = UserDefaults.standard.value(forKey: key) as? T
return value ?? defaultValue
guard
let data = UserDefaults.standard.data(forKey: key),
let decoded = NSKeyedUnarchiver.unarchiveObject(with: data) as? T
else {
return defaultValue
}
return decoded
// let value = UserDefaults.standard.value(forKey: key) as? T
// return value ?? defaultValue
}
set {
UserDefaults.standard.set(newValue, forKey: key)
let data = NSKeyedArchiver.archivedData(withRootObject: T.self)
UserDefaults.standard.set(data, forKey: key)
UserDefaults.standard.synchronize()
}
}
......@@ -41,16 +51,16 @@ class Settings {
var automaticSwitchTheme = false
@UserDefaultsValue(key: "temperature_type")
var temperatureType = TemperatureType.celsius
var temperatureType = UnitTemperature.celsius
@UserDefaultsValue(key: "wind_speed_type")
var windSpeedType = WindSpeedType.milesPerHour
var windSpeedType = UnitSpeed.milesPerHour
@UserDefaultsValue(key: "pressure_type")
var pressureType = PressureType.millibars
var pressureType = UnitPressure.millibars
@UserDefaultsValue(key: "distance_type")
var distanceType = DistanceType.miles
var distanceType = UnitLength.miles
var locale:Locale {
return Locale(identifier: Localize.currentLanguage())
......
......@@ -124,17 +124,17 @@ class SettingsCellFactory: CellFactoryProtocol {
var symbol = ""
switch rowType {
case .temperature:
name = viewModel.settings.temperatureType.unit.name
symbol = viewModel.settings.temperatureType.unit.symbol
name = viewModel.settings.temperatureType.name
symbol = viewModel.settings.temperatureType.symbol
case .wind:
name = viewModel.settings.windSpeedType.unit.name
symbol = viewModel.settings.windSpeedType.unit.symbol
name = viewModel.settings.windSpeedType.name
symbol = viewModel.settings.windSpeedType.symbol
case .pressure:
name = viewModel.settings.pressureType.unit.name
symbol = viewModel.settings.pressureType.unit.symbol
name = viewModel.settings.pressureType.name
symbol = viewModel.settings.pressureType.symbol
case .distance:
name = viewModel.settings.distanceType.unit.name
symbol = viewModel.settings.distanceType.unit.symbol
name = viewModel.settings.distanceType.name
symbol = viewModel.settings.distanceType.symbol
default:
break
}
......
......@@ -51,10 +51,8 @@ class SettingsDetailsCell: UITableViewCell {
switch interfaceStyle {
case .light:
label.textColor = ThemeManager.currentTheme.secondaryTextColor
checkmarkImageView.tintColor = ThemeManager.currentTheme.secondaryTextColor
case .dark:
label.textColor = ThemeManager.currentTheme.primaryTextColor
checkmarkImageView.tintColor = ThemeManager.currentTheme.primaryTextColor
}
}
}
......@@ -89,6 +87,7 @@ private extension SettingsDetailsCell {
func prepareCheckmark() {
checkmarkImageView.contentMode = .scaleAspectFit
checkmarkImageView.image = UIImage(named: "checkmark")
checkmarkImageView.tintColor = ThemeManager.currentTheme.graphTintColor
container.addSubview(checkmarkImageView)
checkmarkImageView.snp.makeConstraints { (make) in
......
......@@ -6,6 +6,7 @@
//
import UIKit
import Localize_Swift
class SettingsDetailsCellFactory: CellFactoryProtocol {
//Private
......@@ -56,23 +57,23 @@ class SettingsDetailsCellFactory: CellFactoryProtocol {
switch viewModel.rowType {
case .temperature:
cell.configure(item: viewModel.temperatures[indexPath.row],
cell.configure(item: viewModel.temperatures[indexPath.row].name,
isSelected: indexPath.row == viewModel.selectedTemperatureIndex,
roundedConrers: mask)
case .wind:
cell.configure(item: viewModel.winds[indexPath.row],
cell.configure(item: viewModel.winds[indexPath.row].name,
isSelected: indexPath.row == viewModel.selectedWindIndex,
roundedConrers: mask)
case .pressure:
cell.configure(item: viewModel.pressures[indexPath.row],
cell.configure(item: viewModel.pressures[indexPath.row].name,
isSelected: indexPath.row == viewModel.selectedPressureIndex,
roundedConrers: mask)
case .distance:
cell.configure(item: viewModel.distances[indexPath.row],
cell.configure(item: viewModel.distances[indexPath.row].name,
isSelected: indexPath.row == viewModel.selectedDistanceIndex,
roundedConrers: mask)
case .language:
cell.configure(item: viewModel.languages[indexPath.row],
cell.configure(item: Localize.displayNameForLanguage(viewModel.languages[indexPath.row]),
isSelected: indexPath.row == viewModel.selectedLanguageIndex,
roundedConrers: mask)
default:
......
......@@ -28,6 +28,7 @@ class SettingsDetailsViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
self.viewModel.delegate = self
prepareController()
prepareTable()
}
......@@ -69,5 +70,13 @@ extension SettingsDetailsViewController: UITableViewDataSource {
//MARK:- UITableView Delegate
extension SettingsDetailsViewController: UITableViewDelegate {
func tableView(_ tableView: UITableView, didSelectRowAt indexPath: IndexPath) {
viewModel.selectUnitAtIndex(index: indexPath.row)
}
}
extension SettingsDetailsViewController: ViewModelDelegate {
func viewModelDidChange<P>(model: P) where P : ViewModelProtocol {
tableView.reloadData()
}
}
......@@ -13,40 +13,61 @@ class SettingsDetailsViewModel: ViewModelProtocol {
let rowType:SettingsRow
weak var delegate:ViewModelDelegate?
var temperatures:[String] {
return TemperatureType.allCases.map{ $0.rawValue.localized() }
public var temperatures:[UnitTemperature] {
return [.kelvin, .celsius, .fahrenheit]
}
var winds:[String] {
return WindSpeedType.allCases.map{ $0.rawValue.localized() }
public var winds:[UnitSpeed] {
return [.metersPerSecond, .kilometersPerHour, .milesPerHour, .knots]
}
var pressures:[String] {
return PressureType.allCases.map{ $0.rawValue.localized() }
public var pressures:[UnitPressure] {
return [.inchesOfMercury, .millibars, .millimetersOfMercury, .atmosphere, .kilopascals]
}
var distances:[String] {
return DistanceType.allCases.map{ $0.rawValue.localized() }
public var distances:[UnitLength] {
return [.miles, .kilometers]
}
var languages:[String] {
public var languages:[String] {
return Localize.availableLanguages()
}
//Selected
var selectedTemperatureIndex: Int {
return TemperatureType.allCases.firstIndex{ Settings.shared.temperatureType == $0 } ?? -1
public var selectedTemperatureIndex: Int {
return temperatures.firstIndex{ $0 == Settings.shared.temperatureType } ?? -1
}
var selectedWindIndex: Int {
return WindSpeedType.allCases.firstIndex{ Settings.shared.windSpeedType == $0 } ?? -1
public var selectedWindIndex: Int {
return winds.firstIndex{ $0 == Settings.shared.windSpeedType } ?? -1
}
var selectedPressureIndex:Int {
return PressureType.allCases.firstIndex{ Settings.shared.pressureType == $0 } ?? -1
public var selectedPressureIndex:Int {
return pressures.firstIndex{ $0 == Settings.shared.pressureType } ?? -1
}
var selectedDistanceIndex:Int {
return DistanceType.allCases.firstIndex{ Settings.shared.distanceType == $0 } ?? -1
public var selectedDistanceIndex:Int {
return distances.firstIndex{ $0 == Settings.shared.distanceType } ?? -1
}
var selectedLanguageIndex:Int {
return Localize.availableLanguages().firstIndex{ $0 == Localize.currentLanguage()} ?? -1
public var selectedLanguageIndex:Int {
return Localize.availableLanguages().firstIndex{ $0 == Localize.currentLanguage() } ?? -1
}
init(rowType: SettingsRow) {
self.rowType = rowType
}
public func selectUnitAtIndex(index: Int) {
switch rowType {
case .temperature:
Settings.shared.temperatureType = temperatures[index]
case .wind:
Settings.shared.windSpeedType = winds[index]
case .pressure:
Settings.shared.pressureType = pressures[index]
case .distance:
Settings.shared.distanceType = distances[index]
default:
break
}
delegate?.viewModelDidChange(model: self)
}
public func selectLaanguage(identifier:String, atIndex index:Int) {
}
}
......@@ -21,7 +21,7 @@
<key>Cirque.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>6</integer>
<integer>4</integer>
</dict>
<key>Localize-Swift.xcscheme</key>
<dict>
......@@ -33,7 +33,7 @@
<key>Localize-Swift.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>4</integer>
<integer>3</integer>
</dict>
<key>Pods-1Weather.xcscheme</key>
<dict>
......@@ -52,7 +52,7 @@
<key>XMLCoder.xcscheme_^#shared#^_</key>
<dict>
<key>orderHint</key>
<integer>5</integer>
<integer>6</integer>
</dict>
</dict>
<key>SuppressBuildableAutocreation</key>
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment