USB-Meter / USB Meter / Views / Meter / MeterSettingsView.swift
1 contributor
176 lines | 6.341kb
//
//  SettingsView.swift
//  USB Meter
//
//  Created by Bogdan Timofte on 14/03/2020.
//  Copyright © 2020 Bogdan Timofte. All rights reserved.
//

import SwiftUI

struct MeterSettingsView: View {
    
    @EnvironmentObject private var meter: Meter
    
    @State private var editingName = false
    @State private var editingScreenTimeout = false
    @State private var editingScreenBrightness = false

    var body: some View {
        ScrollView {
            VStack (spacing: 10) {
                // MARK: Name
                VStack {
                    HStack {
                        Text ("Name").fontWeight(.semibold)
                        Spacer()
                        if !editingName {
                            Text(meter.name)
                        }
                        ChevronView( rotate: $editingName )
                    }
                    if editingName {
                        EditNameView(editingName: $editingName, newName: meter.name)
                    }
                }
                .padding()
                .background(RoundedRectangle(cornerRadius: 15).foregroundColor(.secondary).opacity(0.1))
                if meter.operationalState == .dataIsAvailable {
                    VStack(alignment: .leading, spacing: 8) {
                        Text("Device Info").fontWeight(.semibold)
                        DeviceInfoRow(label: "Advertised Model", value: meter.modelString)
                        DeviceInfoRow(label: "Displayed Model", value: meter.deviceModelSummary)
                        if meter.modelNumber != 0 {
                            DeviceInfoRow(label: "Model Code", value: "\(meter.modelNumber)")
                        }
                        if !meter.firmwareVersion.isEmpty {
                            DeviceInfoRow(label: "Firmware", value: meter.firmwareVersion)
                        }
                        if meter.serialNumber != 0 {
                            DeviceInfoRow(label: "Serial", value: "\(meter.serialNumber)")
                        }
                        if meter.bootCount != 0 {
                            DeviceInfoRow(label: "Boot Count", value: "\(meter.bootCount)")
                        }
                    }
                    .padding()
                    .background(RoundedRectangle(cornerRadius: 15).foregroundColor(.secondary).opacity(0.1))
                }
                if meter.operationalState == .dataIsAvailable && meter.supportsUMSettings {
                    // MARK: Screen Timeout
                    // Ar trebui separat enabled/disabled de valorile in minute eventual stocata valoarea in iCloud la dezactivare pentru restaurare
                    VStack{
                        HStack {
                            Text ("Screen Timeout").fontWeight(.semibold)
                            Spacer()
                            if !editingScreenTimeout {
                                Text ( meter.screenTimeout != 0 ? "\(meter.screenTimeout) Minutes" : "Off" )
                            }
                            ChevronView( rotate: $editingScreenTimeout )
                        }
                        if editingScreenTimeout {
                            EditScreenTimeoutView()
                        }
                    }
                    .padding()
                    .background(RoundedRectangle(cornerRadius: 15).foregroundColor(.secondary).opacity(0.1))
                    // MARK: Screen Brightness
                    VStack{
                        HStack {
                            Text ("Screen Brightness").fontWeight(.semibold)
                            Spacer()
                            if !editingScreenBrightness {
                                Text ( "\(meter.screenBrightness)" )
                            }
                            ChevronView( rotate: $editingScreenBrightness )
                        }
                        if editingScreenBrightness {
                            EditScreenBrightnessView()
                        }
                    }
                    .padding()
                    .background(RoundedRectangle(cornerRadius: 15).foregroundColor(.secondary).opacity(0.1))
                }
            }
        }
        .padding()
        .navigationBarTitle("Meter Settings")
        .navigationBarItems( trailing: RSSIView( RSSI: meter.btSerial.RSSI ).frame( width: 24 ) )
    }
}

private struct DeviceInfoRow: View {
    let label: String
    let value: String

    var body: some View {
        HStack {
            Text(label)
            Spacer()
            Text(value)
                .foregroundColor(.secondary)
                .multilineTextAlignment(.trailing)
        }
        .font(.footnote)
    }
}

struct EditNameView: View {
    
    @EnvironmentObject private var meter: Meter
    
    @Binding var editingName: Bool
    @State var newName: String
    
    var body: some View {
        TextField("Name", text: self.$newName, onCommit: {
            self.meter.name = self.newName
            self.editingName = false
        })
            .textFieldStyle(RoundedBorderTextFieldStyle())
            .lineLimit(1)
            .disableAutocorrection(true)
            .multilineTextAlignment(.center)
            .padding(.horizontal)
    }
}

struct EditScreenTimeoutView: View {
    
    @EnvironmentObject private var meter: Meter
    
    var body: some View {
        Picker("", selection: self.$meter.screenTimeout ) {
            Text("1").tag(1)
            Text("2").tag(2)
            Text("3").tag(3)
            Text("4").tag(4)
            Text("5").tag(5)
            Text("6").tag(6)
            Text("7").tag(7)
            Text("8").tag(8)
            Text("9").tag(9)
            Text("Off").tag(0)
        }
        .pickerStyle( SegmentedPickerStyle() )
        .padding(.horizontal)
    }
}

struct EditScreenBrightnessView: View {
    
    @EnvironmentObject private var meter: Meter
    
    var body: some View {
        Picker("", selection: self.$meter.screenBrightness ) {
            Text("0").tag(0)
            Text("1").tag(1)
            Text("2").tag(2)
            Text("3").tag(3)
            Text("4").tag(4)
            Text("5").tag(5)
        }
        .pickerStyle( SegmentedPickerStyle() )
        .padding(.horizontal)
    }
}