1 contributor
95 lines | 3.072kb
//
//  ControlView.swift
//  USB Meter
//
//  Created by Bogdan Timofte on 09/03/2020.
//  Copyright © 2020 Bogdan Timofte. All rights reserved.
//

import SwiftUI

struct ControlView: View {
    
    @EnvironmentObject private var meter: Meter

    var body: some View {
        VStack(alignment: .leading, spacing: 14) {
            HStack {
                Text("Controls")
                    .font(.headline)
                Spacer()
                Text(meter.reportsCurrentScreenIndex ? "Device Screen" : "Page Controls")
                    .font(.caption.weight(.semibold))
                    .foregroundColor(.secondary)
            }

            HStack(spacing: 12) {
                controlButton(
                    title: "Prev",
                    symbol: "chevron.left",
                    tint: .indigo,
                    action: { meter.previousScreen() }
                )

                VStack(spacing: 6) {
                    Text(meter.currentScreenDescription)
                        .font(.subheadline.weight(.semibold))
                        .multilineTextAlignment(.center)
                    if !meter.reportsCurrentScreenIndex {
                        Text("The protocol allows navigation, but it does not report the active page back to the app.")
                            .font(.caption)
                            .foregroundColor(.secondary)
                            .multilineTextAlignment(.center)
                    }
                }
                .frame(maxWidth: .infinity, minHeight: 92)
                .padding(.horizontal, 12)
                .meterCard(tint: meter.color, fillOpacity: 0.06, strokeOpacity: 0.10)

                controlButton(
                    title: "Next",
                    symbol: "chevron.right",
                    tint: .indigo,
                    action: { meter.nextScreen() }
                )
            }

            controlButton(
                title: "Rotate Screen",
                symbol: "rotate.right.fill",
                tint: .orange,
                compact: false,
                action: { meter.rotateScreen() }
            )
        }
    }

    private func controlButton(
        title: String,
        symbol: String,
        tint: Color,
        compact: Bool = true,
        action: @escaping () -> Void
    ) -> some View {
        Button(action: action) {
            VStack(spacing: 10) {
                Image(systemName: symbol)
                    .font(.system(size: compact ? 18 : 20, weight: .semibold))
                Text(title)
                    .font(.footnote.weight(.semibold))
                    .multilineTextAlignment(.center)
            }
            .foregroundColor(tint)
            .frame(maxWidth: .infinity, minHeight: compact ? 92 : 68)
            .padding(.horizontal, 8)
            .meterCard(tint: tint, fillOpacity: 0.10, strokeOpacity: 0.14)
        }
        .buttonStyle(.plain)
    }
}

struct ControlView_Previews: PreviewProvider {
    static var previews: some View {
        ControlView()
    }
}