// Copyright (C) 2024 Rubén Beltrán del Río // This program is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // This program is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // You should have received a copy of the GNU General Public License // along with this program. If not, see https://map.tranquil.systems. import SwiftUI struct EvolutionPicker: View { @State var isShowingMenu = false @State var isHovered = false @Binding var selectedEvolution: StageType var body: some View { Button( action: { isShowingMenu = !isShowingMenu }, label: { HStack(spacing: Dimensions.Spacing.loose) { Text(Stage.title(selectedEvolution)) .font(.Theme.Body.emphasized) .foregroundColor(isShowingMenu ? .Theme.UI.background : .Theme.UI.foreground) ZStack { Image(systemName: "chevron.up") .resizable() .scaledToFit() .frame( width: Dimensions.EvolutionPicker.controlSize, height: Dimensions.EvolutionPicker.controlSize ) .offset(CGSize(width: 0, height: -Dimensions.EvolutionPicker.controlSpacing)) .foregroundColor(isShowingMenu ? .Theme.UI.background : .Theme.UI.foreground) Image(systemName: "chevron.down") .resizable() .scaledToFit() .frame( width: Dimensions.EvolutionPicker.controlSize, height: Dimensions.EvolutionPicker.controlSize ) .offset(CGSize(width: 0, height: Dimensions.EvolutionPicker.controlSpacing)) .foregroundColor(isShowingMenu ? .Theme.UI.background : .Theme.UI.foreground) } } .padding(.horizontal, Dimensions.Spacing.regular) .padding(.vertical, Dimensions.Spacing.cozy) } ) .buttonStyle(.borderless) .background(isShowingMenu ? Color.Theme.UI.foreground : Color.clear) .cornerRadius(Dimensions.EvolutionPicker.radius) .overlay( RoundedRectangle(cornerRadius: Dimensions.EvolutionPicker.radius) .stroke( isShowingMenu ? Color.Theme.UI.foreground : (isHovered ? Color.Theme.UI.foreground : Color.clear), lineWidth: 1) ) .onHover { hovering in isHovered = hovering } .popover( isPresented: $isShowingMenu, content: { EvolutionPickerMenu(selectedEvolution: $selectedEvolution) } ) .onChange(of: selectedEvolution) { isShowingMenu = false } } } #Preview { @Previewable @State var selectedEvolution: StageType = .behavior EvolutionPicker(selectedEvolution: $selectedEvolution) }