1 contributor
170 lines | 7.088kb
//
//  MeterScreenControlsView.swift
//  USB Meter
//
//  Created by Bogdan Timofte on 09/03/2020.
//  Copyright © 2020 Bogdan Timofte. All rights reserved.
//

import SwiftUI

struct MeterScreenControlsView: View {
    
    @EnvironmentObject private var meter: Meter
    var compactLayout: Bool = false
    var availableSize: CGSize? = nil
    var showsHeader: Bool = true

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

            if compactLayout {
                if usesExpandedCompactLayout {
                    Spacer(minLength: 0)

                    VStack(spacing: 12) {
                        HStack(spacing: 12) {
                            MeterScreenControlButtonView(
                                title: "Prev",
                                symbol: "chevron.left",
                                tint: .indigo,
                                compact: true,
                                isExpandedCompactLayout: usesExpandedCompactLayout,
                                action: { meter.previousScreen() }
                            )

                            MeterCurrentScreenSummaryView(
                                reportsCurrentScreenIndex: meter.reportsCurrentScreenIndex,
                                currentScreenDescription: meter.currentScreenDescription,
                                isExpandedCompactLayout: usesExpandedCompactLayout
                            )
                                .frame(maxWidth: .infinity, minHeight: 112)
                                .padding(.horizontal, 14)
                                .meterCard(tint: meter.color, fillOpacity: 0.06, strokeOpacity: 0.10)
                        }

                        HStack(spacing: 12) {
                            MeterScreenControlButtonView(
                                title: "Rotate",
                                symbol: "rotate.right.fill",
                                tint: .orange,
                                compact: true,
                                isExpandedCompactLayout: usesExpandedCompactLayout,
                                action: { meter.rotateScreen() }
                            )

                            MeterScreenControlButtonView(
                                title: "Next",
                                symbol: "chevron.right",
                                tint: .indigo,
                                compact: true,
                                isExpandedCompactLayout: usesExpandedCompactLayout,
                                action: { meter.nextScreen() }
                            )
                        }
                    }

                    Spacer(minLength: 0)
                } else {
                    HStack(spacing: 10) {
                        MeterScreenControlButtonView(
                            title: "Prev",
                            symbol: "chevron.left",
                            tint: .indigo,
                            compact: true,
                            isExpandedCompactLayout: usesExpandedCompactLayout,
                            action: { meter.previousScreen() }
                        )

                        MeterCurrentScreenSummaryView(
                            reportsCurrentScreenIndex: meter.reportsCurrentScreenIndex,
                            currentScreenDescription: meter.currentScreenDescription,
                            isExpandedCompactLayout: usesExpandedCompactLayout
                        )
                            .frame(maxWidth: .infinity, minHeight: 82)
                            .padding(.horizontal, 10)
                            .meterCard(tint: meter.color, fillOpacity: 0.06, strokeOpacity: 0.10)

                        MeterScreenControlButtonView(
                            title: "Rotate",
                            symbol: "rotate.right.fill",
                            tint: .orange,
                            compact: true,
                            isExpandedCompactLayout: usesExpandedCompactLayout,
                            action: { meter.rotateScreen() }
                        )

                        MeterScreenControlButtonView(
                            title: "Next",
                            symbol: "chevron.right",
                            tint: .indigo,
                            compact: true,
                            isExpandedCompactLayout: usesExpandedCompactLayout,
                            action: { meter.nextScreen() }
                        )
                    }
                }
            } else {
                HStack(spacing: 12) {
                    MeterScreenControlButtonView(
                        title: "Prev",
                        symbol: "chevron.left",
                        tint: .indigo,
                        compact: true,
                        isExpandedCompactLayout: usesExpandedCompactLayout,
                        action: { meter.previousScreen() }
                    )

                    MeterCurrentScreenSummaryView(
                        reportsCurrentScreenIndex: meter.reportsCurrentScreenIndex,
                        currentScreenDescription: meter.currentScreenDescription,
                        isExpandedCompactLayout: usesExpandedCompactLayout
                    )
                    .frame(maxWidth: .infinity, minHeight: 92)
                    .padding(.horizontal, 12)
                    .meterCard(tint: meter.color, fillOpacity: 0.06, strokeOpacity: 0.10)

                    MeterScreenControlButtonView(
                        title: "Next",
                        symbol: "chevron.right",
                        tint: .indigo,
                        compact: true,
                        isExpandedCompactLayout: usesExpandedCompactLayout,
                        action: { meter.nextScreen() }
                    )
                }

                MeterScreenControlButtonView(
                    title: "Rotate Screen",
                    symbol: "rotate.right.fill",
                    tint: .orange,
                    compact: false,
                    isExpandedCompactLayout: usesExpandedCompactLayout,
                    action: { meter.rotateScreen() }
                )
            }
        }
        .frame(maxWidth: .infinity, maxHeight: compactLayout ? .infinity : nil, alignment: .topLeading)
    }

    private var usesExpandedCompactLayout: Bool {
        compactLayout && (availableSize?.height ?? 0) >= 520
    }

}

struct MeterScreenControlsView_Previews: PreviewProvider {
    static var previews: some View {
        MeterScreenControlsView()
    }
}