feat: Allows to change filters from map detail (seismic network)
This commit is contained in:
@@ -9,6 +9,7 @@
|
||||
/* Begin PBXBuildFile section */
|
||||
651901B925F5358700CAFF20 /* EQNMapAnnotationSeismic.swift in Sources */ = {isa = PBXBuildFile; fileRef = 651901B825F5358700CAFF20 /* EQNMapAnnotationSeismic.swift */; };
|
||||
6525A82625E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6525A82525E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift */; };
|
||||
652C37BD26092B3C0068EC3B /* FiltersViewModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */; };
|
||||
65355FFF25F38D3300BB57D2 /* SegnalazioniMapViewController.swift in Sources */ = {isa = PBXBuildFile; fileRef = 65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */; };
|
||||
6535600425F398CD00BB57D2 /* Costanti+Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6535600325F398CD00BB57D2 /* Costanti+Extensions.swift */; };
|
||||
653C67E225F3CC2E00FE52AC /* EQNCustomAnnotationView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 653C67E125F3CC2E00FE52AC /* EQNCustomAnnotationView.swift */; };
|
||||
@@ -279,6 +280,7 @@
|
||||
40CD2E5581CF2FA3D52F392D /* Pods-Earthquake Network.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; name = "Pods-Earthquake Network.release.xcconfig"; path = "Pods/Target Support Files/Pods-Earthquake Network/Pods-Earthquake Network.release.xcconfig"; sourceTree = "<group>"; };
|
||||
651901B825F5358700CAFF20 /* EQNMapAnnotationSeismic.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNMapAnnotationSeismic.swift; sourceTree = "<group>"; };
|
||||
6525A82525E13FD4008FE0D0 /* SeismicNetworkAdvertiseTableViewCell.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SeismicNetworkAdvertiseTableViewCell.swift; sourceTree = "<group>"; };
|
||||
652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FiltersViewModel.swift; sourceTree = "<group>"; };
|
||||
65355FFE25F38D3300BB57D2 /* SegnalazioniMapViewController.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = SegnalazioniMapViewController.swift; sourceTree = "<group>"; };
|
||||
6535600325F398CD00BB57D2 /* Costanti+Extensions.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "Costanti+Extensions.swift"; sourceTree = "<group>"; };
|
||||
653C67E125F3CC2E00FE52AC /* EQNCustomAnnotationView.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EQNCustomAnnotationView.swift; sourceTree = "<group>"; };
|
||||
@@ -623,6 +625,7 @@
|
||||
isa = PBXGroup;
|
||||
children = (
|
||||
DC974AFE251748B300A139EC /* SeismicFiltersViewController.swift */,
|
||||
652C37BC26092B3C0068EC3B /* FiltersViewModel.swift */,
|
||||
);
|
||||
path = Filters;
|
||||
sourceTree = "<group>";
|
||||
@@ -1529,6 +1532,7 @@
|
||||
DCD4571C24F6CF0D00B58304 /* EQNGenericValue.swift in Sources */,
|
||||
8C4E343F215012FA008B0D2A /* EQNManager.m in Sources */,
|
||||
DCAA913F24F68A1D00145A3D /* SettingMultivaluesTableViewCell.swift in Sources */,
|
||||
652C37BD26092B3C0068EC3B /* FiltersViewModel.swift in Sources */,
|
||||
DCF9E14F24F6EA07002B6B1D /* EQNSeismicNetwork.swift in Sources */,
|
||||
DC2814302519C24400C1AFF7 /* SeismicNetworkTableViewCell.swift in Sources */,
|
||||
654D18C425F93C0600BB6DB0 /* PasquakesMapViewController.swift in Sources */,
|
||||
|
||||
+48
@@ -0,0 +1,48 @@
|
||||
//
|
||||
// FiltersViewModel.swift
|
||||
// Earthquake Network
|
||||
//
|
||||
// Created by Andrea Busi on 22/03/21.
|
||||
// Copyright © 2021 Earthquake Network. All rights reserved.
|
||||
//
|
||||
|
||||
import Foundation
|
||||
|
||||
|
||||
struct FiltersViewModel {
|
||||
let magnitude: String
|
||||
let distance: String
|
||||
let timeframe: String
|
||||
|
||||
init() {
|
||||
let magnitudoMinima = EQNData.magitudoDebole(for: EQNSeismic.shared.magnitudoMinima)
|
||||
self.magnitude = Self.formattedMagnitude(magnitudoMinima.value)
|
||||
|
||||
let distanzaMassima = EQNData.raggioSisma(for: EQNSeismic.shared.distanzaMassima)
|
||||
self.distance = Self.formattedDistance(distanzaMassima.value)
|
||||
|
||||
let periodoTemporale = EQNData.periodoTemporale(for: EQNSeismic.shared.periodoTemporale)
|
||||
self.timeframe = Self.formattedTimeframe(periodoTemporale.value)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private static func formattedMagnitude(_ magnitude: String) -> String {
|
||||
return magnitude
|
||||
}
|
||||
|
||||
private static func formattedDistance(_ distance: String) -> String {
|
||||
if distance == EQNData.MaxRaggioSisma {
|
||||
return "∞"
|
||||
}
|
||||
return "\(distance)km"
|
||||
}
|
||||
|
||||
private static func formattedTimeframe(_ timeframe: String) -> String {
|
||||
let time = Int(timeframe) ?? 0
|
||||
if time < 60 {
|
||||
return "\(time)m"
|
||||
}
|
||||
return "\(time/60)h"
|
||||
}
|
||||
}
|
||||
+77
-4
@@ -9,20 +9,57 @@
|
||||
import UIKit
|
||||
import MapKit
|
||||
|
||||
protocol SeismicNetworksMapDetailViewControllerDelegate: class {
|
||||
func seismicNetworksMapDetailControllerWillUpdateData(_ controller: SeismicNetworksMapDetailViewController, needsDataUpdate: Bool)
|
||||
}
|
||||
|
||||
class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
|
||||
|
||||
// MARK: - State
|
||||
|
||||
override var availableFilters: [EQNFiltroMappa] {
|
||||
// filters are not available for this map
|
||||
[]
|
||||
// trick to show filtersView
|
||||
[ .unGiorno ]
|
||||
}
|
||||
weak var delegate: SeismicNetworksMapDetailViewControllerDelegate?
|
||||
|
||||
// MARK: - UI
|
||||
|
||||
override var filtersView: UIView {
|
||||
get { return seismicFiltersView }
|
||||
set { seismicFiltersView = newValue }
|
||||
}
|
||||
|
||||
private lazy var seismicFiltersView: UIView = {
|
||||
let view = UIView()
|
||||
view.translatesAutoresizingMaskIntoConstraints = false
|
||||
view.backgroundColor = .lightGray
|
||||
|
||||
// label with current selecte filter
|
||||
view.addSubview(seismicsFilterLabel)
|
||||
seismicsFilterLabel.topAnchor.constraint(equalTo: view.topAnchor).isActive = true
|
||||
seismicsFilterLabel.bottomAnchor.constraint(equalTo: view.bottomAnchor).isActive = true
|
||||
seismicsFilterLabel.leadingAnchor.constraint(equalTo: view.leadingAnchor, constant: 8.0).isActive = true
|
||||
seismicsFilterLabel.trailingAnchor.constraint(equalTo: view.trailingAnchor, constant: -8.0).isActive = true
|
||||
|
||||
// tap recognizer
|
||||
let tapRecognizer = UITapGestureRecognizer(target: self, action: #selector(filtersTapped(_:)))
|
||||
view.addGestureRecognizer(tapRecognizer)
|
||||
return view
|
||||
}()
|
||||
|
||||
private lazy var seismicsFilterLabel: UILabel = {
|
||||
let label = UILabel()
|
||||
label.translatesAutoresizingMaskIntoConstraints = false
|
||||
label.textAlignment = .center
|
||||
label.text = ""
|
||||
return label
|
||||
}()
|
||||
|
||||
// MARK: - Internal
|
||||
|
||||
private let seismic: EQNSisma
|
||||
private let allSeismics: [EQNSisma]
|
||||
private var allSeismics: [EQNSisma]
|
||||
|
||||
// MARK: - Init
|
||||
|
||||
@@ -33,11 +70,16 @@ class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
|
||||
}
|
||||
|
||||
required init?(coder: NSCoder) {
|
||||
fatalError("init(coder:) has not been implemented")
|
||||
fatalError("init(coder:) is not available, please use init(seismic:allSeismics:)")
|
||||
}
|
||||
|
||||
// MARK: - Public
|
||||
|
||||
func updateSeismics(_ seismics: [EQNSisma]) {
|
||||
allSeismics = seismics
|
||||
loadDataSource()
|
||||
}
|
||||
|
||||
override func registerMapAnnotationViews() {
|
||||
mapView.register(EQNCustomAnnotationView.self, forAnnotationViewWithReuseIdentifier: EQNCustomAnnotationView.DoubleLineIdentifier)
|
||||
}
|
||||
@@ -46,6 +88,7 @@ class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
|
||||
let annotations = allSeismics.map { EQNMapAnnotationSeismic(seismic: $0) }
|
||||
|
||||
updateMap(with: annotations)
|
||||
loadFiltersRecap()
|
||||
}
|
||||
|
||||
override func elaborateMapCenter() {
|
||||
@@ -70,6 +113,30 @@ class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
|
||||
present(alert, animated: true)
|
||||
}
|
||||
|
||||
// MARK: - Private
|
||||
|
||||
private func loadFiltersRecap() {
|
||||
let filters = FiltersViewModel()
|
||||
|
||||
let recap = "\(NSLocalizedString("filter_filter", comment: "")): "
|
||||
+ "M≥\(filters.magnitude) "
|
||||
+ "D≤\(filters.distance) "
|
||||
+ "T≤\(filters.timeframe)"
|
||||
seismicsFilterLabel.text = recap
|
||||
}
|
||||
|
||||
|
||||
|
||||
// MARK: - Actions
|
||||
|
||||
@objc override func filtersTapped(_ sender: UIGestureRecognizer) {
|
||||
let controller = SeismicFiltersViewController.makeController()
|
||||
controller.delegate = self
|
||||
controller.modalPresentationStyle = .overCurrentContext
|
||||
controller.modalTransitionStyle = .crossDissolve
|
||||
present(controller, animated: true, completion: nil)
|
||||
}
|
||||
|
||||
// MARK: - Map
|
||||
|
||||
override func setupAnnotationView(for annotation: MKAnnotation, on mapView: MKMapView) -> MKAnnotationView? {
|
||||
@@ -88,3 +155,9 @@ class SeismicNetworksMapDetailViewController: EQNBaseMapViewController {
|
||||
return annotationView
|
||||
}
|
||||
}
|
||||
|
||||
extension SeismicNetworksMapDetailViewController: SeismicFiltersViewControllerDelegate {
|
||||
func seismicFiltersControllerDidUpdateFilters(_ controller: SeismicFiltersViewController) {
|
||||
delegate?.seismicNetworksMapDetailControllerWillUpdateData(self, needsDataUpdate: controller.needsDataUpdate)
|
||||
}
|
||||
}
|
||||
|
||||
+16
@@ -26,6 +26,7 @@ class SeismicNetworksViewController: UIViewController, UITableViewDelegate, UITa
|
||||
|
||||
@IBOutlet private weak var tableView: UITableView?
|
||||
@IBOutlet private weak var expandeCollapseButton: UIBarButtonItem!
|
||||
weak var currentMapController: SeismicNetworksMapDetailViewController?
|
||||
|
||||
/// The ad loader
|
||||
private lazy var adLoader: GADAdLoader = {
|
||||
@@ -105,7 +106,10 @@ class SeismicNetworksViewController: UIViewController, UITableViewDelegate, UITa
|
||||
private func showMapDetail(for seismic: EQNSisma) {
|
||||
let seismics = getSeismics()
|
||||
let controller = SeismicNetworksMapDetailViewController(seismic: seismic, allSeismics: seismics)
|
||||
controller.delegate = self
|
||||
present(controller, animated: true, completion: nil)
|
||||
|
||||
self.currentMapController = controller
|
||||
}
|
||||
|
||||
// MARK: - Notifications
|
||||
@@ -155,6 +159,11 @@ class SeismicNetworksViewController: UIViewController, UITableViewDelegate, UITa
|
||||
if !EQNPurchaseUtility.isProVersionEnabled() {
|
||||
loadAd()
|
||||
}
|
||||
|
||||
// if a map detail is presented, update its data
|
||||
if let mapController = currentMapController {
|
||||
mapController.updateSeismics(filteredSeismics)
|
||||
}
|
||||
}
|
||||
|
||||
private func getSeismics() -> [EQNSisma] {
|
||||
@@ -418,3 +427,10 @@ extension SeismicNetworksViewController: DZNEmptyDataSetSource {
|
||||
return string
|
||||
}
|
||||
}
|
||||
|
||||
extension SeismicNetworksViewController: SeismicNetworksMapDetailViewControllerDelegate {
|
||||
func seismicNetworksMapDetailControllerWillUpdateData(_ controller: SeismicNetworksMapDetailViewController, needsDataUpdate: Bool) {
|
||||
loadData(forced: needsDataUpdate)
|
||||
refreshUI()
|
||||
}
|
||||
}
|
||||
|
||||
@@ -54,7 +54,7 @@ class EQNBaseMapViewController: EQNBaseViewController, MKMapViewDelegate {
|
||||
return containerView
|
||||
}
|
||||
|
||||
private lazy var filtersView: UIView = {
|
||||
lazy var filtersView: UIView = {
|
||||
let view = UIView()
|
||||
view.translatesAutoresizingMaskIntoConstraints = false
|
||||
view.backgroundColor = .lightGray
|
||||
@@ -233,7 +233,7 @@ class EQNBaseMapViewController: EQNBaseViewController, MKMapViewDelegate {
|
||||
dismiss(animated: true)
|
||||
}
|
||||
|
||||
@objc private func filtersTapped(_ sender: UIGestureRecognizer) {
|
||||
@objc func filtersTapped(_ sender: UIGestureRecognizer) {
|
||||
let sheet = UIAlertController(title: nil, message: nil, preferredStyle: .actionSheet)
|
||||
availableFilters.forEach { (filter) in
|
||||
sheet.addAction(UIAlertAction(title: filter.title, style: .default, handler: { _ in
|
||||
|
||||
@@ -10,8 +10,8 @@ import Foundation
|
||||
|
||||
|
||||
@objc class EQNData: NSObject {
|
||||
|
||||
@objc public static let DefaultRaggioSisma = EQNGenericValue(value:"100000", display:"Qualsiasi distanza")
|
||||
@objc public static let MaxRaggioSisma = "100000"
|
||||
@objc public static let DefaultRaggioSisma = EQNGenericValue(value:MaxRaggioSisma, display:"Qualsiasi distanza")
|
||||
@objc public static let DefaultMagitudoDebole = EQNGenericValue(value:"2.0", display:"Magnitudo >= 2.0")
|
||||
@objc public static let DefaultMagitudoForte = EQNGenericValue(value:"5.5", display:"Magnitudo >= 5.5")
|
||||
@objc public static let DefaultSeismicToNotify = EQNGenericValue(value: "0", display: "Qualsiasi intensità")
|
||||
@@ -34,7 +34,7 @@ import Foundation
|
||||
EQNGenericValue(value:"1000", display:"1000 km"),
|
||||
EQNGenericValue(value:"2000", display:"2000 km"),
|
||||
EQNGenericValue(value:"4000", display:"4000 km"),
|
||||
EQNGenericValue(value:"100000", display:"Qualsiasi distanza"),
|
||||
EQNGenericValue(value:Self.MaxRaggioSisma, display:"Qualsiasi distanza"),
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
@@ -305,6 +305,7 @@
|
||||
"manual_sure" = "Do you really want to notify an earthquake?";
|
||||
"manual_yes" = "Yes";
|
||||
"calendar_missing_permission" = "The calendar cannot be opened, make sure you have set the correct permissions.";
|
||||
"filter_filter" = "Filters";
|
||||
|
||||
// Segnalazioni
|
||||
"manual_sendmessage" = "Send a message that the other users can read about the earthquake that you reported";
|
||||
|
||||
@@ -305,6 +305,7 @@
|
||||
"manual_sure" = "¿Estas seguro de querer reportar un sismo?";
|
||||
"manual_yes" = "Sí";
|
||||
"calendar_missing_permission" = "El calendario no se puede abrir, asegúrese de haber configurado los permisos correctos.";
|
||||
"filter_filter" = "Filtros";
|
||||
|
||||
// Segnalazioni
|
||||
"manual_sendmessage" = "Enviar un mensaje que los demás usuarios puedan leer sobre el sismo que has notificado";
|
||||
|
||||
@@ -304,6 +304,7 @@
|
||||
"manual_sure" = "Vuoi davvero segnalare un sisma?";
|
||||
"manual_yes" = "Sì";
|
||||
"calendar_missing_permission" = "Non è possibile aprire il calendario, assicurarsi di aver impostato i permessi corretti.";
|
||||
"filter_filter" = "Filtri";
|
||||
|
||||
// Segnalazioni
|
||||
"manual_sendmessage" = "Invia un messaggio che gli altri utenti possono leggere sul sisma che hai segnalato";
|
||||
|
||||
Reference in New Issue
Block a user