/** * TrackerMap * Copyright (C) 2021-2022 Iván Ávalos , Henoch Ojeda * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU Affero 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 Affero General Public License for more details. * * You should have received a copy of the GNU Affero General Public License * along with this program. If not, see . */ import SwiftUI import Combine import WhirlyGlobeMaplyComponent import shared struct MapWrapperView: View { @Binding var layer: MapLayer @ObservedObject var link: BaseMapLink = BaseMapLink() var body: some View { ZStack { // MARK: - Map BaseMapView(mapLayer: $layer, link: link) // MARK: - Attribution VStack { HyperlinkText(html: layer.attribution) .font(.footnote) .lineLimit(3) .foregroundColor(.label.opacity(0.35)) .padding() .background(.systemBackground.opacity(0.35)) } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .bottom) .allowsHitTesting(false) // MARK: - Controls VStack { // MARK: Zoom in Button { print ("Zoom in!") link.zoomIn() } label: { Image(systemName: "plus").imageScale(.large) } .buttonStyle(ControlButtonStyle()) // MARK: Zoom out Button { print("Zoom out!") link.zoomOut() } label: { Image(systemName: "minus").imageScale(.large) } .buttonStyle(ControlButtonStyle()) } .frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topTrailing) .padding() } } } struct ControlButtonStyle: ButtonStyle { func makeBody(configuration: Configuration) -> some View { configuration.label .frame(width: 50, height: 50) .foregroundColor(configuration.isPressed ? .secondary : .primary) .background(configuration.isPressed ? .secondarySystemBackground : .systemBackground) .clipShape(Circle()) } }