Files
Reflect/Shared/views/IconView.swift
Trey t fce13af84e re-do the way a custom icon is generated / stored
fix small roll up header text going outside of circle view
2022-02-14 17:02:56 -06:00

132 lines
4.7 KiB
Swift

//
// IconView.swift
// Feels (iOS)
//
// Created by Trey Tartt on 2/13/22.
//
import SwiftUI
struct IconView: View {
@State public var customIcon: CustomIcon
private let facePercSize = 0.6
public let isPreview: Bool
private var gridXOffset: CGFloat {
if isPreview {
return CGFloat(0)
}
return CGFloat(6)
}
private var gridYOffset: CGFloat {
if isPreview {
return CGFloat(0)
}
return CGFloat(-8)
}
private var entireFuckingViewOffset: CGFloat {
if isPreview {
return CGFloat(0)
}
return CGFloat(25)
}
let columns = [
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1),
GridItem(.flexible(minimum: 1, maximum: 100), spacing: 1)
]
var body: some View {
GeometryReader { geo in
ZStack {
Rectangle()
.fill(
customIcon.bgColor
)
.frame(maxWidth: .infinity, maxHeight: .infinity)
LazyVGrid(columns: columns, alignment: .leading, spacing: 0) {
ForEach(customIcon.background, id: \.self.1) { (bgOption, uuid) in
bgOption.image
.resizable()
.aspectRatio(1, contentMode: .fill)
.foregroundColor(customIcon.bgOverlayColor)
}
}
.frame(maxWidth: .infinity, maxHeight: .infinity)
.background(
.clear
)
Circle()
.strokeBorder(customIcon.circleStrokeColor, lineWidth: geo.size.width * 0.045)
.background(Circle().fill(customIcon.innerColor))
.frame(width: geo.size.width*facePercSize,
height: geo.size.height*facePercSize,
alignment: .center)
.position(x: geo.size.width/2, y: geo.size.height/2)
customIcon.leftEye.image
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: geo.size.width*0.12,
height: geo.size.height*0.12,
alignment: .center)
.position(x: geo.size.width*0.4,
y: geo.size.height*0.4)
.foregroundColor(customIcon.leftEyeColor)
customIcon.rightEye.image
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: geo.size.width*0.12,
height: geo.size.height*0.12,
alignment: .center)
.position(x: geo.size.width*0.6,
y: geo.size.height*0.4)
.foregroundColor(customIcon.rightEyeColor)
customIcon.mouth.image
.resizable()
.aspectRatio(contentMode: .fit)
.frame(width: geo.size.width*0.12,
height: geo.size.height*0.12,
alignment: .center)
.position(x: geo.size.width*0.5,
y: geo.size.height*0.59)
.foregroundColor(customIcon.mouthColor)
}
.position(x: geo.size.width/2,
y: geo.size.height/2 - entireFuckingViewOffset)
}
}
}
struct IconView_Previews: PreviewProvider {
static var backgrounds: [(BackGroundOptions, UUID)] = {
var blah = [(BackGroundOptions, UUID)]()
for _ in 0...CustomIcon.numberOfBGItems {
blah.append((BackGroundOptions.selectable.randomElement()!, UUID()))
}
return blah
}()
static var previews: some View {
IconView(customIcon: CustomIcon.defaultCustomIcon,
isPreview: true)
.frame(width: 256, height: 256, alignment: .center)
}
}