1 contributor
//
// 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 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) {
ControlActionButtonView(
title: "Prev",
symbol: "chevron.left",
tint: .indigo,
compact: true,
isExpandedCompactLayout: usesExpandedCompactLayout,
action: { meter.previousScreen() }
)
ControlCurrentScreenCardView(
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) {
ControlActionButtonView(
title: "Rotate",
symbol: "rotate.right.fill",
tint: .orange,
compact: true,
isExpandedCompactLayout: usesExpandedCompactLayout,
action: { meter.rotateScreen() }
)
ControlActionButtonView(
title: "Next",
symbol: "chevron.right",
tint: .indigo,
compact: true,
isExpandedCompactLayout: usesExpandedCompactLayout,
action: { meter.nextScreen() }
)
}
}
Spacer(minLength: 0)
} else {
HStack(spacing: 10) {
ControlActionButtonView(
title: "Prev",
symbol: "chevron.left",
tint: .indigo,
compact: true,
isExpandedCompactLayout: usesExpandedCompactLayout,
action: { meter.previousScreen() }
)
ControlCurrentScreenCardView(
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)
ControlActionButtonView(
title: "Rotate",
symbol: "rotate.right.fill",
tint: .orange,
compact: true,
isExpandedCompactLayout: usesExpandedCompactLayout,
action: { meter.rotateScreen() }
)
ControlActionButtonView(
title: "Next",
symbol: "chevron.right",
tint: .indigo,
compact: true,
isExpandedCompactLayout: usesExpandedCompactLayout,
action: { meter.nextScreen() }
)
}
}
} else {
HStack(spacing: 12) {
ControlActionButtonView(
title: "Prev",
symbol: "chevron.left",
tint: .indigo,
compact: true,
isExpandedCompactLayout: usesExpandedCompactLayout,
action: { meter.previousScreen() }
)
ControlCurrentScreenCardView(
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)
ControlActionButtonView(
title: "Next",
symbol: "chevron.right",
tint: .indigo,
compact: true,
isExpandedCompactLayout: usesExpandedCompactLayout,
action: { meter.nextScreen() }
)
}
ControlActionButtonView(
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 ControlView_Previews: PreviewProvider {
static var previews: some View {
ControlView()
}
}