// // MeterView.swift // USB Meter // // Created by Bogdan Timofte on 04/03/2020. // Copyright © 2020 Bogdan Timofte. All rights reserved. // // MARK: Parent frame https://stackoverflow.com/questions/56832865/how-to-access-parents-frame-in-swiftui import SwiftUI import CoreBluetooth struct MeterView: View { @EnvironmentObject private var meter: Meter @State var dataGroupsViewVisibility: Bool = false @State var measurementsViewVisibility: Bool = false private var myBounds: CGRect { UIScreen.main.bounds } var body: some View { ScrollView { VStack (alignment: .center, spacing: 10) { // MARK: Name VStack { Text("Meter") .font(.headline) Text("\(meter.name)") } .padding() .background(RoundedRectangle(cornerRadius: 20).foregroundColor(meter.color).opacity(0.1)) // MARK: Mac VStack { Text("MAC") .font(.headline) Text("\(meter.btSerial.macAddress.description)") } .padding() .background(RoundedRectangle(cornerRadius: 20).foregroundColor(.secondary).opacity(0.1)) } // MARK: Connect/Disconnect connectionControlButton() // MARK: Show Data if ( meter.operationalState == .dataIsAvailable) { Text("Model: \(meter.deviceModelSummary)") HStack { Button(action: {self.dataGroupsViewVisibility.toggle()}) { VStack { Image(systemName: "map") .sheet(isPresented: self.$dataGroupsViewVisibility) { DataGroupsView(visibility: self.$dataGroupsViewVisibility) .environmentObject(self.meter) } Text("Data Groups") } } Button(action: {self.measurementsViewVisibility.toggle()}) { VStack { Image(systemName: "recordingtape") .sheet(isPresented: self.$measurementsViewVisibility) { MeasurementsView(visibility: self.$measurementsViewVisibility) .environmentObject(self.meter.measurements) } Text("History") } } } if self.meter.measurements.power.context.isValid { MeasurementChartView() .environmentObject(self.meter.measurements) .frame(minHeight: myBounds.height/3) } ControlView() LiveView() } } //.frame(minWidth: 0, maxWidth: .greatestFiniteMagnitude, minHeight: 0, maxHeight: .greatestFiniteMagnitude) .navigationBarTitle("Meter") .navigationBarItems(trailing: HStack (spacing: 0) { if meter.operationalState > .notPresent { RSSIView(RSSI: meter.btSerial.RSSI) .frame(width: 24) .padding(.vertical) } NavigationLink(destination: MeterSettingsView().environmentObject(meter)) { Image( systemName: "gear" ) //.imageScale(.large) .padding(.vertical) .padding(.leading) //.background(RoundedRectangle(cornerRadius: 20)).opacity(0.05) } }) } fileprivate func connectionControlButton() -> some View { /* MARK: De adaugat si celelalte situatii case peripheralNotConnected case peripheralConnectionPending case peripheralConnected case ready */ let buttonColor = meter.operationalState > .peripheralNotConnected ? Color.red : Color.green return Group { if meter.operationalState == .notPresent { Text("Not found at this time.").foregroundColor(.red) } else { HStack { if meter.operationalState < .peripheralConnectionPending { Button (action: { self.meter.connect() } ) { Text("Connect") } } else { Button (action: { self.meter.disconnect() } ) { Text("Disconnect") } } } .padding() .background(RoundedRectangle(cornerRadius: 20).foregroundColor(buttonColor).opacity(0.1)) .frame(maxWidth: .greatestFiniteMagnitude) } } } }