diff --git a/Podfile b/Podfile index 4e33311e..ebcf9d1f 100644 --- a/Podfile +++ b/Podfile @@ -4,11 +4,8 @@ inhibit_all_warnings! use_frameworks! target 'WunderLINQ' do - pod 'InAppSettingsKit', '~> 3.3.6' pod 'ChromaColorPicker', '~> 2.0.2' - pod 'CoreGPX', '~> 0.9.0' pod 'UIMultiPicker', '~> 0.6.2' - pod 'Popovers', '~> 1.3.0' end post_install do |installer| diff --git a/Podfile.lock b/Podfile.lock index 73b0df01..14a1c3ed 100644 --- a/Podfile.lock +++ b/Podfile.lock @@ -1,32 +1,20 @@ PODS: - ChromaColorPicker (2.0.2) - - CoreGPX (0.9.0) - - InAppSettingsKit (3.3.6) - - Popovers (1.3.0) - UIMultiPicker (0.6.2) DEPENDENCIES: - ChromaColorPicker (~> 2.0.2) - - CoreGPX (~> 0.9.0) - - InAppSettingsKit (~> 3.3.6) - - Popovers (~> 1.3.0) - UIMultiPicker (~> 0.6.2) SPEC REPOS: trunk: - ChromaColorPicker - - CoreGPX - - InAppSettingsKit - - Popovers - UIMultiPicker SPEC CHECKSUMS: ChromaColorPicker: 307585f2dc23d4d72f24cad320c1e08825cb5c09 - CoreGPX: 1381c8c47428c3a6bcac2f93d25ca1c5e3525811 - InAppSettingsKit: 37df0b44132380d4c7db6fc7cded92997e29873a - Popovers: 8690b055b2c9ef433492b40e081b1a0be5859437 UIMultiPicker: 29bf824c5251822ca4040b933f6204e617e6ba3f -PODFILE CHECKSUM: 38722fa9b39e37c5cad35620797a9b3d80da744a +PODFILE CHECKSUM: 0746c2b061b6eb98aa8c4ea0fa4e9e38ec4669e0 COCOAPODS: 1.14.3 diff --git a/Pods/CoreGPX/Classes/Converters.swift b/Pods/CoreGPX/Classes/Converters.swift deleted file mode 100644 index 2f21cf0e..00000000 --- a/Pods/CoreGPX/Classes/Converters.swift +++ /dev/null @@ -1,115 +0,0 @@ -// -// Conversions.swift -// CoreGPX -// -// Created by Vincent on 21/3/19. -// - -import Foundation - -/// Provides conversions, when required. -/// -/// Meant for internal conversions use only. -internal final class Convert { - - // MARK:- Number conversion - - /// For conversion from optional `String` type to optional `Int` type - /// - /// - Parameters: - /// - string: input string that should be a number. - /// - Returns: - /// A `Int` that will be nil if input `String` is nil. - /// - static func toInt(from string: String?) -> Int? { - guard let NonNilString = string else { - return nil - } - return Int(NonNilString) - } - - /// For conversion from optional `String` type to optional `Double` type - /// - /// - Parameters: - /// - string: input string that should be a number. - /// - Returns: - /// A `Double` that will be nil if input `String` is nil. - /// - static func toDouble(from string: String?) -> Double? { - guard let NonNilString = string else { - return nil - } - return Double(NonNilString) - } - - - - // MARK:- Date & Time Formatting - - /// Immutable date formatter (UTC Time) for consistency within CoreGPX. - private static let dateFormatter: DateFormatter = { - let formatter = DateFormatter() - - // Timezone should be 0 as GPX uses UTC time, not local time. - formatter.timeZone = TimeZone(secondsFromGMT: 0) - formatter.locale = Locale(identifier: "en_US_POSIX") - - // dateTime(YYYY-MM-DDThh:mm:ssZ) - formatter.dateFormat = "yyyy'-'MM'-'dd'T'HH':'mm':'ss'Z'" - - return formatter - }() - - /// For conversion from optional `Date` to optional `String` - /// - /// - Parameters: - /// - date: can be of any date and time, which will be converted to a formatted ISO8601 date and time string. - /// - /// - Returns: - /// Formatted string according to ISO8601, which is of **"yyyy-MM-ddTHH:mm:ssZ"** - /// - /// This method is currently heavily used for generating of GPX files / formatted string, as the native `Date` type must be converted to a `String` first. - /// - static func toString(from dateTime: Date?) -> String? { - - guard let validDate = dateTime else { - return nil - } - - return dateFormatter.string(from: validDate) - } - - /// Immutable year formatter (UTC Time) for consistency within CoreGPX. - private static let yearFormatter: DateFormatter = { - let formatter = DateFormatter() - - // Timezone should be 0 as GPX uses UTC time, not local time. - formatter.timeZone = TimeZone(secondsFromGMT: 0) - - // dateTime(YYYY-MM-DDThh:mm:ssZ) - formatter.dateFormat = "yyyy" - - return formatter - }() - - /// For conversion from optional year `Date` to optional `String` - /// - /// - Parameters: - /// - date: can be of any year, which will be converted to a string representing the year. - /// - /// - Returns: - /// Formatted string as per: "yyyy", a year. - /// - /// This method is used for generating of GPX files / formatted string if `GPXCopyright` is used. Represents the year of copyright. - /// - static func toString(fromYear year: Date?) -> String? { - - guard let validYear = year else { - return nil - } - - return yearFormatter.string(from: validYear) - } - -} - diff --git a/Pods/CoreGPX/Classes/DateTimeParsers.swift b/Pods/CoreGPX/Classes/DateTimeParsers.swift deleted file mode 100644 index fa50d4e2..00000000 --- a/Pods/CoreGPX/Classes/DateTimeParsers.swift +++ /dev/null @@ -1,91 +0,0 @@ -// -// GPXDateTime.swift -// CoreGPX -// -// Created on 23/3/19. -// -// Original code from: http://jordansmith.io/performant-date-parsing/ -// Modified to better suit CoreGPX's functionalities. -// - -import Foundation - -/** - Date Parser for use when parsing GPX files, containing elements with date attributions. - - It can parse ISO8601 formatted date strings, along with year strings to native `Date` types. - - Formerly Named: `ISO8601DateParser` & `CopyrightYearParser` - */ -final class GPXDateParser { - - // MARK:- Supporting Variables - - /// Caching Calendar such that it can be used repeatedly without reinitializing it. - private static var calendarCache = [Int : Calendar]() - /// Components of Date stored together - private static var components = DateComponents() - - // MARK:- Individual Date Components - - private static let year = UnsafeMutablePointer.allocate(capacity: 1) - private static let month = UnsafeMutablePointer.allocate(capacity: 1) - private static let day = UnsafeMutablePointer.allocate(capacity: 1) - private static let hour = UnsafeMutablePointer.allocate(capacity: 1) - private static let minute = UnsafeMutablePointer.allocate(capacity: 1) - private static let second = UnsafeMutablePointer.allocate(capacity: 1) - - // MARK:- String To Date Parsers - - /// Parses an ISO8601 formatted date string as native Date type. - static func parse(date string: String?) -> Date? { - guard let NonNilString = string else { - return nil - } - - _ = withVaList([year, month, day, hour, minute, - second], { pointer in - vsscanf(NonNilString, "%d-%d-%dT%d:%d:%dZ", pointer) - - }) - - components.year = year.pointee - components.minute = minute.pointee - components.day = day.pointee - components.hour = hour.pointee - components.month = month.pointee - components.second = second.pointee - - if let calendar = calendarCache[0] { - return calendar.date(from: components) - } - - var calendar = Calendar(identifier: .gregorian) - calendar.timeZone = TimeZone(secondsFromGMT: 0)! - calendarCache[0] = calendar - return calendar.date(from: components) - } - - /// Parses a year string as native Date type. - static func parse(year string: String?) -> Date? { - guard let NonNilString = string else { - return nil - } - - _ = withVaList([year], { pointer in - vsscanf(NonNilString, "%d", pointer) - - }) - - components.year = year.pointee - - if let calendar = calendarCache[1] { - return calendar.date(from: components) - } - - var calendar = Calendar(identifier: .gregorian) - calendar.timeZone = TimeZone(secondsFromGMT: 0)! - calendarCache[1] = calendar - return calendar.date(from: components) - } -} diff --git a/Pods/CoreGPX/Classes/GPXAuthor.swift b/Pods/CoreGPX/Classes/GPXAuthor.swift deleted file mode 100644 index 831ad876..00000000 --- a/Pods/CoreGPX/Classes/GPXAuthor.swift +++ /dev/null @@ -1,42 +0,0 @@ -// -// GPXAuthor.swift -// GPXKit -// -// Created by Vincent on 22/11/18. -// - -import Foundation - -/// Author type, holds information of the creator of the GPX file. A subclass of `GPXPerson`. -public final class GPXAuthor: GPXPerson { - - // MARK:- Initializers - - public convenience init(name: String? = nil, email: GPXEmail? = nil, link: GPXLink? = nil) { - self.init() - self.name = name - self.email = email - self.link = link - } - - /// Default Initializer - public required init() { - super.init() - } - - /// Inits native element from raw parser value - override init(raw: GPXRawElement) { - super.init(raw: raw) - } - - /// Decoder handling (from superclass) - required public init(from decoder: Decoder) throws { - try super.init(from: decoder) - } - - // MARK:- Tag - - override func tagName() -> String { - return "author" - } -} diff --git a/Pods/CoreGPX/Classes/GPXBounds.swift b/Pods/CoreGPX/Classes/GPXBounds.swift deleted file mode 100644 index 35ab107a..00000000 --- a/Pods/CoreGPX/Classes/GPXBounds.swift +++ /dev/null @@ -1,92 +0,0 @@ -// -// GPXBounds.swift -// GPXKit -// -// Created by Vincent on 22/11/18. -// - -import Foundation - -/** - A value type that represents bounds based off GPX v1.1 schema's `boundsType`. - - This is meant for having two pairs of longitude and latitude, signifying the maximum and minimum, defining the extent / boundaries of a particular element. - */ -public final class GPXBounds: GPXElement, Codable { - - /// Codable Implementation - private enum CodingKeys: String, CodingKey { - case minLatitude = "minlat" - case maxLatitude = "maxlat" - case minLongitude = "minlon" - case maxLongitude = "maxlon" - } - - /// Minimum latitude of boundaries to a element. - public var minLatitude: Double? - /// Maximum latitude of boundaries to a element. - public var maxLatitude: Double? - /// Minimum longitude of boundaries to a element. - public var minLongitude: Double? - /// Maximum longitude of boundaries to a element. - public var maxLongitude: Double? - - // MARK:- Initalizers - - /// Default initializer. - public required init() { - super.init() - } - - /// Initializes with all values - /// - /// - Parameters: - /// - minLatitude: Minimum latitude - /// - maxLatitude: Maximum latitude - /// - minLongitude: Minimum longitude - /// - maxLongitude: Maximum longitude - public init(minLatitude: Double, maxLatitude: Double, minLongitude: Double, maxLongitude: Double) { - super.init() - self.minLatitude = minLatitude - self.maxLatitude = maxLatitude - self.minLongitude = minLongitude - self.maxLongitude = maxLongitude - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - self.minLatitude = Convert.toDouble(from: raw.attributes["minlat"]) - self.maxLatitude = Convert.toDouble(from: raw.attributes["maxlat"]) - self.minLongitude = Convert.toDouble(from: raw.attributes["minlon"]) - self.maxLongitude = Convert.toDouble(from: raw.attributes["maxlon"]) - } - - // MARK:- Tag - - override func tagName() -> String { - return "bounds" - } - - // MARK:- GPX - - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - - if let minLatitude = minLatitude { - attribute.append(" minlat=\"\(minLatitude)\"") - } - if let minLongitude = minLongitude { - attribute.append(" minlon=\"\(minLongitude)\"") - } - if let maxLatitude = maxLatitude { - attribute.append(" maxlat=\"\(maxLatitude)\"") - } - if let maxLongitude = maxLongitude { - attribute.append(" maxlon=\"\(maxLongitude)\"") - } - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } -} diff --git a/Pods/CoreGPX/Classes/GPXCompression.swift b/Pods/CoreGPX/Classes/GPXCompression.swift deleted file mode 100644 index ab350bc8..00000000 --- a/Pods/CoreGPX/Classes/GPXCompression.swift +++ /dev/null @@ -1,374 +0,0 @@ -// -// GPXParser+Lossy.swift -// Pods -// -// Created by Vincent Neo on 25/10/19. -// - -import Foundation - -/// Simple class for some basic lossy compression. -public class GPXCompression { - - /// Use this function to compression `GPXRoot`. - /// - /// Type of compression can be chose here. - public static func compress(gpx: GPXRoot, by type: lossyTypes, affecting types: [lossyOptions]) -> GPXRoot { - switch type { - - case .randomRemoval: return lossyRandom(gpx, types: types, percent: type.value()) - case .stripNearbyData: return stripNearbyData(gpx, types: types, distanceRadius: type.value()) - case .stripDuplicates: return stripDuplicates(gpx, types: types) - - } - } - - /// Currently supported types of compression. - public enum lossyTypes { - - /// Removal of duplicated points. - case stripDuplicates - /// Removal of points with nearby co ordinates, subject to distance radius provided. - case stripNearbyData(distanceRadius: Double) - /// Removal of points in a random manner, with a percentage of removal. - case randomRemoval(percentage: Double) - - /// Internal function to get a value, should it be supported by the type. - func value() -> Double { - switch self { - case .stripNearbyData(distanceRadius: let rad): return rad - case .randomRemoval(percentage: let percent): return percent - default: fatalError("GPXParserLossyTypes: type of id \(self.rawValue) has no value to get") - } - } - } - - /// Selectable scope of removal of points. - public enum lossyOptions { - /// Remove Track Points - case trackpoint - /// Remove Waypoints - case waypoint - /// Remove Route Points - case routepoint - } - - /// Internal function to call for when removal of duplicates is needed. - /// - /// - Parameters: - /// - gpx: GPX data in an instance. - /// - types: Chosen point types, scope of lossy removals. - /// - static func stripDuplicates(_ gpx: GPXRoot, types: [lossyOptions]) -> GPXRoot { - let gpx = gpx - - var lastWaypoints = [GPXWaypoint]() - var lastTrackpoints = [GPXTrackPoint]() - var lastRoutepoints = [GPXRoutePoint]() - - if types.contains(.waypoint) { - for wpt in gpx.waypoints { - if wpt.compareCoordinates(with: lastWaypoints.last) { - lastWaypoints.append(wpt) - continue - } - else { - if lastWaypoints.isEmpty { - lastWaypoints.append(wpt) - continue - } - for (index,dupWpt) in lastWaypoints.enumerated() { - if index == lastWaypoints.endIndex - 1 { - lastWaypoints = [GPXWaypoint]() - lastWaypoints.append(wpt) - } - else if let i = gpx.waypoints.firstIndex(of: dupWpt) { - gpx.waypoints.remove(at: i) - } - } - - } - } - - lastWaypoints = [GPXWaypoint]() - } - - if types.contains(.trackpoint) { - for track in gpx.tracks { - for segment in track.segments { - for trkpt in segment.points { - if trkpt.compareCoordinates(with: lastTrackpoints.last) { - lastTrackpoints.append(trkpt) - continue - } - else { - if lastTrackpoints.isEmpty { - lastTrackpoints.append(trkpt) - continue - } - for (index,dupTrkpt) in lastTrackpoints.enumerated() { - if index == lastTrackpoints.endIndex - 1 { - lastTrackpoints = [GPXTrackPoint]() - lastTrackpoints.append(trkpt) - } - else if let i = segment.points.firstIndex(of: dupTrkpt) { - segment.points.remove(at: i) - } - } - - } - } - lastTrackpoints = [GPXTrackPoint]() - } - } - } - - - if types.contains(.routepoint) { - for route in gpx.routes { - for rtept in route.points { - if rtept.compareCoordinates(with: lastRoutepoints.last) { - lastRoutepoints.append(rtept) - continue - } - else { - if lastRoutepoints.isEmpty { - lastRoutepoints.append(rtept) - continue - } - for (index,dupRtept) in lastRoutepoints.enumerated() { - if index == lastRoutepoints.endIndex - 1 { - lastRoutepoints = [GPXRoutePoint]() - lastRoutepoints.append(rtept) - } - else if let i = route.points.firstIndex(of: dupRtept) { - route.points.remove(at: i) - } - } - - } - } - lastRoutepoints = [GPXRoutePoint]() - } - } - - return gpx - } - - /// Internal function to call for when removal of nearby points is needed. - /// - /// - Parameters: - /// - gpx: GPX data in an instance. - /// - types: Chosen point types, scope of lossy removals. - /// - distanceRadius: Radius to be affected. In unit of metres (m) - /// - static func stripNearbyData(_ gpx: GPXRoot, types: [lossyOptions], distanceRadius: Double = 100) -> GPXRoot { - let gpx = gpx - var lastPointCoordinates: GPXWaypoint? - - if types.contains(.waypoint) { - for wpt in gpx.waypoints { - if let distance = GPXCompressionCalculate.getDistance(from: lastPointCoordinates, and: wpt) { - if distance < distanceRadius { - if let i = gpx.waypoints.firstIndex(of: wpt) { - gpx.waypoints.remove(at: i) - } - lastPointCoordinates = nil - continue - } - } - lastPointCoordinates = wpt - } - lastPointCoordinates = nil - } - - if types.contains(.trackpoint) { - for track in gpx.tracks { - for segment in track.segments { - for trkpt in segment.points { - if let distance = GPXCompressionCalculate.getDistance(from: lastPointCoordinates, and: trkpt) { - if distance < distanceRadius { - if let i = segment.points.firstIndex(of: trkpt) { - segment.points.remove(at: i) - } - lastPointCoordinates = nil - continue - } - } - lastPointCoordinates = trkpt - } - lastPointCoordinates = nil - } - } - } - - - if types.contains(.routepoint) { - for route in gpx.routes { - for rtept in route.points { - if let distance = GPXCompressionCalculate.getDistance(from: lastPointCoordinates, and: rtept) { - if distance < distanceRadius { - if let i = route.points.firstIndex(of: rtept) { - route.points.remove(at: i) - } - lastPointCoordinates = nil - continue - } - } - lastPointCoordinates = rtept - } - lastPointCoordinates = nil - } - } - - return gpx - } - - /// Internal function to call for when removal of points randomly is needed. - /// - /// - Parameters: - /// - gpx: GPX data in an instance. - /// - types: Chosen point types, scope of lossy removals. - /// - percent: Pecentage to be accepted to be removed. Expressed in decimal. (20% --> 0.2) - /// - static func lossyRandom(_ gpx: GPXRoot, types: [lossyOptions], percent: Double = 0.2) -> GPXRoot { - - let gpx = gpx - let wptCount = gpx.waypoints.count - - if types.contains(.waypoint) { - if wptCount != 0 { - let removalAmount = Int(percent * Double(wptCount)) - for i in 0...removalAmount { - let randomInt = Int.random(in: 0...wptCount - (i+1)) - gpx.waypoints.remove(at: randomInt) - } - } - } - - if types.contains(.trackpoint) { - for track in gpx.tracks { - for segment in track.segments { - let trkptCount = segment.points.count - if trkptCount != 0 { - let removalAmount = Int(percent * Double(trkptCount)) - for i in 0...removalAmount { - let randomInt = Int.random(in: 0...trkptCount - (i+1)) - segment.points.remove(at: randomInt) - } - } - } - } - } - - - if types.contains(.routepoint) { - for route in gpx.routes { - let rteCount = route.points.count - if rteCount != 0 { - let removalAmount = Int(percent * Double(rteCount)) - for i in 0...removalAmount { - let randomInt = Int.random(in: 0...rteCount - (i+1)) - route.points.remove(at: randomInt) - } - } - } - } - - return gpx - - } - -} - -/// Raw Representable for Lossy types enum -extension GPXCompression.lossyTypes: RawRepresentable { - /// Represented as an integer - public typealias RawValue = Int - - /// Initializes raw - public init?(rawValue: Int, value: Double?) { - switch rawValue { - case 0: - self = .stripDuplicates // init will still run even if value has something. - case 1: - guard let value = value else { fatalError("\(rawValue): Invalid value.") } - self = .stripNearbyData(distanceRadius: value) - case 2: - guard let value = value else { fatalError("\(rawValue): Invalid value.") } - self = .randomRemoval(percentage: value) - default: - fatalError("Invalid rawValue.") - } - } - - /// Default Initializer. Not recommended for use. - public init?(rawValue: Int) { - if rawValue == 0 { - self = .stripDuplicates - } - else { - fatalError("GPXCompression.lossyTypes: This initalizer is NOT supported for this associated type. Please use init(rawValue:value:) instead.") - } - } - - /// Raw Value - public var rawValue: Int { - switch self { - case .stripDuplicates: return 0 - case .stripNearbyData: return 1 - case .randomRemoval: return 2 - } - } - -} - - -/// Extension for distance between points calculation, without `CoreLocation` APIs. -class GPXCompressionCalculate { - - /// Calculates distance between two coordinate points, returns in metres (m). - /// - /// Code from https://github.com/raywenderlich/swift-algorithm-club/tree/master/HaversineDistance - /// Licensed under MIT license - static func haversineDistance(la1: Double, lo1: Double, la2: Double, lo2: Double, radius: Double = 6367444.7) -> Double { - - let haversin = { (angle: Double) -> Double in - return (1 - cos(angle))/2 - } - - let ahaversin = { (angle: Double) -> Double in - return 2*asin(sqrt(angle)) - } - - // Converts from degrees to radians - let dToR = { (angle: Double) -> Double in - return (angle / 360) * 2 * .pi - } - - let lat1 = dToR(la1) - let lon1 = dToR(lo1) - let lat2 = dToR(la2) - let lon2 = dToR(lo2) - - return radius * ahaversin(haversin(lat2 - lat1) + cos(lat1) * cos(lat2) * haversin(lon2 - lon1)) - } - - /// Gets distance from any GPX point type - static func getDistance(from first: pt?, and second: pt?) -> Double? { - guard let lat1 = first?.latitude, let lon1 = first?.longitude, let lat2 = second?.latitude, let lon2 = second?.longitude else { return nil } - - return haversineDistance(la1: lat1, lo1: lon1, la2: lat2, lo2: lon2) - } - -} - -/// Extension to allow for easy coordinates comparison. -extension GPXWaypoint { - /// Private function for coordinates comparsions - fileprivate func compareCoordinates(with pointType: pt?) -> Bool { - guard let pointType = pointType else { return false } - return (self.latitude == pointType.latitude && self.longitude == pointType.longitude) ? true : false - } -} - diff --git a/Pods/CoreGPX/Classes/GPXCopyright.swift b/Pods/CoreGPX/Classes/GPXCopyright.swift deleted file mode 100644 index 37c38772..00000000 --- a/Pods/CoreGPX/Classes/GPXCopyright.swift +++ /dev/null @@ -1,95 +0,0 @@ -// -// GPXCopyright.swift -// GPXKit -// -// Created by Vincent on 22/11/18. -// - -import Foundation - -/** - A value type for representing copyright info - - Copyight information also includes additional attributes. - - **Supported attributes:** - - Year of first publication - - License of the file - - Author / Copyright Holder's name - -*/ -public final class GPXCopyright: GPXElement, Codable { - - /// Year of the first publication of this copyrighted work. - /// - /// This should be the current year. - /// - /// year = Date() - /// // year attribute will be current year. - public var year: Date? - - /// License of the file. - /// - /// A URL linking to the license's documentation, represented with a `String` - public var license: String? - - /// Author / copyright holder's name. - /// - /// Basically, the person who has created this GPX file, which is also the copyright holder, shall them wish to have it as a copyrighted work. - public var author: String? - - // MARK:- Instance - - /// Default Initializer. - public required init() { - super.init() - } - - /// Initializes with author - /// - /// At least the author name must be valid in order for a `GPXCopyright` to be valid. - public init(author: String) { - super.init() - self.author = author - self.year = Date() - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "year": self.year = GPXDateParser.parse(year: child.text) - case "license": self.license = child.text - default: continue - } - } - self.author = raw.attributes["author"] - } - - // MARK: Tag - - override func tagName() -> String { - return "copyright" - } - - // MARK: GPX XML markup - - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - - if let author = author { - attribute.appendFormat(" author=\"%@\"", author) - } - - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - self.addProperty(forValue: Convert.toString(fromYear: year), gpx: gpx, tagName: "year", indentationLevel: indentationLevel) - self.addProperty(forValue: license, gpx: gpx, tagName: "license", indentationLevel: indentationLevel) - } -} diff --git a/Pods/CoreGPX/Classes/GPXElement.swift b/Pods/CoreGPX/Classes/GPXElement.swift deleted file mode 100644 index 36bded6f..00000000 --- a/Pods/CoreGPX/Classes/GPXElement.swift +++ /dev/null @@ -1,202 +0,0 @@ -// -// GPXElement.swift -// GPXKit -// -// Created by Vincent on 5/11/18. -// - -import Foundation - -/** - A root class for all element types - - All element types such as waypoints, tracks or routes are subclasses of `GPXElement`. - This class brings important methods that aids towards creation of a GPX file. - - - Note: - This class should not be used as is. To use its functionalities, please subclass it instead. - */ -open class GPXElement: NSObject { - - // MARK:- Tag - - /// Tag name of the element. - /// - /// All subclasses must override this method, as elements cannot be tag-less. - func tagName() -> String { - fatalError("Subclass must override tagName()") - } - - // MARK:- Instance - - /// Default Initializer - public required override init() { - super.init() - } - - // MARK:- GPX - - /// for generating newly tracked data straight into a formatted `String` that holds formatted data according to GPX syntax - open func gpx() -> String { - let gpx = NSMutableString() - self.gpx(gpx, indentationLevel: 0) - return gpx as String - } - - /// A method for invoking all tag-related methods - func gpx(_ gpx: NSMutableString, indentationLevel: Int) { - self.addOpenTag(toGPX: gpx, indentationLevel: indentationLevel) - self.addChildTag(toGPX: gpx, indentationLevel: indentationLevel + 1) - self.addCloseTag(toGPX: gpx, indentationLevel: indentationLevel) - } - - /// Implements an open tag - /// - /// An open tag is added to overall gpx content. - /// - /// - Parameters: - /// - gpx: the GPX string - /// - indentationLevel: the amount of indentation required to add for the tag - /// - **Example**: - /// - /// // an open tag - /// // an open tag with extra attributes - func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - gpx.append(String(format: "%@<%@>\r\n", indent(forIndentationLevel: indentationLevel), self.tagName())) - } - - /// Implements a child tag after an open tag, before a close tag. - /// - /// An child tag is added to overall gpx content. - /// - /// - Parameters: - /// - gpx: the GPX string - /// - indentationLevel: the amount of indentation required to add for the tag - /// - **Example**: - /// - /// // an open tag - /// 20.19 // a child tag - /// // a close tag - func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - // Override to subclasses - } - - /// Implements a close tag - /// - /// An close tag is added to overall gpx content. - /// - /// - Parameters: - /// - gpx: the GPX string - /// - indentationLevel: the amount of indentation required to add for the tag - /// - **Example**: - /// - /// // a close tag - func addCloseTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - gpx.append(String(format: "%@\r\n", indent(forIndentationLevel: indentationLevel), self.tagName())) - } - - - /// For adding `Int` type values to a child tag - /// - Parameters: - /// - value: value of that particular child tag - /// - gpx: The GPX string - /// - tagName: The tag name of the child tag - /// - indentationLevel: the amount of indentation required - /// - /// - Without default value or attribute - /// - Method should only be used when overriding `addChildTag(toGPX:indentationLevel:)` - /// - Will not execute if `value` is nil. - /// - **Example**: - /// - /// 100 // 100 is an example value - func addProperty(forIntegerValue value: Int?, gpx: NSMutableString, tagName: String, indentationLevel: Int) { - if let validValue = value { - addProperty(forValue: String(validValue), gpx: gpx, tagName: tagName, indentationLevel: indentationLevel, defaultValue: nil, attribute: nil) - } - } - - /// For adding `Double` type values to a child tag - /// - Parameters: - /// - value: value of that particular child tag - /// - gpx: The GPX string - /// - tagName: The tag name of the child tag - /// - indentationLevel: the amount of indentation required - /// - /// - Without default value or attribute - /// - Method should only be used when overriding `addChildTag(toGPX:indentationLevel:)` - /// - Will not execute if `value` is nil. - /// - **Example**: - /// - /// 100.21345 // 100.21345 is an example value - func addProperty(forDoubleValue value: Double?, gpx: NSMutableString, tagName: String, indentationLevel: Int) { - if let validValue = value { - addProperty(forValue: String(validValue), gpx: gpx, tagName: tagName, indentationLevel: indentationLevel, defaultValue: nil, attribute: nil) - } - } - - /// For adding `String` type values to a child tag - /// - Parameters: - /// - value: value of that particular child tag - /// - gpx: The GPX string - /// - tagName: The tag name of the child tag - /// - indentationLevel: the amount of indentation required - /// - defaultValue: default value expected of the particular child tag - /// - attribute: an attribute of the tag - /// - /// - If default value is the same as `value` parameter, method will not execute. - /// - Method should only be used when overriding `addChildTag(toGPX:indentationLevel:)` - /// - **Example**: - /// - /// Your Value Here - func addProperty(forValue value: String?, gpx: NSMutableString, tagName: String, indentationLevel: Int, defaultValue: String? = nil, attribute: String? = nil) { - - // value cannot be nil or empty - if value == nil || value == "" { - return - } - - if defaultValue != nil && value == defaultValue { - return - } - - var isCDATA: Bool = false - - let match: Range? = value?.range(of: "[^a-zA-Z0-9.,+-/*!='\"()\\[\\]{}!$%@?_;: #\t\r\n]", options: .regularExpression, range: nil, locale: nil) - - // if match range, isCDATA == true - if match != nil { - isCDATA = true - } - - // will append as XML CDATA instead. - if isCDATA { - gpx.appendFormat("%@<%@%@>\r\n", indent(forIndentationLevel: indentationLevel), tagName, (attribute != nil) ? " ".appending(attribute!): "", value?.replacingOccurrences(of: "]]>", with: "]]>") ?? "", tagName) - } - else { - gpx.appendFormat("%@<%@%@>%@\r\n", indent(forIndentationLevel: indentationLevel), tagName, (attribute != nil) ? " ".appending(attribute!): "", value ?? "", tagName) - } - } - - /// Indentation amount based on parameter - /// - /// - Parameters: - /// - indentationLevel: The indentation amount you require it to have. - /// - /// - Returns: - /// A `NSMutableString` that has been appended with amounts of "\t" with regards to indentation requirements input from the parameter. - /// - /// - **Example:** - /// - /// This is unindented text (indentationLevel == 0) - /// This is indented text (indentationLevel == 1) - /// This is indented text (indentationLevel == 2) - func indent(forIndentationLevel indentationLevel: Int) -> NSMutableString { - let result = NSMutableString() - - for _ in 0.. String { - return "email" - } - - // MARK:- GPX - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - - if let emailID = emailID { - attribute.appendFormat(" id=\"%@\"", emailID) - } - if let domain = domain { - attribute.appendFormat(" domain=\"%@\"", domain) - } - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } -} diff --git a/Pods/CoreGPX/Classes/GPXError.swift b/Pods/CoreGPX/Classes/GPXError.swift deleted file mode 100644 index 4508c1d1..00000000 --- a/Pods/CoreGPX/Classes/GPXError.swift +++ /dev/null @@ -1,79 +0,0 @@ -// -// GPXError.swift -// Pods -// -// Created by Vincent on 4/9/19. -// - -import Foundation - -/// Throwable errors for GPX library -public struct GPXError { - - /// Coordinates related errors - public enum coordinates: Error { - /// when lat is outside range (-90˚ to 90˚) - case invalidLatitude(dueTo: reason) - /// when lon is outside range (-180˚ to 180˚) - case invalidLongitude(dueTo: reason) - - /// reason of why a coordinate error is thrown. - public enum reason { - /// < -90˚ (lat) / < -180˚ (lon) - case underLimit - /// > 90˚ (lat) / > 180˚ (lon) - case overLimit - } - } - - /// Parser related errors - public enum parser: Error { - /// Thrown when GPX version is < 1.1 - case unsupportedVersion - /// When an issue occurred at line, but without further comment. - case issueAt(line: Int) - /// Thrown when issue occurred at line. (Mostly wraps XML parser errors) - case issueAt(line: Int, error: Error) - /// Thrown when file is XML, but not GPX. - case fileIsNotGPX - /// Thrown when file is not XML, let alone GPX. - case fileIsNotXMLBased - /// Thrown when file does not conform schema. (unused) - case fileDoesNotConformSchema - /// Thrown when file is presumed to be empty. - case fileIsEmpty - /// When multiple errors occurred, to give an array of errors. - case multipleErrorsOccurred(_ errors: [Error]) - } - - /// Checks if latitude and longitude is valid (within range) - static func checkError(latitude: Double, longitude: Double) -> Error? { - guard latitude >= -90 && latitude <= 90 else { - if latitude <= -90 { - return GPXError.coordinates.invalidLatitude(dueTo: .underLimit) - } - else { - return GPXError.coordinates.invalidLatitude(dueTo: .overLimit) - } - } - guard longitude >= -180 && longitude <= 180 else { - if longitude <= -180 { - return GPXError.coordinates.invalidLongitude(dueTo: .underLimit) - } - else { - return GPXError.coordinates.invalidLongitude(dueTo: .overLimit) - } - } - - return nil - } - - /// Other errors - enum others: Error { - /// When adding an email that is considered as invalid as per GPX v1.0 schema. - /// - /// Checks against regular expression of: - /// [\p{L}_]+(\.[\p{L}_]+)*@[\p{L}_]+(\.[\p{L}_]+)+ - case invalidEmail - } -} diff --git a/Pods/CoreGPX/Classes/GPXExtensions.swift b/Pods/CoreGPX/Classes/GPXExtensions.swift deleted file mode 100644 index 7d4c6387..00000000 --- a/Pods/CoreGPX/Classes/GPXExtensions.swift +++ /dev/null @@ -1,153 +0,0 @@ -// -// GPXExtensions.swift -// GPXKit -// -// Created by Vincent on 18/11/18. -// - -import Foundation - -/** - For adding/obtaining data stored as extensions in GPX file. - - Typical GPX extended data, would have data that should be inbetween the open and close tags of **\** - - This class represents the extended data in a GPX file. - */ -public final class GPXExtensions: GPXElement, Codable { - - /// Extended children tags - public var children = [GPXExtensionsElement]() - - // MARK:- Initializers - - /// Default Initializer. - public required init() { - super.init() - } - - /// For initializing with a raw element. Parser use only. - /// - /// - Parameters: - /// - raw: parser's raw element - init(raw: GPXRawElement) { - super.init() - for child in raw.children { - let tmp = GPXExtensionsElement(raw: child) - children.append(tmp) - } - - } - - // MARK:- Append and Retrieve - - /// Appending children tags to extension tag, easily. - /// - /// - Parameters: - /// - parent: parent tag's name. If you do not wish to have a parent tag, leave it as `nil`. - /// - contents: data to be represented as extended tag and values. - public func append(at parent: String?, contents: [String : String]) { - if let parent = parent { - let parentElement = GPXExtensionsElement(name: parent) - for (key, value) in contents { - let element = GPXExtensionsElement(name: key) - element.text = value - parentElement.children.append(element) - } - children.append(parentElement) - } - else { - for (key, value) in contents { - let element = GPXExtensionsElement(name: key) - element.text = value - children.append(element) - } - } - } - - /// Get a dictionary of data from a parent tag name, easily. - /// - /// - Parameters: - /// - parent: parent tag name, to retrieve from. Leave it as `nil` if parent tag should not be expected. - public func get(from parent: String?) -> [String : String]? { - var data = [String : String]() - - if let parent = parent { - var hasChild = false - for child in children { - if child.name == parent { - data = child.attributes - - for child2 in child.children { - data[child2.name] = child2.text - } - hasChild = true - } - } - if !hasChild { - return nil - } - } - else { - guard let child = children.first else { return nil } - data = child.attributes - data[child.name] = child.text - } - - return data - } - - // MARK:- Subscript - - /** - Access child element in extensions. - - If extended data does not have a parent tag, **i.e**: - - - 50 - - - Access it directly by `extensions["tag"]`, and access the text attribute of it. - - If extended data does not have a parent tag, **i.e**: - - - 80 - - - Access it directly by `extensions["ParentTag"]["tag"]`, and access the text attribute of it. - - - Parameters: - - name: name of child tag. - */ - public subscript(name: String) -> GPXExtensionsElement { - get { - for child in children { - if child.name == name { - return child - } - } - return GPXExtensionsElement() - } - } - - // MARK:- Tag - override func tagName() -> String { - return "extensions" - } - - // MARK:- Unavailable classes - // Have been removed. - - - // MARK:- GPX - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - for child in children { - child.gpx(gpx, indentationLevel: indentationLevel) - } - - } -} diff --git a/Pods/CoreGPX/Classes/GPXExtensionsElement.swift b/Pods/CoreGPX/Classes/GPXExtensionsElement.swift deleted file mode 100644 index 5a414adf..00000000 --- a/Pods/CoreGPX/Classes/GPXExtensionsElement.swift +++ /dev/null @@ -1,103 +0,0 @@ -// -// GPXExtensionsElement.swift -// Pods -// -// Created by Vincent on 14/7/19. -// - -import Foundation - -/// A duplicated class of `GPXRawElement` -/// -/// This class is a public class as it is representative of all child extension tag types. -/// -/// It is also inherits `GPXElement`, and therefore, works like any other 'native' element types. -open class GPXExtensionsElement: GPXElement, Codable { - - /// Tag name of extension element. - public var name: String - - /// Text data content of the element. - public var text: String? - - /// Attributes data of the element. - public var attributes = [String : String]() - - /// Children tags of this element. - public var children = [GPXExtensionsElement]() - - /// Easily get child tags via subscript. - public subscript(name: String) -> GPXExtensionsElement { - get { - for child in children { - if child.name == name { - return child - } - } - return GPXExtensionsElement() - } - } - - /// For initializing with a raw element. Parser use only. - /// - /// - Parameters: - /// - raw: parser's raw element - init(raw: GPXRawElement) { - self.name = raw.name - self.text = raw.text - self.attributes = raw.attributes - for child in raw.children { - let tmp = GPXExtensionsElement(raw: child) - self.children.append(tmp) - } - } - - /// Initialize with a tagName. - public init(name: String) { - self.name = name - super.init() - } - - /// Default initializer. - required public init() { - self.name = "Undefined" - } - - // MARK:- GPX File Mutation - - override func tagName() -> String { - return name - } - - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - if !attributes.isEmpty { - for (key, value) in attributes { - attribute.appendFormat(" %@=\"%@\"", key, value) - } - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } - else if let text = text { - self.addProperty(forValue: text, gpx: gpx, tagName: tagName(), indentationLevel: indentationLevel) - } - else { - super.addOpenTag(toGPX: gpx, indentationLevel: indentationLevel) - } - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - for child in children { - child.gpx(gpx, indentationLevel: indentationLevel) - } - - } - - override func addCloseTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - if text == nil { - gpx.appendCloseTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName()) - } - } - -} diff --git a/Pods/CoreGPX/Classes/GPXFix.swift b/Pods/CoreGPX/Classes/GPXFix.swift deleted file mode 100644 index 6e32451f..00000000 --- a/Pods/CoreGPX/Classes/GPXFix.swift +++ /dev/null @@ -1,31 +0,0 @@ -// -// GPXFix.swift -// CoreGPX -// -// Created by Vincent on 2/9/19. -// - -import Foundation - -/// Type of GPS fix. -/// -/// - Note: -/// I believe this enum may not be useful as `CoreLocation` API does not appear to state GPS Fix type. -public enum GPXFix: String, Codable { - - /// No Fix - case none = "none" - - /// 2D Fix, position only. - case TwoDimensional = "2d" - - /// 3D Fix, position and elevation. - case ThreeDimensional = "3d" - - /// Differencial GPS fix - case Dgps = "dgps" - - /// Military GPS-equivalent - case Pps = "pps" - -} diff --git a/Pods/CoreGPX/Classes/GPXLegacy.swift b/Pods/CoreGPX/Classes/GPXLegacy.swift deleted file mode 100644 index ff468ab5..00000000 --- a/Pods/CoreGPX/Classes/GPXLegacy.swift +++ /dev/null @@ -1,637 +0,0 @@ -// -// GPXLegacyWaypoint.swift -// All codes for more straightforward GPX 1.0 and below, data handling. -// -// Created by Vincent Neo on 6/6/20. -// Components consolidated on 18/6/20. -// - -import Foundation - -// MARK:- Version - -public enum GPXVersion: String { - case pre4 = "0.4" - case pre5 = "0.5" - case pre6 = "0.6" - case v1 = "1.0" - //case v1_1 = "1.1" - - func getSchemaSite() -> String { - switch self { - case .pre4: return "http://www.topografix.com/GPX/0/4" - case .pre5: return "http://www.topografix.com/GPX/0/5" - case .pre6: return "http://www.topografix.com/GPX/0/6" - case .v1: return "http://www.topografix.com/GPX/1/0" - - } - } -} - -// MARK:- Root Element - -public protocol GPXRootElement: GPXElement { - var version: GPXVersion { get set } - var creator: String { get set } -} - -public final class GPXLegacyRoot: GPXElement, GPXRootElement { - public var version: GPXVersion - public var creator: String - - public var name: String? - public var desc: String? - public var author: String? - public var email: String? // verifies if got @ in it. - public var url: URL? - public var urlName: String? - public var time: Date? - public var keywords: String? - public var bounds: GPXBounds? - public var waypoints = [GPXLegacyWaypoint]() - public var routes = [GPXLegacyRoute]() - public var tracks = [GPXLegacyTrack]() - - // MARK: GPX v1.0 Namespaces - - /// Link to the GPX v1.0 schema - private var schema: String { - get { return version.getSchemaSite() } - } - /// Link to the schema locations. If extended, the extended schema should be added. - private var schemaLocation: String { - get { - return "\(version.getSchemaSite()) \(version.getSchemaSite())/gpx.xsd" - } - } - /// Link to XML schema instance - private let xsi = "http://www.w3.org/2001/XMLSchema-instance" - - public required init() { - self.creator = "Powered by Open Source CoreGPX Project" - self.version = .v1 - super.init() - } - - init(raw: GPXRawElement) { - self.creator = "" - self.version = .v1 - - for (key, value) in raw.attributes { - switch key { - case "creator": self.creator = value - case "version": self.version = GPXVersion(rawValue: value) ?? .v1 - //case "xsi:schemaLocation": self.schemaLocation = value - //case "xmlns:xsi": continue - //case "xmlns": continue - default: continue - } - } - - for child in raw.children { - switch child.name { - case "name": self.name = child.text - case "desc": self.desc = child.text - case "author": self.author = child.text - case "email": self.email = child.text - case "url": if let text = child.text { self.url = URL(string: text) } - case "urlname": self.urlName = child.text - case "time": self.time = GPXDateParser.parse(date: child.text) - case "keywords": self.keywords = child.text - case "bounds": self.bounds = GPXBounds(raw: child) - case "wpt": self.waypoints.append(GPXLegacyWaypoint(raw: child)) - case "rte": self.routes.append(GPXLegacyRoute(raw: child)) - case "trk": self.tracks.append(GPXLegacyTrack(raw: child)) - // more needed - default: continue - } - } - } - - public init(creator: String, version: GPXVersion = .v1) { - self.version = version - self.creator = creator - super.init() - } - - public func addEmail(_ email: String) { - let schemaPattern = #"[\p{L}_]+(\.[\p{L}_]+)*@[\p{L}_]+(\.[\p{L}_]+)+"# - - if email.range(of: schemaPattern, options: .regularExpression) != nil { - self.email = email - } - } - - /* - public func addEmail(_ email: String) throws { - let schemaPattern = #"[\p{L}_]+(\.[\p{L}_]+)*@[\p{L}_]+(\.[\p{L}_]+)+"# - - if email.range(of: schemaPattern, options: .regularExpression) != nil { - self.email = email - } - else { - throw GPXError.others.invalidEmail - } - } - */ - - public func upgrade() -> GPXRoot { - let modern = GPXRoot(creator: creator) - let meta = GPXMetadata() - meta.name = name - meta.desc = desc - - if author != nil || email != nil { - let mAuthor = GPXAuthor(name: author) - if let email = email, email.contains("@") { mAuthor.email = GPXEmail(withFullEmailAddress: email) } - meta.author = mAuthor - } - - if url != nil { - let mLink = GPXLink(withURL: url) - mLink.text = urlName - meta.links.append(mLink) - } - - meta.time = time - meta.keywords = keywords - meta.bounds = bounds - - modern.metadata = meta - - /* REMINDER: - ADD WPT, TRK, RTE types!! */ - for wpt in waypoints { - modern.add(waypoint: wpt.upgrade()) - } - - for rte in routes { - modern.add(route: rte.upgrade()) - } - - for trk in tracks { - modern.add(track: trk.upgrade()) - } - - return modern - } - - override func tagName() -> String { - return "gpx" - } - - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - - attribute.appendFormat(" xmlns:xsi=\"%@\"", self.xsi) - attribute.appendFormat(" xmlns=\"%@\"", self.schema) - attribute.appendFormat(" xsi:schemaLocation=\"%@\"", self.schemaLocation) - - attribute.appendFormat(" version=\"%@\"", version.rawValue) - attribute.appendFormat(" creator=\"%@\"", creator) - - gpx.append("\r\n") - - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - self.addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - self.addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - self.addProperty(forValue: author, gpx: gpx, tagName: "author", indentationLevel: indentationLevel) - self.addProperty(forValue: email, gpx: gpx, tagName: "email", indentationLevel: indentationLevel) - - if let url = url { - self.addProperty(forValue: url.absoluteString, gpx: gpx, tagName: "url", indentationLevel: indentationLevel) - } - - self.addProperty(forValue: urlName, gpx: gpx, tagName: "urlname", indentationLevel: indentationLevel) - self.addProperty(forValue: Convert.toString(from: time), gpx: gpx, tagName: "time", indentationLevel: indentationLevel) - self.addProperty(forValue: keywords, gpx: gpx, tagName: "keywords", indentationLevel: indentationLevel) - - if let bounds = bounds { - bounds.gpx(gpx, indentationLevel: indentationLevel) - } - for waypoint in waypoints { - waypoint.gpx(gpx, indentationLevel: indentationLevel) - } - for track in tracks { - track.gpx(gpx, indentationLevel: indentationLevel) - } - for route in routes { - if version != .v1 { route.isVersion1 = false } - route.gpx(gpx, indentationLevel: indentationLevel) - } - - } - -} - - - - - - -// MARK:- Waypoint - -public class GPXLegacyWaypoint: GPXElement, GPXWaypointProtocol { - public var elevation: Double? - public var time: Date? - public var magneticVariation: Double? - public var geoidHeight: Double? - public var name: String? - public var comment: String? - public var desc: String? - public var source: String? - public var symbol: String? - public var type: String? - public var fix: GPXFix? - public var satellites: Int? - public var horizontalDilution: Double? - public var verticalDilution: Double? - public var positionDilution: Double? - public var ageofDGPSData: Double? - public var DGPSid: Int? - - public var latitude: Double? - public var longitude: Double? - - init(raw: GPXRawElement) { - self.latitude = Convert.toDouble(from: raw.attributes["lat"]) - self.longitude = Convert.toDouble(from: raw.attributes["lon"]) - - for child in raw.children { - switch child.name { - case "time": self.time = GPXDateParser.parse(date: child.text) - case "ele": self.elevation = Convert.toDouble(from: child.text) - case "magvar": self.magneticVariation = Convert.toDouble(from: child.text) - case "geoidheight": self.geoidHeight = Convert.toDouble(from: child.text) - case "name": self.name = child.text - case "cmt": self.comment = child.text - case "desc": self.desc = child.text - case "src": self.source = child.text - case "url": if let text = child.text { self.url = URL(string: text) } - case "urlname": self.urlName = child.text - case "sym": self.symbol = child.text - case "type": self.type = child.text - case "fix": self.fix = GPXFix(rawValue: child.text ?? "none") - case "sat": self.satellites = Convert.toInt(from: child.text) - case "hdop": self.horizontalDilution = Convert.toDouble(from: child.text) - case "vdop": self.verticalDilution = Convert.toDouble(from: child.text) - case "pdop": self.positionDilution = Convert.toDouble(from: child.text) - case "dgpsid": self.DGPSid = Convert.toInt(from: child.text) - case "ageofdgpsid": self.ageofDGPSData = Convert.toDouble(from: child.text) - //case "extensions": self.extensions = GPXExtensions(raw: child) - default: continue - } - } - } - - public required init() { - } - - /// URL of this particular waypoint, if any. - public var url: URL? - - /// Name associated with the given URL. - public var urlName: String? - - override func tagName() -> String { - return "wpt" - } - - func upgrade() -> GPXWaypoint { - let upgraded: GPXWaypoint = self.convert() - if let url = url, let urlName = urlName, - let link = GPXLink(url: url, name: urlName) { - upgraded.links.append(link) - } - return upgraded - } - - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - - if let latitude = latitude { - attribute.append(" lat=\"\(latitude)\"") - } - - if let longitude = longitude { - attribute.append(" lon=\"\(longitude)\"") - } - - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: elevation, gpx: gpx, tagName: "ele", indentationLevel: indentationLevel) - self.addProperty(forValue: Convert.toString(from: time), gpx: gpx, tagName: "time", indentationLevel: indentationLevel) - addSpeedCourseTags(toGPX: gpx, indLvl: indentationLevel) - self.addProperty(forDoubleValue: magneticVariation, gpx: gpx, tagName: "magvar", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: geoidHeight, gpx: gpx, tagName: "geoidheight", indentationLevel: indentationLevel) - self.addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - self.addProperty(forValue: comment, gpx: gpx, tagName: "cmt", indentationLevel: indentationLevel) - self.addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - self.addProperty(forValue: source, gpx: gpx, tagName: "src", indentationLevel: indentationLevel) - - if let url = url { - self.addProperty(forValue: url.absoluteString, gpx: gpx, tagName: "url", indentationLevel: indentationLevel) - } - self.addProperty(forValue: urlName, gpx: gpx, tagName: "urlname", indentationLevel: indentationLevel) - self.addProperty(forValue: symbol, gpx: gpx, tagName: "sym", indentationLevel: indentationLevel) - self.addProperty(forValue: type, gpx: gpx, tagName: "type", indentationLevel: indentationLevel) - - if let fix = self.fix?.rawValue { - self.addProperty(forValue: fix, gpx: gpx, tagName: "fix", indentationLevel: indentationLevel) - } - - self.addProperty(forIntegerValue: satellites, gpx: gpx, tagName: "sat", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: horizontalDilution, gpx: gpx, tagName: "hdop", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: verticalDilution, gpx: gpx, tagName: "vdop", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: positionDilution, gpx: gpx, tagName: "pdop", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: ageofDGPSData, gpx: gpx, tagName: "ageofdgpsdata", indentationLevel: indentationLevel) - self.addProperty(forIntegerValue: DGPSid, gpx: gpx, tagName: "dgpsid", indentationLevel: indentationLevel) - } - /// for overrides from `trkpt` only. - internal func addSpeedCourseTags(toGPX gpx: NSMutableString, indLvl indentationLevel: Int) {} -} - -// MARK:- Route - -public class GPXLegacyRoute: GPXElement, GPXRouteType { - - public var name: String? - - /// Additional comment of the route. - /// - /// - Important: - /// Not available in GPX 0.6 and below. - public var comment: String? - - var isVersion1 = true - - public var desc: String? - - public var source: String? - - public var url: URL? - - public var urlName: String? - - public var number: Int? - - /// Stated in GPX 1.0 schema that it is only *proposed* - //public var type: String? - - // MARK: TODO, ##other - // according to schema, ##other, meant that additional tags can be added, kinda like extensions. - - public var points = [GPXLegacyRoutePoint]() - - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "name": self.name = child.text - case "cmt": self.comment = child.text - case "desc": self.desc = child.text - case "src": self.source = child.text - case "url": if let text = child.text { self.url = URL(string: text) } - case "urlname": self.urlName = child.text - case "number": if let text = child.text { self.number = Int(text) } - case "rtept": self.points.append(GPXLegacyRoutePoint(raw: child)) - default: continue - } - } - } - - public required init() {} - - override func tagName() -> String { - return "rtept" - } - - public func upgrade() -> GPXRoute { - let rte = GPXRoute() - rte.name = name - rte.comment = comment - rte.desc = desc - rte.source = source - if let link = GPXLink(url: url, name: urlName) { - rte.links.append(link) - } - rte.number = number - self.points.forEach { point in - rte.add(routepoint: point.upgrade()) - } - - return rte - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - if isVersion1 { - addProperty(forValue: comment, gpx: gpx, tagName: "cmt", indentationLevel: indentationLevel) - } - addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - addProperty(forValue: source, gpx: gpx, tagName: "src", indentationLevel: indentationLevel) - - if let url = url { - addProperty(forValue: url.absoluteString, gpx: gpx, tagName: "url", indentationLevel: indentationLevel) - } - if let name = urlName { - addProperty(forValue: name, gpx: gpx, tagName: "urlname", indentationLevel: indentationLevel) - } - - for point in points { - point.gpx(gpx, indentationLevel: indentationLevel) - } - - } - -} - - -public final class GPXLegacyRoutePoint: GPXLegacyWaypoint { - - override func upgrade() -> GPXRoutePoint { - let upgraded: GPXRoutePoint = self.convert() - if let url = url, let urlName = urlName, - let link = GPXLink(url: url, name: urlName) { - upgraded.links.append(link) - } - return upgraded - } - - override func tagName() -> String { - return "rtept" - } -} - - -// MARK:- Track - -public final class GPXLegacyTrackPoint: GPXLegacyWaypoint { - - public var course: Double? - public var speed: Double? - - override func upgrade() -> GPXTrackPoint { - let upgraded: GPXTrackPoint = self.convert() - if let url = url, let urlName = urlName, - let link = GPXLink(url: url, name: urlName) { - upgraded.links.append(link) - } - upgraded.extensions = GPXExtensions() - var dict = [String : String]() - if let course = course { - dict["course"] = "\(course)" - } - if let speed = speed { - dict["speed"] = "\(speed)" - } - upgraded.extensions!.append(at: "legacy", contents: dict) - return upgraded - } - - override func tagName() -> String { - return "trkpt" - } - - override func addSpeedCourseTags(toGPX gpx: NSMutableString, indLvl indentationLevel: Int) { - self.addProperty(forDoubleValue: course, gpx: gpx, tagName: "course", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: speed, gpx: gpx, tagName: "speed", indentationLevel: indentationLevel) - } - -} - -public class GPXLegacyTrack: GPXElement { - - override func tagName() -> String { - return "trk" - } - - - public var name: String? - - /// Additional comment of the route. - /// - /// - Important: - /// Not available in GPX 0.6 and below. - public var comment: String? - - var isVersion1 = true - - public var desc: String? - - public var source: String? - - public var url: URL? - - public var urlName: String? - - public var number: Int? - - /// Stated in GPX 1.0 schema that it is only *proposed* - //public var type: String? - - // MARK: TODO, ##other - // according to schema, ##other, meant that additional tags can be added, kinda like extensions. - - public var segments = [GPXLegacyTrackSegment]() - - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "name": self.name = child.text - case "cmt": self.comment = child.text - case "desc": self.desc = child.text - case "src": self.source = child.text - case "url": if let text = child.text { self.url = URL(string: text) } - case "urlname": self.urlName = child.text - case "number": if let text = child.text { self.number = Int(text) } - case "trkseg": self.segments.append(GPXLegacyTrackSegment(raw: child)) - default: continue - } - } - } - - public required init() {} - - public func upgrade() -> GPXTrack { - let trk = GPXTrack() - trk.name = name - trk.comment = comment - trk.desc = desc - trk.source = source - if let link = GPXLink(url: url, name: urlName) { - trk.links.append(link) - } - trk.number = number - self.segments.forEach { segment in - trk.add(trackSegment: segment.upgrade()) - } - - return trk - } - - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - if isVersion1 { - addProperty(forValue: comment, gpx: gpx, tagName: "cmt", indentationLevel: indentationLevel) - } - addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - addProperty(forValue: source, gpx: gpx, tagName: "src", indentationLevel: indentationLevel) - - if let url = url { - addProperty(forValue: url.absoluteString, gpx: gpx, tagName: "url", indentationLevel: indentationLevel) - } - if let name = urlName { - addProperty(forValue: name, gpx: gpx, tagName: "urlname", indentationLevel: indentationLevel) - } - - for segment in segments { - segment.gpx(gpx, indentationLevel: indentationLevel) - } - - } -} - -public class GPXLegacyTrackSegment: GPXElement { - override func tagName() -> String { - return "trkseg" - } - - public var points = [GPXLegacyTrackPoint]() - - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "trkpt": self.points.append(GPXLegacyTrackPoint(raw: child)) - default: continue - } - } - } - - public func upgrade() -> GPXTrackSegment { - let segment = GPXTrackSegment() - self.points.forEach { point in - segment.add(trackpoint: point.upgrade()) - } - return segment - } - - public required init() {} - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - for pt in points { - pt.gpx(gpx, indentationLevel: indentationLevel) - } - } -} diff --git a/Pods/CoreGPX/Classes/GPXLink.swift b/Pods/CoreGPX/Classes/GPXLink.swift deleted file mode 100644 index 38385bdd..00000000 --- a/Pods/CoreGPX/Classes/GPXLink.swift +++ /dev/null @@ -1,118 +0,0 @@ -// -// GPXLink.swift -// GPXKit -// -// Created by Vincent on 18/11/18. -// - -import Foundation - -/// Some common web extensions used for `init(withURL:)` -fileprivate let kCommonWebExtensions: Set = ["htm", "html", "asp", "aspx", "jsp", "jspx", "do", "js", "php", "php3", "php4", "cgi", ".htaccess"] - -/** - A value type that can hold a web link to a external resource, or external information about a certain attribute. - - In addition to having a URL as its attribute, it also accepts the following as child tag: - - type of content - - text of web link (probably a description kind of thing) - */ -public final class GPXLink: GPXElement, Codable { - - /// For Codable use - private enum CodingKeys: String, CodingKey { - case text - case mimetype = "type" - case href - } - - // MARK:- Properties - - /// Text of hyperlink - public var text: String? - - /// Mime type of content (image/jpeg) - public var mimetype: String? - - /// URL of hyperlink - public var href: String? - - // MARK:- Initializers - - /// Default Initializer. - public required init() { - super.init() - } - - /// Initializes with a web link attribute - /// - /// - Parameters: - /// - href: **Hypertext Reference**. Basically, a web link which can be considered as a reference to whichever content, including metadata, waypoints, for example. - /// - public init(withHref href: String) { - self.href = href - } - - /// Initializes with a URL. - /// - /// This initializer is similar to `init(withHref:)`, except, this method checks on whether if the input URL is valid or not. It also modifies the `type` attribute as 'Website' if identified to have a web page extension. - /// - /// - Parameters: - /// - url: input URL, intended as a web link reference. - public init(withURL url: URL?) { - guard let isFileURL = url?.isFileURL else { return } - if !isFileURL { - self.href = url?.absoluteString - guard let pathExtension = url?.pathExtension else { return } - // may not work if web extension is not shown. (etc, using .htaccess) - if kCommonWebExtensions.contains(pathExtension) { - self.mimetype = "Website" - } - } - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "type": self.mimetype = child.text - case "text": self.text = child.text - default: continue - } - } - self.href = raw.attributes["href"] - } - - public init?(url: URL?, name: String? = nil) { - if url == nil && name == nil { return nil } - self.text = name - self.href = url?.absoluteString - } - - // MARK:- Tag - - override func tagName() -> String { - return "link" - } - - // MARK:- GPX - - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - - if let href = href { - attribute.appendFormat(" href=\"%@\"", href) - } - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - self.addProperty(forValue: text, gpx: gpx, tagName: "text", indentationLevel: indentationLevel) - self.addProperty(forValue: mimetype, gpx: gpx, tagName: "type", indentationLevel: indentationLevel) - } -} diff --git a/Pods/CoreGPX/Classes/GPXMetadata.swift b/Pods/CoreGPX/Classes/GPXMetadata.swift deleted file mode 100644 index 128c0eb1..00000000 --- a/Pods/CoreGPX/Classes/GPXMetadata.swift +++ /dev/null @@ -1,131 +0,0 @@ -// -// GPXMetadata.swift -// GPXKit -// -// Created by Vincent on 22/11/18. -// - -import Foundation - -/** - A value type that represents the metadata header of a GPX file. - - Information about the GPX file should be stored here. - - Supported Info types: - - Name - - Description - - Author Info - - Copyright - - Date and Time - - Keyword - - Bounds - - Also supports extensions - */ -public final class GPXMetadata: GPXElement, Codable { - - /// Name intended for the GPX file. - public var name: String? - - /// Description about what the GPX file is about. - public var desc: String? - - /// Author, or the person who created the GPX file. - /// - /// Includes other information regarding the author (see `GPXAuthor`) - public var author: GPXAuthor? - - /// Copyright of the file, if required. - public var copyright: GPXCopyright? - - /// A web link, usually one with information regarding the GPX file. - @available(*, deprecated, message: "CoreGPX now support multiple links.", renamed: "links.first") - public var link: GPXLink? { - return links.first - } - - /// Web links, usually containing information regarding the current GPX file which houses this metadata. - public var links = [GPXLink]() - - /// Date and time of when the GPX file is created. - public var time: Date? - - /// Keyword of the GPX file. - public var keywords: String? - - /// Boundaries of coordinates of the GPX file. - public var bounds: GPXBounds? - - /// Extensions to standard GPX, if any. - public var extensions: GPXExtensions? - - - // MARK:- Initializers - - /// Default initializer. - required public init() { - self.time = Date() - super.init() - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - //super.init() - for child in raw.children { - //let text = child.text - - switch child.name { - case "name": self.name = child.text - case "desc": self.desc = child.text - case "author": self.author = GPXAuthor(raw: child) - case "copyright": self.copyright = GPXCopyright(raw: child) - case "link": self.links.append(GPXLink(raw: child)) - case "time": self.time = GPXDateParser.parse(date: child.text) - case "keywords": self.keywords = child.text - case "bounds": self.bounds = GPXBounds(raw: child) - case "extensions": self.extensions = GPXExtensions(raw: child) - default: continue - } - } - } - - // MARK:- Tag - - override func tagName() -> String { - return "metadata" - } - - // MARK:- GPX - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - self.addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - self.addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - - if author != nil { - self.author?.gpx(gpx, indentationLevel: indentationLevel) - } - - if copyright != nil { - self.copyright?.gpx(gpx, indentationLevel: indentationLevel) - } - - for link in links { - link.gpx(gpx, indentationLevel: indentationLevel) - } - - self.addProperty(forValue: Convert.toString(from: time), gpx: gpx, tagName: "time", indentationLevel: indentationLevel) - self.addProperty(forValue: keywords, gpx: gpx, tagName: "keywords", indentationLevel: indentationLevel) - - if bounds != nil { - self.bounds?.gpx(gpx, indentationLevel: indentationLevel) - } - - if extensions != nil { - self.extensions?.gpx(gpx, indentationLevel: indentationLevel) - } - } -} diff --git a/Pods/CoreGPX/Classes/GPXParser.swift b/Pods/CoreGPX/Classes/GPXParser.swift deleted file mode 100644 index e96a7bc9..00000000 --- a/Pods/CoreGPX/Classes/GPXParser.swift +++ /dev/null @@ -1,365 +0,0 @@ -// -// GPXParserII.swift -// CoreGPX -// -// Version 1 created on 2/11/18. -// Version 2 created on 2/7/19. -// -// XML Parser is referenced from GitHub, yahoojapan/SwiftyXMLParser. - -import Foundation - - /** - An event-driven parser (SAX parser), currently parses GPX v1.1 files only. - - This parser is already setted up, hence, does not require any handling, and will parse files directly as objects. - To get the parsed data from a GPX file, simply initialize the parser, and get the `GPXRoot` from `parsedData()`. - */ -public final class GPXParser: NSObject { - - // MARK:- Private Declarations - - /// XML parser of current object - private let parser: XMLParser - - /// Default base element - private let documentRoot = GPXRawElement(name: "DocumentStart") - - /// Temporary stack of raw elements. - private var stack = [GPXRawElement]() - - // MARK:- Error Checking Declarations - - private var parserError: Error? - private var errorAtLine = Int() - private var isErrorCheckEnabled = false - private var shouldContinueAfterFirstError = false - private var errorsOccurred = [Error]() - - // MARK:- Private Methods - - /// Resets stack - private func stackReset() { - stack = [GPXRawElement]() - stack.append(documentRoot) - } - - /// Common init setup - private func didInit() { - stackReset() - parser.delegate = self - } - - // MARK:- Initializers - - /// for parsing with `Data` type - /// - /// - Parameters: - /// - data: The input must be `Data` object containing GPX markup data, and should not be `nil` - /// - public init(withData data: Data) { - self.parser = XMLParser(data: data) - super.init() - didInit() - } - - /// for parsing with `InputStream` type - /// - /// - Parameters: - /// - stream: The input must be a input stream allowing GPX markup data to be parsed synchronously - /// - public init(withStream stream: InputStream) { - self.parser = XMLParser(stream: stream) - super.init() - didInit() - } - - /// for parsing with `URL` type - /// - /// - Parameters: - /// - url: The input must be a `URL`, which should point to a GPX file located at the URL given - /// - public init?(withURL url: URL) { - guard let urlParser = XMLParser(contentsOf: url) else { return nil } - self.parser = urlParser - super.init() - didInit() - } - - /// for parsing with a string that contains full GPX markup - /// - /// - Parameters: - /// - string: The input `String` must contain full GPX markup, which is typically contained in a `.GPX` file - /// - public convenience init?(withRawString string: String?) { - if let string = string { - if let data = string.data(using: .utf8) { // refactor - self.init(withData: data) - } - else { return nil } - } - else { return nil } - } - - /// for parsing with a path to a GPX file - /// - /// - Parameters: - /// - path: The input path, with type `String`, must contain a path that points to a GPX file used to facilitate parsing. - /// - public convenience init?(withPath path: String) { - do { - let file = try String(contentsOfFile: path, encoding: .utf8) - self.init(withRawString: file) - } - catch { - print("CoreGPX: Failed parsing with path") - return nil - } - - } - - // MARK:- Parser Variants - - // MARK: Main Parse Method - /// - /// Starts parsing, returns parsed `GPXRoot` when done. - /// - public func parsedData() -> GPXRoot? { - self.parser.parse() // parse when requested - guard let firstTag = stack.first else { return nil } - guard let rawGPX = firstTag.children.first else { return nil } - - if rawGPX.attributes["version"] != "1.1" { - return parseLegacyAsModern(rawGPX) - } - - let root = GPXRoot(raw: rawGPX) // to be returned; includes attributes. - - for child in rawGPX.children { - let name = child.name - - switch name { - case "metadata": - let metadata = GPXMetadata(raw: child) - root.metadata = metadata - case "wpt": - let waypoint = GPXWaypoint(raw: child) - root.add(waypoint: waypoint) - case "rte": - let route = GPXRoute(raw: child) - root.add(route: route) - case "trk": - let track = GPXTrack(raw: child) - root.add(track: track) - case "extensions": - let extensions = GPXExtensions(raw: child) - root.extensions = extensions - default: continue - } - } - - // reset stack - stackReset() - - return root - } - - private func parseLegacyAsModern(_ raw: GPXRawElement) -> GPXRoot? { - let legacy = GPXLegacyRoot(raw: raw) - let modern = legacy.upgrade() - return modern - } - - // MARK: Failible Parse Type - - /// Unavailable after CoreGPX 0.8, spelling error. Will be removed soon. - @available(*, unavailable, message: "Please use fallibleParsedData(forceContinue:) instead") - public func failibleParsedData(forceContinue: Bool) throws -> GPXRoot? { return nil } - - /// - /// Starts parsing, returns parsed `GPXRoot` when done. - /// - /// - Parameters: - /// - forceContinue: If `true`, parser will continue parsing even if non XML-based issues like invalid coordinates have occurred - /// - /// - Throws: `GPXError` errors if an incident has occurred while midway or after parsing the GPX file. - /// - public func fallibleParsedData(forceContinue: Bool) throws -> GPXRoot? { - self.isErrorCheckEnabled = true - self.shouldContinueAfterFirstError = forceContinue - self.parser.parse() // parse when requested - - guard let firstTag = stack.first else { - throw GPXError.parser.fileIsNotXMLBased - } - guard let rawGPX = firstTag.children.first else { - throw GPXError.parser.fileIsEmpty - } - - guard parserError == nil else { - throw GPXError.parser.issueAt(line: errorAtLine, error: parserError!) - } - - let root = GPXRoot(raw: rawGPX) // to be returned; includes attributes. - guard root.version == "1.1" else { throw GPXError.parser.unsupportedVersion } - - guard errorsOccurred.isEmpty else { if errorsOccurred.count > 1 { - throw GPXError.parser.multipleErrorsOccurred(errorsOccurred) } else { - throw errorsOccurred.first! } } - - for child in rawGPX.children { - let name = child.name - - switch name { - case "metadata": - let metadata = GPXMetadata(raw: child) - root.metadata = metadata - case "wpt": - let waypoint = GPXWaypoint(raw: child) - root.add(waypoint: waypoint) - case "rte": - let route = GPXRoute(raw: child) - root.add(route: route) - case "trk": - let track = GPXTrack(raw: child) - root.add(track: track) - case "extensions": - let extensions = GPXExtensions(raw: child) - root.extensions = extensions - default: throw GPXError.parser.fileDoesNotConformSchema - } - } - - // reset stack - stackReset() - - return root - } - - // MARK:- For version <= 1.0 Parser - /// - /// Starts parsing, returns parsed `GPXRoot` when done. - /// - public func legacyParsingData() -> GPXLegacyRoot? { - self.parser.parse() // parse when requested - guard let firstTag = stack.first, let rawGPX = firstTag.children.first else { return nil } - - let root = GPXLegacyRoot(raw: rawGPX)// includes attributes. - - // reset stack - stackReset() - - return root - } - - -} - -/// -/// XML Parser Delegate Implementation -/// -extension GPXParser: XMLParserDelegate { - /// Default XML Parser Delegate's start element () callback. - public func parser(_ parser: XMLParser, didStartElement elementName: String, namespaceURI: String?, qualifiedName qName: String?, attributes attributeDict: [String : String] = [:]) { - - if isErrorCheckEnabled { - parserGPXErrorHandling(parser, elementName: elementName, attributeDict: attributeDict) - } - - let node = GPXRawElement(name: elementName) - if !attributeDict.isEmpty { - node.attributes = attributeDict - } - - let parentNode = stack.last - - parentNode?.children.append(node) - stack.append(node) - } - - /// Default XML Parser Delegate callback when characters are found. - public func parser(_ parser: XMLParser, foundCharacters string: String) { - let foundString = string.trimmingCharacters(in: .whitespacesAndNewlines) - if let text = stack.last?.text { - stack.last?.text = text + foundString - } else { - stack.last?.text = "" + foundString - } - } - - /// Default XML Parser Delegate's end element () callback. - public func parser(_ parser: XMLParser, didEndElement elementName: String, namespaceURI: String?, qualifiedName qName: String?) { - stack.last?.text = stack.last?.text?.trimmingCharacters(in: .whitespacesAndNewlines) - - stack.removeLast() - } - - /// Handling of XML parser's thrown error. (if there is any) - public func parser(_ parser: XMLParser, parseErrorOccurred parseError: Error) { - errorAtLine = parser.lineNumber - parserError = parseError - } - - /// Handles GPX errors during parse, unrelated to XML formatting. - private func parserGPXErrorHandling(_ parser: XMLParser, elementName: String, attributeDict: [String : String]) { - if elementName == "gpx" && attributeDict["version"] != "1.1" && !shouldContinueAfterFirstError { - parserError = GPXError.parser.unsupportedVersion - - if !shouldContinueAfterFirstError { parser.abortParsing() } - } - if elementName == "wpt" || elementName == "trkpt" || elementName == "rtept" { - guard let lat = Convert.toDouble(from: attributeDict["lat"]) else { errorsOccurred.append(GPXError.parser.issueAt(line: parser.lineNumber)); return } - guard let lon = Convert.toDouble(from: attributeDict["lon"]) else { errorsOccurred.append(GPXError.parser.issueAt(line: parser.lineNumber)); return } - guard let error = GPXError.checkError(latitude: lat, longitude: lon) else { - return } - errorsOccurred.append(GPXError.parser.issueAt(line: parser.lineNumber, error: error)) - - if !shouldContinueAfterFirstError { parser.abortParsing() } - } - } -} - -extension GPXParser { - /// Parse GPX file, while lossy compressing it straight away, post-parsing. - /// - /// Great for basic direct compression needs. - public func lossyParsing(type: GPXCompression.lossyTypes, affecting types: [GPXCompression.lossyOptions]) -> GPXRoot? { - self.parser.parse() - - guard let firstTag = stack.first else { return nil } - guard let rawGPX = firstTag.children.first else { return nil } - - let root = GPXRoot(raw: rawGPX) // to be returned; includes attributes. - - for child in rawGPX.children { - let name = child.name - - switch name { - case "metadata": - let metadata = GPXMetadata(raw: child) - root.metadata = metadata - case "wpt": - let waypoint = GPXWaypoint(raw: child) - root.add(waypoint: waypoint) - case "rte": - let route = GPXRoute(raw: child) - root.add(route: route) - case "trk": - let track = GPXTrack(raw: child) - root.add(track: track) - case "extensions": - let extensions = GPXExtensions(raw: child) - root.extensions = extensions - default: continue - } - - } - - switch type { - case .stripDuplicates: return GPXCompression.stripDuplicates(root, types: types) - case .stripNearbyData: return GPXCompression.stripNearbyData(root, types: types, distanceRadius: type.value()) - case .randomRemoval: return GPXCompression.lossyRandom(root, types: types, percent: type.value()) - } - } - -} diff --git a/Pods/CoreGPX/Classes/GPXPerson.swift b/Pods/CoreGPX/Classes/GPXPerson.swift deleted file mode 100644 index 1cc24875..00000000 --- a/Pods/CoreGPX/Classes/GPXPerson.swift +++ /dev/null @@ -1,66 +0,0 @@ -// -// GPXPerson.swift -// GPXKit -// -// Created by Vincent on 18/11/18. -// - -import Foundation - -/// A value type that is designated to hold information regarding the person or organisation who has created the GPX file. -public class GPXPerson: GPXElement, Codable { - - /// Name of person who has created the GPX file. - public var name: String? - - /// The email address of the person who has created the GPX file. - public var email: GPXEmail? - - /// An external website that holds information on the person who has created the GPX file. Additional information may be supported as well. - public var link: GPXLink? - - // MARK:- Initializers - - // Default Initializer. - public required init() { - super.init() - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "name": self.name = child.text - case "email": self.email = GPXEmail(raw: child) - case "link": self.link = GPXLink(raw: child) - default: continue - } - } - } - - // MARK:- Tag - - override func tagName() -> String { - return "person" - } - - // MARK:- GPX - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - self.addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - - if email != nil { - self.email?.gpx(gpx, indentationLevel: indentationLevel) - } - - if link != nil { - self.link?.gpx(gpx, indentationLevel: indentationLevel) - } - - } -} diff --git a/Pods/CoreGPX/Classes/GPXPoint.swift b/Pods/CoreGPX/Classes/GPXPoint.swift deleted file mode 100644 index 116ba215..00000000 --- a/Pods/CoreGPX/Classes/GPXPoint.swift +++ /dev/null @@ -1,82 +0,0 @@ -// -// GPXPoint.swift -// GPXKit -// -// Created by Vincent on 23/11/18. -// - -import Foundation - -/** - * This class (`ptType`) is added to conform with the GPX v1.1 schema. - - `ptType` of GPX schema. Not supported in GPXRoot, nor GPXParser's parsing. - */ -open class GPXPoint: GPXElement, Codable { - - /// Elevation Value in (metre, m) - public var elevation: Double? - /// Time/Date of creation - public var time: Date? - /// Latitude of point - public var latitude: Double? - /// Longitude of point - public var longitude: Double? - - // MARK:- Instance - - /// Default Initializer. - required public init() { - super.init() - } - /// Initialize with latitude and longitude - public init(latitude: Double, longitude: Double) { - super.init() - self.latitude = latitude - self.longitude = longitude - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - self.latitude = Convert.toDouble(from: raw.attributes["lat"]) - self.longitude = Convert.toDouble(from: raw.attributes["lon"]) - for child in raw.children { - switch child.name { - case "ele": self.elevation = Convert.toDouble(from: child.text) - case "time": self.time = GPXDateParser.parse(date: child.text) - default: continue - } - } - } - - // MARK:- Tag - - override func tagName() -> String { - return "pt" - } - - // MARK: GPX - - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - if let latitude = latitude { - attribute.append(" lat=\"\(latitude)\"") - } - if let longitude = longitude { - attribute.append(" lon=\"\(longitude)\"") - } - - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - self.addProperty(forDoubleValue: elevation, gpx: gpx, tagName: "ele", indentationLevel: indentationLevel) - self.addProperty(forValue: Convert.toString(from: time), gpx: gpx, tagName: "time", indentationLevel: indentationLevel) - } - -} diff --git a/Pods/CoreGPX/Classes/GPXPointSegment.swift b/Pods/CoreGPX/Classes/GPXPointSegment.swift deleted file mode 100644 index ca13c405..00000000 --- a/Pods/CoreGPX/Classes/GPXPointSegment.swift +++ /dev/null @@ -1,89 +0,0 @@ -// -// GPXPointSegment.swift -// GPXKit -// -// Created by Vincent on 23/11/18. -// - -import Foundation - -/** - * This class (`ptsegType`) is added to conform with the GPX v1.1 schema. - - `ptsegType` of GPX schema. Not supported in GPXRoot, nor GPXParser's parsing. - */ -open class GPXPointSegment: GPXElement, Codable { - - /// points of segment - public var points = [GPXPoint]() - - // MARK:- Instance - - /// Default initializer. - public required init() { - super.init() - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - for child in raw.children { - if child.name == "pt" { - points.append(GPXPoint(raw: child)) - } - else { break } - } - } - - // MARK:- Public Methods - - /// Adds a new point to segment, and returns the added point. - public func newPoint(with latitude: Double, longitude: Double) -> GPXPoint { - - let point = GPXPoint(latitude: latitude, longitude: longitude) - - self.add(point: point) - - return point - } - - /// Appends a point to the point segment - public func add(point: GPXPoint?) { - if let validPoint = point { - points.append(validPoint) - } - } - - /// Appends an array of points to the point segment - public func add(points: [GPXPoint]) { - self.points.append(contentsOf: points) - } - - /// Remove a single point in the point segment - public func remove(point: GPXPoint) { - let contains = points.contains(point) - if contains == true { - if let index = points.firstIndex(of: point) { - points.remove(at: index) - } - } - } - - // MARK:- Tag - - override func tagName() -> String { - return "ptseg" - } - - // MARK:- GPX - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - for point in points { - point.gpx(gpx, indentationLevel: indentationLevel) - } - } -} diff --git a/Pods/CoreGPX/Classes/GPXRawElement.swift b/Pods/CoreGPX/Classes/GPXRawElement.swift deleted file mode 100644 index c8e53545..00000000 --- a/Pods/CoreGPX/Classes/GPXRawElement.swift +++ /dev/null @@ -1,32 +0,0 @@ -// -// ParserElement.swift -// CoreGPX -// -// Created by Vincent on 2/7/19. -// -// Referenced from GitHub, yahoojapan/SwiftyXMLParser - -import Foundation - -/// Raw element that is for GPXParser to work with. -/// -/// Should not be used as is, and should be disposed off once done with parsing. -final class GPXRawElement { - - /// name tag of element - var name: String - - /// text contents of element - var text: String? - - /// open tag attributes of element - var attributes = [String : String]() - - /// child of element tag - var children = [GPXRawElement]() - - /// init with name tag name - init(name: String) { - self.name = name - } -} diff --git a/Pods/CoreGPX/Classes/GPXRoot.swift b/Pods/CoreGPX/Classes/GPXRoot.swift deleted file mode 100644 index 58ed73cf..00000000 --- a/Pods/CoreGPX/Classes/GPXRoot.swift +++ /dev/null @@ -1,361 +0,0 @@ -// -// GPXRoot.swift -// GPXKit -// -// Created by Vincent on 5/11/18. -// - -import Foundation - -/** - Creation of a GPX file or GPX formatted string starts here - - `GPXRoot` holds all `metadata`, `waypoints`, `tracks`, `routes` and `extensions` types together before being packaged as a GPX file, or formatted as per GPX schema's requirements. -*/ -public final class GPXRoot: GPXElement, Codable { - - /// GPX version that will be generated. - public var version: String = "1.1" - - /// Name of the creator of the GPX content. - /// - /// Can be your name or your app's name - public var creator: String? - - /// Metadata to be included in your GPX content. - public var metadata: GPXMetadata? - - /// Array of waypoints - public var waypoints = [GPXWaypoint]() - - /// Array of routes - public var routes = [GPXRoute]() - - /// Array of tracks - public var tracks = [GPXTrack]() - - /// Items for extensions to GPX schema (if any) - /// - /// leave it as is, if used without modification to GPX schema - public var extensions: GPXExtensions? - - - - // MARK: GPX v1.1 Namespaces - - /// Link to the GPX v1.1 schema - private var schema = "http://www.topografix.com/GPX/1/1" - /// Link to the schema locations. If extended, the extended schema should be added. - private var schemaLocation = "http://www.topografix.com/GPX/1/1 http://www.topografix.com/GPX/1/1/gpx.xsd" - /// Link to XML schema instance - private var xsi = "http://www.w3.org/2001/XMLSchema-instance" - /// For if GPX file is extended, and contains extra attributes on gpx main tag. - private var extensionAttributes: [String : String]? - - - - // MARK:- Public Initializers - - /// for initializing without a creator name - /// - /// It will initialize with the creator name set to its defaults. - /// - public required init() { - super.init() - self.creator = "Powered by Open Source CoreGPX Project" - self.version = "1.1" - } - - /// for initializing with a creator name - /// - /// - Parameters: - /// - creator: name of your app, or whichever product that ends up generating a GPX file - /// - public init(creator: String) { - super.init() - self.creator = creator - self.version = "1.1" - } - - /// Initialize if planned to use with extensions - /// - /// - Parameters: - /// - attributes: Extension attributes to be placed in the gpx tag header. Key should be name of attribute, while Value contains the value of the attribute. - /// - schemaLocation: Location/Website of the extension schema - public init(withExtensionAttributes attributes: [String : String], schemaLocation: String) { - super.init() - self.version = "1.1" - self.schemaLocation += " \(schemaLocation)" - self.extensionAttributes = attributes - } - - /// Initialize if planned to use with extensions, with creator name. - public convenience init(withExtensionAttributes attributes: [String : String], schemaLocation: String, creator: String) { - self.init(withExtensionAttributes: attributes, schemaLocation: schemaLocation) - self.creator = creator - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - super.init() - for (key, value) in raw.attributes { - switch key { - case "creator": self.creator = value - case "version": self.version = value - case "xsi:schemaLocation": self.schemaLocation = value - case "xmlns:xsi": continue - case "xmlns": continue - default: - if extensionAttributes == nil { extensionAttributes = [String : String]() } - extensionAttributes?[key] = value - } - } - } - - // MARK:- Public Methods - - /// for saving newly tracked data straight to a GPX file in a directory - /// - /// - Parameters: - /// - location: A `URL` where you wish to have the GPX file saved at. - /// - fileName: The name of the file which you wish to save as, without extension. - /// - /// - Throws: An error if GPX file fails to write at `location` for whichever reason. - /// - public func outputToFile(saveAt location: URL, fileName: String) throws { - let gpxString = self.gpx() - let filePath = location.appendingPathComponent("\(fileName).gpx") - - do { - try gpxString.write(to: filePath, atomically: true, encoding: .utf8) - } - catch { - print(error) - throw error - } - } - - /// Initializes a new `waypoint` which is also added to `GPXRoot` automatically - /// - /// - Parameters: - /// - latitude: Waypoint's latitude in `Double` or `CLLocationDegrees` - /// - longitude: Waypoint's latitude in `Double` or `CLLocationDegrees` - /// - /// A waypoint is initialized with latitude and longitude, then added into the array of waypoints in this `GPXRoot`. - /// - /// - Warning: - /// This method is **not recommended**. It is recommended that you initialize a waypoint first, configure it, and use method `add(waypoint:)` instead. - /// - /// - Returns: - /// A `GPXWaypoint` object. - /// - public func newWaypointWith(latitude: Double, longitude: Double) -> GPXWaypoint { - let waypoint = GPXWaypoint.init(latitude: latitude, longitude: longitude) - - self.add(waypoint: waypoint) - - return waypoint - } - - /// Add a pre-initialized and configured waypoint to `GPXRoot` - /// - /// - Parameters: - /// - waypoint: The waypoint that you wish to include in `GPXRoot` - /// - public func add(waypoint: GPXWaypoint?) { - if let validWaypoint = waypoint { - self.waypoints.append(validWaypoint) - } - } - - /// Add an array of pre-initialized and configured waypoints to `GPXRoot` - /// - /// - Parameters: - /// - waypoints: Array of waypoints that you wish to include in `GPXRoot` - /// - public func add(waypoints: [GPXWaypoint]) { - self.waypoints.append(contentsOf: waypoints) - } - - /// Removes an already added waypoint from `GPXRoot` - /// - /// - Parameters: - /// - waypoint: The waypoint that you wish to remove from `GPXRoot` - /// - public func remove(waypoint: GPXWaypoint) { - let contains = waypoints.contains(waypoint) - if contains == true { - if let index = waypoints.firstIndex(of: waypoint) { - self.waypoints.remove(at: index) - } - } - } - - /// Remove waypoint from root's array at index. - public func remove(WaypointAtIndex index: Int) { - self.waypoints.remove(at: index) - } - - /// Initializes a new `route` which is also added to `GPXRoot` automatically - /// - /// A route is initialized, then added into the array of routes in this `GPXRoot`. - /// - /// - Warning: - /// This method is **not recommended**. It is recommended that you initialize a route first, configure it, and use method `add(route:)` instead. - /// - /// - Returns: - /// A `GPXRoute` object. - /// - public func newRoute() -> GPXRoute { - let route = GPXRoute() - - self.add(route: route) - - return route - } - - /// Add a pre-initialized and configured route to `GPXRoot` - /// - /// - Parameters: - /// - route: The route that you wish to include in `GPXRoot` - /// - public func add(route: GPXRoute?) { - if let validRoute = route { - self.routes.append(validRoute) - } - } - - /// Add an array of pre-initialized and configured routes to `GPXRoot` - /// - /// - Parameters: - /// - routes: The array of routes that you wish to include in `GPXRoot` - /// - public func add(routes: [GPXRoute]) { - self.routes.append(contentsOf: routes) - } - - /// Removes an already added waypoint from `GPXRoot` - /// - /// - Parameters: - /// - route: The route that you wish to remove from `GPXRoot` - /// - public func remove(route: GPXRoute) { - let contains = routes.contains(route) - if contains == true { - if let index = routes.firstIndex(of: route) { - self.waypoints.remove(at: index) - } - } - } - - /// Initializes a new `track` which is also added to `GPXRoot` automatically - /// - /// A track is initialized, then added into the array of tracks in this `GPXRoot`. - /// - /// - Warning: - /// This method is **not recommended**. It is recommended that you initialize a track first, configure it, and use method `add(track:)` instead. - /// - /// - Returns: - /// A `GPXTrack` object. - /// - public func newTrack() -> GPXTrack { - let track = GPXTrack() - - return track - } - - /// Add a pre-initialized and configured track to `GPXRoot` - /// - /// - Parameters: - /// - track: The track that you wish to include in `GPXRoot` - /// - public func add(track: GPXTrack?) { - if let validTrack = track { - self.tracks.append(validTrack) - } - } - - /// Add an array of pre-initialized and configured tracks to `GPXRoot` - /// - /// - Parameters: - /// - tracks: The array of tracks that you wish to include in `GPXRoot` - /// - public func add(tracks: [GPXTrack]) { - self.tracks.append(contentsOf: tracks) - } - - /// Removes an already added track from `GPXRoot` - /// - /// - Parameters: - /// - track: The track that you wish to remove from `GPXRoot` - /// - public func remove(track: GPXTrack) { - let contains = tracks.contains(track) - if contains == true { - if let index = tracks.firstIndex(of: track) { - self.waypoints.remove(at: index) - } - } - } - - // MARK:- Tag - - override func tagName() -> String { - return "gpx" - } - - // MARK:- GPX - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - - attribute.appendFormat(" xmlns:xsi=\"%@\"", self.xsi) - attribute.appendFormat(" xmlns=\"%@\"", self.schema) - - // for extensions attributes to be appended. - if let extensionAttributes = self.extensionAttributes { - for attributeKey in extensionAttributes.keys { - attribute.appendFormat(" %@=\"%@\"", attributeKey, extensionAttributes[attributeKey] ?? "Data is invalid") - } - } - - attribute.appendFormat(" xsi:schemaLocation=\"%@\"", self.schemaLocation) - - attribute.appendFormat(" version=\"%@\"", version) - - - if let creator = self.creator { - attribute.appendFormat(" creator=\"%@\"", creator) - } - - gpx.append("\r\n") - - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - if self.metadata != nil { - self.metadata?.gpx(gpx, indentationLevel: indentationLevel) - } - - for waypoint in waypoints { - waypoint.gpx(gpx, indentationLevel: indentationLevel) - } - - for route in routes { - route.gpx(gpx, indentationLevel: indentationLevel) - } - - for track in tracks { - track.gpx(gpx, indentationLevel: indentationLevel) - } - - if self.extensions != nil { - self.extensions?.gpx(gpx, indentationLevel: indentationLevel) - } - } -} diff --git a/Pods/CoreGPX/Classes/GPXRoute.swift b/Pods/CoreGPX/Classes/GPXRoute.swift deleted file mode 100644 index ba76904a..00000000 --- a/Pods/CoreGPX/Classes/GPXRoute.swift +++ /dev/null @@ -1,179 +0,0 @@ -// -// GPXRoute.swift -// GPXKit -// -// Created by Vincent on 8/12/18. -// - -import Foundation - -/** - Value type that represents a route, or `rteType` in GPX v1.1 schema. - - The route can represent the planned route of a specific trip. - */ -public final class GPXRoute: GPXElement, Codable, GPXRouteType { - - /// For Codable use - private enum CodingKeys: String, CodingKey { - case name - case comment = "cmt" - case desc - case source = "src" - case links = "link" - case type - case extensions - } - - /// Name of the route. - public var name: String? - - /// Additional comment of the route. - public var comment: String? - - /// Description of the route. - public var desc: String? - - /// Source of the route. - public var source: String? - - /// A value type for link properties (see `GPXLink`) - /// - /// Intended for additional information about current route through a web link. - @available(*, deprecated, message: "CoreGPX now support multiple links.", renamed: "links.first") - public var link: GPXLink? { - return links.first - } - - /// A value type for link properties (see `GPXLink`) - /// - /// Intended for additional information about current route through web links. - public var links = [GPXLink]() - - /// Type of route. - public var type: String? - - /// Extensions - public var extensions: GPXExtensions? - - /// Route points in the route. - /// - /// All route points joined represents a route. - @available(*, deprecated, renamed: "points") - public var routepoints: [GPXRoutePoint] { - return points - } - - /// Route points in the route. - /// - /// All route points joined represents a route. - public var points = [GPXRoutePoint]() - - /// Number of route (possibly a tag for the route) - public var number: Int? - - // MARK:- Instance - - /// Default initializer. - public required init() { - super.init() - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "link": self.links.append(GPXLink(raw: child)) - case "rtept": self.points.append(GPXRoutePoint(raw: child)) - case "name": self.name = child.text - case "cmt": self.comment = child.text - case "desc": self.desc = child.text - case "src": self.source = child.text - case "type": self.type = child.text - case "number": self.number = Convert.toInt(from: child.text) - case "extensions": self.extensions = GPXExtensions(raw: child) - default: continue - } - } - } - - // MARK: Public Methods - - /// Creates a `GPXLink` which is added to the route and also returned. - /// - /// Not recommended for use. Init `GPXRoutePoint` manually, then adding it to route, instead. - func newLink(withHref href: String) -> GPXLink { - let link: GPXLink = GPXLink(withHref: href) - self.links.append(link) - return link - } - - /// Creates a `GPXRoutePoint` which is added to the route and also returned. - /// - /// Not recommended for use. Init `GPXRoutePoint` manually, then adding it to route, instead. - func newRoutePointWith(latitude: Double, longitude: Double) -> GPXRoutePoint { - let routepoint = GPXRoutePoint(latitude: latitude, longitude: longitude) - - self.add(routepoint: routepoint) - - return routepoint - } - - /// Adds a singular route point to the route. - func add(routepoint: GPXRoutePoint?) { - if let validPoint = routepoint { - points.append(validPoint) - } - } - - /// Adds an array of route points to the route. - func add(routepoints: [GPXRoutePoint]) { - self.points.append(contentsOf: routepoints) - } - - /// Removes a route point from the route. - func remove(routepoint: GPXRoutePoint) { - let contains = points.contains(routepoint) - if contains == true { - if let index = points.firstIndex(of: routepoint) { - points.remove(at: index) - } - } - - } - - // MARK:- Tag - - override func tagName() -> String { - return "rte" - } - - // MARK:- GPX - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - self.addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - self.addProperty(forValue: comment, gpx: gpx, tagName: "comment", indentationLevel: indentationLevel) - self.addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - self.addProperty(forValue: source, gpx: gpx, tagName: "src", indentationLevel: indentationLevel) - - for link in links { - link.gpx(gpx, indentationLevel: indentationLevel) - } - - self.addProperty(forIntegerValue: number, gpx: gpx, tagName: "number", indentationLevel: indentationLevel) - self.addProperty(forValue: type, gpx: gpx, tagName: "type", indentationLevel: indentationLevel) - - if self.extensions != nil { - self.extensions?.gpx(gpx, indentationLevel: indentationLevel) - } - - for routepoint in points { - routepoint.gpx(gpx, indentationLevel: indentationLevel) - } - } -} diff --git a/Pods/CoreGPX/Classes/GPXRoutePoint.swift b/Pods/CoreGPX/Classes/GPXRoutePoint.swift deleted file mode 100644 index 02d185bb..00000000 --- a/Pods/CoreGPX/Classes/GPXRoutePoint.swift +++ /dev/null @@ -1,44 +0,0 @@ -// -// GPXRoutePoint.swift -// GPXKit -// -// Created by Vincent on 19/11/18. -// - -import Foundation - -/** - A route point is just like a waypoint or track point, but is suited to be part of a route. - - These route points in collective, forms a valid route. - */ -public final class GPXRoutePoint: GPXWaypoint { - - /// Default initializer - public required init() { - super.init() - } - - // MARK:- Instance - - public override init(latitude: Double, longitude: Double) { - super.init(latitude: latitude, longitude: longitude) - } - - override init(raw: GPXRawElement) { - super.init(raw: raw) - } - - /// For initializing with a `Decoder` - /// - /// Declared here for use of Codable functionalities. - required public init(from decoder: Decoder) throws { - try super.init(from: decoder) - } - - // MARK:- Tag - - override func tagName() -> String { - return "rtept" - } -} diff --git a/Pods/CoreGPX/Classes/GPXRouteProtocol.swift b/Pods/CoreGPX/Classes/GPXRouteProtocol.swift deleted file mode 100644 index 1cf7c094..00000000 --- a/Pods/CoreGPX/Classes/GPXRouteProtocol.swift +++ /dev/null @@ -1,25 +0,0 @@ -// -// GPXRouteProtocol.swift -// Pods -// -// Created by Vincent Neo on 13/6/20. -// - -import Foundation - -public protocol GPXRouteType { - /// Name of the route. - var name: String? { get set } - - /// Additional comment of the route. - var comment: String? { get set } - - /// Description of the route. - var desc: String? { get set } - - /// Source of the route. - var source: String? { get set } - - /// Number of route (possibly a tag for the route) - var number: Int? { get set } -} diff --git a/Pods/CoreGPX/Classes/GPXTrack.swift b/Pods/CoreGPX/Classes/GPXTrack.swift deleted file mode 100644 index a0e3273d..00000000 --- a/Pods/CoreGPX/Classes/GPXTrack.swift +++ /dev/null @@ -1,187 +0,0 @@ -// -// GPXTrack.swift -// GPXKit -// -// Created by Vincent on 9/12/18. -// - -import Foundation - -/** - Represents `trkType` of GPX v1.1 schema. - - A track can hold track segments, along with additional information regarding the track. - - Tracks are meant to show the start and finish of a journey, through the track segments that it holds. - */ -public final class GPXTrack: GPXElement, Codable { - - /// for Codable - private enum CodingKeys: String, CodingKey { - case links = "link" - case segments = "trkseg" - case name - case comment = "cmt" - case desc - case source = "src" - case number - case type - case extensions - } - - /// A value type for link properties (see `GPXLink`) - /// - /// Intended for additional information about current route through a web link. - @available(*, deprecated, message: "CoreGPX now support multiple links.", renamed: "links.first") - public var link: GPXLink? { - return links.first - } - - /// A value type for link properties (see `GPXLink`) - /// - /// Holds web links to external resources regarding the current track. - public var links = [GPXLink]() - - /// Array of track segments. Must be included in every track. - @available(*, deprecated, renamed: "segments") - public var tracksegments: [GPXTrackSegment] { - return segments - } - - /// Array of track segments. Must be included in every track. - public var segments = [GPXTrackSegment]() - - /// Name of track. - public var name: String? - - /// Additional comment of track. - public var comment: String? - - /// A full description of the track. Can be of any length. - public var desc: String? - - /// Source of track. - public var source: String? - - /// GPS track number. - public var number: Int? - - /// Type of current track. - public var type: String? - - /// Custom Extensions of track, if needed. - public var extensions: GPXExtensions? - - /// Default Initializer - public required init() { - super.init() - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "link": self.links.append(GPXLink(raw: child)) - case "trkseg": self.segments.append(GPXTrackSegment(raw: child)) - case "name": self.name = child.text - case "cmt": self.comment = child.text - case "desc": self.desc = child.text - case "src": self.source = child.text - case "type": self.type = child.text - case "extensions": self.extensions = GPXExtensions(raw: child) - default: continue - } - } - } - - // MARK:- Public Methods - - /// Initialize a new `GPXLink` to the track. - /// - /// Method not recommended for use. Please initialize `GPXLink` manually and adding it to the track instead. - public func newLink(withHref href: String) -> GPXLink { - let link = GPXLink(withHref: href) - return link - } - - /// Initialize a new `GPXTrackSegement` to the track. - /// - /// Method not recommended for use. Please initialize `GPXTrackSegment` manually and adding it to the track instead. - public func newTrackSegment() -> GPXTrackSegment { - let tracksegment = GPXTrackSegment() - self.add(trackSegment: tracksegment) - return tracksegment - } - - /// Adds a single track segment to the track. - public func add(trackSegment: GPXTrackSegment?) { - if let validTrackSegment = trackSegment { - segments.append(validTrackSegment) - } - } - - /// Adds an array of track segments to the track. - public func add(trackSegments: [GPXTrackSegment]) { - self.segments.append(contentsOf: trackSegments) - } - - /// Removes a tracksegment from the track. - public func remove(trackSegment: GPXTrackSegment) { - let contains = segments.contains(trackSegment) - - if contains == true { - if let index = segments.firstIndex(of: trackSegment) { - segments.remove(at: index) - } - } - } - - /// Initializes a new track point in track, then returns the new track point. - public func newTrackPointWith(latitude: Double, longitude: Double) -> GPXTrackPoint { - var tracksegment: GPXTrackSegment - - if let lastTracksegment = segments.last { - tracksegment = lastTracksegment - } else { - tracksegment = self.newTrackSegment() - } - - return tracksegment.newTrackpointWith(latitude: latitude, longitude: longitude) - } - - // MARK:- Tag - - override func tagName() -> String { - return "trk" - } - - // MARK:- GPX - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - self.addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - self.addProperty(forValue: comment, gpx: gpx, tagName: "cmt", indentationLevel: indentationLevel) - self.addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - self.addProperty(forValue: source, gpx: gpx, tagName: "src", indentationLevel: indentationLevel) - - for link in links { - link.gpx(gpx, indentationLevel: indentationLevel) - } - - self.addProperty(forIntegerValue: number, gpx: gpx, tagName: "number", indentationLevel: indentationLevel) - self.addProperty(forValue: type, gpx: gpx, tagName: "type", indentationLevel: indentationLevel) - - if extensions != nil { - self.extensions?.gpx(gpx, indentationLevel: indentationLevel) - } - - for tracksegment in segments { - tracksegment.gpx(gpx, indentationLevel: indentationLevel) - } - - } -} diff --git a/Pods/CoreGPX/Classes/GPXTrackPoint.swift b/Pods/CoreGPX/Classes/GPXTrackPoint.swift deleted file mode 100644 index f41807fd..00000000 --- a/Pods/CoreGPX/Classes/GPXTrackPoint.swift +++ /dev/null @@ -1,47 +0,0 @@ -// -// GPXTrackPoint.swift -// GPXKit -// -// Created by Vincent on 9/12/18. -// - -import Foundation - -/** - A track point is just like a waypoint or route point, but is suited to be part of a track segment. - - A bunch of track points can be used to form a track segement, while track segments form a track. - (though a single track segment itself is enough to form a track.) - */ -public final class GPXTrackPoint: GPXWaypoint { - - // MARK:- Initializers - - /// Default Initializer. - public required init() { - super.init() - } - - public override init(latitude: Double, longitude: Double) { - super.init(latitude: latitude, longitude: longitude) - } - - override init(raw: GPXRawElement) { - super.init(raw: raw) - } - - /// For initializing with a `Decoder` - /// - /// Declared here for use of Codable functionalities. - required public init(from decoder: Decoder) throws { - try super.init(from: decoder) - } - - - // MARK:- Tag - - override func tagName() -> String { - return "trkpt" - } - -} diff --git a/Pods/CoreGPX/Classes/GPXTrackSegment.swift b/Pods/CoreGPX/Classes/GPXTrackSegment.swift deleted file mode 100644 index 715b31d0..00000000 --- a/Pods/CoreGPX/Classes/GPXTrackSegment.swift +++ /dev/null @@ -1,106 +0,0 @@ -// -// GPXTrackSegment.swift -// GPXKit -// -// Created by Vincent on 9/12/18. -// - -import Foundation - -/** - A track segment that holds data on all track points in the particular segment. - - Does not hold additional information by default. - */ -public final class GPXTrackSegment: GPXElement, Codable { - - /// For Codable use - private enum CodingKeys: String, CodingKey { - case points = "trkpt" - case extensions - } - - /// Track points stored in current segment. - @available(*, deprecated, renamed: "points") - public var trackpoints: [GPXTrackPoint] { - return points - } - - /// Track points stored in current segment. - public var points = [GPXTrackPoint]() - - /// Custom Extensions, if needed. - public var extensions: GPXExtensions? - - - // MARK:- Instance - - /// Default Initializer. - public required init() { - super.init() - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - for child in raw.children { - switch child.name { - case "trkpt": self.points.append(GPXTrackPoint(raw: child)) - case "extensions": self.extensions = GPXExtensions(raw: child) - default: continue - } - } - } - - // MARK:- Public Methods - - /// Initializes a new trackpoint to segment, and returns the trackpoint. - public func newTrackpointWith(latitude: Double, longitude: Double) -> GPXTrackPoint { - let trackpoint = GPXTrackPoint(latitude: latitude, longitude: longitude) - - self.add(trackpoint: trackpoint) - - return trackpoint - } - - /// Adds a single track point to this track segment. - public func add(trackpoint: GPXTrackPoint?) { - if let validPoint = trackpoint { - points.append(validPoint) - } - } - - /// Adds an array of track points to this track segment. - public func add(trackpoints: [GPXTrackPoint]) { - self.points.append(contentsOf: trackpoints) - } - - /// Removes a track point from this track segment. - public func remove(trackpoint: GPXTrackPoint) { - if let index = points.firstIndex(of: trackpoint) { - points.remove(at: index) - } - } - - // MARK:- Tag - - override func tagName() -> String { - return "trkseg" - } - - // MARK:- GPX - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - if self.extensions != nil { - self.extensions?.gpx(gpx, indentationLevel: indentationLevel) - } - - for trackpoint in points { - trackpoint.gpx(gpx, indentationLevel: indentationLevel) - } - } -} diff --git a/Pods/CoreGPX/Classes/GPXWaypoint.swift b/Pods/CoreGPX/Classes/GPXWaypoint.swift deleted file mode 100644 index 078cd1a7..00000000 --- a/Pods/CoreGPX/Classes/GPXWaypoint.swift +++ /dev/null @@ -1,340 +0,0 @@ -// -// GPXWaypoint.swift -// GPXKit -// -// Created by Vincent on 19/11/18. -// - -import Foundation - -/** - A value type that represents waypoint based off GPX v1.1 schema's `wptType`. - - According to the GPX schema, the waypoint type can represent the following: - - a waypoint - - a point of interest - - a named feature on a map - - The waypoint should at least contain the attributes of both `latitude` and `longitude` in order to be considered a valid waypoint. Most attributes are optional, and are not required to be implemented. -*/ -public class GPXWaypoint: GPXElement, GPXWaypointProtocol, Codable { - - // MARK: Codable Implementation - - /// For Codable use - private enum CodingKeys: String, CodingKey { - case time - case elevation = "ele" - case latitude = "lat" - case longitude = "lon" - case magneticVariation = "magvar" - case geoidHeight = "geoidheight" - case name - case comment = "cmt" - case desc - case source = "src" - case symbol = "sym" - case type - case fix - case satellites = "sat" - case horizontalDilution = "hdop" - case verticalDilution = "vdop" - case positionDilution = "pdop" - case DGPSid = "dgpsid" - case ageofDGPSData = "ageofdgpsdata" - case links = "link" - case extensions - } - - - - // MARK:- Attributes of a waypoint - - /// A value type for link properties (see `GPXLink`) - /// - /// Intended for additional information about current point through a web link. - @available(*, deprecated, message: "CoreGPX now support multiple links.", renamed: "links.first") - public var link: GPXLink? { - return links.first - } - - /// A value type for link properties (see `GPXLink`) - /// - /// Intended for additional information about current point through web links. - public var links = [GPXLink]() - - /// Elevation of current point - /// - /// Should be in unit **meters** (m) - public var elevation: Double? - - /// Date and time of current point - /// - /// Should be in **Coordinated Universal Time (UTC)**, without offsets, not local time. - public var time: Date? - - /// Magnetic Variation of current point - /// - /// Should be in unit **degrees** (º) - public var magneticVariation: Double? - - /// Geoid Height of current point - /// - /// Should be in unit **meters** (m). Height of geoid, or mean sea level, above WGS84 earth ellipsoid - public var geoidHeight: Double? - - /// Name of current point - /// - /// - Warning: - /// - This attribute may not be useful, in schema context. - /// - This is carried over from GPX schema, to be compliant with the schema. - public var name: String? - - /// Comment of current point - /// - /// - Warning: - /// - This attribute may not be useful, in schema context. - /// - This is carried over from GPX schema, to be compliant with the schema. - public var comment: String? - - /// Description of current point - /// - /// - Warning: - /// - This attribute may not be useful, in schema context. - /// - This is carried over from GPX schema, to be compliant with the schema. - public var desc: String? - - /// Source of data of current point - /// - /// For assurance that current point is reliable - public var source: String? - - /// Text of GPS symbol name - /// - /// - Warning: - /// - This attribute does not appear to be useful due to `CoreLocation` API. - /// - This is carried over from GPX schema, to be compliant with the schema. - public var symbol: String? - - /// Type of current point - public var type: String? - - /// Type of GPS fix of current point, represented as a number - /// - /// - **Supported Types:** (written in order) - /// - **None**: No fix - /// - **2D**: Position only - /// - **3D**: Position and Elevation - /// - **DGPS**: Differential GPS - /// - **PPS**: Military Signal - /// - /// Unknown fix should leave fix attribute as `nil` - /// - Warning: - /// - This attribute may have limited usefulness due to `CoreLocation` API. - /// - This is carried over from GPX schema, to be compliant with the schema. - public var fix: GPXFix? - - /// Number of satellites used to calculate GPS fix of current point - public var satellites: Int? - - /// Horizontal dilution of precision of current point - public var horizontalDilution: Double? - - /// Vertical dilution of precision of current point - public var verticalDilution: Double? - - /// Position dilution of precision of current point - public var positionDilution: Double? - - /// Age of DGPS Data - /// - /// Number of seconds since last DGPS update - /// - /// - Warning: - /// - This attribute may not be useful. - /// - This is carried over from GPX schema, to be compliant with the schema. - public var ageofDGPSData: Double? - - /// DGPS' ID - /// - /// ID of DGPS station used in differential correction. - /// - /// - Warning: - /// - This attribute may not be useful. - /// - This is carried over from GPX schema, to be compliant with the schema. - public var DGPSid: Int? - - /// Extension to GPX v1.1 standard. - public var extensions: GPXExtensions? - - /// Latitude of current point - /// - /// - Latitude value should be within range of **-90 to 90** - /// - Should be in unit **degrees** (º) - /// - Should conform to WGS 84 datum. - /// - public var latitude: Double? - - /// Longitude of current point - /// - /// - Longitude value should be within range of **-180 to 180** - /// - Should be in unit **degrees** (º) - /// - Should conform to WGS 84 datum. - /// - public var longitude: Double? - - - - - // MARK:- Initializers - - /// Initialize with current date and time - /// - /// The waypoint should be configured appropriately after initializing using this initializer. The `time` attribute will also be set to the time of initializing. - /// - /// - Note: - /// At least latitude and longitude should be configured as required by the GPX v1.1 schema. - /// - public required init() { - self.time = Date() - super.init() - } - - /// Initialize with current date and time, with latitude and longitude. - /// - /// The waypoint should be configured appropriately after initializing using this initializer. The `time` attribute will also be set to the time of initializing, along with `latitude` and `longitude` attributes. - /// - /// - Remark: - /// Other attributes can still be configured as per normal. - /// - /// - Parameters: - /// - latitude: latitude value of the waypoint, in `Double` or `CLLocationDegrees`, **WGS 84** datum only. Should be within the ranges of **-90.0 to 90.0** - /// - longitude: longitude value of the waypoint, in `Double` or `CLLocationDegrees`, **WGS 84** datum only. Should be within the ranges of **-180.0 to 180.0** - /// - public init(latitude: Double, longitude: Double) { - self.time = Date() - super.init() - self.latitude = latitude - self.longitude = longitude - } - - /// Initialize a point type, and verifies that point is within ranges of what latitude and longitude should be. - /// - /// - SeeAlso: - /// init(latitude:longitude:) - public convenience init(verifiedLatitude latitude: Double, longitude: Double) throws { - guard let error = GPXError.checkError(latitude: latitude, longitude: longitude) else { - self.init(latitude: latitude, longitude: longitude) - return } - - throw error - - } - - /// Inits native element from raw parser value - /// - /// - Parameters: - /// - raw: Raw element expected from parser - init(raw: GPXRawElement) { - self.latitude = Convert.toDouble(from: raw.attributes["lat"]) - self.longitude = Convert.toDouble(from: raw.attributes["lon"]) - - for child in raw.children { - switch child.name { - case "time": self.time = GPXDateParser.parse(date: child.text) - case "ele": self.elevation = Convert.toDouble(from: child.text) - case "magvar": self.magneticVariation = Convert.toDouble(from: child.text) - case "geoidheight": self.geoidHeight = Convert.toDouble(from: child.text) - case "name": self.name = child.text - case "cmt": self.comment = child.text - case "desc": self.desc = child.text - case "src": self.source = child.text - case "link": self.links.append(GPXLink(raw: child)) - case "sym": self.symbol = child.text - case "type": self.type = child.text - case "fix": self.fix = GPXFix(rawValue: child.text ?? "none") - case "sat": self.satellites = Convert.toInt(from: child.text) - case "hdop": self.horizontalDilution = Convert.toDouble(from: child.text) - case "vdop": self.verticalDilution = Convert.toDouble(from: child.text) - case "pdop": self.positionDilution = Convert.toDouble(from: child.text) - case "dgpsid": self.DGPSid = Convert.toInt(from: child.text) - case "ageofdgpsid": self.ageofDGPSData = Convert.toDouble(from: child.text) - case "extensions": self.extensions = GPXExtensions(raw: child) - default: continue - } - } - } - - // MARK:- Public Methods - - /// for initializing a `GPXLink` with href, which is added to this point type as well. - /// - Parameters: - /// - href: a URL hyperlink as a `String` - /// - /// This method works by initializing a new `GPXLink`, adding to this point type, then return the `GPXLink` - /// - /// - Warning: Will be deprecated starting version 0.5.0 - @available(*, deprecated, message: "Initialize GPXLink first then, add it to this point type instead.") - public func newLink(withHref href: String) -> GPXLink { - let link = GPXLink(withHref: href) - self.links.append(link) - return link - } - - // MARK:- Tag - - override func tagName() -> String { - return "wpt" - } - - // MARK:- GPX - - override func addOpenTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - let attribute = NSMutableString() - - if let latitude = latitude { - attribute.append(" lat=\"\(latitude)\"") - } - - if let longitude = longitude { - attribute.append(" lon=\"\(longitude)\"") - } - - gpx.appendOpenTag(indentation: indent(forIndentationLevel: indentationLevel), tag: tagName(), attribute: attribute) - } - - override func addChildTag(toGPX gpx: NSMutableString, indentationLevel: Int) { - super.addChildTag(toGPX: gpx, indentationLevel: indentationLevel) - - self.addProperty(forDoubleValue: elevation, gpx: gpx, tagName: "ele", indentationLevel: indentationLevel) - self.addProperty(forValue: Convert.toString(from: time), gpx: gpx, tagName: "time", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: magneticVariation, gpx: gpx, tagName: "magvar", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: geoidHeight, gpx: gpx, tagName: "geoidheight", indentationLevel: indentationLevel) - self.addProperty(forValue: name, gpx: gpx, tagName: "name", indentationLevel: indentationLevel) - self.addProperty(forValue: comment, gpx: gpx, tagName: "cmt", indentationLevel: indentationLevel) - self.addProperty(forValue: desc, gpx: gpx, tagName: "desc", indentationLevel: indentationLevel) - self.addProperty(forValue: source, gpx: gpx, tagName: "src", indentationLevel: indentationLevel) - - for link in links { - link.gpx(gpx, indentationLevel: indentationLevel) - } - - self.addProperty(forValue: symbol, gpx: gpx, tagName: "sym", indentationLevel: indentationLevel) - self.addProperty(forValue: type, gpx: gpx, tagName: "type", indentationLevel: indentationLevel) - - if let fix = self.fix?.rawValue { - self.addProperty(forValue: fix, gpx: gpx, tagName: "fix", indentationLevel: indentationLevel) - } - - self.addProperty(forIntegerValue: satellites, gpx: gpx, tagName: "sat", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: horizontalDilution, gpx: gpx, tagName: "hdop", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: verticalDilution, gpx: gpx, tagName: "vdop", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: positionDilution, gpx: gpx, tagName: "pdop", indentationLevel: indentationLevel) - self.addProperty(forDoubleValue: ageofDGPSData, gpx: gpx, tagName: "ageofdgpsdata", indentationLevel: indentationLevel) - self.addProperty(forIntegerValue: DGPSid, gpx: gpx, tagName: "dgpsid", indentationLevel: indentationLevel) - - if self.extensions != nil { - self.extensions?.gpx(gpx, indentationLevel: indentationLevel) - } - } -} diff --git a/Pods/CoreGPX/Classes/GPXWaypointProtocol.swift b/Pods/CoreGPX/Classes/GPXWaypointProtocol.swift deleted file mode 100644 index 2035cee9..00000000 --- a/Pods/CoreGPX/Classes/GPXWaypointProtocol.swift +++ /dev/null @@ -1,157 +0,0 @@ -// -// GPXWaypointProtocol.swift -// Pods -// -// Created by Vincent Neo on 13/6/20. -// - -import Foundation - -public protocol GPXWaypointProtocol: GPXElement { - // MARK:- Attributes of a waypoint - - /// Elevation of current point - /// - /// Should be in unit **meters** (m) - var elevation: Double? { get set } - - /// Date and time of current point - /// - /// Should be in **Coordinated Universal Time (UTC)**, without offsets, not local time. - var time: Date? { get set } - - /// Magnetic Variation of current point - /// - /// Should be in unit **degrees** (º) - var magneticVariation: Double? { get set } - - /// Geoid Height of current point - /// - /// Should be in unit **meters** (m). Height of geoid, or mean sea level, above WGS84 earth ellipsoid - var geoidHeight: Double? { get set } - - /// Name of current point - /// - /// - Warning: - /// - This attribute may not be useful, in schema context. - /// - This is carried over from GPX schema, to be compliant with the schema. - var name: String? { get set } - - /// Comment of current point - /// - /// - Warning: - /// - This attribute may not be useful, in schema context. - /// - This is carried over from GPX schema, to be compliant with the schema. - var comment: String? { get set } - - /// Description of current point - /// - /// - Warning: - /// - This attribute may not be useful, in schema context. - /// - This is carried over from GPX schema, to be compliant with the schema. - var desc: String? { get set } - - /// Source of data of current point - /// - /// For assurance that current point is reliable - var source: String? { get set } - - /// Text of GPS symbol name - /// - /// - Warning: - /// - This attribute does not appear to be useful due to `CoreLocation` API. - /// - This is carried over from GPX schema, to be compliant with the schema. - var symbol: String? { get set } - - /// Type of current point - var type: String? { get set } - - /// Type of GPS fix of current point, represented as a number - /// - /// - **Supported Types:** (written in order) - /// - **None**: No fix - /// - **2D**: Position only - /// - **3D**: Position and Elevation - /// - **DGPS**: Differential GPS - /// - **PPS**: Military Signal - /// - /// Unknown fix should leave fix attribute as `nil` - /// - Warning: - /// - This attribute may have limited usefulness due to `CoreLocation` API. - /// - This is carried over from GPX schema, to be compliant with the schema. - var fix: GPXFix? { get set } - - /// Number of satellites used to calculate GPS fix of current point - var satellites: Int? { get set } - - /// Horizontal dilution of precision of current point - var horizontalDilution: Double? { get set } - - /// Vertical dilution of precision of current point - var verticalDilution: Double? { get set } - - /// Position dilution of precision of current point - var positionDilution: Double? { get set } - - /// Age of DGPS Data - /// - /// Number of seconds since last DGPS update - /// - /// - Warning: - /// - This attribute may not be useful. - /// - This is carried over from GPX schema, to be compliant with the schema. - var ageofDGPSData: Double? { get set } - - /// DGPS' ID - /// - /// ID of DGPS station used in differential correction. - /// - /// - Warning: - /// - This attribute may not be useful. - /// - This is carried over from GPX schema, to be compliant with the schema. - var DGPSid: Int? { get set } - - - /// Latitude of current point - /// - /// - Latitude value should be within range of **-90 to 90** - /// - Should be in unit **degrees** (º) - /// - Should conform to WGS 84 datum. - /// - var latitude: Double? { get set } - - /// Longitude of current point - /// - /// - Longitude value should be within range of **-180 to 180** - /// - Should be in unit **degrees** (º) - /// - Should conform to WGS 84 datum. - /// - var longitude: Double? { get set } - -} - -extension GPXWaypointProtocol { - func convert() -> T { - let wpt = T() - wpt.elevation = elevation - wpt.time = time - wpt.magneticVariation = magneticVariation - wpt.geoidHeight = geoidHeight - wpt.name = name - wpt.comment = comment - wpt.desc = desc - wpt.source = source - wpt.symbol = symbol - wpt.type = type - wpt.fix = fix - wpt.satellites = satellites - wpt.horizontalDilution = horizontalDilution - wpt.verticalDilution = verticalDilution - wpt.positionDilution = positionDilution - wpt.ageofDGPSData = ageofDGPSData - wpt.DGPSid = DGPSid - wpt.latitude = latitude - wpt.longitude = longitude - return wpt - } -} diff --git a/Pods/CoreGPX/Classes/NSMutableString+XML.swift b/Pods/CoreGPX/Classes/NSMutableString+XML.swift deleted file mode 100644 index ced5ecec..00000000 --- a/Pods/CoreGPX/Classes/NSMutableString+XML.swift +++ /dev/null @@ -1,46 +0,0 @@ -// -// NSMutableString+XML.swift -// CoreGPX -// -// Created by Vincent Neo on 6/6/19. -// - -import Foundation - -/** - To ensure that all appended tags are appended with the right formats. - - For both open and close tags. - */ -extension NSMutableString { - - /// Appends an open tag - /// - /// This function will append an open tag with the right format. - /// - /// **Format it will append to:** - /// - /// "%@<%@%@>\r\n" - /// //indentations \r\n - func appendOpenTag(indentation: NSMutableString, tag: String, attribute: NSMutableString) { - self.appendFormat("%@<%@%@>\r\n", indentation, tag, attribute) - } - - /// Appends a close tag - /// - /// This function will append an close tag with the right format. - /// Not currently used, but included, for ease of use when needed. - /// - /// **Format it will append to:** - /// - /// "%@\r\n" - /// //indentations \r\n - func appendCloseTag(indentation: NSMutableString, tag: String) { - self.appendFormat("%@\r\n", indentation, tag) - } - - /// Appends attributes to a tag - func appendAttributeTag(_ attribution: String, value: CVarArg) { - self.appendFormat(" %@=\"%@\"", attribution, value) - } -} diff --git a/Pods/CoreGPX/LICENSE b/Pods/CoreGPX/LICENSE deleted file mode 100644 index 5301f276..00000000 --- a/Pods/CoreGPX/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2018 Vincent Neo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Pods/CoreGPX/README.md b/Pods/CoreGPX/README.md deleted file mode 100644 index f969bbfe..00000000 --- a/Pods/CoreGPX/README.md +++ /dev/null @@ -1,104 +0,0 @@ -

- -

-

- - Parse and generate GPX files easily on iOS, watchOS & macOS. - -
- - - - - - - - - - - - - - - -
- - - - - - - - - -

- -## What is CoreGPX? -CoreGPX is a port of iOS-GPX-Framework to Swift language. - -CoreGPX currently supports all GPX tags listed in GPX v1.1 schema, along with the recent addition of GPX v1.0 support. It can generate and parse GPX compliant files on iOS, macOS and watchOS. - -As it makes use of `XMLParser` for parsing GPX files, CoreGPX is fully dependent on the `Foundation` API only. - -## Features -- [x] Successfully outputs string that can be packaged into a GPX file -- [x] Parses GPX files using native XMLParser -- [x] Support for iOS, macOS & watchOS -- [x] Supports `Codable` in essential classes -- [x] Enhanced full support for `GPXExtensions` for both parsing and creating. -- [x] Lossy GPX compression. Check out [GPXCompressor](https://github.com/vincentneo/GPXCompressor) for an implementation of this new feature. -- [x] **(new)** Legacy GPX support. (GPX 1.0 and below) - -## Documentation - -CoreGPX is documented using [jazzy](https://github.com/realm/jazzy). - -[![Documentation Status](https://vincentneo.github.io/CoreGPX/badge.svg)](https://vincentneo.github.io/CoreGPX/index.html) - -You can read the documentation [here](https://vincentneo.github.io/CoreGPX/index.html), which documents most of the important features that will be used for parsing and creating of GPX files. - -## Installation - -CoreGPX supports CocoaPods, Carthage, as well as Swift Package Manager, such that you can install it, any way you want. - -To install using [CocoaPods](https://cocoapods.org), simply add the following line to your Podfile: - -```ruby -pod 'CoreGPX' -``` - -CoreGPX works with [Carthage](https://github.com/Carthage/Carthage) as well, simply add the following line to your Cartfile: -```Swift -github "vincentneo/CoreGPX" -``` - -## How to use? -Check out the [wiki page](https://github.com/vincentneo/CoreGPX/wiki) for some basic walkthroughs of how to use this library. - -Alternatively, you may check out the Example app, by cloning the repo, `pod install` and running the Example project. - -To know in-depth of how CoreGPX can be used in a true production setting, please refer to awesome projects like [iOS-Open-GPX-Tracker](https://github.com/merlos/iOS-Open-GPX-Tracker) or [Avenue GPX Viewer](https://github.com/vincentneo/Avenue-GPX-Viewer), both of which, uses CoreGPX. - -## Extras -Check out the Extras folder for some extra helper codes that may help you with using CoreGPX. -Simply drag and drop it into your project to use. - - `GPX+CLLocation.swift`: Converting `CLLocation` type to `GPXWaypoint`, `GPXTrackPoint` and more. - -## Contributing -Contributions to this project will be more than welcomed. Feel free to add a pull request or open an issue. -If you require a feature that has yet to be available, do open an issue, describing why and what the feature could bring and how it would help you! - -## Previous Builds Logs -History of older build logs can be found at Travis CI: -[![Travis CI](https://travis-ci.com/vincentneo/CoreGPX.svg?branch=master)](https://travis-ci.com/vincentneo/CoreGPX) - -CoreGPX recently switched to GitHub Actions due to the loss of free tier Travis CI for open sourced Mac-based projects. - - -## Like the project? Check out these too! -- [iOS-Open-GPX-Tracker](https://github.com/merlos/iOS-Open-GPX-Tracker), an awesome open-sourced GPS tracker for iOS and watchOS. -- [Avenue GPX Viewer](https://github.com/vincentneo/Avenue-GPX-Viewer), a GPX file viewer, written for macOS 10.12 and above. -- [LocaleComplete](https://github.com/vincentneo/LocaleComplete), a small library to make `Locale` identifier hunting more easy and straightforward. - -## License -CoreGPX is available under the MIT license. See the LICENSE file for more info. diff --git a/Pods/InAppSettingsKit/LICENSE b/Pods/InAppSettingsKit/LICENSE deleted file mode 100644 index 0f199d40..00000000 --- a/Pods/InAppSettingsKit/LICENSE +++ /dev/null @@ -1,14 +0,0 @@ -Copyright (c) 2009-2014: -Luc Vandal, Edovia Inc., http://www.edovia.com -Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -All rights reserved. - -It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -as the original authors of this code. You can give credit in a blog post, a tweet or on -a info page of your app. Also, the original authors appreciate letting them know if you -use this code. - -The above copyright notice and this permission notice shall be included in all copies -or substantial portions of the Software. - -This code is licensed under the BSD license that is available at: diff --git a/Pods/InAppSettingsKit/README.md b/Pods/InAppSettingsKit/README.md deleted file mode 100644 index 4bf7576e..00000000 --- a/Pods/InAppSettingsKit/README.md +++ /dev/null @@ -1,370 +0,0 @@ -# InAppSettingsKit - -[![Build Status](https://travis-ci.org/futuretap/InAppSettingsKit.svg?branch=master)](https://travis-ci.org/futuretap/InAppSettingsKit) -[![Version](https://img.shields.io/cocoapods/v/InAppSettingsKit.svg?style=flat)](http://cocoapods.org/pods/InAppSettingsKit) -[![Swift Package Manager compatible](https://img.shields.io/badge/SPM-compatible-brightgreen.svg)](https://swiftpackageindex.com/futuretap/InAppSettingsKit) -[![Carthage compatible](https://img.shields.io/badge/Carthage-compatible-4BC51D.svg?style=flat)](https://github.com/Carthage/Carthage) -[![License](https://img.shields.io/cocoapods/l/InAppSettingsKit.svg?style=flat)](https://github.com/futuretap/InAppSettingsKit/blob/master/LICENSE) -![Platform](https://img.shields.io/badge/Platforms-iOS%20|%20macOS%20Catalyst-lightgrey.svg) -[![Sponsor](https://img.shields.io/badge/Sponsor-ff40a0)](https://github.com/sponsors/futuretap) -[![Twitter](https://img.shields.io/twitter/follow/ortwingentz.svg?style=social&label=Follow)](https://twitter.com/ortwingentz) - -InAppSettingsKit (IASK) is an open source framework to easily add in-app settings to your iOS or Catalyst apps. Normally iOS apps use the `Settings.bundle` resource to add app-specific settings in the Settings app. InAppSettingsKit takes advantage of the same bundle and allows you to present the same settings screen within your app. So the user has the choice where to change the settings. - -IASK not only replicates the feature set of system settings but supports a large number of additional elements and configuration options. - -**Updating from IASK 2.x?** Please read the [Release Notes](RELEASE_NOTES.md). - -![](IASK.gif) - -- [How does it work?](#how-does-it-work) -- [How to include it?](#how-to-include-it) -- [App Integration](#app-integration) -- [Goodies](#goodies) - - [Custom inApp plists](#custom-inapp-plists) - - [Privacy link](#privacy-link) - - [Open URL](#open-url) - - [Mail Composer](#mail-composer) - - [Button](#button) - - [Multiline Text View](#multiline-text-view) - - [Date Picker](#date-picker) - - [List Groups](#list-groups) - - [Custom Views](#custom-views) - - [Section Headers and Footers](#section-headers-and-footers) - - [Extending Child Panes](#extending-child-panes) - - [Extending various specifiers](#extending-various-specifiers) - - [Extending Text Fields](#extending-text-fields) - - [Customizing Toggles](#customizing-toggles) - - [Dynamic MultiValue Lists](#dynamic-multivalue-lists) - - [Settings Storage](#settings-storage) - - [Notifications](#notifications) - - [Dynamic cell hiding](#dynamic-cell-hiding) - - [Register default values](#register-default-values) -- [iCloud sync](#icloud-sync) -- [Support](#support) -- [License](#license) -- [Author](#author) - - -# How does it work? - -To support traditional Settings.app panes, the app must include a `Settings.bundle` with at least a `Root.plist` to specify the connection of settings UI elements with `NSUserDefaults` keys. InAppSettingsKit basically just uses the same Settings.bundle to do its work. This means there's no additional work when you want to include a new settings parameter. It just has to be added to the Settings.bundle and it will appear both in-app and in Settings.app. All settings types like text fields, sliders, toggle elements, child views etc. are supported. - - -# How to include it? - -The source code is available on [github](http://github.com/futuretap/InAppSettingsKit). There are several ways of installing it: - -**Using SPM** - -Add to your Package.swift - - .package(name: "InAppSettingsKit", url: "https://github.com/futuretap/InAppSettingsKit.git", .branch("master")) - -Alternatively go to Xcodes `File->Swift Packages->Add Package Dependency...` menu entry and add `https://github.com/futuretap/InAppSettingsKit.git`. - -**Using CocoaPods** - -Add to your `Podfile`: - - pod 'InAppSettingsKit' - -**Using Carthage** - -Add to your `Cartfile`: - - github "futuretap/InAppSettingsKit" "master" - -# App Integration - -In order to start using IASK add `Settings.bundle` to your project (`File` -> `Add File` -> `Settings bundle`) and edit `Root.plist` with your settings (see Apple's documentation on the [Schema File Root Content](https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/UserDefaults/Preferences/Preferences.html)). Read on to get insight into more advanced uses. - -To display InAppSettingsKit, instantiate `IASKAppSettingsViewController` and push it onto the navigation stack or embed it as the root view controller of a navigation controller. - -**In code, using Swift:** -```swift -let appSettingsViewController = IASKAppSettingsViewController() -navigationController.pushViewController(appSettingsViewController, animated: true) -``` - -**In code, using Objective-C:** -```objc -IASKAppSettingsViewController *appSettingsViewController = [[IASKAppSettingsViewController alloc] init]; -[self.navigationController pushViewController:appSettingsViewController animated:YES]; -``` - -**Via storyboard:** - -- Drag and drop a Table View Controller embedded into a Navigation Controller into your app and wire the storyboard to your app UI -- Set the Table View Controller class to `IASKAppSettingsViewController` -- Set the Table View to "Grouped" style. -- If you’re presenting the navigation controller modally: - - In the Table View Controller set "Show Done Button" under "App Settings View Controller" to "On" - - Set the delegate comforming to `IASKAppSettingsViewControllerDelegate`. - - Implement the delegate method `-settingsViewControllerDidEnd:` and dismiss the view controller. - -The sample application shows how to wire everything up. - -**Additional changes** - -To customize the behavior, implement `IASKSettingsDelegate` and set the `delegate` property of `IASKAppSettingsViewController`. For advanced customization needs, subclassing of IASKAppSettingsViewController is supported. - -Depending on your project it might be needed to make some changes in the startup code of your app. Your app has to be able to reconfigure itself at runtime if the settings are changed by the user. This could be done in a `-reconfigure` method that is being called from `-applicationDidFinishLaunching` as well as in the delegate method `-settingsViewControllerDidEnd:` of `IASKAppSettingsViewController`. - - -# Goodies -The intention of InAppSettingsKit was to create a 100% imitation of the Settings.app behavior (see the [Apple Settings Application Schema Reference](https://developer.apple.com/library/archive/documentation/PreferenceSettings/Conceptual/SettingsApplicationSchemaReference/Introduction/Introduction.html#//apple_ref/doc/uid/TP40007071)). On top of that, we added a ton of bonus features that make IASK much more flexible and dynamic. - - -## Custom inApp plists -Settings plists can be device-dependent: `Root~ipad.plist` will be used on iPad and `Root~iphone.plist` on iPhone. If not existent, `Root.plist` will be used. - -InAppSettingsKit adds the possibility to override those standard files by using `.inApp.plist` instead of `.plist`. Alternatively, you can create a totally separate bundle named `InAppSettings.bundle` instead of the usual `Settings.bundle`. The latter approach is useful if you want to suppress the settings in Settings.app. - -This is the complete search order for the plists: - -- InAppSettings.bundle/FILE~DEVICE.inApp.plist -- InAppSettings.bundle/FILE.inApp.plist -- InAppSettings.bundle/FILE~DEVICE.plist -- InAppSettings.bundle/FILE.plist -- Settings.bundle/FILE~DEVICE.inApp.plist -- Settings.bundle/FILE.inApp.plist -- Settings.bundle/FILE~DEVICE.plist -- Settings.bundle/FILE.plist - - -## Privacy link -If the app includes a usage key for various privacy features such as camera or location access in its `Info.plist`, IASK displays a "Privacy" cell at the top of the root settings page. This cell opens the system Settings app and displays the settings pane for the app where the user can specify the privacy settings for the app. - -If you don't want to show Privacy cells, set the property `neverShowPrivacySettings` to `YES`. - -The sample app defines `NSMicrophoneUsageDescription` to let the cell appear. Note that the settings page doesn't show any privacy settings yet because the app doesn't actually access the microphone. Privacy settings only show up in the Settings app after first use of the privacy-protected API. - - -## Open URL -InAppSettingsKit adds a new element `IASKOpenURLSpecifier` that allows to open a specified URL using an external application (i.e. Safari or Mail). The URL to launch is specified in the `File` parameter. See the sample `Root.inApp.plist` for details. - - -## Mail Composer -The custom `IASKMailComposeSpecifier` element allows to send mail from within the app by opening a mail compose view. You can set the following (optional) parameters using the settings plist: `IASKMailComposeToRecipents`, `IASKMailComposeCcRecipents`, `IASKMailComposeBccRecipents`, `IASKMailComposeSubject`, `IASKMailComposeBody`, `IASKMailComposeBodyIsHTML`. Optionally, you can implement - - - (BOOL)settingsViewController:(id)settingsViewController shouldPresentMailComposeViewController:(MFMailComposeViewController*)mailComposeViewController forSpecifier:(IASKSpecifier*)specifier; - -in your delegate to customize the mail (e.g. pre-fill the body with dynamic content, add attachments) modify the appearance of the compose view controller or even block the standard presentation. An alert is displayed if Email is not configured on the device. `IASKSpecifier` is the internal model object defining a single settings cell. Important IASKSpecifier properties: - -- `key`: corresponds to the `Key` in the Settings plist -- `title`: the localized title of settings key -- `type`: corresponds to the `Type` in the Settings plist -- `defaultValue`: corresponds to the `DefaultValue` in the Settings plist - - -## Button -InAppSettingsKit adds a `IASKButtonSpecifier` element that allows to call a custom action. Just add the following delegate method: - - - (void)settingsViewController:(IASKAppSettingsViewController*)sender buttonTappedForSpecifier:(IASKSpecifier*)specifier; - -The sender is always an instance of `IASKAppSettingsViewController`, a `UIViewController` subclass. So you can access its view property (might be handy to display an action sheet) or push another view controller. Another nifty feature is that the title of IASK buttons can be overriden by the (localizable) value from `NSUserDefaults` (or any other settings store - see below). This comes in handy for toggle buttons (e.g. Login/Logout). See the sample app for details. - -By default, Buttons are aligned centered except if an image is specified (default: left-aligned). The default alignment may be overridden. - - -## Multiline Text View -Similar to standard text fields, `IASKTextViewSpecifier` displays a full-width, multi line text view that resizes according to the entered text. It also supports `KeyboardType`, `AutocapitalizationType` and `AutocorrectionType`. - - -## Date Picker -`IASKDatePickerSpecifier` displays a `UIDatePicker` to set a date and/or time. It supports the following options: - - - `DatePickerMode`: one of `Date`, `Time`, or `DateAndTime` (see [UIDatePickerMode](https://developer.apple.com/documentation/uikit/uidatepickermode)). Default is `DateAndTime`. - - `DatePickerStyle`: one of `Compact`, `Wheels`, or `Inline` (see [UIDatePickerStyle](https://developer.apple.com/documentation/uikit/uidatepickerstyle)). Default is `Wheels`. Feature requires iOS 14 or higher. If the OS doesn't support it, IASK falls back to `Wheels`. - - `MinuteInterval`: The interval at which the date picker displays minutes. Default: 1. - -There are 3 optional delegate methods to customize how to store and display dates and times: - - - (NSDate*)settingsViewController:(IASKAppSettingsViewController*)sender dateForSpecifier:(IASKSpecifier*)specifier; - -Implement this if you store the date/time in a custom format other than as `NSDate` object. Called when the user starts editing a date/time by selecting the title cell above the date/time picker. - - - (NSString*)settingsViewController:(IASKAppSettingsViewController*)sender datePickerTitleForSpecifier:(IASKSpecifier*)specifier; - -Implement this to customize the displayed value in the title cell above the date/time picker. - - - (void)settingsViewController:(IASKAppSettingsViewController*)sender setDate:(NSDate*)date forSpecifier:(IASKSpecifier*)specifier; - -Implement this if you store the date/time in a custom format other than an `NSDate` object. Called when the user changes the date/time value using the picker. - - -## List Groups -List groups (`IASKListGroupSpecifier`) are an IASK-only feature that allow you to manage a variable number of items, including adding and deleting items. Arrays of tags, accounts, names are typical use cases. A list group consists of a variable number of `ItemSpecifier` items. The number of these items is determined by your actual content in your NSUserDefaults (or your custom settings store). In other words, `ItemSpecifier` defines the type of cell, whereas the number of cells and their content comes from NSUserDefaults or your store. Cells can be deleted via swipe if the `Deletable` parameter is set to YES. - -Optionally, a list group also has an `AddSpecifier` that controls the last item of the list group section. It is used to add items and could be a text field, a toggle, a slider, or a child pane. While the first three create a new item after editing is complete, a child pane presents a modal child view controller to configure a complex item, saved as a dictionary. Such child panes work very similarly to normal child panes with a few differences: They are presented not via push but modally and have a Cancel and Done button in the navigation bar. A new item is created by tapping the Done button. - -You may want to specify some validation rules that need to be met before enabling the Done button. This can be achieved with the delegate method: - - - (BOOL)settingsViewController:childPaneIsValidForSpecifier:contentDictionary: - -The Done button is disabled when returning false from this method. Also note that the `contentDictionary` is a mutable dictionary. If you change some of the values, the UI will reflect that. This allows you to autocorrect invalid settings. - - - -## Custom Views -You can specify your own `UITableViewCell` within InAppSettingsKit by using the type `IASKCustomViewSpecifier`. A mandatory field in this case is the `Key` attribute. Also, you have to support the `IASKSettingsDelegate` protocol and implement these methods: - - - (CGFloat)settingsViewController:(UITableViewController *)settingsViewController heightForSpecifier:(IASKSpecifier *)specifier; - - (UITableViewCell*)settingsViewController:(UITableViewController *)settingsViewController cellForSpecifier:(IASKSpecifier*)specifier; - -Both methods are called for all your `IASKCustomViewSpecifier` entries. To differentiate them, you can access the `Key` attribute using `specifier.key`. In the first method you return the height of the cell, in the second method the cell itself. You should use reusable `UITableViewCell` objects as usual in table view programming. There's an example in the Demo app. - -Optionally you can implement - - - (void)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - didSelectCustomViewSpecifier:(IASKSpecifier*)specifier; - -to catch tap events for your custom view. - -If you specify `File`, `IASKViewControllerClass`, `IASKViewControllerStoryBoardId`, or `IASKSegueIdentifier` (see below), the selection behavior of a custom view is identical to a child pane and the delegate is not called on selection. - - - -## Section Headers and Footers -The FooterText key for Group elements is available in system settings. It is supported in InAppSettingsKit as well. On top of that, we support this key for Multi Value elements as well. The footer text is displayed below the table of multi value options. - -You can define a custom header view for `PSGroupSpecifier` segments by adding a `Key` attribute and implementing the following method in your `IASKSettingsDelegate`: - - - (UIView *)settingsViewController:(id)settingsViewController tableView:(UITableView *)tableView viewForHeaderForSection:(NSInteger)section; - -You can adjust the height of the header by implementing the following method: - - - (CGFloat)settingsViewController:(id)settingsViewController tableView:(UITableView*)tableView heightForHeaderForSection:(NSInteger)section; - -For simpler header title customization without the need for a custom view, and provided the `-settingsViewController:tableView:viewForHeaderForSection:` method has not been implemented or returns `nil` for the section, implement the following method: - - - (NSString *)settingsViewController:(id)settingsViewController tableView:(UITableView*)tableView titleForHeaderForSection:(NSInteger)section; - -If the method returns `nil` or a 0-length string, the title defined in the `.plist` will be used. - -This behaviour is similar to custom table view cells. When implementing a method and if you need it, the section key can be retrieved from its index conveniently with: - - NSString *key = [settingsViewController.settingsReader keyForSection:section]; - -Check the demo app for a concrete example. - -For footer customization, three methods from the `IASKSettingsDelegate` protocol can be similarly implemented. - - -## Extending Child Panes - -### Custom ViewControllers -For child pane elements (`PSChildPaneSpecifier`), Apple requires a `file` key that specifies the child plist. InAppSettingsKit allow to alternatively specify `IASKViewControllerClass` and `IASKViewControllerSelector`. In this case, the child pane is displayed by instantiating a UIViewController subclass of the specified class and initializing it using the init method specified in the `IASKViewControllerSelector`. The selector must have two arguments: an `NSString` argument for the file name in the Settings bundle and the `IASKSpecifier`. The custom view controller is then pushed onto the navigation stack. See the sample app for more details. - -### Using Custom ViewControllers from StoryBoard -Alternatively specify `IASKViewControllerStoryBoardId` to initiate a viewcontroller from [main storyboard](https://developer.apple.com/library/ios/documentation/general/conceptual/Devpedia-CocoaApp/Storyboard.html/). -Specify `IASKViewControllerStoryBoardFile` to use a storyboard other than the main storyboard from the app’s `Info.plist`. - -### Perform Segues -As an alternative to `IASKViewControllerClass` and `IASKViewControllerSelector` for child pane elements (`PSChildPaneSpecifier`), InAppSettingsKit is able to navigate to another view controller, by performing any segue defined in your storyboard. To do so specify the segue identifier in `IASKSegueIdentifier`. - - -## Extending various specifiers - -### Subtitles -The `IASKSubtitle` key allows to define subtitles for these elements: Toggle, ChildPane, OpenURL, MailCompose, Button. Using a subtitle implies left alignment. -A child pane displays its value as a subtitle, if available and no `IASKSubtitle` is specified. -The subtitle can be a localizable String or a Dictionary with localizable subtitles depending on the current value. `YES` and `NO` are used as keys for boolean toggle values. The dictionary may contain a `__default__` key to define a subtitle if no key is matching. - -### Text alignment -For some element types, a `IASKTextAlignment` attribute may be added with the following values to override the default alignment: - -- `IASKUITextAlignmentLeft` (ChildPane, TextField, Buttons, OpenURL, MailCompose) -- `IASKUITextAlignmentCenter` (ChildPane, Buttons, OpenURL) -- `IASKUITextAlignmentRight` (ChildPane, TextField, Buttons, OpenURL, MailCompose) - -### Variable font size -By default, the labels in the settings table are displayed in a variable font size, especially handy to squeeze-in long localizations (beware: this might break the look in Settings.app if labels are too long!). -To disable this behavior, add a `IASKAdjustsFontSizeToFitWidth` Boolean attribute with value `NO`. - -### Icons -All element types (except sliders which already have a `MinimumValueImage`) support an icon image on the left side of the cell. You can specify the image name in an optional `IASKCellImage` attribute. The ".png" or "@2x.png" suffix is automatically appended and will be searched in the project. Optionally, you can add an image with suffix "Highlighted.png" or "Highlighted@2x.png" to the project and it will be automatically used as a highlight image when the cell is selected (for Buttons and ChildPanes). - - -## Extending Text Fields -### Placeholder -The `IASKPlaceholder` key allows to define placeholder for TextField and TextView (`IASKTextViewSpecifier`). - -### Content Type -To support autofill based on the content type, add the `IASKTextContentType` key accepting the (prefix-less) constant names of [UITextContentType](https://developer.apple.com/documentation/uikit/uitextcontenttype). -Example: to configure a text field with `UITextContentTypeEmailAddress`, use `IASKTextContentType`: `EmailAddress`. - -### Validation -Text fields can be validated using the delegate callback: - - - (IASKValidationResult)settingsViewController:(IASKAppSettingsViewController*)settingsViewController validateSpecifier:(IASKSpecifier*)specifier textField:(IASKTextField*)textField previousValue:(nullable NSString*)previousValue replacement:(NSString* _Nonnull __autoreleasing *_Nullable)replacement; - -The callback receives the `IASKTextField` which is a `UITextField` subclass to allow styling of the text field in case of a validation error (e.g. red text). It contains a replacement out parameter to replace invalid text. Returning `IASKValidationResultFailedWithShake` lets the text field shake to visually indicate the validation error. - - -## Customizing Toggles -`PSToggleSwitchSpecifier` switches use a `UISwitch` by default. By specifying the option `IASKToggleStyle`: `Checkmark`, checkmarks are displayed for selected keys. - - -## Dynamic MultiValue Lists -MultiValue lists (`PSMultiValueSpecifier`) can fetch their values and titles dynamically from the delegate instead of the static Plist. Implement these two methods in your `IASKSettingsDelegate`: - - - (NSArray*)settingsViewController:(IASKAppSettingsViewController*)sender valuesForSpecifier:(IASKSpecifier*)specifier; - - (NSArray*)settingsViewController:(IASKAppSettingsViewController*)sender titlesForSpecifier:(IASKSpecifier*)specifier; - -The sample app returns a list of all country codes as values and the localized country names as titles. - -MultiValue lists can be sorted alphabetically by adding a `true` Boolean `DisplaySortedByTitle` key in the Plist. -MultiValue list entries can be given an image. Specify images via the `IconNames` attribute (next to Values/Titles/ShortTitles etc.). - - -## Settings Storage -The default behaviour of IASK is to store the settings in `[NSUserDefaults standardUserDefaults]`. However, it is possible to change this behavior by setting the `settingsStore` property on an `IASKAppSettingsViewController`. IASK comes with two store implementations: `IASKSettingsStoreUserDefaults` (the default one) and `IASKSettingsStoreFile`, which read and write the settings in a file of the path you choose. If you need something more specific, you can also choose to create your own store. The easiest way to create your own store is to create a subclass of `IASKAbstractSettingsStore`. Only 3 methods are required to override. See `IASKSettingsStore.{h,m}` for more details. - - -## Notifications -There's a `IASKSettingChangedNotification` notification that is sent for every changed settings key. The `object` of the notification is the sending view controller and the `userInfo` dictionary contains the key and new value of the affected key. - - -## Dynamic cell hiding -Sometimes, options depend on each other. For instance, you might want to have an "Auto Connect" switch, and let the user set username and password if enabled. To react on changes of a specific setting, use the `IASKSettingChangedNotification` notification explained above. - -To hide a set of cells use: - - - (void)[IASKAppSettingsViewController setHiddenKeys:(NSSet*)hiddenKeys animated:(BOOL)animated]; - -or the non-animated version: - - @property (nonatomic, strong) NSSet *hiddenKeys; - -See the sample app for more details. Including a `PSGroupSpecifier` key in the `hiddenKeys` hides the complete section. - - -## Register default values -Settings property lists support the `DefaultValue` parameter to display default values in case there’s no value stored in `NSUserDefaults`. However, when the app queries `NSUserDefaults` for the value, that default value is not propagated. This makes sense since `NSUserDefaults` doesn’t know about settings property lists. - -To initially set values for the various settings keys, `NSUserDefaults` provides the `registerDefaults:` method that takes a dictionary of "fallback" values that are returned from `NSUserDefaults` if no value has been stored. This is typically called at app launch. - -However, creating and maintaining that dictionary can be cumbersome and there’s a risk that this dictionary and the settings default values get out of sync. - -To address this, `IASKSettingsReader` provides a method that generates this dictionary by traversing the Root.plist and all child plists and gathering the `DefaultValue` for all keys. - - NSDictionary *defaultDict = [appSettingsViewController.settingsReader gatherDefaultsLimitedToEditableFields:YES]; - [NSUserDefaults.standardUserDefaults registerDefaults:defaultDict]; - - -# iCloud sync -To sync your `NSUserDefaults` with iCloud, there's another project called [FTiCloudSync](https://github.com/futuretap/FTiCloudSync) which is implemented as a category on `NSUserDefaults`: All write and remove requests are automatically forwarded to iCloud and all updates from iCloud are automatically stored in `NSUserDefaults`. InAppSettingsKit automatically updates the UI if the standard `NSUserDefaults` based store is used. - -# Support -Please don't use Github issues for support requests, we'll close them. Instead, post your question on [StackOverflow](http://stackoverflow.com) with tag `inappsettingskit`. - - -# License -We released the code under the liberal BSD license in order to make it possible to include it in every project, be it a free or paid app. The only thing we ask for is giving the original developers some credit. The easiest way to include credits is by leaving the "Powered by InAppSettingsKit" notice in the code. If you decide to remove this notice, a noticeable mention on the App Store description page or homepage is fine, too. - -# Author -Originally developed by my friend Luc Vandal, I took over the development and continue to update the framework. If you would like to support my Open Source work, consider joining me as a [sponsor](https://github.com/sponsors/futuretap)! 💪️ Your sponsorship enables me to spend more time on InAppSettingsKit and other community projects. Thank you! - -*Ortwin Gentz* diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m deleted file mode 100644 index 4d1dd9e4..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m +++ /dev/null @@ -1,1314 +0,0 @@ -// -// IASKAppSettingsViewController.m -// InAppSettingsKit -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - - -#import "IASKAppSettingsViewController.h" -#import "IASKSwitch.h" -#import "IASKDatePicker.h" -#import "IASKTextView.h" -#import "IASKSettingsReader.h" -#import "IASKMultipleValueSelection.h" -#import "IASKSettingsStoreUserDefaults.h" -#import "IASKSpecifier.h" -#import "IASKSlider.h" -#import "IASKEmbeddedDatePickerViewCell.h" -#import "IASKPSTextFieldSpecifierViewCell.h" -#import "IASKTextField.h" -#import "IASKTextViewCell.h" -#import "IASKPSSliderSpecifierViewCell.h" -#import "IASKSpecifierValuesViewController.h" -#import "IASKSettingsStoreInMemory.h" - -#if !__has_feature(objc_arc) -#error "IASK needs ARC" -#endif - -static NSString *kIASKCredits = @"Powered by InAppSettingsKit"; // Leave this as-is!!! - -#define kIASKSpecifierValuesViewControllerIndex 0 -#define kIASKSpecifierChildViewControllerIndex 1 - -#define kIASKCreditsViewWidth 285 - -CGRect IASKCGRectSwap(CGRect rect); - -@interface IASKAppSettingsViewController () - -@property (nonatomic, weak) UIViewController *currentChildViewController; -@property (nonatomic, strong) NSMutableDictionary *rowHeights; -@property (nonatomic, strong) UIColor *tintColor; -@property (nonatomic) BOOL reloadDisabled; -@property (nonatomic, strong) NSArray *selections; /// The selected index for every group (in case it's a radio group). - -- (void)synchronizeSettings; -- (void)userDefaultsDidChange; -- (void)reload; -@end - -@implementation IASKAppSettingsViewController -//synthesize properties from protocol -@synthesize settingsReader = _settingsReader; -@synthesize settingsStore = _settingsStore; -@synthesize file = _file; -@synthesize childPaneHandler = _childPaneHandler; -@synthesize currentFirstResponder = _currentFirstResponder; -@synthesize listParentViewController; - -#pragma mark accessors -- (IASKSettingsReader*)settingsReader { - if (!_settingsReader) { - _settingsReader = [[IASKSettingsReader alloc] initWithFile:self.file]; - if (self.neverShowPrivacySettings) { - _settingsReader.showPrivacySettings = NO; - } - } - _settingsReader.settingsStore = self.settingsStore; - return _settingsReader; -} - -- (void)setSettingsStore:(id)settingsStore { - _settingsStore = settingsStore; - _settingsReader.settingsStore = _settingsStore; - - // Workaround for PSRadioGroupSpecifier's in List Groups - for (IASKMultipleValueSelection *selection in _selections) { - if (![selection isEqual:[NSNull null]]) { - selection.settingsStore = _settingsStore; - } - } -} - -- (id)settingsStore { - if (!_settingsStore) { - _settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; - } - return _settingsStore; -} - -- (NSString*)file { - if (!_file) { - self.file = @"Root"; - } - return _file; -} - -- (void)setFile:(NSString *)file { - _file = [file copy]; - self.tableView.contentOffset = CGPointMake(0, -self.tableView.contentInset.top); - self.settingsReader = nil; // automatically initializes itself - if (!_reloadDisabled) { - [self.tableView reloadData]; - [self createSelections]; - } -} - -- (void)createSelections { - NSMutableArray *sectionSelection = [NSMutableArray new]; - for (int section = 0; section < _settingsReader.numberOfSections; section++) { - IASKSpecifier *specifier = [self.settingsReader headerSpecifierForSection:section]; - if ([specifier.type isEqualToString:kIASKPSRadioGroupSpecifier]) { - IASKMultipleValueSelection *selection = [[IASKMultipleValueSelection alloc] initWithSettingsStore:self.settingsStore tableView:self.tableView specifier:specifier section:section]; - [sectionSelection addObject:selection]; - } else { - [sectionSelection addObject:[NSNull null]]; - } - } - _selections = sectionSelection; -} - -#pragma mark standard view controller methods -- (id)init { - return [self initWithStyle:UITableViewStyleGrouped]; -} - -- (id)initWithStyle:(UITableViewStyle)style { - if (style == UITableViewStylePlain) { - NSLog(@"WARNING: only \"grouped\" table view styles are supported by InAppSettingsKit."); - } - if ((self = [super initWithStyle:style])) { - [self configure]; - } - return self; -} - -- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil { - if (nibNameOrNil) { - NSLog (@"%@ is now deprecated, we are moving away from nibs.", NSStringFromSelector(_cmd)); - self = [super initWithStyle:UITableViewStyleGrouped]; - } else { - self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil]; - } - if (self) { - [self configure]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - if ((self = [super initWithCoder:aDecoder])) { - [self configure]; - _showDoneButton = NO; - } - return self; -} - -- (void)configure { - _reloadDisabled = NO; - _showDoneButton = YES; - _showCreditsFooter = YES; // display credits for InAppSettingsKit creators - self.clearsSelectionOnViewWillAppear = false; - self.rowHeights = [NSMutableDictionary dictionary]; -} - -- (void)viewDidLoad { - [super viewDidLoad]; - self.tableView.cellLayoutMarginsFollowReadableWidth = self.cellLayoutMarginsFollowReadableWidth; - UITapGestureRecognizer *tapGesture = [[UITapGestureRecognizer alloc] initWithTarget:self action:@selector(singleTapToEndEdit:)]; - tapGesture.cancelsTouchesInView = NO; - [self.tableView addGestureRecognizer:tapGesture]; - - if (_showDoneButton) { - UIBarButtonItem *buttonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone - target:self - action:@selector(dismiss:)]; - self.navigationItem.rightBarButtonItem = buttonItem; - } - - if (!self.title) { - self.title = NSLocalizedString(@"Settings", @""); - } -} - -- (void)viewWillAppear:(BOOL)animated { - NSIndexPath *selectedIndexPath = [self.tableView indexPathForSelectedRow]; - self.tintColor = self.view.tintColor; - - [super viewWillAppear:animated]; - - [self.tableView reloadData]; // values might have changed in the meantime - - if (selectedIndexPath) { - [self.transitionCoordinator animateAlongsideTransition:^(id context) { - // Do nothing. We're only interested in the completion handler. - } completion:^(id context) { - if (![context isCancelled]) { - // don't deselect if the user cancelled the interactive pop gesture - [self.tableView deselectRowAtIndexPath:selectedIndexPath animated:animated]; - } - }]; - - // reloadData destroys the selection at the end of the runloop. - // So select again in the next runloop. - dispatch_async(dispatch_get_main_queue(), ^(void){ - [self.tableView selectRowAtIndexPath:selectedIndexPath animated:NO scrollPosition:UITableViewScrollPositionNone]; - }); - } - - NSNotificationCenter *dc = NSNotificationCenter.defaultCenter; - [dc addObserver:self selector:@selector(didChangeSettingViaIASK:) name:kIASKAppSettingChanged object:nil]; - if ([self.settingsStore isKindOfClass:[IASKSettingsStoreUserDefaults class]]) { - IASKSettingsStoreUserDefaults *udSettingsStore = (id)self.settingsStore; - [dc addObserver:self selector:@selector(userDefaultsDidChange) name:NSUserDefaultsDidChangeNotification object:udSettingsStore.defaults]; - [self userDefaultsDidChange]; // force update in case of changes while we were hidden - } -} - -- (void)viewDidAppear:(BOOL)animated NS_EXTENSION_UNAVAILABLE("Uses APIs (i.e UIApplication.sharedApplication) not available for use in App Extensions.") { - [super viewDidAppear:animated]; - - NSNotificationCenter *dc = [NSNotificationCenter defaultCenter]; - [dc addObserver:self selector:@selector(synchronizeSettings) name:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication]]; - [dc addObserver:self selector:@selector(reload) name:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication]]; - [dc addObserver:self selector:@selector(synchronizeSettings) name:UIApplicationWillTerminateNotification object:[UIApplication sharedApplication]]; -} - -- (void)viewWillDisappear:(BOOL)animated { - [NSObject cancelPreviousPerformRequestsWithTarget:self]; - - // hide the keyboard - [self.currentFirstResponder resignFirstResponder]; - - [super viewWillDisappear:animated]; -} - -- (void)viewDidDisappear:(BOOL)animated NS_EXTENSION_UNAVAILABLE("Uses APIs (i.e UIApplication.sharedApplication) not available for use in App Extensions.") { - NSNotificationCenter *dc = [NSNotificationCenter defaultCenter]; - if ([self.settingsStore isKindOfClass:[IASKSettingsStoreUserDefaults class]]) { - IASKSettingsStoreUserDefaults *udSettingsStore = (id)self.settingsStore; - [dc removeObserver:self name:NSUserDefaultsDidChangeNotification object:udSettingsStore.defaults]; - [dc removeObserver:self name:kIASKAppSettingChanged object:self]; - } - [dc removeObserver:self name:UIApplicationDidEnterBackgroundNotification object:[UIApplication sharedApplication]]; - [dc removeObserver:self name:UIApplicationWillEnterForegroundNotification object:[UIApplication sharedApplication]]; - [dc removeObserver:self name:UIApplicationWillTerminateNotification object:[UIApplication sharedApplication]]; - - [super viewDidDisappear:animated]; -} - -- (void)setHiddenKeys:(NSSet *)theHiddenKeys { - [self setHiddenKeys:theHiddenKeys animated:NO]; -} - - -- (void)setHiddenKeys:(NSSet*)theHiddenKeys animated:(BOOL)animated { - if (_hiddenKeys != theHiddenKeys) { - NSSet *oldHiddenKeys = _hiddenKeys; - _hiddenKeys = theHiddenKeys; - - if (animated) { - NSMutableSet *showKeys = [NSMutableSet setWithSet:oldHiddenKeys]; - [showKeys minusSet:theHiddenKeys]; - - NSMutableSet *hideKeys = [NSMutableSet setWithSet:theHiddenKeys]; - [hideKeys minusSet:oldHiddenKeys]; - - // calculate rows to be deleted - NSMutableArray *hideIndexPaths = [NSMutableArray array]; - NSMutableIndexSet *hideSections = [NSMutableIndexSet indexSet]; - for (NSString *key in hideKeys) { - NSIndexPath *indexPath = [self.settingsReader indexPathForKey:key]; - if (indexPath) { - IASKSpecifier *specifier = [self.settingsReader specifierForKey:key]; - if (specifier == [self.settingsReader headerSpecifierForSection:indexPath.section]) { - [hideSections addIndex:indexPath.section]; - } else { - [hideIndexPaths addObject:indexPath]; - } - } - if ([self.settingsReader.selectedSpecifier.key isEqualToString:key]) { - [hideIndexPaths addObject:[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section]]; - } - } - - // calculate sections to be deleted - for (NSInteger section = 0; section < [self numberOfSectionsInTableView:self.tableView ]; section++) { - NSInteger rowsInSection = 0; - if ([hideSections containsIndex:section]) { - continue; - } - for (NSIndexPath *indexPath in hideIndexPaths) { - if (indexPath.section == section) { - rowsInSection++; - } - } - if (rowsInSection && rowsInSection >= [self.settingsReader numberOfRowsInSection:section]) { - [hideSections addIndex:section]; - } - } - - // set the datasource - self.settingsReader.hiddenKeys = theHiddenKeys; - - - // calculate rows to be inserted - NSMutableArray *showIndexPaths = [NSMutableArray array]; - NSMutableIndexSet *showSections = [NSMutableIndexSet indexSet]; - for (NSString *key in showKeys) { - NSIndexPath *indexPath = [self.settingsReader indexPathForKey:key]; - if (indexPath) { - IASKSpecifier *specifier = [self.settingsReader specifierForKey:key]; - if (specifier == [self.settingsReader headerSpecifierForSection:indexPath.section]) { - [showSections addIndex:indexPath.section]; - } else { - [showIndexPaths addObject:indexPath]; - } - } - if ([self.settingsReader.selectedSpecifier.key isEqualToString:key]) { - [showIndexPaths addObject:[NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section]]; - } - } - - // calculate sections to be inserted - for (NSInteger section = 0; section < [self.settingsReader numberOfSections]; section++) { - if ([showSections containsIndex:section]) { - continue; - } - NSInteger rowsInSection = 0; - for (NSIndexPath *indexPath in showIndexPaths) { - if (indexPath.section == section) { - rowsInSection++; - } - } - if (rowsInSection && rowsInSection >= [self.settingsReader numberOfRowsInSection:section]) { - [showSections addIndex:section]; - } - } - - if (hideSections.count || hideIndexPaths.count || showSections.count || showIndexPaths.count) { - [self.tableView beginUpdates]; - UITableViewRowAnimation rowAnimation = animated ? UITableViewRowAnimationAutomatic : UITableViewRowAnimationNone; - UITableViewRowAnimation sectionAnimation = animated ? UITableViewRowAnimationFade : UITableViewRowAnimationNone; - if (hideSections.count) { - [self.tableView deleteSections:hideSections withRowAnimation:sectionAnimation]; - } - if (hideIndexPaths.count) { - [self.tableView deleteRowsAtIndexPaths:hideIndexPaths withRowAnimation:rowAnimation]; - } - if (showSections.count) { - [self.tableView insertSections:showSections withRowAnimation:sectionAnimation]; - } - if (showIndexPaths.count) { - [self.tableView insertRowsAtIndexPaths:showIndexPaths withRowAnimation:rowAnimation]; - } - [self.tableView endUpdates]; - } - } else { - self.settingsReader.hiddenKeys = theHiddenKeys; - if (!_reloadDisabled) [self.tableView reloadData]; - } - } - UIViewController *childViewController = _currentChildViewController; - if([childViewController respondsToSelector:@selector(setHiddenKeys:animated:)]) { - [(id)childViewController setHiddenKeys:theHiddenKeys animated:animated]; - } -} - -- (void)setNeverShowPrivacySettings:(BOOL)neverShowPrivacySettings { - _neverShowPrivacySettings = neverShowPrivacySettings; - self.settingsReader = nil; - [self reload]; -} - -- (void)setCellLayoutMarginsFollowReadableWidth:(BOOL)cellLayoutMarginsFollowReadableWidth { - _cellLayoutMarginsFollowReadableWidth = cellLayoutMarginsFollowReadableWidth; - self.tableView.cellLayoutMarginsFollowReadableWidth = cellLayoutMarginsFollowReadableWidth; -} - - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self]; -} - - -#pragma mark - -#pragma mark Actions - -- (IBAction)dismiss:(id)sender { - [self.settingsStore synchronize]; - - if (self.delegate && [self.delegate conformsToProtocol:@protocol(IASKSettingsDelegate)]) { - [self.delegate settingsViewControllerDidEnd:self]; - } -} - -- (void)toggledValue:(IASKSwitch*)sender { - [self setSpecifier:sender.specifier on:sender.isOn]; -} - -- (void)setSpecifier:(IASKSpecifier*)specifier on:(BOOL)on { - if (on) { - if (specifier.trueValue) { - [self.settingsStore setObject:specifier.trueValue forSpecifier:specifier]; - } else { - [self.settingsStore setBool:YES forSpecifier:specifier]; - } - } - else { - if (specifier.falseValue) { - [self.settingsStore setObject:specifier.falseValue forSpecifier:specifier]; - } else { - [self.settingsStore setBool:NO forSpecifier:specifier]; - } - } - NSString* key = specifier.key; - if (key != nil) { - NSIndexPath* indexPath = [_settingsReader indexPathForKey:key]; - UITableViewCell* cell = [self.tableView cellForRowAtIndexPath:indexPath]; - cell.detailTextLabel.text = [specifier subtitleForValue:on ? @"YES" : @"NO"]; - } - [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged - object:self - userInfo:@{(id)specifier.key: [self.settingsStore objectForSpecifier:specifier] ?: NSNull.null}]; -} - -- (void)sliderChangedValue:(id)sender { - IASKSlider *slider = (IASKSlider*)sender; - [self.settingsStore setFloat:slider.value forSpecifier:slider.specifier]; - [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged - object:self - userInfo:@{(id)slider.specifier.key: @(slider.value)}]; -} - -- (void)datePickerChangedValue:(IASKDatePicker*)datePicker { - datePicker.editing = YES; - if ([self.delegate respondsToSelector:@selector(settingsViewController:setDate:forSpecifier:)]) { - [self.delegate settingsViewController:self setDate:datePicker.date forSpecifier:datePicker.specifier]; - } else { - [self.settingsStore setObject:datePicker.date forSpecifier:datePicker.specifier]; - } - datePicker.editing = NO; -} - -#pragma mark - -#pragma mark UITableView Functions - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return [self.settingsReader numberOfSections]; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [self.settingsReader numberOfRowsInSection:section]; -} - -- (CGFloat)tableView:(UITableView *)tableView heightForRowAtIndexPath:(NSIndexPath *)indexPath { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - if ([specifier.type isEqualToString:kIASKTextViewSpecifier]) { - CGFloat height = (CGFloat)[self.rowHeights[(id)specifier.key] doubleValue]; - return height > 0 ? height : UITableViewAutomaticDimension; - } else if ([specifier.type isEqualToString:kIASKCustomViewSpecifier]) { - if ([self.delegate respondsToSelector:@selector(settingsViewController:heightForSpecifier:)]) { - return [self.delegate settingsViewController:self heightForSpecifier:specifier]; - } - } - return UITableViewAutomaticDimension; -} - -- (NSString *)tableView:(UITableView*)tableView titleForHeaderInSection:(NSInteger)section { - IASKSpecifier *specifier = [self.settingsReader headerSpecifierForSection:section]; - NSString *headerText = nil; - if (specifier && [self.delegate respondsToSelector:@selector(settingsViewController:titleForHeaderInSection:specifier:)]) { - headerText = [self.delegate settingsViewController:self titleForHeaderInSection:section specifier:specifier]; - } - - if (headerText.length == 0) { - headerText = [self.settingsReader titleForSection:section]; - } - return (headerText.length != 0) ? headerText : nil; -} - -- (UIView *)tableView:(UITableView*)tableView viewForHeaderInSection:(NSInteger)section { - IASKSpecifier *specifier = [self.settingsReader headerSpecifierForSection:section]; - if (specifier && [self.delegate respondsToSelector:@selector(settingsViewController:viewForHeaderInSection:specifier:)]) { - return [self.delegate settingsViewController:self viewForHeaderInSection:section specifier:specifier]; - } else { - return nil; - } -} - -- (CGFloat)tableView:(UITableView*)tableView heightForHeaderInSection:(NSInteger)section { - IASKSpecifier *specifier = [self.settingsReader headerSpecifierForSection:section]; - if (specifier && [self tableView:tableView viewForHeaderInSection:section] && [self.delegate respondsToSelector:@selector(settingsViewController:heightForHeaderInSection:specifier:)]) { - CGFloat result = [self.delegate settingsViewController:self heightForHeaderInSection:section specifier:specifier]; - if (result > 0) { - return result; - } - } - return section > 0 || [self tableView:tableView titleForHeaderInSection:section].length ? UITableViewAutomaticDimension : 34; -} - -- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { - IASKSpecifier *specifier = [self.settingsReader headerSpecifierForSection:section]; - NSString *footerText = nil; - if ([self.delegate respondsToSelector:@selector(settingsViewController:titleForFooterInSection:specifier:)]) { - footerText = [self.delegate settingsViewController:self titleForFooterInSection:section specifier:specifier]; - } - if (footerText.length == 0) { - footerText = [self.settingsReader footerTextForSection:section]; - } - - if (_showCreditsFooter && (section == [self.settingsReader numberOfSections]-1)) { - // show credits since this is the last section - if (footerText.length == 0) { - // show the credits on their own - return kIASKCredits; - } else { - // show the credits below the app's FooterText - return [NSString stringWithFormat:@"%@\n\n%@", footerText, kIASKCredits]; - } - } else { - return footerText; - } -} - -- (UIView *)tableView:(UITableView*)tableView viewForFooterInSection:(NSInteger)section { - IASKSpecifier *specifier = [self.settingsReader headerSpecifierForSection:section]; - if (specifier && [self.delegate respondsToSelector:@selector(settingsViewController:viewForFooterInSection:specifier:)]) { - return [self.delegate settingsViewController:self viewForFooterInSection:section specifier:specifier]; - } else { - return nil; - } -} - -- (CGFloat)tableView:(UITableView*)tableView heightForFooterInSection:(NSInteger)section { - IASKSpecifier *specifier = [self.settingsReader headerSpecifierForSection:section]; - if (specifier && [self tableView:tableView viewForFooterInSection:section] && [self.delegate respondsToSelector:@selector(settingsViewController:heightForFooterInSection:specifier:)]) { - CGFloat result = [self.delegate settingsViewController:self heightForFooterInSection:section specifier:specifier]; - if (result > 0) { - return result; - } - } - return UITableViewAutomaticDimension; -} - -- (UITableViewCell*)tableView:(UITableView *)tableView newCellForSpecifier:(IASKSpecifier*)specifier { - - NSString *identifier = [NSString stringWithFormat:@"%@-%ld-%d-%d", specifier.type, (long)specifier.textAlignment, !!specifier.hasSubtitle, specifier.embeddedDatePicker]; - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier]; - if (cell) { - return cell; - } - UITableViewCellStyle style = (specifier.textAlignment == NSTextAlignmentLeft || specifier.hasSubtitle) ? UITableViewCellStyleSubtitle : UITableViewCellStyleDefault; - if ([identifier hasPrefix:kIASKPSToggleSwitchSpecifier]) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:identifier]; - } - else if (specifier.embeddedDatePicker) { - cell = [[IASKEmbeddedDatePickerViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - [((IASKDatePickerViewCell*)cell).datePicker addTarget:self action:@selector(datePickerChangedValue:) forControlEvents:UIControlEventValueChanged]; -} - else if ([@[kIASKPSMultiValueSpecifier, kIASKPSTitleValueSpecifier, kIASKDatePickerSpecifier] containsObject:specifier.type]) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:identifier]; - cell.accessoryType = [identifier hasPrefix:kIASKPSMultiValueSpecifier] ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; - } - else if ([identifier hasPrefix:kIASKPSTextFieldSpecifier]) { - cell = [[IASKPSTextFieldSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - [((IASKPSTextFieldSpecifierViewCell*)cell).textField addTarget:self action:@selector(textChanged:) forControlEvents:UIControlEventEditingChanged]; - } - else if ([identifier hasPrefix:kIASKTextViewSpecifier]) { - cell = [[IASKTextViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - } - else if ([identifier hasPrefix:kIASKPSSliderSpecifier]) { - cell = [[IASKPSSliderSpecifierViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - } else if ([identifier hasPrefix:kIASKPSChildPaneSpecifier]) { - if (!specifier.hasSubtitle) { - style = UITableViewCellStyleValue1; - } - cell = [[UITableViewCell alloc] initWithStyle:style reuseIdentifier:identifier]; - cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator; - } else if ([identifier hasPrefix:kIASKDatePickerControl]) { - cell = [[IASKDatePickerViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier]; - [((IASKDatePickerViewCell*)cell).datePicker addTarget:self action:@selector(datePickerChangedValue:) forControlEvents:UIControlEventValueChanged]; - } else { - cell = [[UITableViewCell alloc] initWithStyle:style reuseIdentifier:identifier]; - } - cell.textLabel.minimumScaleFactor = kIASKMinimumFontSize / cell.textLabel.font.pointSize; - cell.detailTextLabel.minimumScaleFactor = kIASKMinimumFontSize / cell.detailTextLabel.font.pointSize; - return cell; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - if ([specifier.type isEqualToString:kIASKCustomViewSpecifier] && [self.delegate respondsToSelector:@selector(settingsViewController:cellForSpecifier:)]) { - UITableViewCell* cell = [self.delegate settingsViewController:self cellForSpecifier:specifier]; - assert(nil != cell && "delegate must return a UITableViewCell for custom cell types"); - return cell; - } - - UITableViewCell* cell = [self tableView:tableView newCellForSpecifier:specifier]; - id currentValue = [self.settingsStore objectForSpecifier:specifier]; - NSString *title = specifier.title; - - if ([specifier.type isEqualToString:kIASKPSToggleSwitchSpecifier]) { - cell.textLabel.text = title; - - BOOL toggleState; - if (currentValue) { - if ([currentValue isEqual:specifier.trueValue]) { - toggleState = YES; - } else if ([currentValue isEqual:specifier.falseValue]) { - toggleState = NO; - } else { - toggleState = [currentValue respondsToSelector:@selector(boolValue)] ? [currentValue boolValue] : NO; - } - } else { - toggleState = specifier.defaultBoolValue; - } - cell.detailTextLabel.text = [specifier subtitleForValue:toggleState ? @"YES" : @"NO"]; - if (specifier.toggleStyle == IASKToggleStyleSwitch) { - IASKSwitch *toggle = [[IASKSwitch alloc] initWithFrame:CGRectMake(0, 0, 79, 27)]; - [toggle addTarget:self action:@selector(toggledValue:) forControlEvents:UIControlEventValueChanged]; - toggle.on = toggleState; - toggle.specifier = specifier; - cell.accessoryView = toggle; - cell.selectionStyle = UITableViewCellSelectionStyleNone; - } else { - cell.accessoryType = toggleState ? UITableViewCellAccessoryCheckmark : UITableViewCellAccessoryNone; - cell.selectionStyle = UITableViewCellSelectionStyleDefault; - } - } - else if ([specifier.type isEqualToString:kIASKPSMultiValueSpecifier]) { - [self setMultiValuesFromDelegateIfNeeded:specifier]; - - BOOL hasTitle = title.length > 0 && !specifier.isItemSpecifier; - cell.detailTextLabel.text = [[specifier titleForCurrentValue:currentValue ?: specifier.defaultValue] description]; - if (hasTitle) { - cell.textLabel.text = title; - } else { - cell.textLabel.text = cell.detailTextLabel.text; - cell.detailTextLabel.text = nil; - } - } - else if (specifier.embeddedDatePicker) { - IASKEmbeddedDatePickerViewCell *datePickerCell = (id)cell; - datePickerCell.titleLabel.text = title; - datePickerCell.datePicker.specifier = specifier; - datePickerCell.datePicker.datePickerMode = specifier.datePickerMode; - if (@available(iOS 14.0, *)) { - datePickerCell.datePicker.preferredDatePickerStyle = specifier.datePickerStyle; - } - datePickerCell.datePicker.minuteInterval = specifier.datePickerMinuteInterval; - if ([self.delegate respondsToSelector:@selector(settingsViewController:dateForSpecifier:)]) { - datePickerCell.datePicker.date = [self.delegate settingsViewController:self dateForSpecifier:specifier]; - } else { - datePickerCell.datePicker.date = currentValue ?: NSDate.date; - } - } - else if ([@[kIASKPSTitleValueSpecifier, kIASKDatePickerSpecifier] containsObject:specifier.type]) { - cell.textLabel.text = title; - id value = currentValue ?: specifier.defaultValue; - - if ([specifier.type isEqualToString:kIASKDatePickerSpecifier] && [self.delegate respondsToSelector:@selector(settingsViewController:datePickerTitleForSpecifier:)]) { - value = [self.delegate settingsViewController:self datePickerTitleForSpecifier:specifier]; - } - NSString *stringValue; - if (specifier.multipleValues || specifier.multipleTitles) { - stringValue = [specifier titleForCurrentValue:value]; - } else { - stringValue = [value description]; - } - - if (specifier.textAlignment == NSTextAlignmentLeft) { - cell.textLabel.text = stringValue; - } else { - cell.detailTextLabel.text = stringValue; - } - cell.userInteractionEnabled = [specifier.type isEqualToString:kIASKDatePickerSpecifier]; - if ([specifier.type isEqualToString:kIASKDatePickerSpecifier]) { - cell.detailTextLabel.textColor = [specifier isEqual:self.settingsReader.selectedSpecifier] ? [UILabel appearanceWhenContainedInInstancesOfClasses:@[UITableViewCell.class]].textColor : self.tintColor; - } - } - else if ([specifier.type isEqualToString:kIASKPSTextFieldSpecifier]) { - cell.textLabel.text = title; - - NSString *textValue = currentValue ?: specifier.defaultStringValue; - if (textValue && ![textValue isMemberOfClass:[NSString class]]) { - textValue = [NSString stringWithFormat:@"%@", textValue]; - } - IASKTextField *textField = ((IASKPSTextFieldSpecifierViewCell*)cell).textField; - textField.text = textValue; - textField.specifier = specifier; - textField.delegate = self; - if ([self.delegate respondsToSelector:@selector(settingsViewController:validateSpecifier:textField:previousValue:replacement:)]) { - NSString *replacement = textField.text ?: @""; - IASKValidationResult result = [self.delegate settingsViewController:self validateSpecifier:specifier textField:textField previousValue:textValue replacement:&replacement]; - if (result != IASKValidationResultOk) { - textField.text = replacement; - } - } - } - else if ([specifier.type isEqualToString:kIASKTextViewSpecifier]) { - IASKTextViewCell *textCell = (id)cell; - NSString *value = currentValue ?: specifier.defaultStringValue; - textCell.textView.text = value; - textCell.textView.delegate = self; - textCell.textView.specifier = specifier; - textCell.textView.keyboardType = specifier.keyboardType; - textCell.textView.autocapitalizationType = specifier.autocapitalizationType; - textCell.textView.autocorrectionType = specifier.autoCorrectionType; - textCell.textView.placeholder = specifier.placeholder; - - dispatch_async(dispatch_get_main_queue(), ^{ - [self cacheRowHeightForTextView:textCell.textView animated:NO]; - }); - } - else if ([specifier.type isEqualToString:kIASKPSSliderSpecifier]) { - if (specifier.minimumValueImage.length > 0) { - NSString *path = [self.settingsReader pathForImageNamed:(id)specifier.minimumValueImage]; - ((IASKPSSliderSpecifierViewCell*)cell).minImage.image = [UIImage imageWithContentsOfFile:path]; - } - - if (specifier.maximumValueImage.length > 0) { - NSString *path = [self.settingsReader pathForImageNamed:(id)specifier.maximumValueImage]; - ((IASKPSSliderSpecifierViewCell*)cell).maxImage.image = [UIImage imageWithContentsOfFile:path]; - } - - IASKSlider *slider = ((IASKPSSliderSpecifierViewCell*)cell).slider; - slider.minimumValue = specifier.minimumValue; - slider.maximumValue = specifier.maximumValue; - slider.value = currentValue ? [currentValue floatValue] : [specifier.defaultValue floatValue]; - [slider addTarget:self action:@selector(sliderChangedValue:) forControlEvents:UIControlEventValueChanged]; - slider.specifier = specifier; - [cell setNeedsLayout]; - } - else if ([specifier.type isEqualToString:kIASKPSChildPaneSpecifier]) { - cell.textLabel.text = title; - if (specifier.hasSubtitle) { - cell.detailTextLabel.text = [specifier subtitleForValue:currentValue]; - } else if (specifier.key) { - NSString *valueString = currentValue ?: specifier.defaultValue; - valueString = [valueString isKindOfClass:NSString.class] ? valueString : nil; - if (valueString) { - if (specifier.textAlignment == NSTextAlignmentLeft) { - cell.textLabel.text = [self.settingsReader titleForId:valueString]; - } else { - cell.detailTextLabel.text = [self.settingsReader titleForId:valueString]; - } - } - } - } else if ([@[kIASKMailComposeSpecifier, kIASKOpenURLSpecifier] containsObject:specifier.type]) { - cell.textLabel.text = title; - cell.detailTextLabel.text = [specifier subtitleForValue:currentValue] ? : [specifier.defaultValue description]; - cell.accessoryType = (specifier.textAlignment == NSTextAlignmentLeft) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; - } else if ([specifier.type isEqualToString:kIASKButtonSpecifier]) { - cell.textLabel.text = ([currentValue isKindOfClass:NSString.class] && [self.settingsReader titleForId:currentValue].length) ? [self.settingsReader titleForId:currentValue] : title; - cell.detailTextLabel.text = [specifier subtitleForValue:currentValue]; - cell.textLabel.textAlignment = specifier.textAlignment; - cell.accessoryType = (specifier.textAlignment == NSTextAlignmentLeft) ? UITableViewCellAccessoryDisclosureIndicator : UITableViewCellAccessoryNone; - } else if ([specifier.type isEqualToString:kIASKPSRadioGroupSpecifier]) { - NSInteger index = [specifier.multipleValues indexOfObject:(id)specifier.radioGroupValue]; - cell.textLabel.text = [self.settingsReader titleForId:specifier.multipleTitles[index]]; - [_selections[indexPath.section] updateSelectionInCell:cell indexPath:indexPath]; - } else if ([specifier.type isEqualToString:kIASKDatePickerControl]) { - IASKDatePickerViewCell *datePickerCell = (id)cell; - datePickerCell.datePicker.specifier = specifier; - datePickerCell.datePicker.datePickerMode = specifier.datePickerMode; - if (@available(iOS 14.0, *)) { - datePickerCell.datePicker.preferredDatePickerStyle = specifier.datePickerStyle; - } - datePickerCell.datePicker.minuteInterval = specifier.datePickerMinuteInterval; - if ([self.delegate respondsToSelector:@selector(settingsViewController:dateForSpecifier:)]) { - datePickerCell.datePicker.date = [self.delegate settingsViewController:self dateForSpecifier:specifier]; - } else { - datePickerCell.datePicker.date = currentValue ?: NSDate.date; - } - } else { - cell.textLabel.text = title; - } - - cell.imageView.image = specifier.cellImage; - cell.imageView.highlightedImage = specifier.highlightedCellImage; - - if (![@[kIASKPSMultiValueSpecifier, kIASKPSTitleValueSpecifier, kIASKPSTextFieldSpecifier, kIASKTextViewSpecifier] containsObject:specifier.type]) { - cell.textLabel.textAlignment = specifier.textAlignment; - } - cell.detailTextLabel.textAlignment = specifier.textAlignment; - cell.textLabel.adjustsFontSizeToFitWidth = specifier.adjustsFontSizeToFitWidth; - cell.detailTextLabel.adjustsFontSizeToFitWidth = specifier.adjustsFontSizeToFitWidth; - cell.textLabel.textColor = (specifier.isAddSpecifier || specifier.textAlignment == NSTextAlignmentCenter) ? self.tintColor : [UILabel appearanceWhenContainedInInstancesOfClasses:@[UITableViewCell.class]].textColor; - return cell; -} - -- (NSIndexPath *)tableView:(UITableView *)tableView willSelectRowAtIndexPath:(NSIndexPath *)indexPath { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - if ([specifier.type isEqualToString:kIASKPSSliderSpecifier] || ([specifier.type isEqualToString:kIASKPSToggleSwitchSpecifier] && specifier.toggleStyle == IASKToggleStyleSwitch) || specifier.embeddedDatePicker) { - return nil; - } else { - return indexPath; - } -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath NS_EXTENSION_UNAVAILABLE("Uses APIs (i.e UIApplication.sharedApplication) not available for use in App Extensions.") { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - - //switches and sliders can't be selected (should be captured by tableView:willSelectRowAtIndexPath: delegate method) - assert(![specifier.type isEqualToString:kIASKPSSliderSpecifier]); - - if (![@[kIASKPSChildPaneSpecifier, kIASKCustomViewSpecifier, kIASKPSRadioGroupSpecifier, ] containsObject:specifier.type]) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - } - - [tableView beginUpdates]; - if ([specifier.type isEqualToString:kIASKDatePickerSpecifier]) { - [tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationFade]; - } - IASKSpecifier *selectedSpecifier = self.settingsReader.selectedSpecifier; - if (selectedSpecifier.key) { - NSIndexPath *oldIndexPath = [self.settingsReader indexPathForKey:(id)selectedSpecifier.key]; - self.settingsReader.selectedSpecifier = nil; - [tableView reloadRowsAtIndexPaths:@[oldIndexPath] withRowAnimation:UITableViewRowAnimationFade]; - [tableView deleteRowsAtIndexPaths:@[[NSIndexPath indexPathForRow:oldIndexPath.row + 1 inSection:oldIndexPath.section]] withRowAnimation:UITableViewRowAnimationFade]; - if (oldIndexPath.section == indexPath.section && oldIndexPath.row < indexPath.row) { - indexPath = [NSIndexPath indexPathForRow:indexPath.row - 1 inSection:indexPath.section]; - } - } - - if ([specifier.type isEqualToString:kIASKPSMultiValueSpecifier]) { - IASKSpecifier *childSpecifier = [[IASKSpecifier alloc] initWithSpecifier:specifier.specifierDict]; - childSpecifier.settingsReader = self.settingsReader; - IASKSpecifierValuesViewController *targetViewController = [[IASKSpecifierValuesViewController alloc] initWithSpecifier:childSpecifier style:self.tableView.style]; - targetViewController.view.backgroundColor = self.view.backgroundColor; - targetViewController.settingsReader = self.settingsReader; - [self setMultiValuesFromDelegateIfNeeded:childSpecifier]; - - [self presentChildViewController:targetViewController specifier:specifier indexPath:indexPath]; - - } else if ([specifier.type isEqualToString:kIASKPSToggleSwitchSpecifier]) { - UITableViewCell *cell = [tableView cellForRowAtIndexPath:indexPath]; - BOOL on = cell.accessoryType == UITableViewCellAccessoryCheckmark; - [self setSpecifier:specifier on:!on]; - cell.accessoryType = on ? UITableViewCellAccessoryNone : UITableViewCellAccessoryCheckmark; - - } else if ([specifier.type isEqualToString:kIASKPSTextFieldSpecifier]) { - IASKPSTextFieldSpecifierViewCell *textFieldCell = (id)[tableView cellForRowAtIndexPath:indexPath]; - [textFieldCell.textField becomeFirstResponder]; - } else if ([specifier.type isEqualToString:kIASKPSChildPaneSpecifier] || ([specifier.type isEqualToString:kIASKCustomViewSpecifier] && (specifier.file || specifier.viewControllerStoryBoardID || specifier.viewControllerClass || specifier.segueIdentifier))) { - if (specifier.viewControllerStoryBoardID){ - NSString *storyBoardFileFromSpecifier = [specifier viewControllerStoryBoardFile]; - storyBoardFileFromSpecifier = storyBoardFileFromSpecifier && storyBoardFileFromSpecifier.length > 0 ? storyBoardFileFromSpecifier : [[NSBundle mainBundle].infoDictionary objectForKey:@"UIMainStoryboardFile"]; - UIStoryboard *storyBoard = [UIStoryboard storyboardWithName:storyBoardFileFromSpecifier bundle:nil]; - UIViewController * vc = [storyBoard instantiateViewControllerWithIdentifier:(id)specifier.viewControllerStoryBoardID]; - vc.view.tintColor = self.tintColor; - [self.navigationController pushViewController:vc animated:YES]; - [tableView endUpdates]; - return; - } - - Class vcClass = [specifier viewControllerClass]; - if (vcClass) { - if (vcClass == [NSNull class]) { - NSLog(@"class '%@' not found", [specifier localizedObjectForKey:kIASKViewControllerClass]); - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - [tableView endUpdates]; - return; - } - SEL initSelector = [specifier viewControllerSelector]; - if (!initSelector) { - initSelector = @selector(init); - } - UIViewController * vc = [vcClass alloc]; -#pragma clang diagnostic push -#pragma clang diagnostic ignored "-Warc-performSelector-leaks" - vc = [vc performSelector:initSelector withObject:specifier.file withObject:specifier]; -#pragma clang diagnostic pop - if ([vc respondsToSelector:@selector(setDelegate:)]) { - [vc performSelector:@selector(setDelegate:) withObject:self.delegate]; - } - if ([vc respondsToSelector:@selector(setSettingsStore:)]) { - [vc performSelector:@selector(setSettingsStore:) withObject:self.settingsStore]; - } - vc.view.tintColor = self.tintColor; - [self.navigationController pushViewController:vc animated:YES]; - [tableView endUpdates]; - return; - } - - NSString *segueIdentifier = specifier.segueIdentifier; - if (segueIdentifier) { - @try { - [self performSegueWithIdentifier:segueIdentifier sender:self]; - } @catch (NSException *exception) { - NSLog(@"segue with identifier '%@' not defined", segueIdentifier); - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - } - [tableView endUpdates]; - return; - } - - if (!specifier.file) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - [tableView endUpdates]; - return; - } - - _reloadDisabled = YES; // Disable internal unnecessary reloads - IASKAppSettingsViewController *targetViewController = - [((IASKAppSettingsViewController*)[[self class] alloc]) initWithStyle:self.tableView.style]; - targetViewController.showDoneButton = NO; - targetViewController.showCreditsFooter = NO; // Does not reload the tableview (but next setters do it) - targetViewController.delegate = self.delegate; - targetViewController.file = (id)specifier.file; - targetViewController.hiddenKeys = self.hiddenKeys; - targetViewController.title = specifier.title; - targetViewController.view.backgroundColor = self.view.backgroundColor; - _currentChildViewController = targetViewController; - - _reloadDisabled = NO; - - if ([specifier.parentSpecifier.type isEqualToString:kIASKListGroupSpecifier]) { - [tableView deselectRowAtIndexPath:indexPath animated:YES]; - } - [self presentChildViewController:targetViewController specifier:specifier indexPath:indexPath]; - - } else if ([specifier.type isEqualToString:kIASKOpenURLSpecifier]) { - NSString *urlString = [specifier localizedObjectForKey:kIASKFile]; - NSURL *url = urlString ? [NSURL URLWithString:urlString] : nil; - if (url) { - IASK_IF_IOS11_OR_GREATER([UIApplication.sharedApplication openURL:url options:@{} completionHandler:nil];); - IASK_IF_PRE_IOS11([UIApplication.sharedApplication openURL:url];); - } - } else if ([specifier.type isEqualToString:kIASKButtonSpecifier]) { - if ([self.delegate respondsToSelector:@selector(settingsViewController:buttonTappedForSpecifier:)]) { - [self.delegate settingsViewController:self buttonTappedForSpecifier:specifier]; - } - } else if ([specifier.type isEqualToString:kIASKMailComposeSpecifier]) { - MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; - if ([specifier localizedObjectForKey:kIASKMailComposeSubject]) { - [mailViewController setSubject:(id)[specifier localizedObjectForKey:kIASKMailComposeSubject]]; - } - if ([specifier.specifierDict objectForKey:kIASKMailComposeToRecipents]) { - [mailViewController setToRecipients:[specifier.specifierDict objectForKey:kIASKMailComposeToRecipents]]; - } - if ([specifier.specifierDict objectForKey:kIASKMailComposeCcRecipents]) { - [mailViewController setCcRecipients:[specifier.specifierDict objectForKey:kIASKMailComposeCcRecipents]]; - } - if ([specifier.specifierDict objectForKey:kIASKMailComposeBccRecipents]) { - [mailViewController setBccRecipients:[[specifier specifierDict] objectForKey:kIASKMailComposeBccRecipents]]; - } - if ([specifier localizedObjectForKey:kIASKMailComposeBody]) { - BOOL isHTML = NO; - if ([specifier.specifierDict objectForKey:kIASKMailComposeBodyIsHTML]) { - isHTML = [[specifier.specifierDict objectForKey:kIASKMailComposeBodyIsHTML] boolValue]; - } - if ([specifier localizedObjectForKey:kIASKMailComposeBody]) { - [mailViewController setMessageBody:(id)[specifier localizedObjectForKey:kIASKMailComposeBody] isHTML:isHTML]; - } - } - - if ([self.delegate respondsToSelector:@selector(settingsViewController:shouldPresentMailComposeViewController:forSpecifier:)]) { - BOOL shouldPresent = [self.delegate settingsViewController:self shouldPresentMailComposeViewController:mailViewController forSpecifier:specifier]; - if (!shouldPresent) { - [tableView endUpdates]; - return; - } - } - - if ([MFMailComposeViewController canSendMail]) { - mailViewController.mailComposeDelegate = self; - _currentChildViewController = mailViewController; -#if !TARGET_OS_MACCATALYST - UIStatusBarStyle savedStatusBarStyle = [UIApplication sharedApplication].statusBarStyle; -#endif - [self presentViewController:mailViewController animated:YES completion:^{ -#if !TARGET_OS_MACCATALYST - [UIApplication sharedApplication].statusBarStyle = savedStatusBarStyle; -#endif - }]; - - } else { - UIAlertController *alert = [UIAlertController alertControllerWithTitle:NSLocalizedStringFromTableInBundle(@"Mail not configured", @"IASKLocalizable", self.settingsReader.iaskBundle, @"warning title") - message:NSLocalizedStringFromTableInBundle(@"This device is not configured for sending Email. Please configure the Mail settings in the Settings app.", @"IASKLocalizable", self.settingsReader.iaskBundle, @"warning message") - preferredStyle:UIAlertControllerStyleAlert]; - [alert addAction:[UIAlertAction actionWithTitle:NSLocalizedStringFromTableInBundle(@"OK", @"IASKLocalizable", self.settingsReader.iaskBundle, @"InAppSettingsKit") style:UIAlertActionStyleCancel handler:^(UIAlertAction * _Nonnull action) { - [alert dismissViewControllerAnimated:YES completion:nil]; - }]]; - [self presentViewController:alert animated:YES completion:nil]; - } - - } else if ([specifier.type isEqualToString:kIASKCustomViewSpecifier] && [self.delegate respondsToSelector:@selector(settingsViewController:didSelectCustomViewSpecifier:)]) { - [self.delegate settingsViewController:self didSelectCustomViewSpecifier:specifier]; - } else if ([specifier.type isEqualToString:kIASKPSRadioGroupSpecifier]) { - [_selections[indexPath.section] selectRowAtIndexPath:indexPath]; - } else if ([specifier.type isEqualToString:kIASKDatePickerSpecifier]) { - if (![selectedSpecifier isEqual:specifier]) { - self.settingsReader.selectedSpecifier = specifier; - NSIndexPath *insertedIndexPath = [NSIndexPath indexPathForRow:indexPath.row + 1 inSection:indexPath.section]; - [tableView insertRowsAtIndexPaths:@[insertedIndexPath] withRowAnimation:UITableViewRowAnimationFade]; - dispatch_after(DISPATCH_TIME_NOW, dispatch_get_main_queue(), ^{ - [tableView scrollToRowAtIndexPath:insertedIndexPath atScrollPosition:UITableViewScrollPositionMiddle animated:YES]; - }); - } - } - [tableView endUpdates]; -} - -- (BOOL)tableView:(UITableView *)tableView canEditRowAtIndexPath:(NSIndexPath *)indexPath { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - return specifier.parentSpecifier.deletable && specifier.isItemSpecifier; -} - -- (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath { - IASKSpecifier *specifier = [self.settingsReader specifierForIndexPath:indexPath]; - [self.settingsStore removeObjectWithSpecifier:specifier]; - [tableView deleteRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; - - NSDictionary *userInfo = specifier.parentSpecifier.key && [self.settingsStore objectForSpecifier:(id)specifier.parentSpecifier] ? @{(id)specifier.parentSpecifier.key: [self.settingsStore objectForSpecifier:(id)specifier.parentSpecifier] ?: @[]} : nil; - [NSNotificationCenter.defaultCenter postNotificationName:kIASKAppSettingChanged object:self userInfo:userInfo]; -} - -- (void)presentChildViewController:(UITableViewController *)targetViewController specifier:(IASKSpecifier *)specifier indexPath:(NSIndexPath*)indexPath { - targetViewController.tableView.cellLayoutMarginsFollowReadableWidth = self.cellLayoutMarginsFollowReadableWidth; - _currentChildViewController = targetViewController; - targetViewController.settingsStore = self.settingsStore; - targetViewController.view.tintColor = self.tintColor; - if ([specifier.parentSpecifier.type isEqualToString:kIASKListGroupSpecifier]) { - NSDictionary *itemDict = @{}; - if (!specifier.isAddSpecifier) { - id value = [self.settingsStore objectForSpecifier:specifier]; - if ([value isKindOfClass:NSDictionary.class]) { - itemDict = value; - } else if (specifier.key && value) { - itemDict = @{(id)specifier.key: value}; - } - } - IASKSettingsStoreInMemory *inMemoryStore = [[IASKSettingsStoreInMemory alloc] initWithDictionary:itemDict]; - targetViewController.settingsStore = inMemoryStore; - targetViewController.listParentViewController = self; - [targetViewController.settingsReader applyDefaultsToStore]; - UINavigationController *navCtrl = [[UINavigationController alloc] initWithRootViewController:targetViewController]; - navCtrl.modalPresentationStyle = self.navigationController.modalPresentationStyle; - navCtrl.popoverPresentationController.sourceView = [self.tableView cellForRowAtIndexPath:indexPath]; - targetViewController.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(listItemCancel:)]; - targetViewController.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(listItemDone:)]; - [self.navigationController presentViewController:navCtrl animated:YES completion:nil]; - - __weak typeof(self)weakSelf = self; - self.childPaneHandler = ^(BOOL doneEditing){ - if (!doneEditing) { - if ([weakSelf.delegate respondsToSelector:@selector(settingsViewController:childPaneIsValidForSpecifier:contentDictionary:)]) { - NSDictionary *oldContent = inMemoryStore.dictionary.copy; - BOOL valid = [weakSelf.delegate settingsViewController:weakSelf childPaneIsValidForSpecifier:specifier contentDictionary:inMemoryStore.dictionary]; - if (![oldContent isEqualToDictionary:inMemoryStore.dictionary]) { - [targetViewController.tableView reloadData]; - valid = [weakSelf.delegate settingsViewController:weakSelf childPaneIsValidForSpecifier:specifier contentDictionary:inMemoryStore.dictionary]; - } - targetViewController.navigationItem.rightBarButtonItem.enabled = valid; - } - return; - } - if ([targetViewController respondsToSelector:@selector(currentFirstResponder)]) { - [targetViewController.currentFirstResponder resignFirstResponder]; - } - if (specifier.isAddSpecifier) { - [weakSelf.settingsStore addObject:inMemoryStore.dictionary forSpecifier:specifier]; - } else { - [weakSelf.settingsStore setObject:inMemoryStore.dictionary forSpecifier:specifier]; - } - NSDictionary *userInfo = specifier.parentSpecifier.key && [weakSelf.settingsStore objectForSpecifier:(id)specifier.parentSpecifier] ? @{(id)specifier.parentSpecifier.key: (id)[weakSelf.settingsStore objectForSpecifier:(id)specifier.parentSpecifier]} : nil; - [NSNotificationCenter.defaultCenter postNotificationName:kIASKAppSettingChanged object:weakSelf userInfo:userInfo]; - [weakSelf.tableView reloadData]; - }; - self.childPaneHandler(NO); // perform initial validation - } else { - [[self navigationController] pushViewController:targetViewController animated:YES]; - } -} - -#pragma mark - -#pragma mark MFMailComposeViewControllerDelegate Function - --(void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { - - // Forward the mail compose delegate - if ([self.delegate respondsToSelector:@selector(settingsViewController:mailComposeController:didFinishWithResult:error:)]) { - [self.delegate settingsViewController:self - mailComposeController:controller - didFinishWithResult:result - error:error]; - } - - [self dismissViewControllerAnimated:YES - completion:nil]; -} - -#pragma mark - -#pragma mark UITextFieldDelegate Functions - -- (void)textFieldDidBeginEditing:(UITextField *)textField { - self.currentFirstResponder = textField; -} - -- (void)textChanged:(IASKTextField*)textField { - // Wait with setting the property until editing ends for the addSpecifier of list groups or if a validation delegate is implemented - if ((!textField.specifier.isAddSpecifier && ![self.delegate respondsToSelector:@selector(settingsViewController:validateSpecifier:textField:previousValue:replacement:)]) || - (self.listParentViewController && [self.delegate respondsToSelector:@selector(settingsViewController:childPaneIsValidForSpecifier:contentDictionary:)])) - { - [self.settingsStore setObject:textField.text forSpecifier:textField.specifier]; - NSDictionary *userInfo = textField.specifier.key && textField.text ? @{(id)textField.specifier.key : (NSString *)textField.text} : nil; - [NSNotificationCenter.defaultCenter postNotificationName:kIASKAppSettingChanged - object:self - userInfo:userInfo]; - } -} - -- (BOOL)textFieldShouldReturn:(UITextField *)textField{ - [textField resignFirstResponder]; - self.currentFirstResponder = nil; - return YES; -} - -- (void)singleTapToEndEdit:(UIGestureRecognizer *)sender { - [self.tableView endEditing:NO]; -} - -- (void)textFieldDidEndEditing:(IASKTextField *)textField { - IASKSpecifier *specifier = textField.specifier; - - NSString *replacement = textField.text ?: @""; - IASKValidationResult result = IASKValidationResultOk; - if ([self.delegate respondsToSelector:@selector(settingsViewController:validateSpecifier:textField:previousValue:replacement:)]) { - result = [self.delegate settingsViewController:self validateSpecifier:specifier textField:textField previousValue:textField.oldText replacement:&replacement]; - } - - void (^restoreText)(void) = ^{ - if (![textField.text isEqualToString:replacement]) { - textField.text = replacement; - [self textChanged:textField]; - } - }; - - switch (result) { - case IASKValidationResultOk: { - if (![self.settingsStore objectForSpecifier:specifier] && textField.text.length == 0) { - return; - } - [self.settingsStore setObject:textField.text forSpecifier:specifier]; - if (specifier.isAddSpecifier) { - NSUInteger section = [self.settingsReader indexPathForKey:(id)specifier.parentSpecifier.key].section; - NSUInteger row = [self tableView:self.tableView numberOfRowsInSection:section] - 2; - NSIndexPath *indexPath = [NSIndexPath indexPathForRow:row inSection:section]; - [self.tableView insertRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; - indexPath = [NSIndexPath indexPathForRow:row + 1 inSection:section]; - [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationAutomatic]; - } - NSDictionary *userInfo = specifier.key && textField.text ? @{(id)specifier.key: (id)textField.text} : nil; - [NSNotificationCenter.defaultCenter postNotificationName:kIASKAppSettingChanged - object:self - userInfo:userInfo]; - break; - } - case IASKValidationResultFailed: - restoreText(); - break; - - case IASKValidationResultFailedWithShake: { - [textField shake]; - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.35 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - restoreText(); - }); - } - default: - break; - } -} - -#pragma mark - UITextViewDelegate - -- (void)textViewDidEndEditing:(UITextView *)textView { - self.currentFirstResponder = textView; -} - -- (void)textViewDidChange:(IASKTextView *)textView { - [self cacheRowHeightForTextView:textView animated:YES]; - - CGRect visibleTableRect = UIEdgeInsetsInsetRect(self.tableView.bounds, self.tableView.contentInset); - NSIndexPath *indexPath = [self.settingsReader indexPathForKey:(id)textView.specifier.key]; - CGRect cellFrame = [self.tableView rectForRowAtIndexPath:indexPath]; - - if (!CGRectContainsRect(visibleTableRect, cellFrame)) { - [self.tableView scrollRectToVisible:CGRectInset(cellFrame, 0, - 30) animated:YES]; - } - - [self.settingsStore setObject:textView.text forSpecifier:textView.specifier]; - [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged - object:self - userInfo:@{(id)textView.specifier.key: textView.text}]; - -} - -- (void)cacheRowHeightForTextView:(IASKTextView *)textView animated:(BOOL)animated { - CGFloat maxHeight = self.tableView.bounds.size.height - self.tableView.contentInset.top - self.tableView.contentInset.bottom - 60; - CGFloat contentHeight = [textView sizeThatFits:CGSizeMake(textView.frame.size.width, 10000)].height + 16; - self.rowHeights[(id)textView.specifier.key] = @(MAX(44, MIN(maxHeight, contentHeight))); - textView.scrollEnabled = contentHeight > maxHeight; - - void (^actions)(void) = ^{ - [self.tableView beginUpdates]; - [self.tableView endUpdates]; - }; - - if (animated) { - actions(); - } - else { - [UIView performWithoutAnimation:actions]; - } -} - -#pragma mark - List groups -- (void)listItemCancel:(id)sender { - self.childPaneHandler = nil; - [self dismissViewControllerAnimated:YES completion:nil]; -} - -- (void)listItemDone:(id)sender { - self.childPaneHandler(YES); - self.childPaneHandler = nil; - [self dismissViewControllerAnimated:YES completion:nil]; -} - -#pragma mark - Notifications - -- (void)synchronizeSettings { - [self.settingsStore synchronize]; -} - -static NSMutableDictionary *oldUserDefaults = nil; -- (void)userDefaultsDidChange { - dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0.5 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{ - IASKSettingsStoreUserDefaults *udSettingsStore = (id)self.settingsStore; - NSDictionary *currentDict = udSettingsStore.defaults.dictionaryRepresentation; - NSMutableArray *indexPathsToUpdate = [NSMutableArray array]; - for (NSString *key in currentDict.allKeys) { - if (oldUserDefaults && ![[oldUserDefaults valueForKey:key] isEqual:[currentDict valueForKey:key]]) { - NSIndexPath *path = [self.settingsReader indexPathForKey:key]; - if (path && ![[self.settingsReader specifierForKey:key].type isEqualToString:kIASKCustomViewSpecifier] && [self.tableView.indexPathsForVisibleRows containsObject:path]) { - [indexPathsToUpdate addObject:path]; - } - } - } - oldUserDefaults = currentDict.mutableCopy; - - for (UITableViewCell *cell in self.tableView.visibleCells) { - NSIndexPath *indexPath = [self.tableView indexPathForCell:cell]; - if ([cell isKindOfClass:[IASKPSTextFieldSpecifierViewCell class]] && [((IASKPSTextFieldSpecifierViewCell*)cell).textField isFirstResponder] && indexPath) { - [indexPathsToUpdate removeObject:indexPath]; - } else if ([cell isKindOfClass:IASKEmbeddedDatePickerViewCell.class] && !((IASKEmbeddedDatePickerViewCell*)cell).datePicker.editing) { - [indexPathsToUpdate removeObject:indexPath]; - } - } - if (indexPathsToUpdate.count) { - [self.tableView reloadRowsAtIndexPaths:indexPathsToUpdate withRowAnimation:UITableViewRowAnimationAutomatic]; - } - }); -} - -- (void)didChangeSettingViaIASK:(NSNotification*)notification { - NSString *key = notification.userInfo.allKeys.firstObject; - if (key) { - [oldUserDefaults setValue:notification.userInfo[key] forKey:key]; - } - if (self.childPaneHandler) { - self.childPaneHandler(NO); - } -} - -- (void)reload { - // wait 0.5 sec until UI is available after applicationWillEnterForeground - [self.tableView performSelector:@selector(reloadData) withObject:nil afterDelay:0.5]; -} - -- (void)setMultiValuesFromDelegateIfNeeded:(IASKSpecifier *)specifier { - if (specifier.multipleValues.count == 0) { - if ([self.delegate respondsToSelector:@selector(settingsViewController:valuesForSpecifier:)] && - [self.delegate respondsToSelector:@selector(settingsViewController:titlesForSpecifier:)]) - { - [specifier setMultipleValuesDictValues:[self.delegate settingsViewController:self valuesForSpecifier:specifier] - titles:[self.delegate settingsViewController:self titlesForSpecifier:specifier]]; - } - [specifier sortIfNeeded]; - } -} - - -#pragma mark CGRect Utility function -CGRect IASKCGRectSwap(CGRect rect) { - CGRect newRect; - newRect.origin.x = rect.origin.y; - newRect.origin.y = rect.origin.x; - newRect.size.width = rect.size.height; - newRect.size.height = rect.size.width; - return newRect; -} -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m deleted file mode 100644 index 50f75a72..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m +++ /dev/null @@ -1,170 +0,0 @@ -// -// IASKAppSettingsWebViewController.h -// InAppSettingsKit -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKAppSettingsWebViewController.h" -#import "IASKSettingsReader.h" -#import "IASKSpecifier.h" - -@interface IASKAppSettingsWebViewController() -@property (nullable, nonatomic, strong, readwrite) WKWebView *webView; -@property (nonatomic, strong, readwrite) NSURL *url; -@end - -@implementation IASKAppSettingsWebViewController - -- (id)initWithFile:(NSString*)urlString specifier:(IASKSpecifier*)specifier { - if ((self = [super init])) { - NSURL *url = [NSURL URLWithString:urlString]; - if (!url.scheme) { - NSString *path = [NSBundle.mainBundle pathForResource:urlString.stringByDeletingPathExtension ofType:urlString.pathExtension]; - url = path ? [NSURL fileURLWithPath:path] : nil; - } - self.customTitle = [specifier localizedObjectForKey:kIASKChildTitle]; - self.title = self.customTitle ? : specifier.title; - if (!url) { - return nil; - } - self.url = url; - } - return self; -} - -- (void)loadView { - self.webView = [[WKWebView alloc] init]; - self.webView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - self.webView.navigationDelegate = self; - - self.view = self.webView; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - UIActivityIndicatorView *activityIndicatorView = [[UIActivityIndicatorView alloc] initWithFrame:CGRectMake(0, 0, 40, 20)]; -#if TARGET_OS_MACCATALYST - activityIndicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleMedium; -#else - activityIndicatorView.activityIndicatorViewStyle = UIActivityIndicatorViewStyleWhite; -#endif - [activityIndicatorView startAnimating]; - self.navigationItem.rightBarButtonItem = [[UIBarButtonItem alloc] initWithCustomView:activityIndicatorView]; - [self.webView loadRequest:[NSURLRequest requestWithURL:self.url]]; -} - -- (void)webView:(WKWebView *)webView didFinishNavigation:(WKNavigation *)navigation { - self.navigationItem.rightBarButtonItem = nil; - [self.webView evaluateJavaScript:@"document.title" completionHandler:^(id result, NSError *error) { - NSString* title = (NSString*)result; - self.title = self.customTitle.length ? self.customTitle : title; - }]; -} - -- (void)webView:(WKWebView *)webView decidePolicyForNavigationAction:(WKNavigationAction *)navigationAction decisionHandler:(void (^)(WKNavigationActionPolicy))decisionHandler NS_EXTENSION_UNAVAILABLE("Uses APIs (i.e UIApplication.sharedApplication) not available for use in App Extensions.") { - NSURL* newURL = navigationAction.request.URL; - - // intercept mailto URL and send it to an in-app Mail compose view instead - if ([[newURL scheme] isEqualToString:@"mailto"]) { - [self handleMailto:newURL]; - decisionHandler(WKNavigationActionPolicyCancel); - return; - } - - // open inline if host is the same, otherwise, pass to the system - if (![newURL host] || ![self.url host] || [[newURL host] isEqualToString:(NSString *)[self.url host]]) { - decisionHandler(WKNavigationActionPolicyAllow); - return; - } - - IASK_IF_IOS11_OR_GREATER([UIApplication.sharedApplication openURL:newURL options:@{} completionHandler:nil];); - IASK_IF_PRE_IOS11([UIApplication.sharedApplication openURL:newURL];); - decisionHandler(WKNavigationActionPolicyCancel); -} - -- (void)handleMailto:(NSURL*)mailToURL NS_EXTENSION_UNAVAILABLE("Uses APIs (i.e UIApplication.sharedApplication) not available for use in App Extensions.") { - NSArray *rawURLparts = [[mailToURL resourceSpecifier] componentsSeparatedByString:@"?"]; - if (rawURLparts.count > 2 || !MFMailComposeViewController.canSendMail) { - return; // invalid URL or can't send mail - } - - MFMailComposeViewController *mailViewController = [[MFMailComposeViewController alloc] init]; - mailViewController.mailComposeDelegate = self; - - NSMutableArray *toRecipients = [NSMutableArray array]; - NSString *defaultRecipient = [rawURLparts objectAtIndex:0]; - if (defaultRecipient.length) { - [toRecipients addObject:defaultRecipient]; - } - - if (rawURLparts.count == 2) { - NSString *queryString = [rawURLparts objectAtIndex:1]; - - NSArray *params = [queryString componentsSeparatedByString:@"&"]; - for (NSString *param in params) { - NSArray *keyValue = [param componentsSeparatedByString:@"="]; - if (keyValue.count != 2) { - continue; - } - NSString *key = [[keyValue objectAtIndex:0] lowercaseString]; - NSString *value = [keyValue objectAtIndex:1]; - - value = CFBridgingRelease(CFURLCreateStringByReplacingPercentEscapes(kCFAllocatorDefault, - (CFStringRef)value, - CFSTR(""))); - - if ([key isEqualToString:@"subject"]) { - [mailViewController setSubject:value]; - } - - if ([key isEqualToString:@"body"]) { - [mailViewController setMessageBody:value isHTML:NO]; - } - - if ([key isEqualToString:@"to"]) { - [toRecipients addObjectsFromArray:[value componentsSeparatedByString:@","]]; - } - - if ([key isEqualToString:@"cc"]) { - NSArray *recipients = [value componentsSeparatedByString:@","]; - [mailViewController setCcRecipients:recipients]; - } - - if ([key isEqualToString:@"bcc"]) { - NSArray *recipients = [value componentsSeparatedByString:@","]; - [mailViewController setBccRecipients:recipients]; - } - } - } - - [mailViewController setToRecipients:toRecipients]; - - mailViewController.navigationBar.barStyle = self.navigationController.navigationBar.barStyle; - mailViewController.navigationBar.tintColor = self.navigationController.navigationBar.tintColor; - mailViewController.navigationBar.titleTextAttributes = self.navigationController.navigationBar.titleTextAttributes; -#if !TARGET_OS_MACCATALYST - UIStatusBarStyle savedStatusBarStyle = [UIApplication sharedApplication].statusBarStyle; -#endif - [self presentViewController:mailViewController animated:YES completion:^{ -#if !TARGET_OS_MACCATALYST - [UIApplication sharedApplication].statusBarStyle = savedStatusBarStyle; -#endif - }]; -} - -- (void)mailComposeController:(MFMailComposeViewController*)controller didFinishWithResult:(MFMailComposeResult)result error:(NSError*)error { - [self dismissViewControllerAnimated:YES completion:nil]; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKMultipleValueSelection.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKMultipleValueSelection.m deleted file mode 100644 index 1b949f84..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKMultipleValueSelection.m +++ /dev/null @@ -1,145 +0,0 @@ -// -// IASKMultipleValueSelection.m -// InAppSettingsKit -// -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKMultipleValueSelection.h" -#import "IASKSettingsStore.h" -#import "IASKSettingsStoreUserDefaults.h" -#import "IASKSpecifier.h" -#import "IASKSettingsReader.h" - - -@interface IASKMultipleValueSelection () -@property (nonatomic, strong) IASKSpecifier *specifier; -@property (nonatomic) NSInteger section; - -@property (nonatomic) NSInteger checkedIndex; -@end - -@implementation IASKMultipleValueSelection - -@synthesize settingsStore = _settingsStore; - -- (id)initWithSettingsStore:(id)settingsStore - tableView:(UITableView*)tableView - specifier:(IASKSpecifier*)specifier - section:(NSInteger)section { - if ((self = [super init])) { - self.settingsStore = settingsStore; - self.tableView = tableView; - self.specifier = specifier; - self.section = section; - } - return self; -} - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:nil]; -} - -- (void)setSpecifier:(IASKSpecifier *)specifier { - _specifier = specifier; - [self updateCheckedItem]; -} - -- (NSIndexPath *)checkedIndexPath { - return [NSIndexPath indexPathForRow:self.checkedIndex inSection:_section];; -} - -- (void)updateCheckedItem { - // Find the currently checked item - id value = [self.settingsStore objectForSpecifier:self.specifier]; - if (!value) { - value = self.specifier.defaultValue; - } - self.checkedIndex = [self.specifier.multipleValues indexOfObject:value]; -} - -- (id)settingsStore { - if (_settingsStore == nil) { - self.settingsStore = [[IASKSettingsStoreUserDefaults alloc] init]; - } - return _settingsStore; -} - -- (void)setSettingsStore:(id)settingsStore { - if ([_settingsStore isKindOfClass:IASKSettingsStoreUserDefaults.class]) { - IASKSettingsStoreUserDefaults *udSettingsStore = (id)_settingsStore; - [[NSNotificationCenter defaultCenter] removeObserver:self name:NSUserDefaultsDidChangeNotification object:udSettingsStore.defaults]; - } - - _settingsStore = settingsStore; - - if ([settingsStore isKindOfClass:IASKSettingsStoreUserDefaults.class]) { - IASKSettingsStoreUserDefaults *udSettingsStore = (id)settingsStore; - [[NSNotificationCenter defaultCenter] addObserver:self - selector:@selector(userDefaultsDidChange) - name:NSUserDefaultsDidChangeNotification - object:udSettingsStore.defaults]; - } - [self updateCheckedItem]; -} - -#pragma mark - selection - -- (void)selectRowAtIndexPath:(NSIndexPath *)indexPath { - - if (indexPath == self.checkedIndexPath) { - [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; - return; - } - - NSArray *values = self.specifier.multipleValues; - - [self.tableView deselectRowAtIndexPath:indexPath animated:YES]; - [self deselectCell:[self.tableView cellForRowAtIndexPath:self.checkedIndexPath]]; - [self selectCell:[self.tableView cellForRowAtIndexPath:indexPath]]; - self.checkedIndex = indexPath.row; - - [self.settingsStore setObject:[values objectAtIndex:indexPath.row] forSpecifier:self.specifier]; - [self.settingsStore synchronize]; - NSDictionary *userInfo = self.specifier.key && values[indexPath.row] ? @{(id)self.specifier.key: (id)values[indexPath.row]} : nil; - [[NSNotificationCenter defaultCenter] postNotificationName:kIASKAppSettingChanged object:self userInfo:userInfo]; -}; - -- (void)updateSelectionInCell:(UITableViewCell *)cell indexPath:(NSIndexPath *)indexPath { - if ([indexPath isEqual:self.checkedIndexPath]) { - [self selectCell:cell]; - } else { - [self deselectCell:cell]; - } -} - -- (void)selectCell:(UITableViewCell *)cell { - [cell setAccessoryType:UITableViewCellAccessoryCheckmark]; -} - -- (void)deselectCell:(UITableViewCell *)cell { - [cell setAccessoryType:UITableViewCellAccessoryNone]; -} - - -#pragma mark Notifications - -- (void)userDefaultsDidChange { - NSIndexPath *oldCheckedItem = self.checkedIndexPath; - if (_specifier) { - [self updateCheckedItem]; - } - - // only reload the table if it had changed; prevents animation cancellation - if (![self.checkedIndexPath isEqual:oldCheckedItem]) { - [self.tableView reloadData]; - } -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m deleted file mode 100644 index 3802d0f8..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m +++ /dev/null @@ -1,140 +0,0 @@ -// -// IASKSpecifierValuesViewController.m -// InAppSettingsKit -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSpecifierValuesViewController.h" -#import "IASKSpecifier.h" -#import "IASKSettingsReader.h" -#import "IASKMultipleValueSelection.h" - -#define kCellValue @"kCellValue" - -@interface IASKSpecifierValuesViewController() -@property (nonnull, nonatomic, strong) IASKSpecifier *currentSpecifier; -@property (nonatomic, strong) IASKMultipleValueSelection *selection; -@property (nonatomic) BOOL didFirstLayout; -@end - -@implementation IASKSpecifierValuesViewController - -@synthesize settingsReader = _settingsReader; -@synthesize settingsStore = _settingsStore; -@synthesize childPaneHandler = _childPaneHandler; -@synthesize listParentViewController; - -- (id)initWithSpecifier:(IASKSpecifier*)specifier { - if ((self = [super initWithStyle:UITableViewStyleGrouped])) { - self.currentSpecifier = specifier; - }; - return self; -} - -- (id)initWithSpecifier:(IASKSpecifier*)specifier style:(UITableViewStyle)style { - if ((self = [super initWithStyle:style])) { - self.currentSpecifier = specifier; - }; - return self; -} - -- (void)setSettingsStore:(id )settingsStore { - self.selection = [[IASKMultipleValueSelection alloc] initWithSettingsStore:settingsStore tableView:self.tableView specifier:self.currentSpecifier section:0]; -} - -- (void)viewWillAppear:(BOOL)animated { - [super viewWillAppear:animated]; - - if (self.currentSpecifier) { - self.title = self.currentSpecifier.title; - IASK_IF_IOS11_OR_GREATER(self.navigationItem.largeTitleDisplayMode = self.title.length ? UINavigationItemLargeTitleDisplayModeAutomatic : UINavigationItemLargeTitleDisplayModeNever;); - } - - if (self.tableView) { - self.selection.tableView = self.tableView; - [self.tableView reloadData]; - - // Make sure the currently checked item is visible - [self.tableView scrollToRowAtIndexPath:self.selection.checkedIndexPath - atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; - } - self.didFirstLayout = NO; -} - -- (void)viewDidDisappear:(BOOL)animated { - [super viewDidDisappear:animated]; - self.selection.tableView = nil; -} - -- (void)viewWillLayoutSubviews { - [super viewWillLayoutSubviews]; - - if (!self.didFirstLayout) { - self.didFirstLayout = YES; - [self.tableView scrollToRowAtIndexPath:self.selection.checkedIndexPath - atScrollPosition:UITableViewScrollPositionMiddle animated:NO]; - [self.tableView flashScrollIndicators]; - } -} - -#pragma mark - -#pragma mark UITableView delegates - -- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { - return 1; -} - -- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { - return [self.currentSpecifier multipleValuesCount]; -} - -- (NSString *)tableView:(UITableView *)tableView titleForFooterInSection:(NSInteger)section { - return [self.currentSpecifier footerText]; -} - -- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { - UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:kCellValue]; - NSArray *titles = self.currentSpecifier.multipleTitles; - NSArray *iconNames = self.currentSpecifier.multipleIconNames; - - if (!cell) { - cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:kCellValue]; - } - - [self.selection updateSelectionInCell:cell indexPath:indexPath]; - UIColor *textColor = [UILabel appearanceWhenContainedInInstancesOfClasses:@[UITableViewCell.class]].textColor; - if (textColor == nil) { - textColor = [UILabel appearance].textColor; - } - cell.textLabel.textColor = textColor; - - @try { - [[cell textLabel] setText:[self.settingsReader titleForId:[titles objectAtIndex:indexPath.row]]]; - if ((NSInteger)iconNames.count > indexPath.row) { - NSString *iconName = iconNames[indexPath.row]; - // This tries to read the image from the main bundle. As this is currently not supported in - // system settings, this should be the correct behaviour. (Idea: abstract away and try different - // paths?) - UIImage *image = [UIImage imageNamed:iconName]; - cell.imageView.image = image; - } - } - @catch (NSException * e) {} - return cell; -} - -- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath { - [self.selection selectRowAtIndexPath:indexPath]; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsReader.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsReader.m deleted file mode 100644 index cf38bacf..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsReader.m +++ /dev/null @@ -1,437 +0,0 @@ -// -// IASKSettingsReader.m -// InAppSettingsKit -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSettingsReader.h" -#import "IASKSpecifier.h" -#import "IASKSettingsStore.h" - -NSString * const IASKSettingChangedNotification = @"IASKAppSettingChangedNotification"; - -#pragma mark - -@interface NSArray (IASKAdditions) -- (id)iaskObjectAtIndex:(NSUInteger)index; -@end - -@implementation IASKSettingsReader - -- (nonnull id)initWithFile:(nonnull NSString*)file bundle:(nonnull NSBundle*)bundle { - if ((self = [super init])) { - _applicationBundle = bundle; - - NSString* plistFilePath = [self locateSettingsFile:file]; - NSDictionary *settingsDictionary = [NSDictionary dictionaryWithContentsOfFile:plistFilePath]; - NSAssert(settingsDictionary, @"invalid settings plist"); - _settingsDictionary = settingsDictionary; - - //store the bundle which we'll need later for getting localizations - NSString* settingsBundlePath = plistFilePath.stringByDeletingLastPathComponent; - NSBundle *settingsBundle = [NSBundle bundleWithPath:settingsBundlePath]; - NSAssert(settingsBundle, @"invalid settings bundle"); - _settingsBundle = settingsBundle; - - // Look for localization file - NSString *localizationTable = [_settingsDictionary objectForKey:@"StringsTable"]; - if (!localizationTable) { - // Look for localization file using filename - localizationTable = [plistFilePath.stringByDeletingPathExtension // removes '.plist' - .stringByDeletingPathExtension // removes potential '.inApp' - .lastPathComponent // strip absolute path - stringByReplacingOccurrencesOfString:[self platformSuffixForInterfaceIdiom:[[UIDevice currentDevice] userInterfaceIdiom]] withString:@""]; // removes potential '~device' (~ipad, ~iphone) - if ([self.settingsBundle pathForResource:localizationTable ofType:@"strings"] == nil) { - // Could not find the specified localization: use default - localizationTable = @"Root"; - } - } - self.localizationTable = localizationTable ?: @"Root"; - - self.showPrivacySettings = NO; - NSArray *privacyRelatedInfoPlistKeys = @[@"NSBluetoothPeripheralUsageDescription", @"NSCalendarsUsageDescription", @"NSCameraUsageDescription", @"NSContactsUsageDescription", @"NSLocationAlwaysAndWhenInUseUsageDescription", @"NSLocationAlwaysUsageDescription", @"NSLocationUsageDescription", @"NSLocationWhenInUseUsageDescription", @"NSMicrophoneUsageDescription", @"NSMotionUsageDescription", @"NSPhotoLibraryAddUsageDescription", @"NSPhotoLibraryUsageDescription", @"NSRemindersUsageDescription", @"NSHealthShareUsageDescription", @"NSHealthUpdateUsageDescription"]; - NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary]; - if ([file isEqualToString:@"Root"]) { - for (NSString* key in privacyRelatedInfoPlistKeys) { - if (infoDictionary[key]) { - self.showPrivacySettings = YES; - break; - } - } - } - if (self.settingsDictionary) { - [self _reinterpretBundle:self.settingsDictionary]; - } - } - return self; -} - -- (nonnull id)initWithFile:(nonnull NSString*)file { - return [self initWithFile:file bundle:[NSBundle mainBundle]]; -} - -- (id)init { - return [self initWithFile:@"Root"]; -} - -- (void)setHiddenKeys:(NSSet *)anHiddenKeys { - if (_hiddenKeys != anHiddenKeys) { - _hiddenKeys = anHiddenKeys; - - if (self.settingsDictionary) { - [self _reinterpretBundle:self.settingsDictionary]; - } - } -} - -- (void)setSelectedSpecifier:(IASKSpecifier *)selectedSpecifier { - if (_selectedSpecifier != selectedSpecifier) { - _selectedSpecifier = selectedSpecifier; - [self _reinterpretBundle:self.settingsDictionary]; - } -} - -- (void)setShowPrivacySettings:(BOOL)showPrivacySettings { - if (_showPrivacySettings != showPrivacySettings) { - _showPrivacySettings = showPrivacySettings; - [self _reinterpretBundle:self.settingsDictionary]; - } -} - -- (NSArray*)privacySettingsSpecifiers { - NSMutableDictionary *dict = [@{kIASKTitle: NSLocalizedStringFromTableInBundle(@"Privacy", @"IASKLocalizable", self.iaskBundle, @"Privacy cell: title"), - kIASKKey: @"IASKPrivacySettingsCellKey", - kIASKType: kIASKOpenURLSpecifier, - kIASKFile: UIApplicationOpenSettingsURLString, - } mutableCopy]; - NSString *subtitle = NSLocalizedStringFromTableInBundle(@"Open in Settings app", @"IASKLocalizable", self.iaskBundle, @"Privacy cell: subtitle"); - if (subtitle.length) { - dict [kIASKSubtitle] = subtitle; - } - - return @[@[[[IASKSpecifier alloc] initWithSpecifier:@{kIASKKey: @"IASKPrivacySettingsHeaderKey", kIASKType: kIASKPSGroupSpecifier}], - [[IASKSpecifier alloc] initWithSpecifier:dict]]]; -} - -- (NSBundle*)iaskBundle { -#ifdef SWIFTPM_MODULE_BUNDLE - return SWIFTPM_MODULE_BUNDLE; -#endif - - NSURL *inAppSettingsBundlePath = [[NSBundle bundleForClass:[self class]] URLForResource:@"InAppSettingsKit" withExtension:@"bundle"]; - NSBundle *bundle; - - if (inAppSettingsBundlePath) { - bundle = [NSBundle bundleWithURL:inAppSettingsBundlePath]; - } else { - bundle = [NSBundle mainBundle]; - } - - return bundle; -} - -- (void)_reinterpretBundle:(NSDictionary*)settingsBundle { - NSArray *preferenceSpecifiers = [settingsBundle objectForKey:kIASKPreferenceSpecifiers]; - NSMutableArray *dataSource = [NSMutableArray array]; - - if (self.showPrivacySettings) { - [dataSource addObjectsFromArray:self.privacySettingsSpecifiers]; - } - - BOOL ignoreItemsInThisSection = NO; - for (NSDictionary *specifierDictionary in preferenceSpecifiers) { - IASKSpecifier *newSpecifier = [[IASKSpecifier alloc] initWithSpecifier:specifierDictionary]; - newSpecifier.settingsReader = self; - [newSpecifier sortIfNeeded]; - - if (![newSpecifier.userInterfaceIdioms containsObject:@([[UIDevice currentDevice] userInterfaceIdiom])]) { - // All specifiers without a matching idiom are ignored in the iOS Settings app, so we will do likewise here. - // Some specifiers may be seen as containing other elements, such as groups, but the iOS settings app will not ignore the perceived content of those unless their own supported idioms do not fit. - continue; - } - - if ([@[kIASKPSGroupSpecifier, kIASKPSRadioGroupSpecifier, kIASKListGroupSpecifier] containsObject:newSpecifier.type]) { - - if (newSpecifier.key && [self.hiddenKeys containsObject:(id)newSpecifier.key]) { - ignoreItemsInThisSection = YES; - continue; - } - ignoreItemsInThisSection = NO; - - ///create a brand new array with the specifier above and an empty array - NSMutableArray *newArray = [NSMutableArray array]; - [newArray addObject:newSpecifier]; - [dataSource addObject:newArray]; - - if ([newSpecifier.type isEqualToString:kIASKPSRadioGroupSpecifier]) { - for (NSString *value in newSpecifier.multipleValues) { - IASKSpecifier *valueSpecifier = - [[IASKSpecifier alloc] initWithSpecifier:specifierDictionary radioGroupValue:value]; - valueSpecifier.settingsReader = self; - [valueSpecifier sortIfNeeded]; - [newArray addObject:valueSpecifier]; - } - } - } else { - if (ignoreItemsInThisSection || (newSpecifier.key && [self.hiddenKeys containsObject:(id)newSpecifier.key])) { - continue; - } - - if (dataSource.count == 0 || (dataSource.count == 1 && self.showPrivacySettings)) { - [dataSource addObject:[NSMutableArray array]]; - } - - [(NSMutableArray*)dataSource.lastObject addObject:newSpecifier]; - - if ([newSpecifier isEqual:self.selectedSpecifier]) { - [(NSMutableArray*)dataSource.lastObject addObject:newSpecifier.editSpecifier]; - } - } - } - [self setDataSource:dataSource]; -} - -- (BOOL)_sectionHasHeading:(NSInteger)section { - return [self headerSpecifierForSection:section] != nil; -} - -/// Returns the specifier describing the section's header, or nil if there is no header. -- (nullable IASKSpecifier*)headerSpecifierForSection:(NSInteger)section { - IASKSpecifier *specifier = [[self.dataSource iaskObjectAtIndex:section] iaskObjectAtIndex:kIASKSectionHeaderIndex]; - if ([specifier.type isEqualToString:kIASKPSGroupSpecifier] - || [specifier.type isEqualToString:kIASKListGroupSpecifier] - || [specifier.type isEqualToString:kIASKPSRadioGroupSpecifier]) { - return specifier; - } - return nil; -} - -- (NSInteger)numberOfSections { - return self.dataSource.count; -} - -- (NSInteger)numberOfRowsInSection:(NSInteger)section { - int headingCorrection = [self _sectionHasHeading:section] ? 1 : 0; - - IASKSpecifier *headerSpecifier = [[[self dataSource] iaskObjectAtIndex:section] iaskObjectAtIndex:kIASKSectionHeaderIndex]; - if ([headerSpecifier.type isEqualToString:kIASKListGroupSpecifier]) { - NSInteger numberOfRows = [self.settingsStore arrayForSpecifier:headerSpecifier].count; - - if (headerSpecifier.addSpecifier) { - numberOfRows++; - } - return numberOfRows; - } - - return ((NSArray*)[self.dataSource iaskObjectAtIndex:section]).count - headingCorrection; -} - -- (nullable IASKSpecifier*)specifierForIndexPath:(nonnull NSIndexPath*)indexPath { - int headingCorrection = [self _sectionHasHeading:indexPath.section] ? 1 : 0; - IASKSpecifier *specifier; - - IASKSpecifier *headerSpecifier = [self headerSpecifierForSection:indexPath.section]; - - if (headerSpecifier != nil && [headerSpecifier.type isEqualToString:kIASKListGroupSpecifier]) { - NSInteger numberOfRows = [self.settingsStore arrayForSpecifier:headerSpecifier].count; - - if (indexPath.row < numberOfRows) { - specifier = [headerSpecifier itemSpecifierForIndex:indexPath.row]; - } else if (headerSpecifier.addSpecifier != nil) { - specifier = headerSpecifier.addSpecifier; - } - } else { - specifier = [[[self dataSource] iaskObjectAtIndex:indexPath.section] iaskObjectAtIndex:(indexPath.row+headingCorrection)]; - } - - specifier.settingsReader = self; - return specifier; -} - -- (nullable NSIndexPath*)indexPathForKey:(NSString *)key { - for (NSUInteger sectionIndex = 0; sectionIndex < self.dataSource.count; sectionIndex++) { - NSArray *section = [self.dataSource iaskObjectAtIndex:sectionIndex]; - for (NSInteger rowIndex = 0; (NSUInteger)rowIndex < section.count; rowIndex++) { - IASKSpecifier *specifier = (IASKSpecifier*)[section objectAtIndex:rowIndex]; - if ([specifier isKindOfClass:[IASKSpecifier class]] && [specifier.key isEqualToString:key]) { - NSInteger headingCorrection = [self _sectionHasHeading:sectionIndex] ? 1 : 0; - NSUInteger correctedRowIndex = MAX(0, rowIndex - headingCorrection); - return [NSIndexPath indexPathForRow:correctedRowIndex inSection:sectionIndex]; - } - } - } - return nil; -} - -- (nullable IASKSpecifier*)specifierForKey:(NSString*)key { - for (NSArray *specifiers in _dataSource) { - for (id sp in specifiers) { - if ([sp isKindOfClass:[IASKSpecifier class]]) { - if ([[sp key] isEqualToString:key]) { - return sp; - } - } - } - } - return nil; -} - -- (nullable NSString*)titleForSection:(NSInteger)section { - return [self titleForId:[self headerSpecifierForSection:section].title]; -} - -- (nullable NSString*)keyForSection:(NSInteger)section { - return [self headerSpecifierForSection:section].key; -} - -- (nullable NSString*)footerTextForSection:(NSInteger)section { - return [self titleForId:[self headerSpecifierForSection:section].footerText]; -} - -- (nullable NSString*)titleForId:(nullable NSObject*)titleId { - if ([titleId isKindOfClass:NSNumber.class]) { - NSNumber* numberTitleId = (NSNumber*)titleId; - NSNumberFormatter* formatter = [NSNumberFormatter new]; - [formatter setNumberStyle:NSNumberFormatterNoStyle]; - return [formatter stringFromNumber:numberTitleId]; - } else if ([titleId isKindOfClass:NSString.class]) { - NSString* stringTitleId = (NSString*)titleId; - return [self.settingsBundle localizedStringForKey:stringTitleId value:stringTitleId table:self.localizationTable]; - } else { - return nil; - } -} - -- (NSDictionary*)gatherDefaultsLimitedToEditableFields:(BOOL)limitedToEditableFields { - NSMutableDictionary *dictionary = NSMutableDictionary.dictionary; - [self gatherDefaultsInDictionary:dictionary limitedToEditableFields:limitedToEditableFields apply:NO]; - return dictionary; -} - -- (void)applyDefaultsToStore { - [self gatherDefaultsInDictionary:nil limitedToEditableFields:YES apply:YES]; -} - -- (void)gatherDefaultsInDictionary:(NSMutableDictionary*)dictionary limitedToEditableFields:(BOOL)limitedToEditableFields apply:(BOOL)apply { - NSArray *editableTypes = @[kIASKPSToggleSwitchSpecifier, kIASKPSMultiValueSpecifier, kIASKPSRadioGroupSpecifier, kIASKPSSliderSpecifier, kIASKPSTextFieldSpecifier, kIASKTextViewSpecifier, kIASKCustomViewSpecifier, kIASKDatePickerSpecifier]; - for (NSArray *section in self.dataSource) { - for (IASKSpecifier *specifier in section) { - if (specifier.key && specifier.defaultValue && (!limitedToEditableFields || [editableTypes containsObject:specifier.type])) { - if (apply && ![self.settingsStore objectForSpecifier:specifier]) { - [self.settingsStore setObject:specifier.defaultValue forSpecifier:specifier]; - } - [dictionary setObject:(id)specifier.defaultValue forKey:(id)specifier.key]; - } - if ([specifier.type isEqualToString:kIASKPSChildPaneSpecifier] && specifier.file) { - IASKSettingsReader *childReader = [[IASKSettingsReader alloc] initWithFile:(id)specifier.file]; - childReader.settingsStore = self.settingsStore; - [childReader gatherDefaultsInDictionary:dictionary limitedToEditableFields:limitedToEditableFields apply:apply]; - } - } - } -} - -- (nonnull NSString*)pathForImageNamed:(nonnull NSString*)image { - return image ? [self.settingsBundle.bundlePath stringByAppendingPathComponent:(id)image] : @""; -} - -- (NSString *)platformSuffixForInterfaceIdiom:(UIUserInterfaceIdiom) interfaceIdiom { - switch (interfaceIdiom) { - case UIUserInterfaceIdiomPad: return @"~ipad"; - case UIUserInterfaceIdiomPhone: return @"~iphone"; - default: return @"~iphone"; - } -} - -- (NSString *)file:(NSString *)file - withBundle:(NSString *)bundle - suffix:(NSString *)suffix - extension:(NSString *)extension { - - bundle = [self.applicationBundle pathForResource:bundle ofType:nil]; - file = [file stringByAppendingFormat:@"%@%@", suffix, extension]; - return [bundle stringByAppendingPathComponent:file]; -} - -- (NSString *)locateSettingsFile: (NSString *)file { - static NSString* const kIASKBundleFolder = @"Settings.bundle"; - static NSString* const kIASKBundleFolderAlt = @"InAppSettings.bundle"; - - static NSString* const kIASKBundleLocaleFolderExtension = @".lproj"; - - // The file is searched in the following order: - // - // InAppSettings.bundle/FILE~DEVICE.inApp.plist - // InAppSettings.bundle/FILE.inApp.plist - // InAppSettings.bundle/FILE~DEVICE.plist - // InAppSettings.bundle/FILE.plist - // Settings.bundle/FILE~DEVICE.inApp.plist - // Settings.bundle/FILE.inApp.plist - // Settings.bundle/FILE~DEVICE.plist - // Settings.bundle/FILE.plist - // - // where DEVICE is either "iphone" or "ipad" depending on the current - // interface idiom. - // - // Settings.app uses the ~DEVICE suffixes since iOS 4.0. There are some - // differences from this implementation: - // - For an iPhone-only app running on iPad, Settings.app will not use the - // ~iphone suffix. There is no point in using these suffixes outside - // of universal apps anyway. - // - This implementation uses the device suffixes on iOS 3.x as well. - // - also check current locale (short only) - - NSArray *settingsBundleNames = @[kIASKBundleFolderAlt, kIASKBundleFolder]; - - NSArray *extensions = @[@".inApp.plist", @".plist"]; - - NSArray *plattformSuffixes = @[[self platformSuffixForInterfaceIdiom:[[UIDevice currentDevice] userInterfaceIdiom]], - @""]; - - NSArray *preferredLanguages = [NSLocale preferredLanguages]; - NSArray *languageFolders = @[[ (preferredLanguages.count ? [preferredLanguages objectAtIndex:0] : @"en") stringByAppendingString:kIASKBundleLocaleFolderExtension], - @""]; - - - NSString *path = nil; - NSFileManager *fileManager = [NSFileManager defaultManager]; - - for (NSString *settingsBundleName in settingsBundleNames) { - for (NSString *extension in extensions) { - for (NSString *platformSuffix in plattformSuffixes) { - for (NSString *languageFolder in languageFolders) { - path = [self file:file - withBundle:[settingsBundleName stringByAppendingPathComponent:languageFolder] - suffix:platformSuffix - extension:extension]; - if ([fileManager fileExistsAtPath:path]) { - goto exitFromNestedLoop; - } - } - } - } - } - -exitFromNestedLoop: - return path; -} - -@end - -@implementation NSArray (IASKAdditions) - -- (id)iaskObjectAtIndex:(NSUInteger)index { - if (index >= self.count) return nil; - return self[index]; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStore.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStore.m deleted file mode 100644 index c704ded2..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStore.m +++ /dev/null @@ -1,135 +0,0 @@ -// -// IASKSettingsStore.m -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSettingsStore.h" -#import "IASKSettingsReader.h" -#import "IASKSpecifier.h" - -@implementation IASKAbstractSettingsStore - -- (void)setObject:(id)value forKey:(NSString*)key { - @throw [NSException exceptionWithName:NSGenericException reason:@"setObject:forKey: must be implemented in subclasses of IASKAbstractSettingsStore" userInfo:nil]; -} - -- (id)objectForKey:(NSString*)key { - @throw [NSException exceptionWithName:NSGenericException reason:@"objectForKey: must be implemented in subclasses of IASKAbstractSettingsStore" userInfo:nil]; -} - -- (void)setObject:(id)value forSpecifier:(IASKSpecifier*)specifier { - if (!value) { - [self removeObjectWithSpecifier:specifier]; - return; - } - if (specifier.parentSpecifier) { - if (specifier.isAddSpecifier) { - [self addObject:value forSpecifier:specifier]; - return; - } - NSMutableArray *array = ([self arrayForSpecifier:(id)specifier.parentSpecifier] ?: @[]).mutableCopy; - if (array.count <= specifier.itemIndex) { - return; - } - NSObject *object = array[specifier.itemIndex]; - if (![value isKindOfClass:NSDictionary.class] && [object isKindOfClass:NSDictionary.class] && [object respondsToSelector:@selector(mutableCopy)]) { - object = [object mutableCopy]; - [object setValue:value forKey:(id)specifier.key]; - } else { - object = value; - } - array[specifier.itemIndex] = object; - [self setObject:array forSpecifier:(id)specifier.parentSpecifier]; - return; - } - if (specifier.key) { - [self setObject:value forKey:(id)specifier.key]; - } -} - -- (id)objectForSpecifier:(IASKSpecifier*)specifier { - if (specifier.parentSpecifier) { - NSArray *array = [self arrayForSpecifier:(id)specifier.parentSpecifier] ?: @[]; - if (array.count <= specifier.itemIndex) { - return nil; - } - NSDictionary *value = array[specifier.itemIndex]; - return specifier.key && [value valueForKey:(id)specifier.key] ? [value valueForKey:(id)specifier.key] : value; - } - - return specifier.key ? [self objectForKey:(id)specifier.key] : nil; -} - -- (void)setBool:(BOOL)value forSpecifier:(IASKSpecifier*)specifier { - [self setObject:[NSNumber numberWithBool:value] forSpecifier:specifier]; -} - -- (void)setFloat:(float)value forSpecifier:(IASKSpecifier*)specifier { - [self setObject:[NSNumber numberWithFloat:value] forSpecifier:specifier]; -} - -- (void)setInteger:(NSInteger)value forSpecifier:(IASKSpecifier*)specifier { - [self setObject:[NSNumber numberWithInteger:value] forSpecifier:specifier]; -} - -- (void)setDouble:(double)value forSpecifier:(IASKSpecifier*)specifier { - [self setObject:[NSNumber numberWithDouble:value] forSpecifier:specifier]; -} - -- (BOOL)boolForSpecifier:(IASKSpecifier*)specifier { - return [[self objectForSpecifier:specifier] boolValue]; -} - -- (float)floatForSpecifier:(IASKSpecifier*)specifier { - return [[self objectForSpecifier:specifier] floatValue]; -} - -- (NSInteger)integerForSpecifier:(IASKSpecifier*)specifier { - return [[self objectForSpecifier:specifier] integerValue]; -} - -- (double)doubleForSpecifier:(IASKSpecifier*)specifier { - return [[self objectForSpecifier:specifier] doubleValue]; -} - -- (void)setArray:(NSArray*)array forSpecifier:(IASKSpecifier*)specifier { - [self setObject:array forSpecifier:specifier]; -} - -- (NSArray*)arrayForSpecifier:(IASKSpecifier*)specifier { - NSArray *array = [self objectForSpecifier:specifier]; - return [array isKindOfClass:NSArray.class] ? array : @[]; -} - -- (void)addObject:(NSObject*)object forSpecifier:(IASKSpecifier*)specifier { - if ([specifier.parentSpecifier.type isEqualToString:kIASKListGroupSpecifier]) { - NSMutableArray *array = [self arrayForSpecifier:(id)specifier.parentSpecifier].mutableCopy; - [array addObject:object]; - [self setArray:array forSpecifier:(id)specifier.parentSpecifier]; - } -} - -- (void)removeObjectWithSpecifier:(IASKSpecifier*)specifier { - if ([specifier.parentSpecifier.type isEqualToString:kIASKListGroupSpecifier]) { - NSMutableArray *array = [self arrayForSpecifier:(id)specifier.parentSpecifier].mutableCopy; - [array removeObjectAtIndex:specifier.itemIndex]; - [self setArray:array forSpecifier:(id)specifier.parentSpecifier]; - } -} - -- (BOOL)synchronize { - return NO; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreFile.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreFile.m deleted file mode 100644 index 00a2c1a2..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreFile.m +++ /dev/null @@ -1,49 +0,0 @@ -// -// IASKSettingsStoreFile.m -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSettingsStoreFile.h" - -@interface IASKSettingsStoreFile() -@property (nonatomic, strong) NSMutableDictionary *dict; -@property (nonatomic, copy, readwrite) NSString* filePath; -@end - -@implementation IASKSettingsStoreFile - -- (id)initWithPath:(NSString*)path { - if((self = [super init])) { - self.filePath = path; - self.dict = [[NSMutableDictionary alloc] initWithContentsOfFile:path]; - if (!self.dict) { - self.dict = NSMutableDictionary.dictionary; - } - } - return self; -} - -- (void)setObject:(id)value forKey:(NSString *)key { - [self.dict setObject:value forKey:key]; -} - -- (id)objectForKey:(NSString *)key { - return [self.dict objectForKey:key]; -} - -- (BOOL)synchronize { - return [self.dict writeToFile:self.filePath atomically:YES]; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreInMemory.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreInMemory.m deleted file mode 100644 index 562aba19..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreInMemory.m +++ /dev/null @@ -1,33 +0,0 @@ -// -// IASKSettingsStoreInMemory.m -// InAppSettingsKit -// -// Created by Costantino Pistagna on 24/04/2020. -// Copyright (c) 2009-2020: -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// - -#import "IASKSettingsStoreInMemory.h" - -@implementation IASKSettingsStoreInMemory - -- (id)initWithDictionary:(NSDictionary *)dictionary { - if ((self = [super init])) { - self.dictionary = [[NSMutableDictionary alloc] initWithDictionary:dictionary]; - } - return self; -} - -- (void)setObject:(id)value forKey:(NSString*)key { - [self.dictionary setObject:value forKey:key]; -} - -- (id)objectForKey:(NSString*)key { - return [self.dictionary objectForKey:key]; -} - -- (BOOL)synchronize { - return NO; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m deleted file mode 100644 index a999f975..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m +++ /dev/null @@ -1,51 +0,0 @@ -// -// IASKSettingsStoreUserDefaults.m -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSettingsStoreUserDefaults.h" - -@interface IASKSettingsStoreUserDefaults () - -@property (nonatomic, strong, readwrite) NSUserDefaults* defaults; - -@end - -@implementation IASKSettingsStoreUserDefaults - -- (id)initWithUserDefaults:(NSUserDefaults *)defaults { - self = [super init]; - if( self ) { - _defaults = defaults; - } - return self; -} - -- (id)init { - return [self initWithUserDefaults:[NSUserDefaults standardUserDefaults]]; -} - -- (void)setObject:(id)value forKey:(NSString*)key { - [self.defaults setObject:value forKey:key]; -} - -- (id)objectForKey:(NSString*)key { - return [self.defaults objectForKey:key]; -} - -- (BOOL)synchronize { - return [self.defaults synchronize]; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSpecifier.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSpecifier.m deleted file mode 100644 index 029dbed9..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Models/IASKSpecifier.m +++ /dev/null @@ -1,622 +0,0 @@ -// -// IASKSpecifier.m -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSpecifier.h" -#import "IASKSettingsReader.h" -#import "IASKAppSettingsWebViewController.h" - -@interface IASKSpecifier () - -@property (nonnull, nonatomic, strong, readwrite) NSDictionary *specifierDict; -@property (nullable, nonatomic, strong, readwrite) IASKSpecifier *parentSpecifier; -@property (nonatomic, strong) NSDictionary *multipleValuesDict; -@property (nullable, nonatomic, copy, readwrite) NSString *radioGroupValue; -@property (nonatomic, readwrite) NSUInteger itemIndex; - -@end - -@implementation IASKSpecifier - -- (id)initWithSpecifier:(NSDictionary*)specifier { - NSAssert(specifier[kIASKType], @"specifier type missing"); - if ((self = [super init])) { - self.specifierDict = specifier; - - if ([self isMultiValueSpecifierType]) { - [self updateMultiValuesDict]; - } - } - return self; -} - -- (id)initWithSpecifier:(NSDictionary *)specifier radioGroupValue:(NSString *)radioGroupValue { - if ((self = [self initWithSpecifier:specifier])) { - self.radioGroupValue = radioGroupValue; - } - return self; -} - -- (BOOL)isMultiValueSpecifierType { - static NSArray *types = nil; - if (!types) { - types = @[kIASKPSMultiValueSpecifier, kIASKPSTitleValueSpecifier, kIASKPSRadioGroupSpecifier]; - } - return [types containsObject:[self type]]; -} - -- (void)updateMultiValuesDict { - NSArray *values = [_specifierDict objectForKey:kIASKValues]; - NSArray *titles = [_specifierDict objectForKey:kIASKTitles]; - [self setMultipleValuesDictValues:values titles:titles]; -} - -- (void)setMultipleValuesDictValues:(NSArray*)values titles:(NSArray*)titles { - NSArray *shortTitles = [_specifierDict objectForKey:kIASKShortTitles]; - NSArray *iconNames = [_specifierDict objectForKey:kIASKIconNames]; - NSMutableDictionary *multipleValuesDict = [NSMutableDictionary new]; - - if (values) { - [multipleValuesDict setObject:values forKey:kIASKValues]; - } - - if (titles) { - [multipleValuesDict setObject:titles forKey:kIASKTitles]; - } - - if (shortTitles.count) { - [multipleValuesDict setObject:shortTitles forKey:kIASKShortTitles]; - } - - if (iconNames.count) { - [multipleValuesDict setObject:iconNames forKey:kIASKIconNames]; - } - - [self setMultipleValuesDict:multipleValuesDict]; -} - -- (void)sortIfNeeded { - if (self.displaySortedByTitle) { - NSArray *values = self.multipleValues ?: [_specifierDict objectForKey:kIASKValues]; - NSArray *titles = self.multipleTitles ?: [_specifierDict objectForKey:kIASKTitles]; - NSArray *shortTitles = self.multipleShortTitles ?: [_specifierDict objectForKey:kIASKShortTitles]; - NSArray *iconNames = self.multipleIconNames ?: [_specifierDict objectForKey:kIASKIconNames]; - - NSAssert(values.count == titles.count, @"Malformed multi-value specifier found in settings bundle. Number of values and titles differ."); - NSAssert(shortTitles == nil || shortTitles.count == values.count, @"Malformed multi-value specifier found in settings bundle. Number of short titles and values differ."); - NSAssert(iconNames == nil || iconNames.count == values.count, @"Malformed multi-value specifier found in settings bundle. Number of icon names and values differ."); - - NSMutableDictionary *multipleValuesDict = [NSMutableDictionary new]; - - NSMutableArray *temporaryMappingsForSort = [NSMutableArray arrayWithCapacity:titles.count]; - - static NSString *const titleKey = @"title"; - static NSString *const shortTitleKey = @"shortTitle"; - static NSString *const localizedTitleKey = @"localizedTitle"; - static NSString *const iconNamesKey = @"iconNamesKey"; - static NSString *const valueKey = @"value"; - - IASKSettingsReader *strongSettingsReader = self.settingsReader; - [titles enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - NSString *localizedTitle = [strongSettingsReader titleForId:obj]; - [temporaryMappingsForSort addObject:@{titleKey : obj, - valueKey : values[idx], - localizedTitleKey : localizedTitle, - shortTitleKey : (shortTitles[idx] ?: [NSNull null]), - iconNamesKey : (iconNames[idx] ?: [NSNull null]), - }]; - }]; - - NSArray *sortedTemporaryMappings = [temporaryMappingsForSort sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) { - NSString *localizedTitle1 = obj1[localizedTitleKey]; - NSString *localizedTitle2 = obj2[localizedTitleKey]; - - if ([localizedTitle1 isKindOfClass:[NSString class]] && [localizedTitle2 isKindOfClass:[NSString class]]) { - return [localizedTitle1 localizedCompare:localizedTitle2]; - } else { - return NSOrderedSame; - } - }]; - - NSMutableArray *sortedTitles = [NSMutableArray arrayWithCapacity:sortedTemporaryMappings.count]; - NSMutableArray *sortedShortTitles = [NSMutableArray arrayWithCapacity:sortedTemporaryMappings.count]; - NSMutableArray *sortedValues = [NSMutableArray arrayWithCapacity:sortedTemporaryMappings.count]; - NSMutableArray *sortedIconNames = [NSMutableArray arrayWithCapacity:sortedTemporaryMappings.count]; - - [sortedTemporaryMappings enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) { - NSDictionary *mapping = obj; - sortedTitles[idx] = (NSString *)mapping[titleKey]; - sortedValues[idx] = (id)mapping[valueKey]; - if (mapping[shortTitleKey] != [NSNull null]) { - sortedShortTitles[idx] = (id)mapping[shortTitleKey]; - } - if (mapping[iconNamesKey] != [NSNull null]) { - sortedIconNames[idx] = (id)mapping[iconNamesKey]; - } - }]; - titles = [sortedTitles copy]; - values = [sortedValues copy]; - shortTitles = [sortedShortTitles copy]; - iconNames = [iconNames copy]; - - if (values) { - [multipleValuesDict setObject:values forKey:kIASKValues]; - } - - if (titles) { - [multipleValuesDict setObject:titles forKey:kIASKTitles]; - } - - if (shortTitles.count) { - [multipleValuesDict setObject:shortTitles forKey:kIASKShortTitles]; - } - - if (iconNames.count) { - [multipleValuesDict setObject:iconNames forKey:kIASKIconNames]; - } - - [self setMultipleValuesDict:multipleValuesDict]; - } -} - -- (BOOL)displaySortedByTitle { - return [[_specifierDict objectForKey:kIASKDisplaySortedByTitle] boolValue]; -} - -- (NSString*)localizedObjectForKey:(NSString*)key { - IASKSettingsReader *settingsReader = self.settingsReader; - return [settingsReader titleForId:[_specifierDict objectForKey:key]]; -} - -- (NSString*)title { - return [self localizedObjectForKey:kIASKTitle]; -} - -- (BOOL)hasSubtitle { - return [_specifierDict objectForKey:kIASKSubtitle] != nil; -} - -- (NSString*)subtitle { - return [self subtitleForValue:nil]; -} - -- (NSString*)subtitleForValue:(id)value { - id subtitleValue = [_specifierDict objectForKey:kIASKSubtitle]; - if ([subtitleValue isKindOfClass:[NSDictionary class]]) { - id subtitleForValue = nil; - if (value != nil) { - subtitleForValue = [(NSDictionary*) subtitleValue objectForKey:value]; - } - if (subtitleForValue == nil) { - subtitleForValue = [(NSDictionary*) subtitleValue objectForKey:@"__default__"]; - } - IASKSettingsReader *settingsReader = self.settingsReader; - return [settingsReader titleForId:subtitleForValue]; - } - return [self localizedObjectForKey:kIASKSubtitle]; -} - -- (NSString *)placeholder { - return [self localizedObjectForKey:kIASKPlaceholder]; -} - -- (NSString*)footerText { - return [self localizedObjectForKey:kIASKFooterText]; -} - -- (Class)viewControllerClass { - [IASKAppSettingsWebViewController class]; // make sure this is linked into the binary/library - NSString *classString = [_specifierDict objectForKey:kIASKViewControllerClass]; - return classString ? ([self classFromString:classString] ?: [NSNull class]) : nil; -} - -- (Class)classFromString:(NSString *)className { - Class class = NSClassFromString(className); - if (!class) { - // if the class doesn't exist as a pure Obj-C class then try to retrieve it as a Swift class. - NSString *appName = [[[NSBundle mainBundle] objectForInfoDictionaryKey:@"CFBundleName"] stringByReplacingOccurrencesOfString:@" " withString:@"_"]; - NSString *classStringName = [NSString stringWithFormat:@"_TtC%lu%@%lu%@", (unsigned long)appName.length, appName, (unsigned long)className.length, className]; - class = NSClassFromString(classStringName); - } - return class; -} - -- (SEL)viewControllerSelector { - NSString *selector = [_specifierDict objectForKey:kIASKViewControllerSelector]; - return selector ? NSSelectorFromString(selector) : nil; -} - -- (NSString*)viewControllerStoryBoardFile { - return [_specifierDict objectForKey:kIASKViewControllerStoryBoardFile]; -} - -- (NSString*)viewControllerStoryBoardID { - return [_specifierDict objectForKey:kIASKViewControllerStoryBoardId]; -} - -- (NSString*)segueIdentifier { - return [_specifierDict objectForKey:kIASKSegueIdentifier]; -} - -- (NSString*)key { - return [_specifierDict objectForKey:kIASKKey]; -} - -- (NSString*)type { - return (id)[_specifierDict objectForKey:kIASKType]; -} - -- (NSString*)titleForCurrentValue:(id)currentValue { - NSArray *values = [self multipleValues]; - NSArray *titles = [self multipleShortTitles] ?: self.multipleTitles; - if (!titles) { - titles = [self multipleTitles]; - } - if (values.count != titles.count) { - return nil; - } - NSInteger keyIndex = [values indexOfObject:currentValue]; - if (keyIndex == NSNotFound) { - return nil; - } - @try { - IASKSettingsReader *strongSettingsReader = self.settingsReader; - return [strongSettingsReader titleForId:[titles objectAtIndex:keyIndex]]; - } - @catch (NSException * e) {} - return nil; -} - -- (NSInteger)multipleValuesCount { - return [[_multipleValuesDict objectForKey:kIASKValues] count]; -} - -- (NSArray*)multipleValues { - return [_multipleValuesDict objectForKey:kIASKValues]; -} - -- (NSArray*)multipleTitles { - return [_multipleValuesDict objectForKey:kIASKTitles]; -} - -- (NSArray *)multipleIconNames { - return [_multipleValuesDict objectForKey:kIASKIconNames]; -} - -- (NSArray*)multipleShortTitles { - return [_multipleValuesDict objectForKey:kIASKShortTitles]; -} - -- (NSString*)file { - return [_specifierDict objectForKey:kIASKFile]; -} - -- (id)defaultValue { - return [_specifierDict objectForKey:kIASKDefaultValue]; -} - -- (id)defaultStringValue { - return [[_specifierDict objectForKey:kIASKDefaultValue] description]; -} - -- (BOOL)defaultBoolValue { - id defaultValue = [self defaultValue]; - if ([defaultValue isEqual:[self trueValue]]) { - return YES; - } - if ([defaultValue isEqual:[self falseValue]]) { - return NO; - } - return [defaultValue boolValue]; -} - -- (id)trueValue { - return [_specifierDict objectForKey:kIASKTrueValue]; -} - -- (id)falseValue { - return [_specifierDict objectForKey:kIASKFalseValue]; -} - -- (float)minimumValue { - return [[_specifierDict objectForKey:kIASKMinimumValue] floatValue]; -} - -- (float)maximumValue { - return [[_specifierDict objectForKey:kIASKMaximumValue] floatValue]; -} - -- (NSString*)minimumValueImage { - return [_specifierDict objectForKey:kIASKMinimumValueImage]; -} - -- (NSString*)maximumValueImage { - return [_specifierDict objectForKey:kIASKMaximumValueImage]; -} - -- (BOOL)isSecure { - return [[_specifierDict objectForKey:kIASKIsSecure] boolValue]; -} - -- (UIKeyboardType)keyboardType { - if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardAlphabet]) { - return UIKeyboardTypeDefault; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNumbersAndPunctuation]) { - return UIKeyboardTypeNumbersAndPunctuation; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNumberPad]) { - return UIKeyboardTypeNumberPad; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardPhonePad]) { - return UIKeyboardTypePhonePad; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardNamePhonePad]) { - return UIKeyboardTypeNamePhonePad; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardASCIICapable]) { - return UIKeyboardTypeASCIICapable; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardDecimalPad]) { - return UIKeyboardTypeDecimalPad; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:KIASKKeyboardURL]) { - return UIKeyboardTypeURL; - } - else if ([[_specifierDict objectForKey:KIASKKeyboardType] isEqualToString:kIASKKeyboardEmailAddress]) { - return UIKeyboardTypeEmailAddress; - } - return UIKeyboardTypeDefault; -} - -- (UITextAutocapitalizationType)autocapitalizationType { - if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapNone]) { - return UITextAutocapitalizationTypeNone; - } - else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapSentences]) { - return UITextAutocapitalizationTypeSentences; - } - else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapWords]) { - return UITextAutocapitalizationTypeWords; - } - else if ([[_specifierDict objectForKey:kIASKAutocapitalizationType] isEqualToString:kIASKAutoCapAllCharacters]) { - return UITextAutocapitalizationTypeAllCharacters; - } - return UITextAutocapitalizationTypeNone; -} - -- (UITextAutocorrectionType)autoCorrectionType { - if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrDefault]) { - return UITextAutocorrectionTypeDefault; - } - else if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrNo]) { - return UITextAutocorrectionTypeNo; - } - else if ([[_specifierDict objectForKey:kIASKAutoCorrectionType] isEqualToString:kIASKAutoCorrYes]) { - return UITextAutocorrectionTypeYes; - } - return UITextAutocorrectionTypeDefault; -} - -- (nullable UITextContentType)textContentType { - NSMutableDictionary *dict; - if (@available(iOS 10.0, *)) { - dict = @{kIASKTextContentTypeName: UITextContentTypeName, - kIASKTextContentTypeNamePrefix: UITextContentTypeNamePrefix, - kIASKTextContentTypeGivenName: UITextContentTypeGivenName, - kIASKTextContentTypeMiddleName: UITextContentTypeMiddleName, - kIASKTextContentTypeFamilyName: UITextContentTypeFamilyName, - kIASKTextContentTypeNameSuffix: UITextContentTypeNameSuffix, - kIASKTextContentTypeNickname: UITextContentTypeNickname, - kIASKTextContentTypeJobTitle: UITextContentTypeJobTitle, - kIASKTextContentTypeOrganizationName: UITextContentTypeOrganizationName, - kIASKTextContentTypeLocation: UITextContentTypeLocation, - kIASKTextContentTypeFullStreetAddress: UITextContentTypeFullStreetAddress, - kIASKTextContentTypeStreetAddressLine1: UITextContentTypeStreetAddressLine1, - kIASKTextContentTypeStreetAddressLine2: UITextContentTypeStreetAddressLine2, - kIASKTextContentTypeAddressCity: UITextContentTypeAddressCity, - kIASKTextContentTypeAddressState: UITextContentTypeAddressState, - kIASKTextContentTypeAddressCityAndState: UITextContentTypeAddressCityAndState, - kIASKTextContentTypeSublocality: UITextContentTypeSublocality, - kIASKTextContentTypeCountryName: UITextContentTypeCountryName, - kIASKTextContentTypePostalCode: UITextContentTypePostalCode, - kIASKTextContentTypeTelephoneNumber: UITextContentTypeTelephoneNumber, - kIASKTextContentTypeEmailAddress: UITextContentTypeEmailAddress, - kIASKTextContentTypeURL: UITextContentTypeURL, - kIASKTextContentTypeCreditCardNumber: UITextContentTypeCreditCardNumber}.mutableCopy; - } - if (@available(iOS 11.0, *)) { - [dict addEntriesFromDictionary:@{kIASKTextContentTypeUsername: UITextContentTypeUsername, - kIASKTextContentTypePassword: UITextContentTypePassword}]; - } - if (@available(iOS 12.0, *)) { - [dict addEntriesFromDictionary:@{kIASKTextContentTypeNewPassword: UITextContentTypeNewPassword, - kIASKTextContentTypeOneTimeCode: UITextContentTypeOneTimeCode}]; - } - NSString *value = [_specifierDict objectForKey:kIASKTextContentType]; - if (value.length > 1) { - // also accept Swift form (e.g. "telephoneNumber" instead of "TelephoneNumber") - NSString *firstChar = [value substringToIndex:1].uppercaseString; - value = [value stringByReplacingCharactersInRange:NSMakeRange(0, 1) withString:firstChar]; - } - return value ? [dict objectForKey:value] : nil; -} - -- (UIImage *)cellImage { - NSString *imageName = [_specifierDict objectForKey:kIASKCellImage]; - if( imageName.length == 0 ) - return nil; - - return [UIImage imageNamed:imageName]; -} - -- (UIImage *)highlightedCellImage { - NSString *imageName = [[_specifierDict objectForKey:kIASKCellImage ] stringByAppendingString:@"Highlighted"]; - if( imageName.length == 0 ) - return nil; - - return [UIImage imageNamed:imageName]; -} - -- (BOOL)adjustsFontSizeToFitWidth { - NSNumber *boxedResult = [_specifierDict objectForKey:kIASKAdjustsFontSizeToFitWidth]; - return (boxedResult == nil) || [boxedResult boolValue]; -} - -- (NSTextAlignment)textAlignment -{ - if (self.hasSubtitle || [[_specifierDict objectForKey:kIASKTextLabelAlignment] isEqualToString:kIASKTextLabelAlignmentLeft]) { - return NSTextAlignmentLeft; - } else if ([[_specifierDict objectForKey:kIASKTextLabelAlignment] isEqualToString:kIASKTextLabelAlignmentCenter]) { - return NSTextAlignmentCenter; - } else if ([[_specifierDict objectForKey:kIASKTextLabelAlignment] isEqualToString:kIASKTextLabelAlignmentRight]) { - return NSTextAlignmentRight; - } - if ([self.type isEqualToString:kIASKButtonSpecifier] && !self.cellImage) { - return NSTextAlignmentCenter; - } else if ([@[kIASKPSMultiValueSpecifier, kIASKPSTitleValueSpecifier, kIASKTextViewSpecifier, kIASKDatePickerSpecifier] containsObject:self.type]) { - return NSTextAlignmentRight; - } - return NSTextAlignmentLeft; -} - -- (NSArray *)userInterfaceIdioms { - NSMutableDictionary *idiomMap = [NSMutableDictionary dictionaryWithDictionary: - @{ - @"Phone": @(UIUserInterfaceIdiomPhone), - @"Pad": @(UIUserInterfaceIdiomPad), - }]; - if (@available(iOS 14.0, *)) { - idiomMap[@"Mac"] = @(UIUserInterfaceIdiomMac); - } - - NSArray *idiomStrings = _specifierDict[kIASKSupportedUserInterfaceIdioms]; - if (idiomStrings.count == 0) { - return [idiomMap allValues]; - } - NSMutableArray *idioms = [NSMutableArray new]; - for (NSString *idiomString in idiomStrings) { - id idiom = idiomMap[idiomString]; - if (idiom != nil){ - [idioms addObject:idiom]; - } - } - return idioms; -} - -- (IASKSpecifier*)itemSpecifierForIndex:(NSUInteger)index { - NSDictionary *specifierDictionary = [_specifierDict objectForKey:kIASKItemSpecifier]; - IASKSpecifier *itemSpecifier = [[IASKSpecifier alloc] initWithSpecifier:specifierDictionary]; - itemSpecifier.parentSpecifier = self; - itemSpecifier.itemIndex = index; - BOOL validType = [@[kIASKPSTitleValueSpecifier, kIASKPSChildPaneSpecifier, kIASKPSTextFieldSpecifier, kIASKPSMultiValueSpecifier, kIASKButtonSpecifier, kIASKCustomViewSpecifier] containsObject:itemSpecifier.type]; - NSAssert(validType, @"unsupported AddSpecifier Type"); - return validType ? itemSpecifier : nil; -} - -- (BOOL)isItemSpecifier { - return self.parentSpecifier && !self.isAddSpecifier; -} - -- (IASKSpecifier*)addSpecifier { - NSDictionary *specifierDictionary = [_specifierDict objectForKey:kIASKAddSpecifier]; - if (specifierDictionary == nil) { - return nil; - } - IASKSpecifier *addSpecifier = [[IASKSpecifier alloc] initWithSpecifier:specifierDictionary]; - addSpecifier.parentSpecifier = self; - addSpecifier.itemIndex = NSUIntegerMax; - BOOL validType = [@[kIASKPSChildPaneSpecifier, kIASKPSTextFieldSpecifier, kIASKPSMultiValueSpecifier, kIASKButtonSpecifier, kIASKCustomViewSpecifier] containsObject:addSpecifier.type]; - NSAssert(validType, @"unsupported AddSpecifier Type"); - return validType ? addSpecifier : nil; -} - -- (BOOL)isAddSpecifier { - return self.itemIndex == NSUIntegerMax; -} - -- (BOOL)deletable { - return [[_specifierDict objectForKey:kIASKDeletable] boolValue]; -} - -- (IASKSpecifier*)editSpecifier { - NSMutableDictionary *dict = _specifierDict.mutableCopy; - if ([self.type isEqualToString:kIASKDatePickerSpecifier]) { - dict[kIASKType] = kIASKDatePickerControl; - } - return [[IASKSpecifier alloc] initWithSpecifier:dict]; -} - -- (id)valueForKey:(NSString *)key { - return [_specifierDict objectForKey:key]; -} - -- (void)setKey:(NSString *)key { - [_specifierDict setValue:key forKey:kIASKKey]; -} - -- (void)setTitle:(NSString *)key { - [_specifierDict setValue:key forKey:kIASKTitle]; -} - -- (UIDatePickerMode)datePickerMode { - NSDictionary *dict = @{kIASKDatePickerModeTime: @(UIDatePickerModeTime), - kIASKDatePickerModeDate: @(UIDatePickerModeDate)}; - NSString *string = [_specifierDict objectForKey:kIASKDatePickerMode]; - NSNumber *value = dict[string]; - return value == nil ? UIDatePickerModeDateAndTime : value.integerValue; -} - -- (UIDatePickerStyle)datePickerStyle { - NSDictionary *dict = @{kIASKDatePickerStyleCompact: @(UIDatePickerStyleCompact), - kIASKDatePickerStyleWheels: @(UIDatePickerStyleWheels)}; - if (@available(iOS 14.0, *)) { - IASK_IF_IOS14_OR_GREATER( - dict = @{kIASKDatePickerStyleCompact: @(UIDatePickerStyleCompact), - kIASKDatePickerStyleWheels: @(UIDatePickerStyleWheels), - kIASKDatePickerStyleInline: @(UIDatePickerStyleInline)}; - ); - } - NSString *string = [_specifierDict objectForKey:kIASKDatePickerStyle]; - NSNumber *value = dict[string]; - return value == nil ? UIDatePickerStyleWheels : value.integerValue; -} - -- (BOOL)embeddedDatePicker { - BOOL embeddedDatePicker = NO; - if (@available(iOS 14.0, *)) { - IASK_IF_IOS14_OR_GREATER( - embeddedDatePicker = [self.type isEqualToString:kIASKDatePickerSpecifier] && - (self.datePickerStyle == UIDatePickerStyleCompact || (self.datePickerStyle == UIDatePickerStyleInline && self.datePickerMode == UIDatePickerModeTime)); - ); - } - return embeddedDatePicker; -} - -- (NSInteger)datePickerMinuteInterval { - return [_specifierDict[kIASKDatePickerMinuteInterval] integerValue] ?: 1; -} - -- (IASKToggleStyle)toggleStyle { - return [_specifierDict[kIASKToggleStyle] isEqualToString:kIASKToggleStyleCheckmark] ? IASKToggleStyleCheckmark : IASKToggleStyleSwitch; -} - -- (BOOL)isEqual:(IASKSpecifier*)specifier { - if (specifier.class != self.class) { - return NO; - } - - return specifier == self || [specifier.key isEqual:self.key]; -} -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/Base.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/Base.lproj/IASKLocalizable.strings deleted file mode 100644 index 124bae73..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/Base.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacy"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Open in “Settings” app"; - -/* warning title */ -"Mail not configured" = "Mail not configured"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "This device is not configured for sending Email. Please configure the Mail settings in the Settings app."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ca.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ca.lproj/IASKLocalizable.strings deleted file mode 100644 index a9f468ae..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ca.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privadesa"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Obrir en Configuració"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/de.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/de.lproj/IASKLocalizable.strings deleted file mode 100644 index 9f3312ad..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/de.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Datenschutz"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "In „Einstellungen“-App öffnen"; - -/* warning title */ -"Mail not configured" = "Mail nicht konfiguriert"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Dein Gerät ist nicht zum Senden von E-Mails konfiguriert. Bitte konfiguriere die Mail-Einstellungen im Programm „Einstellungen“."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/el.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/el.lproj/IASKLocalizable.strings deleted file mode 100644 index a60a0c7e..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/el.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,17 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Απόρρητο"; - -/* warning title */ -"Mail not configured" = "Δεν έχει ρυθμιστεί ακόμα το Mail"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Αυτή η συσκευή δεν έχει ρυθμιστεί για χρήση Email. Παρακαλώ συμπληρώστε τις ρυθμίσεις στο Mail."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/en.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/en.lproj/IASKLocalizable.strings deleted file mode 100644 index 124bae73..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/en.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacy"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Open in “Settings” app"; - -/* warning title */ -"Mail not configured" = "Mail not configured"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "This device is not configured for sending Email. Please configure the Mail settings in the Settings app."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es-419.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es-419.lproj/IASKLocalizable.strings deleted file mode 100644 index 59a10bca..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es-419.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacidad"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Abrir en “Configuración” del sistema"; - -/* warning title */ -"Mail not configured" = "Sin cuenta de correo configurada"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Este dispositivo no esta configurado para enviar correo electrónico. Por favor configura una cuenta de correo electrónico en Ajustes."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es-MX.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es-MX.lproj/IASKLocalizable.strings deleted file mode 100644 index 59a10bca..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es-MX.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacidad"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Abrir en “Configuración” del sistema"; - -/* warning title */ -"Mail not configured" = "Sin cuenta de correo configurada"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Este dispositivo no esta configurado para enviar correo electrónico. Por favor configura una cuenta de correo electrónico en Ajustes."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es.lproj/IASKLocalizable.strings deleted file mode 100644 index 1caed7d9..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/es.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacidad"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Abrir en “Ajustes” del sistema"; - -/* warning title */ -"Mail not configured" = "Sin cuenta de correo configurada"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Este dispositivo no esta configurado para enviar correo electrónico. Por favor configura una cuenta de correo electrónico en Ajustes."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/fr.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/fr.lproj/IASKLocalizable.strings deleted file mode 100644 index 8d6bc4f3..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/fr.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Confidentialité"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Ouvrir dans l’application « Réglages »"; - -/* warning title */ -"Mail not configured" = "Mail n'est pas encore configuré"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Cet appareil n'est pas configuré pour envoyer des Emails. Veuille configurer les paramètres Mail dans l'application Réglages."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/hr.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/hr.lproj/IASKLocalizable.strings deleted file mode 100644 index 34478cfb..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/hr.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privatnost"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Otvori Postavke app"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/hu.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/hu.lproj/IASKLocalizable.strings deleted file mode 100644 index d1282c9e..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/hu.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Adatvédelem"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Megnyitás a Beállítások"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/it.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/it.lproj/IASKLocalizable.strings deleted file mode 100644 index 5bd39ed2..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/it.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacy"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Apri nell'app “Impostazioni”"; - -/* warning title */ -"Mail not configured" = "Mail non configurata"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Questo apparecchio non è configurato per inviare Email. Vi preghiamo di configurare le impostazioni di Mail nelle Impostazioni applicazione."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ja.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ja.lproj/IASKLocalizable.strings deleted file mode 100644 index 3347da81..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ja.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "プライバシー"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "“設定”アプリで開く"; - -/* warning title */ -"Mail not configured" = "メールは設定されていません。"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "メール送信に関する設定がされていません。「設定」アプリの「メール」で設定してください。"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/nb.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/nb.lproj/IASKLocalizable.strings deleted file mode 100644 index c1c5b07e..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/nb.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Personvern"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Åpne i Innstillinger"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/nl.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/nl.lproj/IASKLocalizable.strings deleted file mode 100644 index 6de61c3f..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/nl.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacy"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Open in “Instellingen” app"; - -/* warning title */ -"Mail not configured" = "E-mail is nog niet ingesteld."; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Dit apparaat is niet ingesteld om e-mail te versturen. Stel deze in de Instellingen app in."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pl.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pl.lproj/IASKLocalizable.strings deleted file mode 100644 index 181d3265..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pl.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Prywatność"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Otwórz w Ustawienia"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pt-PT.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pt-PT.lproj/IASKLocalizable.strings deleted file mode 100644 index ab8feb31..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pt-PT.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacidade"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Abrir na app “Definições”"; - -/* warning title */ -"Mail not configured" = "Mail ainda não está configurado"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Este aparelho não está configurado para enviar Email. Por favor configure o Mail em Ajustes do aparelho."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pt.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pt.lproj/IASKLocalizable.strings deleted file mode 100644 index 845896ba..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/pt.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Privacidade"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Abrir na app “Ajustes”"; - -/* warning title */ -"Mail not configured" = "Mail ainda não está configurado"; - -"OK" = "OK"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Este aparelho não está configurado para enviar Email. Por favor configure o Mail em Ajustes do aparelho."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ru.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ru.lproj/IASKLocalizable.strings deleted file mode 100644 index d635bd4d..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/ru.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Конфиденциальность"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Открыть в Настройки"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/sv.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/sv.lproj/IASKLocalizable.strings deleted file mode 100644 index b9d71e6c..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/sv.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Integritetsskydd"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = ""; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/th.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/th.lproj/IASKLocalizable.strings deleted file mode 100644 index 6abbc0e4..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/th.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "ความเป็นส่วนตัว"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = ""; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/tr.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/tr.lproj/IASKLocalizable.strings deleted file mode 100644 index 296316d2..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/tr.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,20 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Gizlilik"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Ayarlar uygulaması ile aç"; - -/* warning title */ -"Mail not configured" = "E-posta ayarları yapılandırılmamış"; - -"OK" = "Tamam"; - -/* warning message */ -"This device is not configured for sending Email. Please configure the Mail settings in the Settings app." = "Bu cihazın e-posta ayarları yapılandırılmamış. Lütfen telefonunuzun Ayarlar bölümünde e-posta ayarlarını yapılandırın."; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/uk.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/uk.lproj/IASKLocalizable.strings deleted file mode 100644 index c013a44f..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/uk.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "Приватність"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "Відкрити у застосунку Параметри"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/zh-Hans.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/zh-Hans.lproj/IASKLocalizable.strings deleted file mode 100644 index 8c68028a..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/zh-Hans.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "隐私"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "在设置中打开"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/zh-Hant.lproj/IASKLocalizable.strings b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/zh-Hant.lproj/IASKLocalizable.strings deleted file mode 100644 index 91c7f715..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Resources/zh-Hant.lproj/IASKLocalizable.strings +++ /dev/null @@ -1,12 +0,0 @@ -/* IASKLocalizable.strings - InAppSettingsKit - - Created by Ortwin Gentz on 20.10.14. - Copyright (c) 2014 FutureTap. All rights reserved. */ - -/* Privacy cell: title */ -"Privacy" = "隱私權"; - -/* Privacy cell: subtitle */ -"Open in Settings app" = "在設定中打開"; - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKColor.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKColor.m deleted file mode 100644 index 7999f804..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKColor.m +++ /dev/null @@ -1,22 +0,0 @@ -// -// IASKColor.m -// InAppSettingsKit -// -// Created by valvoline on 17/09/2019. -// Copyright (c) 2019-2020: -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// - -#import "IASKColor.h" - -@implementation IASKColor - -+ (UIColor *)iaskPlaceholderColor { - if (@available(iOS 13.0, *)) { - return UIColor.placeholderTextColor; - } else { - return UIColor.systemGrayColor; - } -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKDatePicker.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKDatePicker.m deleted file mode 100644 index 41650c14..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKDatePicker.m +++ /dev/null @@ -1,14 +0,0 @@ -// -// IASKDatePicker.m -// InAppSettingsKit -// -// Created by Ortwin Gentz on 04.05.20. -// Copyright (c) 2009-2020: -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com - -#import "IASKDatePicker.h" -#import "IASKSpecifier.h" - -@implementation IASKDatePicker - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKDatePickerViewCell.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKDatePickerViewCell.m deleted file mode 100644 index 120f327c..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKDatePickerViewCell.m +++ /dev/null @@ -1,31 +0,0 @@ -// -// IASKDatePickerViewCell.m -// InAppSettingsKit -// -// Created by Ortwin Gentz on 04.05.20. -// Copyright (c) 2009-2020: -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// - -#import "IASKDatePickerViewCell.h" -#import "IASKDatePicker.h" - -@implementation IASKDatePickerViewCell - -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier])) { - self.datePicker = [[IASKDatePicker alloc] init]; - [self.contentView addSubview:self.datePicker]; - [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"H:|-0-[picker]-0-|" options:0 metrics:nil views:@{@"picker": self.datePicker}]]; - [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-0-[picker]-0-|" options:0 metrics:nil views:@{@"picker": self.datePicker}]]; - self.datePicker.translatesAutoresizingMaskIntoConstraints = NO; - } - return self; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - self.datePicker.frame = self.bounds; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKEmbeddedDatePickerViewCell.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKEmbeddedDatePickerViewCell.m deleted file mode 100644 index bf5af4a9..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKEmbeddedDatePickerViewCell.m +++ /dev/null @@ -1,35 +0,0 @@ -// -// IASKEmbeddedDatePickerViewCell.m -// InAppSettingsKit -// -// Created by Ortwin Gentz on 02.07.20. -// Copyright © 2020 InAppSettingsKit. All rights reserved. -// - -#import "IASKEmbeddedDatePickerViewCell.h" -#import "IASKDatePicker.h" - -@implementation IASKEmbeddedDatePickerViewCell - -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier])) { - self.titleLabel = [[UILabel alloc] init]; - self.datePicker = [[IASKDatePicker alloc] init]; - - self.contentView.preservesSuperviewLayoutMargins = YES; - [self.contentView addSubview:self.titleLabel]; - [self.contentView addSubview:self.datePicker]; - - [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"|-[label]-(>=16)-[picker(50@100)]-|" options:0 metrics:nil views:@{@"label": self.titleLabel, @"picker": self.datePicker}]]; - [self.titleLabel setContentCompressionResistancePriority:UILayoutPriorityDefaultLow forAxis:UILayoutConstraintAxisHorizontal]; - [self.datePicker setContentCompressionResistancePriority:UILayoutPriorityRequired forAxis:UILayoutConstraintAxisHorizontal]; - - [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-4-[picker]-4-|" options:0 metrics:nil views:@{@"picker": self.datePicker}]]; - [self.contentView addConstraints:[NSLayoutConstraint constraintsWithVisualFormat:@"V:|-4-[label]-4-|" options:0 metrics:nil views:@{@"label": self.titleLabel}]]; - self.titleLabel.translatesAutoresizingMaskIntoConstraints = NO; - self.datePicker.translatesAutoresizingMaskIntoConstraints = NO; - } - return self; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m deleted file mode 100644 index 66ad283e..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m +++ /dev/null @@ -1,94 +0,0 @@ -// -// IASKPSSliderSpecifierViewCell.m -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKPSSliderSpecifierViewCell.h" -#import "IASKSlider.h" -#import "IASKSettingsReader.h" - -@implementation IASKPSSliderSpecifierViewCell - -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier -{ - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - // Setting only frame data that will not be overwritten by layoutSubviews - // Slider - _slider = [[IASKSlider alloc] initWithFrame:CGRectMake(0, 0, 0, 23)]; - _slider.autoresizingMask = UIViewAutoresizingFlexibleBottomMargin | - UIViewAutoresizingFlexibleWidth; - _slider.continuous = NO; - [self.contentView addSubview:_slider]; - - // MinImage - _minImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 21, 21)]; - _minImage.autoresizingMask = UIViewAutoresizingFlexibleRightMargin | - UIViewAutoresizingFlexibleBottomMargin; - [self.contentView addSubview:_minImage]; - - // MaxImage - _maxImage = [[UIImageView alloc] initWithFrame:CGRectMake(0, 0, 21, 21)]; - _maxImage.autoresizingMask = UIViewAutoresizingFlexibleLeftMargin | - UIViewAutoresizingFlexibleBottomMargin; - [self.contentView addSubview:_maxImage]; - - self.selectionStyle = UITableViewCellSelectionStyleNone; - } - return self; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - UIEdgeInsets padding = (UIEdgeInsets) { 0, kIASKPaddingLeft, 0, kIASKPaddingRight }; - if ([self respondsToSelector:@selector(layoutMargins)]) { - padding = [self layoutMargins]; - } - CGRect sliderBounds = _slider.bounds; - CGPoint sliderCenter = _slider.center; - const CGFloat superViewWidth = _slider.superview.frame.size.width; - - sliderBounds.size.width = superViewWidth - (padding.left + padding.right); - sliderCenter.x = padding.left + sliderBounds.size.width / 2; - sliderCenter.y = self.contentView.center.y; - _minImage.hidden = YES; - _maxImage.hidden = YES; - - // Check if there are min and max images. If so, change the layout accordingly. - if (_minImage.image) { - // Min image - _minImage.hidden = NO; - sliderBounds.size.width -= _minImage.frame.size.width + kIASKSliderImageGap; - sliderCenter.x += (_minImage.frame.size.width + kIASKSliderImageGap) / 2; - _minImage.center = CGPointMake(_minImage.frame.size.width / 2 + padding.left, - self.contentView.center.y); - } - if (_maxImage.image) { - // Max image - _maxImage.hidden = NO; - sliderBounds.size.width -= kIASKSliderImageGap + _maxImage.frame.size.width; - sliderCenter.x -= (kIASKSliderImageGap + _maxImage.frame.size.width) / 2; - _maxImage.center = CGPointMake(superViewWidth - padding.right - _maxImage.frame.size.width /2, self.contentView.center.y ); - } - - _slider.bounds = sliderBounds; - _slider.center = sliderCenter; -} - -- (void)prepareForReuse { - [super prepareForReuse]; - _minImage.image = nil; - _maxImage.image = nil; -} -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m deleted file mode 100644 index c633b527..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m +++ /dev/null @@ -1,69 +0,0 @@ -// -// IASKPSTextFieldSpecifierViewCell.m -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKPSTextFieldSpecifierViewCell.h" -#import "IASKTextField.h" -#import "IASKSettingsReader.h" - -@implementation IASKPSTextFieldSpecifierViewCell -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier -{ - self = [super initWithStyle:style reuseIdentifier:reuseIdentifier]; - if (self) { - self.textLabel.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleRightMargin; - - // TextField - _textField = [[IASKTextField alloc] initWithFrame:CGRectMake(0, 0, 200, self.frame.size.height)]; - _textField.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleLeftMargin; - _textField.font = [UIFont systemFontOfSize:kIASKLabelFontSize]; - _textField.minimumFontSize = kIASKMinimumFontSize; - [self.contentView addSubview:_textField]; - - self.selectionStyle = UITableViewCellSelectionStyleNone; - } - return self; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - UIEdgeInsets padding = (UIEdgeInsets) { 0, kIASKPaddingLeft, 0, kIASKPaddingRight }; - if ([self respondsToSelector:@selector(layoutMargins)]) { - padding = [self layoutMargins]; - } - - // Label - CGFloat imageOffset = self.imageView.image ? self.imageView.bounds.size.width + padding.left : 0; - CGSize labelSize = [self.textLabel sizeThatFits:CGSizeZero]; - labelSize.width = MAX(labelSize.width, kIASKMinLabelWidth - imageOffset); - self.textLabel.frame = (CGRect){self.textLabel.frame.origin, {MIN(kIASKMaxLabelWidth, labelSize.width), self.textLabel.frame.size.height}} ; - - // TextField - _textField.center = CGPointMake(_textField.center.x, self.contentView.center.y); - CGRect textFieldFrame = _textField.frame; - textFieldFrame.origin.x = self.textLabel.frame.origin.x + MAX(kIASKMinLabelWidth - imageOffset, self.textLabel.frame.size.width) + kIASKSpacing; - textFieldFrame.size.width = _textField.superview.frame.size.width - textFieldFrame.origin.x - padding.right; - - if (!self.textLabel.text.length) { - textFieldFrame.origin.x = padding.left + imageOffset; - textFieldFrame.size.width = self.contentView.bounds.size.width - padding.left - padding.right - imageOffset; - } else if (_textField.textAlignment == NSTextAlignmentRight) { - textFieldFrame.origin.x = self.textLabel.frame.origin.x + labelSize.width + kIASKSpacing; - textFieldFrame.size.width = _textField.superview.frame.size.width - textFieldFrame.origin.x - padding.right; - } - _textField.frame = textFieldFrame; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKSlider.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKSlider.m deleted file mode 100644 index 97a817ab..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKSlider.m +++ /dev/null @@ -1,21 +0,0 @@ -// -// IASKSlider.m -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSlider.h" - - -@implementation IASKSlider - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKSwitch.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKSwitch.m deleted file mode 100644 index 57bf8ae5..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKSwitch.m +++ /dev/null @@ -1,20 +0,0 @@ -// -// IASKSwitch.m -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKSwitch.h" - -@implementation IASKSwitch - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextField.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextField.m deleted file mode 100644 index 4095aba7..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextField.m +++ /dev/null @@ -1,63 +0,0 @@ -// -// IASKTextField.m -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKTextField.h" - -#import "IASKSpecifier.h" - -@interface IASKTextField () -@property (strong, nonatomic, nullable, readwrite) NSString *oldText; -@end - -@implementation IASKTextField - -- (void)setSpecifier:(IASKSpecifier *)specifier { - _specifier = specifier; - self.secureTextEntry = specifier.isSecure; - self.keyboardType = specifier.keyboardType; - self.autocapitalizationType = specifier.autocapitalizationType; - self.autocorrectionType = specifier.isSecure ? UITextAutocorrectionTypeNo : specifier.autoCorrectionType; - self.textAlignment = specifier.textAlignment; - self.placeholder = specifier.placeholder; - self.adjustsFontSizeToFitWidth = specifier.adjustsFontSizeToFitWidth; - if (specifier.isAddSpecifier) { - self.returnKeyType = UIReturnKeyDone; - } - if (@available(iOS 10.0, *)) { - self.textContentType = specifier.textContentType; - } -} - -- (BOOL)becomeFirstResponder { - BOOL result = [super becomeFirstResponder]; - if (result) { - self.oldText = self.text; - } - return result; -} - -- (void)shake { - self.transform = CGAffineTransformMakeTranslation(20.f, 0.f); - [UIView animateWithDuration:0.4f - delay:0.0f - usingSpringWithDamping:0.2f - initialSpringVelocity:1.0f - options:UIViewAnimationOptionCurveEaseInOut - animations:^{ - self.transform = CGAffineTransformIdentity; - } completion:nil]; -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextView.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextView.m deleted file mode 100644 index 7065b68c..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextView.m +++ /dev/null @@ -1,99 +0,0 @@ -// -// IASKTextView.m -// -// Copyright (c) 2009-2015: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import "IASKTextView.h" -#import "IASKColor.h" -#import "IASKSpecifier.h" - -@implementation IASKTextView { - BOOL _shouldDrawPlaceholder; -} - - -#pragma mark NSObject - -- (void)dealloc { - [[NSNotificationCenter defaultCenter] removeObserver:self name:UITextViewTextDidChangeNotification object:self]; -} - - -#pragma mark UIView - -- (void)configure { - [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(updateShouldDrawPlaceholder) name:UITextViewTextDidChangeNotification object:self]; - - _shouldDrawPlaceholder = NO; -} - -- (id)initWithFrame:(CGRect)frame { - if ((self = [super initWithFrame:frame])) { - [self configure]; - } - return self; -} - -- (id)initWithCoder:(NSCoder *)aDecoder { - if ((self = [super initWithCoder:aDecoder])) { - [self configure]; - } - return self; -} - - -- (void)drawRect:(CGRect)rect { - [super drawRect:rect]; - - if (_shouldDrawPlaceholder && self.font) { - [_placeholder drawAtPoint:CGPointMake(5.0, 8.0) withAttributes:@{NSFontAttributeName: (UIFont *)self.font, NSForegroundColorAttributeName: IASKColor.iaskPlaceholderColor}]; - } -} - - -#pragma mark Setters - -- (void)setText:(NSString *)string { - [super setText:string]; - [self updateShouldDrawPlaceholder]; -} - - -- (void)setPlaceholder:(NSString *)string { - if ([string isEqual:_placeholder]) { - return; - } - - _placeholder = string; - - self.accessibilityLabel = self.placeholder; - [self updateShouldDrawPlaceholder]; -} - -- (void)setFrame:(CGRect)frame { - super.frame = frame; - [self setNeedsDisplay]; -} - -#pragma mark Private Methods - -- (void)updateShouldDrawPlaceholder { - BOOL prev = _shouldDrawPlaceholder; - _shouldDrawPlaceholder = self.placeholder && self.text.length == 0; - - if (prev != _shouldDrawPlaceholder) { - [self setNeedsDisplay]; - } -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextViewCell.m b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextViewCell.m deleted file mode 100644 index d4b2c69c..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/Views/IASKTextViewCell.m +++ /dev/null @@ -1,57 +0,0 @@ -// -// IASKTextViewCell.m -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -#import "IASKTextViewCell.h" -#import "IASKSettingsReader.h" -#import "IASKTextView.h" - -@implementation IASKTextViewCell - - -- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier { - if ((self = [super initWithStyle:UITableViewCellStyleDefault reuseIdentifier:reuseIdentifier])) { - self.selectionStyle = UITableViewCellSelectionStyleNone; - self.accessoryType = UITableViewCellAccessoryNone; - - IASKTextView *textView = [[IASKTextView alloc] initWithFrame:CGRectZero]; - textView.autoresizingMask = UIViewAutoresizingFlexibleWidth | UIViewAutoresizingFlexibleHeight; - textView.scrollEnabled = NO; - textView.font = [UIFont systemFontOfSize:17.0]; - textView.backgroundColor = [UIColor clearColor]; - [self.contentView addSubview:textView]; - - self.textView = textView; - } - return self; -} - -- (void)layoutSubviews { - [super layoutSubviews]; - - UIEdgeInsets padding = (UIEdgeInsets) { 0, kIASKPaddingLeft, 0, kIASKPaddingRight }; - if ([self respondsToSelector:@selector(layoutMargins)]) { - padding = self.layoutMargins; - padding.left -= 5; - padding.right -= 5; - padding.top -= 5; - padding.bottom -= 5; - } - - self.textView.frame = UIEdgeInsetsInsetRect(self.bounds, padding); -} - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKAppSettingsViewController.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKAppSettingsViewController.h deleted file mode 100644 index c1fb6b72..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKAppSettingsViewController.h +++ /dev/null @@ -1,274 +0,0 @@ -// -// IASKAppSettingsViewController.h -// InAppSettingsKit -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import - -#import "IASKViewController.h" - -NS_ASSUME_NONNULL_BEGIN - -@class IASKSettingsReader; -@class IASKAppSettingsViewController; -@class IASKSettingsStore; -@class IASKSpecifier; -@class IASKTextField; -@protocol IASKViewController; - -@protocol IASKSettingsDelegate - -/** called when the settings view controller was dismissed by tapping the Done button or performing `-dismiss:`. - @param settingsViewController the settingsViewController - @discussion Note that this callback is not performed if IASK was presented by pushing it onto a navigation controller. - */ -- (void)settingsViewControllerDidEnd:(IASKAppSettingsViewController*)settingsViewController; - -@optional -#pragma mark - Section header customization -/** customize the header of the specified section of the table view - @param settingsViewController the settingsViewController - @param section An index number identifying the section of the tableView - @param specifier the specifier containing the key of the element - */ -- (nullable NSString*)settingsViewController:(UITableViewController*)settingsViewController - titleForHeaderInSection:(NSInteger)section - specifier:(IASKSpecifier*)specifier; - -/** Asks the delegate for the height to use for the header of a particular section. - @param settingsViewController the settingsViewController - @param section An index number identifying the section of the tableView - @param specifier the specifier containing the key of the element - @discussion Use this method to specify the height of custom header views returned by your `tableView:viewForHeaderInSection:specifier: method. - */ -- (CGFloat)settingsViewController:(UITableViewController*)settingsViewController - heightForHeaderInSection:(NSInteger)section - specifier:(IASKSpecifier*)specifier; - -/** Asks the delegate for a view object to display in the header of the specified section of the table view. - @param settingsViewController the settingsViewController - @param section An index number identifying the section of the tableView - @param specifier the specifier containing the key of the element - @discussion Use this method to return a custom view for your header. If you implement this method, you must also implement the `tableView:heightForFooterInSection:` method to specify the height of your custom view. - */ -- (nullable UIView*)settingsViewController:(UITableViewController*)settingsViewController - viewForHeaderInSection:(NSInteger)section - specifier:(IASKSpecifier*)specifier; - -#pragma mark - Section footer customization -/** customize the footer of the specified section of the table view -@param settingsViewController the settingsViewController -@param section An index number identifying the section of the tableView -@param specifier the specifier containing the key of the element -*/ -- (nullable NSString*)settingsViewController:(UITableViewController*)settingsViewController - titleForFooterInSection:(NSInteger)section - specifier:(IASKSpecifier*)specifier; - -/** Asks the delegate for the height to use for the footer of a particular section. -@param settingsViewController the settingsViewController -@param section An index number identifying the section of the tableView -@param specifier the specifier containing the key of the element -@discussion Use this method to specify the height of custom footer views returned by your `tableView:viewForFooterInSection:specifier: method. -*/ -- (CGFloat) settingsViewController:(UITableViewController*)settingsViewController - heightForFooterInSection:(NSInteger)section - specifier:(IASKSpecifier*)specifier; - -/** Asks the delegate for a view object to display in the footer of the specified section of the table view. -@param settingsViewController the settingsViewController -@param section An index number identifying the section of the tableView -@param specifier the specifier containing the key of the element -@discussion Use this method to return a custom view for your footer. If you implement this method, you must also implement the `tableView:heightForFooterInSection:` method to specify the height of your custom view. -*/ -- (nullable UIView *)settingsViewController:(UITableViewController*)settingsViewController - viewForFooterInSection:(NSInteger)section - specifier:(IASKSpecifier*)specifier; - - -#pragma mark - Custom Views -/** Asks the delegate for the height to use for a custom view element - @param settingsViewController the settingsViewController - @param specifier the specifier containing the key of the element - @return A nonnegative floating-point value (or `UITableViewAutomaticDimension`) that specifies the height (in points) that row should be. - @discussion Use this method to specify the height of custom views (`IASKCustomView`) returned by your `tableView:cellForSpecifier: method. If this method is not implemented, `UITableViewAutomaticDimension` is returned. -*/ -- (CGFloat)settingsViewController:(UITableViewController*)settingsViewController - heightForSpecifier:(IASKSpecifier*)specifier; - -/** Returns the table cell for the specified custom view element (`IASKCustomView`) - @param settingsViewController the settingsViewController - @param specifier the specifier containing the key of the element - @return The cell of the table, or nil if the cell is not visible or the specifier is not found. - */ -- (nullable __kindof UITableViewCell*)settingsViewController:(UITableViewController*)settingsViewController - cellForSpecifier:(IASKSpecifier*)specifier; - -/** Tells the delegate that the specified custom view (`IASKCustomView`) element is now selected. - @param settingsViewController the settingsViewController - @param specifier the specifier containing the key of the selected element - */ - - (void)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - didSelectCustomViewSpecifier:(IASKSpecifier*)specifier; - -#pragma mark - Mail Composition -/** Tells the delegate that the specified custom view (`IASKCustomView`) element is now selected. - @param settingsViewController the settingsViewController - @param mailComposeViewController the mail compose view controller being presented - @param specifier the specifier containing the key of the element - @return Return NO to prevent presenting the mail compose view controller, YES otherwise. - @discussion You may customize `mailComposeViewController` before it is being presented. -*/ -- (BOOL)settingsViewController:(UITableViewController*)settingsViewController -shouldPresentMailComposeViewController:(MFMailComposeViewController*)mailComposeViewController - forSpecifier:(IASKSpecifier*) specifier; - -/** Tells the delegate that the user wants to dismiss the mail composition view. - @param settingsViewController the settingsViewController - @param mailComposeViewController the mail compose view controller being dismissed - @param result The result of the user’s action - @param error If an error occurred, this parameter contains an error object with information about the type of failure. - @see `-[MFMailComposeViewControllerDelegate mailComposeController:didFinishWithResult:error:]` -*/ -- (void)settingsViewController:(UITableViewController*) settingsViewController - mailComposeController:(MFMailComposeViewController*)mailComposeViewController - didFinishWithResult:(MFMailComposeResult)result - error:(nullable NSError*)error; - -#pragma mark - Custom MultiValues -/** Ask the delegate to provide dynamic values for a MultiValue element - @param settingsViewController the settingsViewController - @param specifier the specifier containing the key of the selected element - @return an array of values (either of type `NSString` or `NSNumber`) - @discussion the returned array overrides any values specified in the static schema plist -*/ -- (NSArray*)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - valuesForSpecifier:(IASKSpecifier*)specifier; - -/** Ask the delegate to provide dynamic titles for a MultiValue element - @param settingsViewController the settingsViewController - @param specifier the specifier containing the key of the selected element - @return an array of titles - @discussion the returned array overrides any titles specified in the static schema plist -*/ -- (NSArray*)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - titlesForSpecifier:(IASKSpecifier*)specifier; - -#pragma mark - Button -/** Tells the delegate that the specified button (`IASKButton`) element is now selected. -@param settingsViewController the settingsViewController -@param specifier the specifier containing the key of the selected button -*/ -- (void)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - buttonTappedForSpecifier:(IASKSpecifier*)specifier; - -#pragma mark - Validation -typedef NS_ENUM(NSUInteger, IASKValidationResult) { - IASKValidationResultOk, - IASKValidationResultFailed, - IASKValidationResultFailedWithShake, -}; -/** validate user input in text fields - @param settingsViewController the settingsViewController - @param specifier the specifier containing the key of the element - @param textField the textField, a `UITextField` subclass - @param previousValue the text before the text field became first responder - @param replacement replacement string that will be set if the result is not Ok. - @return Only on `IASKValidationResultOk`, the input is accepted and stored. `IASKValidationResultFailed` does not alter indicate the failure to the user (it's up to the developer to style the text red or something similar). `IASKValidationResultFailedWithShake` performs a shake animation to indicate the validation error. - */ -- (IASKValidationResult)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - validateSpecifier:(IASKSpecifier*)specifier - textField:(IASKTextField*)textField - previousValue:(nullable NSString*)previousValue - replacement:(NSString* _Nonnull __autoreleasing *_Nullable)replacement; - -#pragma mark - List group child view controller validation -/** Validate the child pane to add a new list group item - @param settingsViewController the settingsViewController - @param specifier the specifier containing the key of the element - @param contentDictionary a dictionary with the keys and the user-supplied input - @return If NO is returned, the "Done" button in the navigation bar is disabled. If YES is returned, the button is enabled allowing the user to "submit" the child pane and add a new list group item. - */ -- (BOOL)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - childPaneIsValidForSpecifier:(IASKSpecifier*)specifier - contentDictionary:(NSMutableDictionary*)contentDictionary; - -#pragma mark - Date Picker -/// Implement this if you store the date/time in a custom format other than as `NSDate` object. Called when the user starts editing a date/time by selecting the title cell above the date/time picker. -- (NSDate*)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - dateForSpecifier:(IASKSpecifier*)specifier; - -/// Implement this to customize the displayed value in the title cell above the date/time picker. -- (nullable NSString*)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - datePickerTitleForSpecifier:(IASKSpecifier*)specifier; - -/// Implement this if you store the date/time in a custom format other than an `NSDate` object. Called when the user changes the date/time value using the picker. -- (void)settingsViewController:(IASKAppSettingsViewController*)settingsViewController - setDate:(NSDate*)date - forSpecifier:(IASKSpecifier*)specifier; -@end - - -@interface IASKAppSettingsViewController : UITableViewController - -/// the delegate to customize IASK’s behavior. Propagated to child view controllers. -@property (nonatomic, assign) IBOutlet id delegate; - -/** base name of the settings plist file (default: `Root`) - @discussion IASK automatically checks for specific or custom inApp plists according to this order (`DEVICE` being a placeholder for "iphone" on iPhone and "ipad" on iPad): - @code - - InAppSettings.bundle/FILE~DEVICE.inApp.plist - - InAppSettings.bundle/FILE.inApp.plist - - InAppSettings.bundle/FILE~DEVICE.plist - - InAppSettings.bundle/FILE.plist - - Settings.bundle/FILE~DEVICE.inApp.plist - - Settings.bundle/FILE.inApp.plist - - Settings.bundle/FILE~DEVICE.plist - - Settings.bundle/FILE.plist -*/ -@property (nonatomic, copy) NSString *file; - -/// Whether a footer giving credit to InAppSettingsKit is shown -@property (nonatomic, assign) BOOL showCreditsFooter; - -/// Whether a Done button is displayed as the rightBarButtonItem for the root level -@property (nonatomic, assign) IBInspectable BOOL showDoneButton; - -/** Suppress showing the privacy settings cell -@discussion if NO, IASK inspects the Info.plist for privacy related key and shows the cell linking to the system settings for the app, if needed. If YES, a privacy cell is never displayed. -*/ -@property (nonatomic) IBInspectable BOOL neverShowPrivacySettings; - -/// Sets the same parameter on the tableView of the root and all child view controllers -@property (nonatomic) IBInspectable BOOL cellLayoutMarginsFollowReadableWidth; - -/// Synchronizes the settings store, e.g. calls `-[NSUserDefaults synchronize]` in case of the default store. -- (void)synchronizeSettings; - -/// dismiss the settings view controller -- (IBAction)dismiss:(id)sender; - -/// a set of element `Key`s that are hidden. Propagated to child view controllers. -@property (nonatomic, strong) NSSet *hiddenKeys; - -/** hide a set of element `Key`s - @param hiddenKeys a set of element `Key`s that are hidden - @param animated Specify YES if you want to animate the change in visibility or NO if you want the changes to appear immediately. - @discussion Propagated to child view controllers. - */ -- (void)setHiddenKeys:(NSSet*)hiddenKeys animated:(BOOL)animated; -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKAppSettingsWebViewController.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKAppSettingsWebViewController.h deleted file mode 100644 index e72b3e76..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKAppSettingsWebViewController.h +++ /dev/null @@ -1,34 +0,0 @@ -// -// IASKAppSettingsWebViewController.h -// InAppSettingsKit -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import -#import -@class IASKSpecifier; - -NS_ASSUME_NONNULL_BEGIN - -@interface IASKAppSettingsWebViewController : UIViewController - -- (nullable id)initWithFile:(NSString*)htmlFileName specifier:(IASKSpecifier*)specifier; - -@property (nullable, nonatomic, strong, readonly) WKWebView *webView; -@property (nonatomic, strong, readonly) NSURL *url; -@property (nullable, nonatomic, strong) NSString *customTitle; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKColor.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKColor.h deleted file mode 100644 index 8e35f546..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKColor.h +++ /dev/null @@ -1,20 +0,0 @@ -// -// IASKColor.h -// InAppSettingsKit -// -// Created by valvoline on 17/09/2019. -// Copyright (c) 2019-2020: -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@interface IASKColor : UIColor - -+ (UIColor *)iaskPlaceholderColor; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKDatePicker.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKDatePicker.h deleted file mode 100644 index 76ee70c0..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKDatePicker.h +++ /dev/null @@ -1,17 +0,0 @@ -// -// IASKDatePicker.h -// InAppSettingsKit -// -// Created by Ortwin Gentz on 04.05.20. -// Copyright (c) 2009-2020: -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// - -#import -@class IASKSpecifier; - -@interface IASKDatePicker : UIDatePicker -@property (strong, nonatomic, nonnull) IASKSpecifier *specifier; -@property (nonatomic, getter=isEditing) BOOL editing; -@end - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKDatePickerViewCell.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKDatePickerViewCell.h deleted file mode 100644 index 3b62d486..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKDatePickerViewCell.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// IASKDatePickerViewCell.h -// InAppSettingsKit -// -// Created by Ortwin Gentz on 04.05.20. -// Copyright (c) 2009-2020: -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// - -#import -@class IASKDatePicker; - -@interface IASKDatePickerViewCell : UITableViewCell -@property (nonatomic, nonnull) IASKDatePicker *datePicker; -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKEmbeddedDatePickerViewCell.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKEmbeddedDatePickerViewCell.h deleted file mode 100644 index 19e47cd8..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKEmbeddedDatePickerViewCell.h +++ /dev/null @@ -1,15 +0,0 @@ -// -// IASKEmbeddedDatePickerViewCell.h -// InAppSettingsKit -// -// Created by Ortwin Gentz on 02.07.20. -// Copyright © 2020 InAppSettingsKit. All rights reserved. -// - -#import -#import "IASKDatePickerViewCell.h" - -@interface IASKEmbeddedDatePickerViewCell : UITableViewCell -@property (nonatomic, nonnull) UILabel *titleLabel; -@property (nonatomic, nonnull) IASKDatePicker *datePicker; -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKMultipleValueSelection.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKMultipleValueSelection.h deleted file mode 100644 index 34c47cef..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKMultipleValueSelection.h +++ /dev/null @@ -1,38 +0,0 @@ -// -// IASKMultipleValueSelection.h -// InAppSettingsKit -// -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -NS_ASSUME_NONNULL_BEGIN - -@class IASKSpecifier; -@protocol IASKSettingsStore; - -/// Encapsulates the selection among multiple values. -/// This is used for PSMultiValueSpecifier and PSRadioGroupSpecifier -@interface IASKMultipleValueSelection : NSObject - -@property (nullable, nonatomic, assign) UITableView *tableView; -@property (nonatomic, copy, readonly) NSIndexPath *checkedIndexPath; -@property (nonatomic, strong) id settingsStore; - -- (id)initWithSettingsStore:(id)settingsStore - tableView:(nullable UITableView*)tableView - specifier:(IASKSpecifier*)specifier - section:(NSInteger)section; -- (void)selectRowAtIndexPath:(NSIndexPath*)indexPath; -- (void)updateSelectionInCell:(UITableViewCell*)cell indexPath:(NSIndexPath *)indexPath; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKPSSliderSpecifierViewCell.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKPSSliderSpecifierViewCell.h deleted file mode 100644 index 2aecf5e6..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKPSSliderSpecifierViewCell.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// IASKPSSliderSpecifierViewCell.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -@class IASKSlider; - -@interface IASKPSSliderSpecifierViewCell : UITableViewCell - -@property (nonatomic, strong) IASKSlider *slider; -@property (nonatomic, strong) UIImageView *minImage; -@property (nonatomic, strong) UIImageView *maxImage; - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKPSTextFieldSpecifierViewCell.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKPSTextFieldSpecifierViewCell.h deleted file mode 100644 index e0d74a81..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKPSTextFieldSpecifierViewCell.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// IASKPSTextFieldSpecifierViewCell.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -@class IASKTextField; - -@interface IASKPSTextFieldSpecifierViewCell : UITableViewCell - -@property (nonatomic, strong) IASKTextField *textField; - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsReader.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsReader.h deleted file mode 100644 index b89a315d..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsReader.h +++ /dev/null @@ -1,285 +0,0 @@ -// -// IASKSettingsReader.h -// InAppSettingsKit -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -#define kIASKPreferenceSpecifiers @"PreferenceSpecifiers" -#define kIASKCellImage @"IASKCellImage" - -#define kIASKItemSpecifier @"ItemSpecifier" -#define kIASKAddSpecifier @"AddSpecifier" -#define kIASKDeletable @"Deletable" -#define kIASKType @"Type" -#define kIASKTitle @"Title" -#define kIASKFooterText @"FooterText" -#define kIASKKey @"Key" -#define kIASKFile @"File" -#define kIASKDefaultValue @"DefaultValue" -#define kIASKDisplaySortedByTitle @"DisplaySortedByTitle" -#define kIASKMinimumValue @"MinimumValue" -#define kIASKMaximumValue @"MaximumValue" -#define kIASKTrueValue @"TrueValue" -#define kIASKFalseValue @"FalseValue" -#define kIASKIsSecure @"IsSecure" -#define KIASKKeyboardType @"KeyboardType" -#define kIASKAutocapitalizationType @"AutocapitalizationType" -#define kIASKAutoCorrectionType @"AutocorrectionType" -#define kIASKValues @"Values" -#define kIASKTitles @"Titles" -#define kIASKIconNames @"IconNames" -#define kIASKShortTitles @"ShortTitles" -#define kIASKSupportedUserInterfaceIdioms @"SupportedUserInterfaceIdioms" -#define kIASKSubtitle @"IASKSubtitle" -#define kIASKPlaceholder @"IASKPlaceholder" -#define kIASKViewControllerClass @"IASKViewControllerClass" -#define kIASKViewControllerSelector @"IASKViewControllerSelector" -#define kIASKViewControllerStoryBoardFile @"IASKViewControllerStoryBoardFile" -#define kIASKViewControllerStoryBoardId @"IASKViewControllerStoryBoardId" -#define kIASKSegueIdentifier @"IASKSegueIdentifier" -#define kIASKDatePickerMode @"DatePickerMode" -#define kIASKDatePickerModeTime @"Time" -#define kIASKDatePickerModeDate @"Date" -#define kIASKDatePickerModeDateAndTime @"DateAndTime" -#define kIASKDatePickerStyle @"DatePickerStyle" -#define kIASKDatePickerStyleCompact @"Compact" -#define kIASKDatePickerStyleInline @"Inline" -#define kIASKDatePickerStyleWheels @"Wheels" -#define kIASKDatePickerMinuteInterval @"MinuteInterval" -#define kIASKMailComposeToRecipents @"IASKMailComposeToRecipents" -#define kIASKMailComposeCcRecipents @"IASKMailComposeCcRecipents" -#define kIASKMailComposeBccRecipents @"IASKMailComposeBccRecipents" -#define kIASKMailComposeSubject @"IASKMailComposeSubject" -#define kIASKMailComposeBody @"IASKMailComposeBody" -#define kIASKMailComposeBodyIsHTML @"IASKMailComposeBodyIsHTML" -#define kIASKKeyboardAlphabet @"Alphabet" -#define kIASKKeyboardNumbersAndPunctuation @"NumbersAndPunctuation" -#define kIASKKeyboardNumberPad @"NumberPad" -#define kIASKKeyboardDecimalPad @"DecimalPad" -#define kIASKKeyboardPhonePad @"PhonePad" -#define kIASKKeyboardNamePhonePad @"NamePhonePad" -#define kIASKKeyboardASCIICapable @"AsciiCapable" -#define kIASKTextContentTypeName @"Name" -#define kIASKTextContentTypeNamePrefix @"NamePrefix" -#define kIASKTextContentTypeGivenName @"GivenName" -#define kIASKTextContentTypeMiddleName @"MiddleName" -#define kIASKTextContentTypeFamilyName @"FamilyName" -#define kIASKTextContentTypeNameSuffix @"NameSuffix" -#define kIASKTextContentTypeNickname @"Nickname" -#define kIASKTextContentTypeJobTitle @"JobTitle" -#define kIASKTextContentTypeOrganizationName @"OrganizationName" -#define kIASKTextContentTypeLocation @"Location" -#define kIASKTextContentTypeFullStreetAddress @"FullStreetAddress" -#define kIASKTextContentTypeStreetAddressLine1 @"StreetAddressLine1" -#define kIASKTextContentTypeStreetAddressLine2 @"StreetAddressLine2" -#define kIASKTextContentTypeAddressCity @"AddressCity" -#define kIASKTextContentTypeAddressState @"AddressState" -#define kIASKTextContentTypeAddressCityAndState @"AddressCityAndState" -#define kIASKTextContentTypeSublocality @"Sublocality" -#define kIASKTextContentTypeCountryName @"CountryName" -#define kIASKTextContentTypePostalCode @"PostalCode" -#define kIASKTextContentTypeTelephoneNumber @"TelephoneNumber" -#define kIASKTextContentTypeEmailAddress @"EmailAddress" -#define kIASKTextContentTypeURL @"URL" -#define kIASKTextContentTypeCreditCardNumber @"CreditCardNumber" -#define kIASKTextContentTypeUsername @"Username" -#define kIASKTextContentTypePassword @"Password" -#define kIASKTextContentTypeNewPassword @"NewPassword" -#define kIASKTextContentTypeOneTimeCode @"OneTimeCode" -#define KIASKKeyboardURL @"URL" -#define kIASKKeyboardEmailAddress @"EmailAddress" -#define kIASKAutoCapNone @"None" -#define kIASKAutoCapSentences @"Sentences" -#define kIASKAutoCapWords @"Words" -#define kIASKAutoCapAllCharacters @"AllCharacters" -#define kIASKAutoCorrDefault @"Default" -#define kIASKAutoCorrNo @"No" -#define kIASKAutoCorrYes @"Yes" -#define kIASKMinimumValueImage @"MinimumValueImage" -#define kIASKMaximumValueImage @"MaximumValueImage" -#define kIASKAdjustsFontSizeToFitWidth @"IASKAdjustsFontSizeToFitWidth" -#define kIASKTextContentType @"IASKTextContentType" -#define kIASKTextLabelAlignment @"IASKTextAlignment" -#define kIASKTextLabelAlignmentLeft @"IASKUITextAlignmentLeft" -#define kIASKTextLabelAlignmentCenter @"IASKUITextAlignmentCenter" -#define kIASKTextLabelAlignmentRight @"IASKUITextAlignmentRight" -#define kIASKToggleStyle @"IASKToggleStyle" -#define kIASKToggleStyleCheckmark @"Checkmark" -#define kIASKToggleStyleSwitch @"Switch" - -#define kIASKPSGroupSpecifier @"PSGroupSpecifier" -#define kIASKListGroupSpecifier @"IASKListGroupSpecifier" -#define kIASKPSToggleSwitchSpecifier @"PSToggleSwitchSpecifier" -#define kIASKPSMultiValueSpecifier @"PSMultiValueSpecifier" -#define kIASKPSRadioGroupSpecifier @"PSRadioGroupSpecifier" -#define kIASKPSSliderSpecifier @"PSSliderSpecifier" -#define kIASKPSTitleValueSpecifier @"PSTitleValueSpecifier" -#define kIASKPSTextFieldSpecifier @"PSTextFieldSpecifier" -#define kIASKPSChildPaneSpecifier @"PSChildPaneSpecifier" -#define kIASKTextViewSpecifier @"IASKTextViewSpecifier" -#define kIASKOpenURLSpecifier @"IASKOpenURLSpecifier" -#define kIASKButtonSpecifier @"IASKButtonSpecifier" -#define kIASKMailComposeSpecifier @"IASKMailComposeSpecifier" -#define kIASKCustomViewSpecifier @"IASKCustomViewSpecifier" -#define kIASKDatePickerSpecifier @"IASKDatePickerSpecifier" -#define kIASKDatePickerControl @"IASKDatePickerControl" - -// IASKChildTitle can be set if IASKViewControllerClass is set to IASKAppSettingsWebViewController. -// If IASKChildTitle is set, the navigation title is fixed to it; otherwise, the title value is used and is overridden by the HTML title tag -// as soon as the web page is loaded; if IASKChildTitle is set to the empty string, the title is not shown on push but _will_ be replaced by -// the HTML title as soon as the page is loaded. The value of IASKChildTitle is localizable. -#define kIASKChildTitle @"IASKChildTitle" - -extern NSString * const IASKSettingChangedNotification; -#define kIASKAppSettingChanged IASKSettingChangedNotification - -#define kIASKSectionHeaderIndex 0 - -#define kIASKSliderImageGap 10 - -#define kIASKSpacing 8 -#define kIASKMinLabelWidth 97 -#define kIASKMaxLabelWidth 240 -#define kIASKMinValueWidth 35 -#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000 -#define kIASKPaddingLeft (floor(NSFoundationVersionNumber) > NSFoundationVersionNumber_iOS_6_1 ? 15 : 9) -#else -#define kIASKPaddingLeft 9 -#endif -#define kIASKPaddingRight 10 -#define kIASKHorizontalPaddingGroupTitles 19 -#define kIASKVerticalPaddingGroupTitles 15 - -#define kIASKLabelFontSize 17 -#define kIASKgrayBlueColor [UIColor colorWithRed:0.318f green:0.4f blue:0.569f alpha:1.f] - -#define kIASKMinimumFontSize 12.0f - -#ifndef kCFCoreFoundationVersionNumber_iOS_7_0 -#define kCFCoreFoundationVersionNumber_iOS_7_0 843.00 -#endif - -#ifndef kCFCoreFoundationVersionNumber_iOS_8_0 -#define kCFCoreFoundationVersionNumber_iOS_8_0 1129.150000 -#endif - -#ifndef kCFCoreFoundationVersionNumber_iOS_11_0 -#define kCFCoreFoundationVersionNumber_iOS_11_0 1429.150000 -#endif - -#ifndef kCFCoreFoundationVersionNumber_iOS_14_0 -#define kCFCoreFoundationVersionNumber_iOS_14_0 1740.0 -#endif - -#ifdef __IPHONE_11_0 -#define IASK_IF_IOS11_OR_GREATER(...) \ -if (@available(iOS 11.0, *)) \ -{ \ -__VA_ARGS__ \ -} - -#define IASK_IF_PRE_IOS11(...) \ -_Pragma("clang diagnostic push") \ -_Pragma("clang diagnostic ignored \"-Wdeprecated-declarations\"") \ -if (kCFCoreFoundationVersionNumber < kCFCoreFoundationVersionNumber_iOS_11_0) \ -{ \ -__VA_ARGS__ \ -} \ -_Pragma("clang diagnostic pop") -#else -#define IASK_IF_IOS11_OR_GREATER(...) -#define IASK_IF_PRE_IOS11(...) -#endif - -#ifdef __IPHONE_14_0 -#define IASK_IF_IOS14_OR_GREATER(...) \ -if (kCFCoreFoundationVersionNumber >= kCFCoreFoundationVersionNumber_iOS_14_0) \ -{ \ -__VA_ARGS__ \ -} -#else -#define IASK_IF_IOS14_OR_GREATER(...) -#endif - -@class IASKSpecifier; -@protocol IASKSettingsStore; - -/** settings reader transform iOS's settings plist files - to the IASKSpecifier model objects. - Besides that, it also hides the complexity of finding - the 'proper' Settings.bundle - */ -@interface IASKSettingsReader : NSObject - -/** designated initializer - searches for a settings bundle that contains a plist with the specified fileName that must - be contained in the given bundle - @param file settings file name without the ".plist" suffix - @param bundle bundle that contains a plist with the specified file - */ -- (id)initWithFile:(NSString*)file bundle:(NSBundle*)bundle; - -/** convenience initializer - calls initWithFile where applicationBundle is set to NSBundle.mainBundle - @param file settings file name without the ".plist" suffix - */ -- (id)initWithFile:(NSString*)file; - -@property (nonatomic, readonly) NSInteger numberOfSections; -- (NSInteger)numberOfRowsInSection:(NSInteger)section; -- (nullable IASKSpecifier*)specifierForIndexPath:(NSIndexPath*)indexPath; -- (nullable IASKSpecifier*)headerSpecifierForSection:(NSInteger)section; -- (nullable NSIndexPath*)indexPathForKey:(NSString*)key; -- (nullable IASKSpecifier*)specifierForKey:(NSString*)key; -- (nullable NSString*)titleForSection:(NSInteger)section; -- (nullable NSString*)keyForSection:(NSInteger)section; -- (nullable NSString*)footerTextForSection:(NSInteger)section; -- (nullable NSString*)titleForId:(nullable NSObject*)titleId; -- (NSString*)pathForImageNamed:(NSString*)image; -- (nullable NSString*)locateSettingsFile:(NSString *)file; - -/** recursively go through all specifiers of the file/sub-files and gather default values - @param limitedToEditableFields limit the gathering to default values of specifiers that can be edited by the user (e.g. -PSToggleSwitchSpecifier, PSTextFieldSpecifier). - */ -- (NSDictionary *)gatherDefaultsLimitedToEditableFields:(BOOL)limitedToEditableFields; - -/// recursively go through all specifiers of the file/sub-files and populate the store with the specified default values -- (void)applyDefaultsToStore; - -/// the main application bundle. most often NSBundle.mainBundle -@property (nonatomic, readonly) NSBundle *applicationBundle; - -/// the actual settings bundle -@property (nonatomic, readonly) NSBundle *settingsBundle; - -/// the actual settings plist, parsed into a dictionary -@property (nonatomic, readonly) NSDictionary *settingsDictionary; - -@property (nonatomic, strong) NSString *localizationTable; -@property (nonatomic, readonly) NSBundle *iaskBundle; -@property (nonatomic, strong) NSArray *dataSource; -@property (nullable, nonatomic, strong) NSSet *hiddenKeys; -@property (nonatomic) BOOL showPrivacySettings; -@property (nullable, nonatomic, weak) id settingsStore; -@property (nullable, nonatomic, strong) IASKSpecifier *selectedSpecifier; // currently used for date picker - -@end - -NS_ASSUME_NONNULL_END - diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStore.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStore.h deleted file mode 100644 index a576b69e..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStore.h +++ /dev/null @@ -1,58 +0,0 @@ -// -// IASKSettingsStore.h -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -@class IASKSpecifier; - -NS_ASSUME_NONNULL_BEGIN - -/** protocol that needs to be implemented from a settings store - */ -@protocol IASKSettingsStore -@required -- (void)setBool:(BOOL)value forSpecifier:(IASKSpecifier*)specifier; -- (void)setFloat:(float)value forSpecifier:(IASKSpecifier*)specifier; -- (void)setDouble:(double)value forSpecifier:(IASKSpecifier*)specifier; -- (void)setInteger:(NSInteger)value forSpecifier:(IASKSpecifier*)specifier; -- (void)setObject:(nullable id)value forSpecifier:(IASKSpecifier*)specifier; -- (BOOL)boolForSpecifier:(IASKSpecifier*)specifier; -- (float)floatForSpecifier:(IASKSpecifier*)specifier; -- (double)doubleForSpecifier:(IASKSpecifier*)specifier; -- (NSInteger)integerForSpecifier:(IASKSpecifier*)specifier; -- (nullable id)objectForSpecifier:(IASKSpecifier*)specifier; -- (BOOL)synchronize; // Write settings to a permanant storage. Returns YES on success, NO otherwise -- (void)setArray:(NSArray*)array forSpecifier:(IASKSpecifier*)specifier; -- (NSArray*)arrayForSpecifier:(IASKSpecifier*)specifier; -- (void)addObject:(NSObject*)object forSpecifier:(IASKSpecifier*)specifier; -- (void)removeObjectWithSpecifier:(IASKSpecifier*)specifier; -@optional -- (void)setObject:(id)value forKey:(NSString*)key; -- (nullable id)objectForKey:(NSString*)key; -@end - - -/** default implementation of the IASKSettingsStore protocol - - Subclassing notes: - To implement your own store, either implement the @optional methods setObject:forKey: and objectForKey: (without calling super) or implement all @required methods (without calling super or the @optional methods). - - IASKAbstractSettingsStore implements all @required methods by calling objectForKey: and setObject:forKey:. However, objectForKey: and setObject:forKey: itself are not implemented and raise an exception. - */ -@interface IASKAbstractSettingsStore : NSObject - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreFile.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreFile.h deleted file mode 100644 index 416c9026..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreFile.h +++ /dev/null @@ -1,40 +0,0 @@ -// -// IASKSettingsStoreFile.h -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -#import "IASKSettingsStore.h" - -NS_ASSUME_NONNULL_BEGIN - -/** file-based implementation of IASKAbstractSettingsStore - - uses an NSDictionary + its read/write to file support to store - settings in a file at the specified path - */ -@interface IASKSettingsStoreFile : IASKAbstractSettingsStore - -/** designated initializer - - @param path absolute file-path to store settings dictionary - */ -- (id)initWithPath:(NSString*)path; - -@property (nonatomic, copy, readonly) NSString* filePath; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreInMemory.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreInMemory.h deleted file mode 100644 index 6b9ea0dd..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreInMemory.h +++ /dev/null @@ -1,27 +0,0 @@ -// -// IASKSettingsStoreInMemory.h -// InAppSettingsKit -// -// Created by Costantino Pistagna on 24/04/2020. -// Copyright (c) 2009-2020: -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// - -#import - -#import "IASKSettingsStore.h" - -NS_ASSUME_NONNULL_BEGIN - -/** implementation of IASKSettingsStore that uses InMemory NSDictionary -*/ -@interface IASKSettingsStoreInMemory : IASKAbstractSettingsStore - -@property (nonatomic, strong, readwrite) NSMutableDictionary* dictionary; - -///designated initializer -- (id)initWithDictionary:(NSDictionary *)dictionary; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreUserDefaults.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreUserDefaults.h deleted file mode 100644 index b89590f3..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSettingsStoreUserDefaults.h +++ /dev/null @@ -1,37 +0,0 @@ -// -// IASKSettingsStoreUserDefaults.h -// -// Copyright (c) 2010: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// Marc-Etienne M.Léveillé, Edovia Inc., http://www.edovia.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -#import "IASKSettingsStore.h" - -NS_ASSUME_NONNULL_BEGIN - -/** implementation of IASKSettingsStore that uses NSUserDefaults - */ -@interface IASKSettingsStoreUserDefaults : IASKAbstractSettingsStore - -/// designated initializer -- (id)initWithUserDefaults:(NSUserDefaults*)defaults; - -/// calls initWithUserDefaults: with NSUserDefaults.standardUserDefaults -- (id)init; - -@property (nonatomic, strong, readonly) NSUserDefaults* defaults; - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSlider.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSlider.h deleted file mode 100644 index 5b41622d..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSlider.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// IASKSlider.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -@class IASKSpecifier; - -@interface IASKSlider : UISlider - -@property (strong, nonatomic) IASKSpecifier *specifier; - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSpecifier.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSpecifier.h deleted file mode 100644 index 997bcfcf..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSpecifier.h +++ /dev/null @@ -1,232 +0,0 @@ -// -// IASKSpecifier.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -#import - -NS_ASSUME_NONNULL_BEGIN - -@class IASKSettingsReader; - -/** - Represents one element of a preferences schema file - */ - -@interface IASKSpecifier : NSObject - -#pragma mark - Generic -- (id)initWithSpecifier:(NSDictionary*)specifier; - -@property (nonatomic, strong, readonly) NSDictionary *specifierDict; -@property (nullable, nonatomic, weak) IASKSettingsReader *settingsReader; - -/** Settings schema: `Key` -@discussion This is mandatory for almost all specifiers except Group, OpenURL, Button, MailCompose, CustomView, and the ItemSpecifier of ListGroup. - */ -@property (nullable, nonatomic, copy) NSString *key; - -/// Settings schema: `Title` -@property (nullable, nonatomic, copy) NSString *title; - -/// Settings schema: `IASKSubtitle` -@property (nullable, nonatomic, copy, readonly) NSString *subtitle; - -// internal: Whether or not this setting has a subtitle. -@property (nonatomic, readonly) BOOL hasSubtitle; - -// internal: Returns the subtitle for the current value of the setting -- (nullable NSString*)subtitleForValue:(nullable id)value; - -@property (nonatomic, copy, readonly) NSString *type; -@property (nullable, nonatomic, strong, readonly) id defaultValue; -@property (nullable, nonatomic, strong, readonly) id defaultStringValue; -@property (nullable, nonatomic, copy, readonly) NSString *footerText; - -/** Settings schema: `IASKCellImage` - @discussion All element types (except sliders which already have a `MinimumValueImage`) support an icon image on the left side of the cell. You can specify the image name in an optional `IASKCellImage` attribute. The ".png" or "@2x.png" suffix is automatically appended and will be searched in the project. Optionally, you can add an image with suffix "Highlighted.png" or "Highlighted@2x.png" to the project and it will be automatically used as a highlight image when the cell is selected (for Buttons and ChildPanes). -*/ -@property (nullable, nonatomic, strong, readonly) UIImage *cellImage; -@property (nullable, nonatomic, strong, readonly) UIImage *highlightedCellImage; -@property (nullable, nonatomic, strong, readonly) NSArray *userInterfaceIdioms; -@property (nonatomic, readonly) BOOL adjustsFontSizeToFitWidth; -@property (nonatomic, readonly) NSTextAlignment textAlignment; - -- (nullable NSString*)localizedObjectForKey:(NSString*)key; -- (nullable NSString*)titleForCurrentValue:(nullable id)currentValue; - - -#pragma mark - Sliders -/// Settings schema: `MinimumValue` -@property (nonatomic, readonly) float minimumValue; - -/// Settings schema: `MaximumValue` -@property (nonatomic, readonly) float maximumValue; - -/// Settings schema: `MinimumValueImage` -@property (nullable, nonatomic, copy, readonly) NSString *minimumValueImage; - -/// Settings schema: `MaximumValueImage` -@property (nullable, nonatomic, copy, readonly) NSString *maximumValueImage; - - -#pragma mark - Switches -/// Settings schema: `TrueValue` -@property (nullable, nonatomic, strong, readonly) id trueValue; - -/// Settings schema: `FalseValue` -@property (nullable, nonatomic, strong, readonly) id falseValue; - -typedef NS_ENUM(NSUInteger, IASKToggleStyle) { - IASKToggleStyleSwitch, - IASKToggleStyleCheckmark, -}; - -/** Settings schema: `IASKToggleStyle`, values: `Switch` (default) or `Checkmark` - @discussion Specifies if the switch uses the default UISwitch style or an accessoryType checkmark. - */ -@property (nonatomic, readonly) IASKToggleStyle toggleStyle; - -@property (nonatomic, readonly) BOOL defaultBoolValue; - - -/*! - @group Text Fields and Views -*/ -#pragma mark - Text Fields and Views -/// Settings schema: `IsSecure` -@property (nonatomic, readonly) BOOL isSecure; - -/// Settings schema: `KeyboardType`, values: `Alphabet` (default), `NumbersAndPunctuation`, `NumberPad`, `DecimalPad`, `PhonePad`, `NamePhonePad`, `AsciiCapable`, `URL`, `EmailAddress` -@property (nonatomic, readonly) UIKeyboardType keyboardType; - -/// Settings schema: `AutocapitalizationType`, values: `None` (default), `Sentences`, `Words`, `AllCharacters`, -@property (nonatomic, readonly) UITextAutocapitalizationType autocapitalizationType; - -/// Settings schema: `AutocorrectionType`, values: `Default` (default), `No`, `Yes` -@property (nonatomic, readonly) UITextAutocorrectionType autoCorrectionType; - -/// Settings schema: `IASKPlaceholder` -@property (nullable, nonatomic, copy, readonly) NSString *placeholder; - -/** Settings schema: `IASKTextContentType` - @discussion The plist values correspond to the naming of the UIKit constants, e.g. for `UITextContentTypeAddressCityAndState` use the value `AddressCityAndState`. - */ -@property (nullable, nonatomic, copy, readonly) UITextContentType textContentType; - -/*! - @group Radio Groups -*/ -#pragma mark - Radio Groups -/// A specifier for one entry in a radio group preceeded by a radio group specifier. -- (id)initWithSpecifier:(NSDictionary*)specifier - radioGroupValue:(NSString*)radioGroupValue; -@property (nullable, nonatomic, copy, readonly) NSString *radioGroupValue; - - -/*! - @group Multi Values -*/ -#pragma mark - Multi Values -@property (nonatomic, readonly) NSInteger multipleValuesCount; -@property (nullable, nonatomic, strong, readonly) NSArray *multipleValues; -@property (nullable, nonatomic, strong, readonly) NSArray *multipleTitles; -@property (nullable, nonatomic, strong, readonly) NSArray *multipleIconNames; -@property (nonatomic, readonly) BOOL displaySortedByTitle; -- (void)setMultipleValuesDictValues:(NSArray*)values titles:(NSArray*)titles; -- (void)sortIfNeeded; - -/*! - @group Child Panes -*/ -#pragma mark - Child Panes -@property (nullable, nonatomic, copy, readonly) NSString *file; - -/** Settings schema: `IASKViewControllerClass` - @discussion The child pane is displayed by instantiating a UIViewController subclass of the specified class and initializing it using the init method specified in @see viewControllerSelector - */ -@property (nullable, nonatomic, readonly) Class viewControllerClass; -/** Settings schema: `IASKViewControllerSelector` -@discussion The selector must have two arguments: an `NSString` argument for the file name in the Settings bundle and the `IASKSpecifier`. The custom view controller is then pushed onto the navigation stack. See the sample app for more details. -*/ -@property (nullable, nonatomic, readonly) SEL viewControllerSelector; - -/** Settings schema: `IASKViewControllerStoryBoardFile` - @discussion When using @see viewControllerStoryBoardID to reference the child view controller from a storyboard, this specifies the storyboard file. - */ -@property (nullable, nonatomic, copy, readonly) NSString *viewControllerStoryBoardFile; - -/** Settings schema: `IASKViewControllerStoryBoardId` - @discussion References the child view controller from a storyboard. If `IASKViewControllerStoryBoardFile` is not specified, the main storyboard (`UIMainStoryboardFile` in Info.plist) is used. - */ -@property (nullable, nonatomic, copy, readonly) NSString *viewControllerStoryBoardID; - -/** Settings schema: `IASKSegueIdentifier` -@discussion References the child view controller from a storyboard segue. Requires that `IASKAppSettingsViewController` is loaded from a storyboard as well. - */ -@property (nullable, nonatomic, copy, readonly) NSString *segueIdentifier; - - -/*! - @group List Groups -*/ -#pragma mark - List Groups - -/// The specifier of the enclosing list group. Only defined for `ItemSpecifier` or `AddSpecifier`. -@property (nullable, nonatomic, strong, readonly) IASKSpecifier *parentSpecifier; - -/** Returns the item specifier of a list group - @param index the index into the array of items - @discussion Note that for the `ItemSpecifier` the `Key` parameter is optional. If the key is set, accessing the store with `objectForSpecifier:` returns the keyed element of the item dictionary. If the key is not set, the whole dictionary is returned. Note that the item content can also be of scalar type when items are added using a text field, a slider or toggle. - */ -- (nullable IASKSpecifier*)itemSpecifierForIndex:(NSUInteger)index; - -/// The item index of a list group `itemSpecifier`. Only defined for the parent list group specifier. -@property (nonatomic, readonly) NSUInteger itemIndex; - -@property (nonatomic, readonly) BOOL isItemSpecifier; - -/// The specifier for the "Add…" item at the end of a list group allowing to add new items. Only defined for the parent list group specifier. -@property (nullable, nonatomic, strong, readonly) IASKSpecifier *addSpecifier; - -@property (nonatomic, readonly) BOOL isAddSpecifier; - -/// Specifies if the item cells of a list group are deletable via swipe. -@property (nonatomic, readonly) BOOL deletable; - - -/*! - @group Date Picker -*/ -#pragma mark - Date Picker - -/// Settings schema: `DatePickerMode` with values `Date`, `Time`, and `DateAndTime` (default) -@property (nonatomic, readonly) UIDatePickerMode datePickerMode; - -/// Settings schema: `DatePickerStyle` with values `Compact` (default), `Inline`, and `Wheels` -@property (nonatomic, readonly) UIDatePickerStyle datePickerStyle API_AVAILABLE(ios(13.4)); - -/// Settings schema: `MinuteInterval` with an integer value (default: 1) -@property (nonatomic, readonly) NSInteger datePickerMinuteInterval; - -// internal: the date picker doesn't expand/collapse (datePickerStyle is `Compact`) -@property (nonatomic, readonly) BOOL embeddedDatePicker; - -// internal: represents the actual date picker cell below the title cell -@property (nonatomic, strong, readonly) IASKSpecifier *editSpecifier; - - -@end - -NS_ASSUME_NONNULL_END diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSpecifierValuesViewController.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSpecifierValuesViewController.h deleted file mode 100644 index ba737728..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSpecifierValuesViewController.h +++ /dev/null @@ -1,28 +0,0 @@ -// -// IASKSpecifierValuesViewController.h -// InAppSettingsKit -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -#import "IASKViewController.h" - -@class IASKSpecifier; - -@interface IASKSpecifierValuesViewController : UITableViewController - -- (nonnull id)initWithSpecifier:(nonnull IASKSpecifier*)specifier; -- (nonnull id)initWithSpecifier:(nonnull IASKSpecifier*)specifier style:(UITableViewStyle)style; - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSwitch.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSwitch.h deleted file mode 100644 index f2369fc8..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKSwitch.h +++ /dev/null @@ -1,23 +0,0 @@ -// -// IASKSwitch.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -@class IASKSpecifier; - -@interface IASKSwitch : UISwitch - -@property (strong, nonatomic) IASKSpecifier *specifier; - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextField.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextField.h deleted file mode 100644 index ba02638a..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextField.h +++ /dev/null @@ -1,26 +0,0 @@ -// -// IASKTextField.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -@class IASKSpecifier; - -@interface IASKTextField : UITextField - -@property (strong, nonatomic, nonnull) IASKSpecifier *specifier; -@property (strong, nonatomic, nullable, readonly) NSString *oldText; // text when this field became first responder - -- (void)shake; - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextView.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextView.h deleted file mode 100644 index 6f0954aa..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextView.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// IASKTextView.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import -@class IASKSpecifier; - -@interface IASKTextView : UITextView - -@property (strong, nonatomic) IASKSpecifier *specifier; -@property (strong, nonatomic) NSString *placeholder; - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextViewCell.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextViewCell.h deleted file mode 100644 index f0fea387..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKTextViewCell.h +++ /dev/null @@ -1,24 +0,0 @@ -// -// IASKTextViewCell.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -#import - -@class IASKTextView; - -@interface IASKTextViewCell : UITableViewCell - -@property (nonatomic, strong) IASKTextView *textView; - -@end diff --git a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKViewController.h b/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKViewController.h deleted file mode 100644 index 7cec91cf..00000000 --- a/Pods/InAppSettingsKit/Sources/InAppSettingsKit/include/IASKViewController.h +++ /dev/null @@ -1,30 +0,0 @@ -// -// IASKAppSettingsViewController.h -// -// Copyright (c) 2009-2020: -// Luc Vandal, Edovia Inc., http://www.edovia.com -// Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -// All rights reserved. -// -// It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -// as the original authors of this code. You can give credit in a blog post, a tweet or on -// a info page of your app. Also, the original authors appreciate letting them know if you use this code. -// -// This code is licensed under the BSD license that is available at: http://www.opensource.org/licenses/bsd-license.php -// - -@class IASKSettingsReader; -@protocol IASKSettingsStore; - -// protocol all IASK view controllers implement -@protocol IASKViewController - -@property (nonatomic, strong, nullable) IASKSettingsReader* settingsReader; -@property (nonatomic, strong, nonnull) id settingsStore; -@property (nonatomic, copy, nullable) void (^childPaneHandler)(BOOL doneEditing); -@property (nonatomic, weak, nullable) UIViewController *listParentViewController; - -@optional -@property (nonatomic, weak, nullable) id currentFirstResponder; - -@end diff --git a/Pods/Manifest.lock b/Pods/Manifest.lock index 73b0df01..14a1c3ed 100644 --- a/Pods/Manifest.lock +++ b/Pods/Manifest.lock @@ -1,32 +1,20 @@ PODS: - ChromaColorPicker (2.0.2) - - CoreGPX (0.9.0) - - InAppSettingsKit (3.3.6) - - Popovers (1.3.0) - UIMultiPicker (0.6.2) DEPENDENCIES: - ChromaColorPicker (~> 2.0.2) - - CoreGPX (~> 0.9.0) - - InAppSettingsKit (~> 3.3.6) - - Popovers (~> 1.3.0) - UIMultiPicker (~> 0.6.2) SPEC REPOS: trunk: - ChromaColorPicker - - CoreGPX - - InAppSettingsKit - - Popovers - UIMultiPicker SPEC CHECKSUMS: ChromaColorPicker: 307585f2dc23d4d72f24cad320c1e08825cb5c09 - CoreGPX: 1381c8c47428c3a6bcac2f93d25ca1c5e3525811 - InAppSettingsKit: 37df0b44132380d4c7db6fc7cded92997e29873a - Popovers: 8690b055b2c9ef433492b40e081b1a0be5859437 UIMultiPicker: 29bf824c5251822ca4040b933f6204e617e6ba3f -PODFILE CHECKSUM: 38722fa9b39e37c5cad35620797a9b3d80da744a +PODFILE CHECKSUM: 0746c2b061b6eb98aa8c4ea0fa4e9e38ec4669e0 COCOAPODS: 1.14.3 diff --git a/Pods/Pods.xcodeproj/project.pbxproj b/Pods/Pods.xcodeproj/project.pbxproj index 37fe850a..40525a5e 100644 --- a/Pods/Pods.xcodeproj/project.pbxproj +++ b/Pods/Pods.xcodeproj/project.pbxproj @@ -7,421 +7,95 @@ objects = { /* Begin PBXBuildFile section */ - 0398B9327CEFE5409D9780F7AB2FB480 /* GPXLegacy.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5DA0B088435D68A26FB61DC02282A6DF /* GPXLegacy.swift */; }; - 066F140F881A30F460D97B28176AC535 /* GPXAuthor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EC84A71CCF121D0B2E0C3D67AB572D3B /* GPXAuthor.swift */; }; - 06C2280561C2533DFD2C2AE0449DAA11 /* IASKPSTextFieldSpecifierViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 91AB13988912CB7C386322FC6A1A46F3 /* IASKPSTextFieldSpecifierViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 0950749F633B46F3D9F25195C17CF3D5 /* UIColor+Brightness.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7466FC0C9CCD05C64C465F97AA9340F6 /* UIColor+Brightness.swift */; }; - 0A315A670640FAF5C6F37591EA182982 /* Popover.swift in Sources */ = {isa = PBXBuildFile; fileRef = 485D56E268AC91872A1C6946FEC6875C /* Popover.swift */; }; - 0AB70C33A6E75D0F25CB1D1A2C633F8D /* Extensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = 38E27C2E9C2A4690A9EE76106F3796AB /* Extensions.swift */; }; - 0AE4791906FF6CF77A501001CA758CB5 /* GPXPerson.swift in Sources */ = {isa = PBXBuildFile; fileRef = 64275AF3168E886A9F16DBA2344120AA /* GPXPerson.swift */; }; - 0D56EB72B99B01416542A3B1BB27A0DF /* GPXPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 525D5DD844A76D8DE0279465A2831E29 /* GPXPoint.swift */; }; - 100B82CDA344F9B9585027C3D560C1C3 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 772245828F0E506C859B7A962DC70C92 /* Foundation.framework */; }; - 1013B0C50126F3E25805ED89465FABB2 /* IASKViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 3C4A90D9845344327FA4AC9D30B74E3C /* IASKViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 15372E5FA2EF49EC7E4863346934C018 /* pl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 2F6A23D99EEA13ADE4DDEDAE13331BA9 /* pl.lproj */; }; - 15A490367AD0CFEDEA3242D712D1039A /* IASKSpecifierValuesViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 1B43B8984DCE6143EF2B1A45ACDD6F1A /* IASKSpecifierValuesViewController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 16BF05CEC1D33148CEE3AB550416367C /* IASKSettingsStoreUserDefaults.h in Headers */ = {isa = PBXBuildFile; fileRef = 3F3B397EB6AAA89B542EABE8064FBC0C /* IASKSettingsStoreUserDefaults.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1722E678F296F719EAC7560191753674 /* pt.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A9B99BB2D82C411E7774E80361135D14 /* pt.lproj */; }; - 172A875560ED4CCAAFD7BD59343620CD /* GPXExtensions.swift in Sources */ = {isa = PBXBuildFile; fileRef = EE791C857B1C0CB030B98BBCF51D41A8 /* GPXExtensions.swift */; }; - 177C66F5AF1827606BFD679F79373F97 /* IASKEmbeddedDatePickerViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = D4C67B358388EF56B4C1846DFDCC13C1 /* IASKEmbeddedDatePickerViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 17A2FB0CA678F74913D74DD693722EDC /* GPXEmail.swift in Sources */ = {isa = PBXBuildFile; fileRef = F99FCA154EE265FC35E62084A9903712 /* GPXEmail.swift */; }; - 1A68CA2DA40FCE5E93F5BE7364C89E7E /* IASKDatePicker.h in Headers */ = {isa = PBXBuildFile; fileRef = 59E80EAE43F58D4673A9E293CA5E5424 /* IASKDatePicker.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1B8EDB17F6F552AADD6A4C0889CC45B7 /* DateTimeParsers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F5D9B883A6F7FCA7924440714B341DD /* DateTimeParsers.swift */; }; - 1DCDF597266DBE3E35B912CFBB3A07B0 /* MessageUI.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = E218635B62BFBD9D6E78E4C2164F0717 /* MessageUI.framework */; }; - 1E620625175517CAF606E20B645CCB8D /* IASKSwitch.h in Headers */ = {isa = PBXBuildFile; fileRef = 783379E8DC45B73554D9BA0AD8AEE396 /* IASKSwitch.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 1F7CD35AA80C025F245CC0B13163DD99 /* IASKTextField.m in Sources */ = {isa = PBXBuildFile; fileRef = 6E0BC583838349978BFB03D649854625 /* IASKTextField.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 1FD62FC49184BF87446C332911ADC36C /* IASKPSSliderSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 99EFA32A87122290EC3A8A77E6C2FEDA /* IASKPSSliderSpecifierViewCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 206ABF35676484B0199D4931A1777618 /* IASKColor.m in Sources */ = {isa = PBXBuildFile; fileRef = 4EFD7C39121B59549CB60EE4E3C6F665 /* IASKColor.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 20A57C501C416C826E2B45EE823B5852 /* ca.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 8EEAFBF0D4128BD0256FD28417844A99 /* ca.lproj */; }; - 21D6E5163FCEA8B00C403BFB022E3317 /* ja.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BD0E085C2596E72A0FCA8E828680B7A0 /* ja.lproj */; }; - 2209F75959A56AB2EDE4450F8B1C1934 /* GPXLink.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4F6D9C516FE20DDA9F620456EFE93F0D /* GPXLink.swift */; }; - 229E45FBD72B98A80A48E8138E9DCA2D /* UIColor+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = A16D3531CF2D667284F3142E91576B14 /* UIColor+Utils.swift */; }; - 237E4C7ECAF93A8C661558BD09E15BB4 /* zh-Hans.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 32F930DD3AD647DB052AEB5A72A70A21 /* zh-Hans.lproj */; }; - 289D7212FFEDAFDA7920632DF5EFA948 /* IASKAppSettingsWebViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = 1D694988C563BD6415F49C6F25B956F3 /* IASKAppSettingsWebViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 29494A0AA2122A64690844C8FC7CC455 /* IASKPSSliderSpecifierViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 0F50699DE1B119E1DB9AC8D3712A7AB5 /* IASKPSSliderSpecifierViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 2A21E091359267D7F985AF77312F45B7 /* Pods-WunderLINQ-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 427E56F4CF2E99993434B5ACC466869E /* Pods-WunderLINQ-dummy.m */; }; - 2A3EC6BA307F9B79F7B7A22F39DB8EAC /* GPXRoutePoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 29949D7E3D4E9BB17897940E6FB77B99 /* GPXRoutePoint.swift */; }; - 2DD991BCE46DD01C11E1DF654DF046F5 /* Popovers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 85296CDD82535607181AEBABD327B4C1 /* Popovers.swift */; }; - 2EADFD3DA1BCB3B822739B43E4795F9C /* FrameTag.swift in Sources */ = {isa = PBXBuildFile; fileRef = BEE64EC7352025EB09B5F32DFBAFB2D0 /* FrameTag.swift */; }; - 2F39ADB690E78CED92AB4AD7AB3B1D17 /* ru.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F4253039760EE37DA8B289470077DE06 /* ru.lproj */; }; - 32C64AB18CD3F2E60523E2AC1268AB16 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 772245828F0E506C859B7A962DC70C92 /* Foundation.framework */; }; - 32E561A15C312235BA64C938AE92E1EF /* UIView+DropShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9175F19D5F027DA90EBB5C9567C4E20E /* UIView+DropShadow.swift */; }; - 34C5581CFD72256B12754F00652EE6AB /* IASKSettingsStoreUserDefaults.m in Sources */ = {isa = PBXBuildFile; fileRef = E5E969316AE9B854A2920CE32B9B31DA /* IASKSettingsStoreUserDefaults.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 35711D800BF76ABA65B59B97109B126E /* Menu+UIKit.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6983A1C4A3687F478D6DB2F98A1CB243 /* Menu+UIKit.swift */; }; - 35E2A5FDB8F88903F7E8A799C5085819 /* GPXParser.swift in Sources */ = {isa = PBXBuildFile; fileRef = CEB4866C4114B58B72A6B2911F4C9173 /* GPXParser.swift */; }; - 373EB52F1159C61F23A342FA9EF9E1DD /* sv.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 35CBD7116D03B8AE542F27C25BACD5EA /* sv.lproj */; }; - 374714C76D014BB72583BDB5A7FD6F3F /* IASKSlider.h in Headers */ = {isa = PBXBuildFile; fileRef = 478F76D4194C8A256BCB9767F7A3FD9D /* IASKSlider.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 37A1850CD71CA0BF9E3CD9BCC30C6AA2 /* NSMutableString+XML.swift in Sources */ = {isa = PBXBuildFile; fileRef = B3092955C0CB4F5FC36BF93F6E7927E8 /* NSMutableString+XML.swift */; }; - 3AC4258902263D76CDA96BDAA08A881D /* ChromaColorPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = FAD2EBA37C160A445D14AF835F533BBC /* ChromaColorPicker.swift */; }; - 3BD53ACFDDBF3CE01053AB350F534ED1 /* UIMultiPicker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = A1E891EAEB7D2C3402C1B341103DBC7C /* UIMultiPicker-dummy.m */; }; - 3BF99526314FFEF40A149EC8FB67F227 /* IASKTextView.m in Sources */ = {isa = PBXBuildFile; fileRef = D60E0AEC214159E32DB560D8CAE1073D /* IASKTextView.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 42BA147DE27A276FB142193CFB4EADF2 /* hr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 89B1066183318DFD567322AEEB59002A /* hr.lproj */; }; - 454313AF39193E4AD9CDBD2215BC68EF /* IASKColor.h in Headers */ = {isa = PBXBuildFile; fileRef = 50722313F76518974FF52CFA7636DB56 /* IASKColor.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4702768004D49FD9CA1DEDDC1E733116 /* GPXTrack.swift in Sources */ = {isa = PBXBuildFile; fileRef = B2349157577BF081F6907EEAE683A97C /* GPXTrack.swift */; }; - 473D3854493C0ECACBB7F4403E41A327 /* Container.swift in Sources */ = {isa = PBXBuildFile; fileRef = E20409BEDFE5BE3E8B7D05E8D87BBD98 /* Container.swift */; }; - 47DE32AA030CDB56DC4591902F948E6B /* Readers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5FABA709DD703C10F157E8D6AB82F098 /* Readers.swift */; }; - 4A6C1B39749347F26316E908223863EA /* IASKSlider.m in Sources */ = {isa = PBXBuildFile; fileRef = 66426BBDAD31BF562CC8D848080A7E19 /* IASKSlider.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 4AF4FF1C5DFA5E3F2B170D59807BC3E3 /* tr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = ACC82CD87A0882A87953E6F05BD08C83 /* tr.lproj */; }; - 4B6684199FCBDFD2E1D1FB1AE2FE4E12 /* GPXExtensionsElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = AE8A5ECF6587333D91D9426ACBCAF2BF /* GPXExtensionsElement.swift */; }; - 4DEC3AD2F9C8C658A526118D8C9249BB /* IASKSettingsStore.h in Headers */ = {isa = PBXBuildFile; fileRef = EB6FC9F734F5E535B3A598413F4D9962 /* IASKSettingsStore.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 4E0B1FF2EBB5F6579FEA1727D1491D17 /* GPXRoute.swift in Sources */ = {isa = PBXBuildFile; fileRef = A18823A942ACEEFADA55B166DBF1288F /* GPXRoute.swift */; }; - 4E1D4C2C72405D0BBBB9E3D04A500A9E /* IASKSettingsReader.m in Sources */ = {isa = PBXBuildFile; fileRef = 72E52A6BAD42EA2F296B8B4CD7A7651C /* IASKSettingsReader.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 520289DBD833A3AB3DEEE04E572A1D24 /* CoreGPX-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 08E320DA89BBC5218593653295B68983 /* CoreGPX-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 53929C3F82B34E7C1E2BD8936A8F44F1 /* UIMultiPicker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 6A65E09C9D431850D4F2CD9D7E30CC83 /* UIMultiPicker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 5621DF660AEDD509DC64D8955479D41A /* IASKPSTextFieldSpecifierViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 127F0A1120E6B2F2E9F91C060C72F88B /* IASKPSTextFieldSpecifierViewCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5739225BB71AFF17386BEED4A5D28F35 /* IASKAppSettingsWebViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 7C8AB362D90D1AA349F91F369CFD56DF /* IASKAppSettingsWebViewController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 575B1EC64934071D8BAC834BE27618D0 /* GPXMetadata.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3F514549F377EC9D073BA0916C6F058D /* GPXMetadata.swift */; }; - 5872F61E0724861D828493E10C358359 /* ChromaColorPicker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8EDA4F9200016EFFF6C1875ACCBBFA84 /* ChromaColorPicker-dummy.m */; }; - 58D2AACD7853E45DD1BF8A7B31FD5730 /* ChromaColorHandle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6BD6AEE50BFAD04D330074E42D0011D1 /* ChromaColorHandle.swift */; }; - 5A4F378854ED42A4067BEEEBED4E0628 /* IASKAppSettingsViewController.m in Sources */ = {isa = PBXBuildFile; fileRef = 5D927066B7746CAF4C4391B4498A5D46 /* IASKAppSettingsViewController.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 5D16591C8AD64C459DF2E59809608726 /* ColorWheelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 76B6A77FCEF15DB7D093039B8969C660 /* ColorWheelView.swift */; }; - 5EE28FCB029438E6DCAEE83170EF60CC /* nl.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BDB2A88F95FFA2B71F6333A81278D76F /* nl.lproj */; }; - 5FF91E4A8D3170E2F65631AF78FD04DA /* Menu.swift in Sources */ = {isa = PBXBuildFile; fileRef = 79550D1557C924468B9C90AD0B3A3FBB /* Menu.swift */; }; - 61D0B90CAEA50899D92AB7E9296BC50B /* hu.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 24E7D6CB740A33E53D8DB88B81A8C3FF /* hu.lproj */; }; - 627FE1872CBB7C9354A281B05B466CEA /* ChromaColorPicker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EC0855EFD454BAAD7349B04D0B3969A /* ChromaColorPicker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 630F88C020E3036DB35AEA01A3718B06 /* IASKSettingsStoreInMemory.h in Headers */ = {isa = PBXBuildFile; fileRef = 29334BE03F4FE5A932BB6346B61E67A3 /* IASKSettingsStoreInMemory.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 653C67A340D97823E77A46BBFF834E0D /* ChromaBrightnessSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 369BE74C06F714C4F9BF755E6C92370D /* ChromaBrightnessSlider.swift */; }; - 6563BD0971EEF92E7E65203A20DABB2A /* IASKEmbeddedDatePickerViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = BE0194FA8C2FA5B3A6CFA12CAC882D98 /* IASKEmbeddedDatePickerViewCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 67040EA15B49C03FDAD58F27A8BEBB37 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 772245828F0E506C859B7A962DC70C92 /* Foundation.framework */; }; - 67E9C6444041F88BB19DC538C1CF4595 /* Shapes.swift in Sources */ = {isa = PBXBuildFile; fileRef = 5424C1E08824A30531B54B41AF6D3C5A /* Shapes.swift */; }; - 67EBECDF77394D67F9C46CF47F36725E /* Modifiers.swift in Sources */ = {isa = PBXBuildFile; fileRef = 342A759E0C6E5B0C3AFC4E108D7D326C /* Modifiers.swift */; }; - 69107640C83E1AC77221A661CF4004F1 /* ChromaControlStylable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3AF688645B6E7825293E93AB87EBD0F4 /* ChromaControlStylable.swift */; }; - 6ADD5D4FA0D791F419447FA08EB7D206 /* GPXCompression.swift in Sources */ = {isa = PBXBuildFile; fileRef = D3B57CFF32F5E22295A7FF507EBDF96C /* GPXCompression.swift */; }; - 6AECA00FCF45C4B7C8ACB0EF189B9419 /* Popover+Lifecycle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9226922D3292D9FF245F106D72F37356 /* Popover+Lifecycle.swift */; }; - 6BF555F86AEE3607F005E37E05851675 /* Alert.swift in Sources */ = {isa = PBXBuildFile; fileRef = ED5C1CDFF124E795ABB8FD9B7A8B58DC /* Alert.swift */; }; - 6BF9D577654629D4F82F327DED51D33B /* Popover+Positioning.swift in Sources */ = {isa = PBXBuildFile; fileRef = 66FADCA4FF87D0FC1F95FA8691245271 /* Popover+Positioning.swift */; }; - 6D7FDE6B449BA699FA6CC4F627153C64 /* en.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F25BEF29EC58F408B0D37E1E374E3300 /* en.lproj */; }; - 6EAE5358A31A274AAC4D22D8CC378D5D /* Blur.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2B165D1AEFDA2E29AF31713003F47828 /* Blur.swift */; }; - 7233C7649C6E2DF3EA53F7A97570B4BF /* fr.lproj in Resources */ = {isa = PBXBuildFile; fileRef = F475D83A488B11ADD8A3649FC6D67344 /* fr.lproj */; }; - 78D8D33DB5E7DEE4D8E16E45F49012F1 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 772245828F0E506C859B7A962DC70C92 /* Foundation.framework */; }; - 792FB4D78BDBE1495508A9C35CED6ADB /* GPXBounds.swift in Sources */ = {isa = PBXBuildFile; fileRef = C3CE3A212AE982F14D013ADF91FED284 /* GPXBounds.swift */; }; - 79F53FC5428CB171F848C06C37917054 /* IASKSettingsStore.m in Sources */ = {isa = PBXBuildFile; fileRef = 5E5E0032B48981548FF527EA8B359D25 /* IASKSettingsStore.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 7C67EF2EC8FF95EFE216890F41D357F7 /* IASKSpecifier.h in Headers */ = {isa = PBXBuildFile; fileRef = 44EB6190CCBAA81C78A4804B45BA50A9 /* IASKSpecifier.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7CC968B41F8A4F27993B2A317B2594FB /* IASKAppSettingsViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = CB9BCF037D92EA48AB125DDECD4B9CD4 /* IASKAppSettingsViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 7CEBD193D0FB3E2042A936E1B4369313 /* IASKDatePickerViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 554A8CEDB54DCB35B1DDB114918CB58A /* IASKDatePickerViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 8561A7139E2AAFBDCA9A26ABA45796B2 /* Converters.swift in Sources */ = {isa = PBXBuildFile; fileRef = BC1F75EEADEBE964BC15E0FEEA8AC6E2 /* Converters.swift */; }; - 86BEB8439E47AD82EDB5E2F6AE4B0EDD /* GPXRawElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9D8D03180118E6B5D6C3D4E996D4FAA1 /* GPXRawElement.swift */; }; - 88A8B381273D76D3EA808663A34017E3 /* GPXElement.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7FF89A89B679AE4F6A3380F81F2EE264 /* GPXElement.swift */; }; - 895D9E26698DACC02216ED4C6666C18B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 772245828F0E506C859B7A962DC70C92 /* Foundation.framework */; }; - 8BE6DA431B8C64475F3DE20D563B6671 /* IASKSettingsStoreFile.m in Sources */ = {isa = PBXBuildFile; fileRef = 2F023D1FBA51D06D6507058336762EE0 /* IASKSettingsStoreFile.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 8BEEE65591B0DF2D6B52E2BD628E8407 /* Popovers-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 01C350E8CA3131ACFB167E4038739A82 /* Popovers-dummy.m */; }; - 90A48FA25FE82EAE6FC4B1F85F30DE4D /* GPXCopyright.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50B9873A49C26871B38809BD62AA32C2 /* GPXCopyright.swift */; }; - 9135AEF6D68531937F90B32B136A0A33 /* pt-PT.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B9E7C4B9C7CE9AEF9697D9B64A88B610 /* pt-PT.lproj */; }; - 928845D9C73A9B7CD079198BCD8262DF /* GPXError.swift in Sources */ = {isa = PBXBuildFile; fileRef = CC18B0D279844740F7F65314158B64D1 /* GPXError.swift */; }; - 93B0FA516E3B50D26E317F7830DDE5E8 /* IASKTextViewCell.h in Headers */ = {isa = PBXBuildFile; fileRef = 0DADCA7619D3859856AA978AC1185DE4 /* IASKTextViewCell.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 93C0E4CCF4F7E80E467BEA0FDEEDF86F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 772245828F0E506C859B7A962DC70C92 /* Foundation.framework */; }; - 93C1D4AA67E4D19FDEE1D34649CF6929 /* SliderTrackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A36B01EF1C0C223AD6E8418EF59D729E /* SliderTrackView.swift */; }; - 94AC918CF449E8BB5B1DF83963D2EE1C /* GPXTrackSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4B0FDAC7A3CC3F85A7F571A768FE58FF /* GPXTrackSegment.swift */; }; - 992F30DEAF79C7AFA46D79BD795C0E85 /* Pods-WunderLINQ-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 62C8E513795A3691B5AE49498FCBEEE8 /* Pods-WunderLINQ-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - 9DBA33AFE13F00E6A9CF34D0EBD0F197 /* IASKDatePicker.m in Sources */ = {isa = PBXBuildFile; fileRef = CF27D8613FF35E1D0B0CA527FFDFC936 /* IASKDatePicker.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - 9F0164977868A7659754D91695F705D8 /* GPXPointSegment.swift in Sources */ = {isa = PBXBuildFile; fileRef = 6231EB39320135AFC339A5E66B3C0D2C /* GPXPointSegment.swift */; }; - A09E15A046C0A82F3F0C26A715E986A2 /* PopoverWindows.swift in Sources */ = {isa = PBXBuildFile; fileRef = A862D55B078793F29D1FB58B868B1589 /* PopoverWindows.swift */; }; - A291D43EF0F82A02D3BAD350DBF92FED /* IASKSettingsReader.h in Headers */ = {isa = PBXBuildFile; fileRef = 8834F8A27DC7D4C31239C37BC6D08C88 /* IASKSettingsReader.h */; settings = {ATTRIBUTES = (Public, ); }; }; - A325289F545C0EBF0D025CFA1D2DDB84 /* GPXRouteProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = CE5B831EAA1F9DD416AD0A6E468B58F4 /* GPXRouteProtocol.swift */; }; - AC5D57BB9401D3258B8E44CC58C70F52 /* IASKMultipleValueSelection.h in Headers */ = {isa = PBXBuildFile; fileRef = 8AC9F1BF987833C9AB831B7904FC6291 /* IASKMultipleValueSelection.h */; settings = {ATTRIBUTES = (Public, ); }; }; - ADAB9AE375E5E8AC3BC3A49B0A8B7BF0 /* IASKTextViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 2A3212ECAF85B2C55493B54F1A5FD1B4 /* IASKTextViewCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - ADB368EA86941343CBBED3B375CE38E4 /* PopoverModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3D6B78165E5CB8B2253A1708943BE80D /* PopoverModel.swift */; }; - B2A5E6347E2249084A485CD2599C366D /* IASKDatePickerViewCell.m in Sources */ = {isa = PBXBuildFile; fileRef = 857F979CC90DA1188FB0F31282DE580B /* IASKDatePickerViewCell.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - B547CDD41E1B01C29886B887FC38E4B4 /* zh-Hant.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7253BCE39F0D801968BFCA21E0A5A969 /* zh-Hant.lproj */; }; - BA4690E39D8078F3B865A3728BE1D1BB /* IASKTextView.h in Headers */ = {isa = PBXBuildFile; fileRef = AFB935C7A57E8497C024C9DACD9157BA /* IASKTextView.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BAD4C85464D4E640D6FFBCE04E7D7126 /* IASKSpecifierValuesViewController.h in Headers */ = {isa = PBXBuildFile; fileRef = D3F08FFBBFB822FD4C8AC62CC0448502 /* IASKSpecifierValuesViewController.h */; settings = {ATTRIBUTES = (Public, ); }; }; - BF89DD38649E18456157DF8173FE4A47 /* IASKSpecifier.m in Sources */ = {isa = PBXBuildFile; fileRef = 671B8F029126C219F70C79F2D1F23265 /* IASKSpecifier.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - BFC45B8A130718FC2E15F7C2A1C051E1 /* UIKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = C4FE240B361E9690F32BB2A46A68AF89 /* UIKit.framework */; }; - C0578FACECCB7A8A5D6998C47584EFEE /* IASKSwitch.m in Sources */ = {isa = PBXBuildFile; fileRef = AD7561B2F8F0A598FE4E0E350D4AD564 /* IASKSwitch.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - C4C6848DF2564757FCEDB7695D03D9E0 /* Menu+Model.swift in Sources */ = {isa = PBXBuildFile; fileRef = FE23B05E95F1F4D0D7D04F7FAA518DE0 /* Menu+Model.swift */; }; - C507F238396AEBF9C8C6A85ADF0419C6 /* el.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 22116EF531ECC23304F95D38AAA5082C /* el.lproj */; }; - C83BF7F193EE0C02AA93721511E470E4 /* Templates.swift in Sources */ = {isa = PBXBuildFile; fileRef = 95B9CC5699C28B4BCAC7EA27A9C28030 /* Templates.swift */; }; - CB6B0AD88496E6436BC8D22B494F751D /* CoreGPX-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 8C8D9FE64941611D7FD8CDF568CAF385 /* CoreGPX-dummy.m */; }; - CCC2FE67693B8E9C2F9238FB9ADE2839 /* de.lproj in Resources */ = {isa = PBXBuildFile; fileRef = A5CEB98FF20F16F5704BF16C6BC05CD5 /* de.lproj */; }; - CD59FD960D2E59A22B1607CC6B853EC4 /* es-MX.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 87C9FAA10E29C2355D18D13EC6D8342D /* es-MX.lproj */; }; - D0CCE7D12EEDB8A903DE3F8A0685993E /* es-419.lproj in Resources */ = {isa = PBXBuildFile; fileRef = BC96E5046A8E65619F6A3ECA2993705A /* es-419.lproj */; }; - D16985F1540BC8F62B3F8827D6A7B429 /* PopoverGestureContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = A020610EEC043BA02BF9994E6BF9BCC5 /* PopoverGestureContainer.swift */; }; - D1A8A5DFE5D4DB1AEC0A8306FA6B463B /* GPXWaypoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = 2FD8489546BBEA615B0F7E83C13394D2 /* GPXWaypoint.swift */; }; - D31E18C9CD11F54D54CA99E855044110 /* IASKSettingsStoreInMemory.m in Sources */ = {isa = PBXBuildFile; fileRef = AFA441C1FBBFE33119C690426F83EEC4 /* IASKSettingsStoreInMemory.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - D4E0EEC7C7784C8D8B84B87158351A3A /* SliderHandleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = D8267EBA9E066B0A346AA7759CAF9DAA /* SliderHandleView.swift */; }; - D6CAAC8130A312DA26B8DDBA431A64FB /* GPXRoot.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8DF5F69CFE8A70A0FB0E2F6BABE8EAE7 /* GPXRoot.swift */; }; - DB920FF3D8837B48879FAF4D45B5CF05 /* PopoverUtilities.swift in Sources */ = {isa = PBXBuildFile; fileRef = 7F19586280E9E0123961318EA3F48CB7 /* PopoverUtilities.swift */; }; - DBD8F0B618E96A7533D29595E5CD1AF7 /* IASKTextField.h in Headers */ = {isa = PBXBuildFile; fileRef = 7EF63C3E15F57AA715B99A8749EFD4EB /* IASKTextField.h */; settings = {ATTRIBUTES = (Public, ); }; }; - E54C583C4DBFD52F831BD22B4F3FCF06 /* Shadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 4E97F8CC6AAD46EF1F6804D508E6FB8E /* Shadow.swift */; }; - E62FF4C45D4885E0DBC36CEE65CC62B6 /* GPXWaypointProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = 50E5F9699A48661BF8904884C3873CA1 /* GPXWaypointProtocol.swift */; }; - E76FB2CAF2C220732A888E33D02427B6 /* IASKMultipleValueSelection.m in Sources */ = {isa = PBXBuildFile; fileRef = BC5DFEF8856A764E8414C854BE3C2EFF /* IASKMultipleValueSelection.m */; settings = {COMPILER_FLAGS = "-w -Xanalyzer -analyzer-disable-all-checks"; }; }; - E995530C7E72C4CFBE5EC792E8065DBB /* th.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 17B4B9222F6184682F26A4D8DDA123A3 /* th.lproj */; }; - EAF96204B65771082CC3C995EEA68E5D /* GPXFix.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3E3B75E6D74BEAD46E02934590F0C749 /* GPXFix.swift */; }; - EC905717C74F5130D14644F1365C1987 /* InAppSettingsKit-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 72D8E3627FF394675C765B93C034770C /* InAppSettingsKit-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - EEAF24F7298917EB78BB21BC172FBAFF /* it.lproj in Resources */ = {isa = PBXBuildFile; fileRef = B758BF93FB6C428F0DA64DBDA965E672 /* it.lproj */; }; - EEB758733F4F9AEE9EFDCD60F0EBA4A1 /* Base.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7F56A94B2F420C5731D2FBFCABB63CA3 /* Base.lproj */; }; - F294150179A23470E49CB8068D02EB61 /* nb.lproj in Resources */ = {isa = PBXBuildFile; fileRef = D21EB7CEE26D49C7CC50A6319FAD747D /* nb.lproj */; }; - F39AD9C98EC2071DEF2BDE3076B1FDF1 /* InAppSettingsKit-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 87D337E6A35D934BE179793B960AD9A7 /* InAppSettingsKit-dummy.m */; }; - F4173BC1CF9DC186AF4A2C7738FE5D84 /* Popovers-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = FB8BBACA438E91BE7C5DFFE5482FE08A /* Popovers-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F42DD8C8044872ED99F5E516FC760C49 /* PopoverContainerView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 706FB67021BCA362C1FEC6B989F4FCB9 /* PopoverContainerView.swift */; }; - F572BC287F38A47223F91B115552F7AB /* UIView+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 34F408EF00A982BBEAD6D39ED4456D1F /* UIView+Utils.swift */; }; - F612401B4C88DAF8001512DF0EB81AD8 /* GPXTrackPoint.swift in Sources */ = {isa = PBXBuildFile; fileRef = F56500B6ED58B105D77E4A5164EA9B07 /* GPXTrackPoint.swift */; }; - F7541D1FF54BE3EC531D616C4DF9DBF4 /* IASKSettingsStoreFile.h in Headers */ = {isa = PBXBuildFile; fileRef = 8732372CDF401D995550F44116B37DF8 /* IASKSettingsStoreFile.h */; settings = {ATTRIBUTES = (Public, ); }; }; - F8609487A0A9D64C41187F5F9717017A /* UIMultiPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = A060379F483CC032BCF6768C3DE9BABE /* UIMultiPicker.swift */; }; - FBF8A6DE59EAFB6BC4FEF1D9C082B064 /* es.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 7313BB817CE730F38909542390E29F46 /* es.lproj */; }; - FD3028C3BC747B9F19DE494F500C2A14 /* uk.lproj in Resources */ = {isa = PBXBuildFile; fileRef = 33CADAC0595D3E3E180503216417B1D8 /* uk.lproj */; }; - FF3D4B4390CD54DBE022DBBA3C76F5EC /* InAppSettingsKit-InAppSettingsKit in Resources */ = {isa = PBXBuildFile; fileRef = 325E862631E06444E4504511C87F1E9C /* InAppSettingsKit-InAppSettingsKit */; }; + 0008539C25EFD58AC105AAAC93E580C4 /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 0950749F633B46F3D9F25195C17CF3D5 /* UIColor+Brightness.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8FDC518D568431747738B2C58B9C4793 /* UIColor+Brightness.swift */; }; + 229E45FBD72B98A80A48E8138E9DCA2D /* UIColor+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3393DA658F5F6951233865E01E3DF790 /* UIColor+Utils.swift */; }; + 32E561A15C312235BA64C938AE92E1EF /* UIView+DropShadow.swift in Sources */ = {isa = PBXBuildFile; fileRef = 536396054714F6F6A7FF50AC11A33B07 /* UIView+DropShadow.swift */; }; + 3AC4258902263D76CDA96BDAA08A881D /* ChromaColorPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 3204C755521D99C795F46979F5F556E8 /* ChromaColorPicker.swift */; }; + 3BD53ACFDDBF3CE01053AB350F534ED1 /* UIMultiPicker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 4CDAB1D485973DB4E0DB632C5D52D862 /* UIMultiPicker-dummy.m */; }; + 53929C3F82B34E7C1E2BD8936A8F44F1 /* UIMultiPicker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 8022C6843E27E28D4190730D07BB4D44 /* UIMultiPicker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 5872F61E0724861D828493E10C358359 /* ChromaColorPicker-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 33390DC97F6731D31AA8D8FD849FB42A /* ChromaColorPicker-dummy.m */; }; + 58D2AACD7853E45DD1BF8A7B31FD5730 /* ChromaColorHandle.swift in Sources */ = {isa = PBXBuildFile; fileRef = A7C95F8EA119E56B385C255D855F1032 /* ChromaColorHandle.swift */; }; + 5D16591C8AD64C459DF2E59809608726 /* ColorWheelView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 9617C8EE0B0539F8622B6CACD60626A7 /* ColorWheelView.swift */; }; + 627FE1872CBB7C9354A281B05B466CEA /* ChromaColorPicker-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 5DFAA31A6985B0853DA37218E66C9385 /* ChromaColorPicker-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + 653C67A340D97823E77A46BBFF834E0D /* ChromaBrightnessSlider.swift in Sources */ = {isa = PBXBuildFile; fileRef = 25D3FC818162AE0E98785F6F1D495A8F /* ChromaBrightnessSlider.swift */; }; + 69107640C83E1AC77221A661CF4004F1 /* ChromaControlStylable.swift in Sources */ = {isa = PBXBuildFile; fileRef = 678B5E0F8687D774D7160503E4460FA9 /* ChromaControlStylable.swift */; }; + 895D9E26698DACC02216ED4C6666C18B /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 93C0E4CCF4F7E80E467BEA0FDEEDF86F /* Foundation.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */; }; + 93C1D4AA67E4D19FDEE1D34649CF6929 /* SliderTrackView.swift in Sources */ = {isa = PBXBuildFile; fileRef = A25C29ED86341A5FD068CBD97F93098A /* SliderTrackView.swift */; }; + A0FC5DB302A508F2C0CFDAE6D3F2DE30 /* Pods-WunderLINQ-umbrella.h in Headers */ = {isa = PBXBuildFile; fileRef = 62C8E513795A3691B5AE49498FCBEEE8 /* Pods-WunderLINQ-umbrella.h */; settings = {ATTRIBUTES = (Public, ); }; }; + C168B53A5280CEEA2BFD680395CAF412 /* Pods-WunderLINQ-dummy.m in Sources */ = {isa = PBXBuildFile; fileRef = 427E56F4CF2E99993434B5ACC466869E /* Pods-WunderLINQ-dummy.m */; }; + D4E0EEC7C7784C8D8B84B87158351A3A /* SliderHandleView.swift in Sources */ = {isa = PBXBuildFile; fileRef = 1CB430EB7BE11EB3597DABC6F5795FD8 /* SliderHandleView.swift */; }; + F572BC287F38A47223F91B115552F7AB /* UIView+Utils.swift in Sources */ = {isa = PBXBuildFile; fileRef = AB2ECADBC99A1B748D78FE21EBE6FE2F /* UIView+Utils.swift */; }; + F8609487A0A9D64C41187F5F9717017A /* UIMultiPicker.swift in Sources */ = {isa = PBXBuildFile; fileRef = 8D5D32941653DAAACAA32CDE8E4B33A4 /* UIMultiPicker.swift */; }; /* End PBXBuildFile section */ /* Begin PBXContainerItemProxy section */ - 01F3243B03172433218CD4816A948E64 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = B748EFCD9F50067EF7DF853242BB3AB4; - remoteInfo = Popovers; - }; - 08DEF155CE2899EB26D278596637B278 /* PBXContainerItemProxy */ = { + 2EEED5753A544CE49F679D5829D2A427 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = 7961A0F04FB3D96E3E703CF075D6DACD; remoteInfo = ChromaColorPicker; }; - 5D16117131584B5A6834F1AC48AA70E7 /* PBXContainerItemProxy */ = { + CF8055952F124364B3A54719D6BCCFF1 /* PBXContainerItemProxy */ = { isa = PBXContainerItemProxy; containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; proxyType = 1; remoteGlobalIDString = C29B8E66676DEE2FC332C8BE854A34BA; remoteInfo = UIMultiPicker; }; - 9819C0410A052C1C44754F4F1EB6500A /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 8A996938DFC560C0A3EF0DD6CA6B032A; - remoteInfo = "InAppSettingsKit-InAppSettingsKit"; - }; - 9AD2A6337D9716FE9868C65590B49233 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 5B4848122435F4C22D574A5DA6D2EFB3; - remoteInfo = InAppSettingsKit; - }; - B5F394FFA07FE735856CEF5743E8D7D3 /* PBXContainerItemProxy */ = { - isa = PBXContainerItemProxy; - containerPortal = BFDFE7DC352907FC980B868725387E98 /* Project object */; - proxyType = 1; - remoteGlobalIDString = 493735E92C5B6068F445B48D0CA7B736; - remoteInfo = CoreGPX; - }; /* End PBXContainerItemProxy section */ /* Begin PBXFileReference section */ - 01C350E8CA3131ACFB167E4038739A82 /* Popovers-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Popovers-dummy.m"; sourceTree = ""; }; - 04A0CBFF7FC8DA5D16E4F985A87A8B30 /* CoreGPX.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = CoreGPX.modulemap; sourceTree = ""; }; - 08E320DA89BBC5218593653295B68983 /* CoreGPX-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-umbrella.h"; sourceTree = ""; }; - 0C38AA75E6239EAB538F139CF9C7FD1B /* UIMultiPicker-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIMultiPicker-prefix.pch"; sourceTree = ""; }; - 0DA51D2D1B0A398AD4A0D82C274B67AE /* Popovers.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Popovers.release.xcconfig; sourceTree = ""; }; - 0DADCA7619D3859856AA978AC1185DE4 /* IASKTextViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKTextViewCell.h; path = Sources/InAppSettingsKit/include/IASKTextViewCell.h; sourceTree = ""; }; - 0F50699DE1B119E1DB9AC8D3712A7AB5 /* IASKPSSliderSpecifierViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKPSSliderSpecifierViewCell.h; path = Sources/InAppSettingsKit/include/IASKPSSliderSpecifierViewCell.h; sourceTree = ""; }; - 127F0A1120E6B2F2E9F91C060C72F88B /* IASKPSTextFieldSpecifierViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKPSTextFieldSpecifierViewCell.m; path = Sources/InAppSettingsKit/Views/IASKPSTextFieldSpecifierViewCell.m; sourceTree = ""; }; + 0C38FBC9FAC8D20324DD7C475E0226BF /* ChromaColorPicker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ChromaColorPicker.release.xcconfig; sourceTree = ""; }; 155774EF7639BBFA9D7197EB5222CBF9 /* Pods-WunderLINQ-frameworks.sh */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.script.sh; path = "Pods-WunderLINQ-frameworks.sh"; sourceTree = ""; }; - 17B4B9222F6184682F26A4D8DDA123A3 /* th.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = th.lproj; path = Sources/InAppSettingsKit/Resources/th.lproj; sourceTree = ""; }; - 19D355B137AADBEAE940E34A09FBDD01 /* Popovers */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = Popovers; path = Popovers.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 1B43B8984DCE6143EF2B1A45ACDD6F1A /* IASKSpecifierValuesViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSpecifierValuesViewController.m; path = Sources/InAppSettingsKit/Controllers/IASKSpecifierValuesViewController.m; sourceTree = ""; }; - 1D694988C563BD6415F49C6F25B956F3 /* IASKAppSettingsWebViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKAppSettingsWebViewController.h; path = Sources/InAppSettingsKit/include/IASKAppSettingsWebViewController.h; sourceTree = ""; }; - 22116EF531ECC23304F95D38AAA5082C /* el.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = el.lproj; path = Sources/InAppSettingsKit/Resources/el.lproj; sourceTree = ""; }; - 2376F284B91CF011CBE35265BECDC135 /* ChromaColorPicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ChromaColorPicker-Info.plist"; sourceTree = ""; }; - 24E7D6CB740A33E53D8DB88B81A8C3FF /* hu.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hu.lproj; path = Sources/InAppSettingsKit/Resources/hu.lproj; sourceTree = ""; }; - 29334BE03F4FE5A932BB6346B61E67A3 /* IASKSettingsStoreInMemory.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSettingsStoreInMemory.h; path = Sources/InAppSettingsKit/include/IASKSettingsStoreInMemory.h; sourceTree = ""; }; - 29949D7E3D4E9BB17897940E6FB77B99 /* GPXRoutePoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoutePoint.swift; path = Classes/GPXRoutePoint.swift; sourceTree = ""; }; - 2A3212ECAF85B2C55493B54F1A5FD1B4 /* IASKTextViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKTextViewCell.m; path = Sources/InAppSettingsKit/Views/IASKTextViewCell.m; sourceTree = ""; }; - 2B165D1AEFDA2E29AF31713003F47828 /* Blur.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Blur.swift; path = Sources/Templates/Blur.swift; sourceTree = ""; }; + 1AD9198737C89F7533BC43B59DB121F2 /* UIMultiPicker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UIMultiPicker.release.xcconfig; sourceTree = ""; }; + 1CB430EB7BE11EB3597DABC6F5795FD8 /* SliderHandleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SliderHandleView.swift; path = "Source/Supporting Views/SliderHandleView.swift"; sourceTree = ""; }; + 25D3FC818162AE0E98785F6F1D495A8F /* ChromaBrightnessSlider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChromaBrightnessSlider.swift; path = Source/ChromaBrightnessSlider.swift; sourceTree = ""; }; 2BF9472E73161208EAA0E2625C652868 /* Pods-WunderLINQ-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WunderLINQ-Info.plist"; sourceTree = ""; }; - 2F023D1FBA51D06D6507058336762EE0 /* IASKSettingsStoreFile.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSettingsStoreFile.m; path = Sources/InAppSettingsKit/Models/IASKSettingsStoreFile.m; sourceTree = ""; }; - 2F6A23D99EEA13ADE4DDEDAE13331BA9 /* pl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pl.lproj; path = Sources/InAppSettingsKit/Resources/pl.lproj; sourceTree = ""; }; - 2FD8489546BBEA615B0F7E83C13394D2 /* GPXWaypoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXWaypoint.swift; path = Classes/GPXWaypoint.swift; sourceTree = ""; }; - 325E862631E06444E4504511C87F1E9C /* InAppSettingsKit-InAppSettingsKit */ = {isa = PBXFileReference; explicitFileType = wrapper.cfbundle; includeInIndex = 0; name = "InAppSettingsKit-InAppSettingsKit"; path = InAppSettingsKit.bundle; sourceTree = BUILT_PRODUCTS_DIR; }; - 32F930DD3AD647DB052AEB5A72A70A21 /* zh-Hans.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hans.lproj"; path = "Sources/InAppSettingsKit/Resources/zh-Hans.lproj"; sourceTree = ""; }; - 33CADAC0595D3E3E180503216417B1D8 /* uk.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = uk.lproj; path = Sources/InAppSettingsKit/Resources/uk.lproj; sourceTree = ""; }; - 342A759E0C6E5B0C3AFC4E108D7D326C /* Modifiers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Modifiers.swift; path = Sources/SwiftUI/Modifiers.swift; sourceTree = ""; }; - 34F408EF00A982BBEAD6D39ED4456D1F /* UIView+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Utils.swift"; path = "Source/Extensions/UIView+Utils.swift"; sourceTree = ""; }; - 35CBD7116D03B8AE542F27C25BACD5EA /* sv.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = sv.lproj; path = Sources/InAppSettingsKit/Resources/sv.lproj; sourceTree = ""; }; - 369BE74C06F714C4F9BF755E6C92370D /* ChromaBrightnessSlider.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChromaBrightnessSlider.swift; path = Source/ChromaBrightnessSlider.swift; sourceTree = ""; }; - 37859CBAA0D195FCBA44DD33372A0499 /* InAppSettingsKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "InAppSettingsKit-Info.plist"; sourceTree = ""; }; - 38E27C2E9C2A4690A9EE76106F3796AB /* Extensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Extensions.swift; path = Sources/Templates/Extensions.swift; sourceTree = ""; }; - 3AF688645B6E7825293E93AB87EBD0F4 /* ChromaControlStylable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChromaControlStylable.swift; path = Source/ChromaControlStylable.swift; sourceTree = ""; }; - 3C4A90D9845344327FA4AC9D30B74E3C /* IASKViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKViewController.h; path = Sources/InAppSettingsKit/include/IASKViewController.h; sourceTree = ""; }; - 3D6B78165E5CB8B2253A1708943BE80D /* PopoverModel.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopoverModel.swift; path = Sources/PopoverModel.swift; sourceTree = ""; }; - 3E3B75E6D74BEAD46E02934590F0C749 /* GPXFix.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXFix.swift; path = Classes/GPXFix.swift; sourceTree = ""; }; - 3F3B397EB6AAA89B542EABE8064FBC0C /* IASKSettingsStoreUserDefaults.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSettingsStoreUserDefaults.h; path = Sources/InAppSettingsKit/include/IASKSettingsStoreUserDefaults.h; sourceTree = ""; }; - 3F514549F377EC9D073BA0916C6F058D /* GPXMetadata.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXMetadata.swift; path = Classes/GPXMetadata.swift; sourceTree = ""; }; - 41EC6D2EF2E593508B940414FDDA8B8A /* ChromaColorPicker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ChromaColorPicker.debug.xcconfig; sourceTree = ""; }; + 3204C755521D99C795F46979F5F556E8 /* ChromaColorPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChromaColorPicker.swift; path = Source/ChromaColorPicker.swift; sourceTree = ""; }; + 33390DC97F6731D31AA8D8FD849FB42A /* ChromaColorPicker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ChromaColorPicker-dummy.m"; sourceTree = ""; }; + 3393DA658F5F6951233865E01E3DF790 /* UIColor+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Utils.swift"; path = "Source/Extensions/UIColor+Utils.swift"; sourceTree = ""; }; 427E56F4CF2E99993434B5ACC466869E /* Pods-WunderLINQ-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "Pods-WunderLINQ-dummy.m"; sourceTree = ""; }; - 44EB6190CCBAA81C78A4804B45BA50A9 /* IASKSpecifier.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSpecifier.h; path = Sources/InAppSettingsKit/include/IASKSpecifier.h; sourceTree = ""; }; - 478F76D4194C8A256BCB9767F7A3FD9D /* IASKSlider.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSlider.h; path = Sources/InAppSettingsKit/include/IASKSlider.h; sourceTree = ""; }; - 485D56E268AC91872A1C6946FEC6875C /* Popover.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Popover.swift; path = Sources/Popover.swift; sourceTree = ""; }; - 4B0FDAC7A3CC3F85A7F571A768FE58FF /* GPXTrackSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackSegment.swift; path = Classes/GPXTrackSegment.swift; sourceTree = ""; }; - 4C46A2543B2867A2BA5D8C152AAE02F9 /* InAppSettingsKit-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "InAppSettingsKit-prefix.pch"; sourceTree = ""; }; - 4E822A6CF1CC6B6E92A9E69BA1DECF0E /* CoreGPX.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CoreGPX.debug.xcconfig; sourceTree = ""; }; - 4E97F8CC6AAD46EF1F6804D508E6FB8E /* Shadow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Shadow.swift; path = Sources/Templates/Shadow.swift; sourceTree = ""; }; - 4EFD7C39121B59549CB60EE4E3C6F665 /* IASKColor.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKColor.m; path = Sources/InAppSettingsKit/Views/IASKColor.m; sourceTree = ""; }; - 4F5D9B883A6F7FCA7924440714B341DD /* DateTimeParsers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = DateTimeParsers.swift; path = Classes/DateTimeParsers.swift; sourceTree = ""; }; - 4F6D9C516FE20DDA9F620456EFE93F0D /* GPXLink.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXLink.swift; path = Classes/GPXLink.swift; sourceTree = ""; }; - 50722313F76518974FF52CFA7636DB56 /* IASKColor.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKColor.h; path = Sources/InAppSettingsKit/include/IASKColor.h; sourceTree = ""; }; - 50B9873A49C26871B38809BD62AA32C2 /* GPXCopyright.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXCopyright.swift; path = Classes/GPXCopyright.swift; sourceTree = ""; }; - 50E5F9699A48661BF8904884C3873CA1 /* GPXWaypointProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXWaypointProtocol.swift; path = Classes/GPXWaypointProtocol.swift; sourceTree = ""; }; - 525D5DD844A76D8DE0279465A2831E29 /* GPXPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPoint.swift; path = Classes/GPXPoint.swift; sourceTree = ""; }; - 5424C1E08824A30531B54B41AF6D3C5A /* Shapes.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Shapes.swift; path = Sources/Templates/Shapes.swift; sourceTree = ""; }; - 554A8CEDB54DCB35B1DDB114918CB58A /* IASKDatePickerViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKDatePickerViewCell.h; path = Sources/InAppSettingsKit/include/IASKDatePickerViewCell.h; sourceTree = ""; }; - 59683CEDD075D091024D7D90EFAA5DCB /* Popovers.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = Popovers.modulemap; sourceTree = ""; }; - 59E80EAE43F58D4673A9E293CA5E5424 /* IASKDatePicker.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKDatePicker.h; path = Sources/InAppSettingsKit/include/IASKDatePicker.h; sourceTree = ""; }; - 5D927066B7746CAF4C4391B4498A5D46 /* IASKAppSettingsViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKAppSettingsViewController.m; path = Sources/InAppSettingsKit/Controllers/IASKAppSettingsViewController.m; sourceTree = ""; }; - 5DA0B088435D68A26FB61DC02282A6DF /* GPXLegacy.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXLegacy.swift; path = Classes/GPXLegacy.swift; sourceTree = ""; }; - 5E11E864E5DCDE1D17E099FC608DC0E2 /* ChromaColorPicker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ChromaColorPicker.modulemap; sourceTree = ""; }; + 42EBB9161EE83F317C04E488F24209B3 /* UIMultiPicker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UIMultiPicker.debug.xcconfig; sourceTree = ""; }; + 4CDAB1D485973DB4E0DB632C5D52D862 /* UIMultiPicker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIMultiPicker-dummy.m"; sourceTree = ""; }; + 536396054714F6F6A7FF50AC11A33B07 /* UIView+DropShadow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+DropShadow.swift"; path = "Source/Extensions/UIView+DropShadow.swift"; sourceTree = ""; }; + 55FCE4CF6B384F2446B51813263DFF78 /* ChromaColorPicker-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChromaColorPicker-prefix.pch"; sourceTree = ""; }; + 5DFAA31A6985B0853DA37218E66C9385 /* ChromaColorPicker-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChromaColorPicker-umbrella.h"; sourceTree = ""; }; 5E5281A942FF40E675BE29998F8B29C4 /* Pods-WunderLINQ-acknowledgements.markdown */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text; path = "Pods-WunderLINQ-acknowledgements.markdown"; sourceTree = ""; }; - 5E5E0032B48981548FF527EA8B359D25 /* IASKSettingsStore.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSettingsStore.m; path = Sources/InAppSettingsKit/Models/IASKSettingsStore.m; sourceTree = ""; }; - 5FABA709DD703C10F157E8D6AB82F098 /* Readers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Readers.swift; path = Sources/SwiftUI/Readers.swift; sourceTree = ""; }; - 6231EB39320135AFC339A5E66B3C0D2C /* GPXPointSegment.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPointSegment.swift; path = Classes/GPXPointSegment.swift; sourceTree = ""; }; 62C8E513795A3691B5AE49498FCBEEE8 /* Pods-WunderLINQ-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Pods-WunderLINQ-umbrella.h"; sourceTree = ""; }; - 63E56DD2B2B97D058C78DE06BAB06EE5 /* ChromaColorPicker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ChromaColorPicker.release.xcconfig; sourceTree = ""; }; - 64275AF3168E886A9F16DBA2344120AA /* GPXPerson.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXPerson.swift; path = Classes/GPXPerson.swift; sourceTree = ""; }; - 66426BBDAD31BF562CC8D848080A7E19 /* IASKSlider.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSlider.m; path = Sources/InAppSettingsKit/Views/IASKSlider.m; sourceTree = ""; }; - 66FADCA4FF87D0FC1F95FA8691245271 /* Popover+Positioning.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Popover+Positioning.swift"; path = "Sources/Popover+Positioning.swift"; sourceTree = ""; }; - 671B8F029126C219F70C79F2D1F23265 /* IASKSpecifier.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSpecifier.m; path = Sources/InAppSettingsKit/Models/IASKSpecifier.m; sourceTree = ""; }; - 68676CD591957EA4525B4B03D1CF22AD /* CoreGPX */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = CoreGPX; path = CoreGPX.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 6983A1C4A3687F478D6DB2F98A1CB243 /* Menu+UIKit.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Menu+UIKit.swift"; path = "Sources/Templates/Menu+UIKit.swift"; sourceTree = ""; }; - 6A26569688F3731CBAF1730B2CF91D26 /* CoreGPX-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "CoreGPX-prefix.pch"; sourceTree = ""; }; - 6A65E09C9D431850D4F2CD9D7E30CC83 /* UIMultiPicker-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIMultiPicker-umbrella.h"; sourceTree = ""; }; - 6A6D9046921C4A3A61AEF7744FA9AFB1 /* Popovers-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Popovers-prefix.pch"; sourceTree = ""; }; - 6BD6AEE50BFAD04D330074E42D0011D1 /* ChromaColorHandle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChromaColorHandle.swift; path = "Source/Supporting Views/ChromaColorHandle.swift"; sourceTree = ""; }; - 6E0BC583838349978BFB03D649854625 /* IASKTextField.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKTextField.m; path = Sources/InAppSettingsKit/Views/IASKTextField.m; sourceTree = ""; }; - 706FB67021BCA362C1FEC6B989F4FCB9 /* PopoverContainerView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopoverContainerView.swift; path = Sources/PopoverContainerView.swift; sourceTree = ""; }; - 7253BCE39F0D801968BFCA21E0A5A969 /* zh-Hant.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "zh-Hant.lproj"; path = "Sources/InAppSettingsKit/Resources/zh-Hant.lproj"; sourceTree = ""; }; - 72D8E3627FF394675C765B93C034770C /* InAppSettingsKit-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "InAppSettingsKit-umbrella.h"; sourceTree = ""; }; - 72E52A6BAD42EA2F296B8B4CD7A7651C /* IASKSettingsReader.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSettingsReader.m; path = Sources/InAppSettingsKit/Models/IASKSettingsReader.m; sourceTree = ""; }; - 7313BB817CE730F38909542390E29F46 /* es.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = es.lproj; path = Sources/InAppSettingsKit/Resources/es.lproj; sourceTree = ""; }; - 73A2D70A20EDEACD402C364BF07EA1B7 /* CoreGPX.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = CoreGPX.release.xcconfig; sourceTree = ""; }; - 7466FC0C9CCD05C64C465F97AA9340F6 /* UIColor+Brightness.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Brightness.swift"; path = "Source/Extensions/UIColor+Brightness.swift"; sourceTree = ""; }; - 76B6A77FCEF15DB7D093039B8969C660 /* ColorWheelView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorWheelView.swift; path = Source/ColorWheelView.swift; sourceTree = ""; }; - 772245828F0E506C859B7A962DC70C92 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; - 783379E8DC45B73554D9BA0AD8AEE396 /* IASKSwitch.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSwitch.h; path = Sources/InAppSettingsKit/include/IASKSwitch.h; sourceTree = ""; }; - 79550D1557C924468B9C90AD0B3A3FBB /* Menu.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Menu.swift; path = Sources/Templates/Menu.swift; sourceTree = ""; }; - 7B271D344E28FA4ADF241F5F19C80E49 /* InAppSettingsKit.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = InAppSettingsKit.modulemap; sourceTree = ""; }; - 7C32B8D61E11050B1602EB5DF23AF3B3 /* UIMultiPicker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = UIMultiPicker.modulemap; sourceTree = ""; }; - 7C8AB362D90D1AA349F91F369CFD56DF /* IASKAppSettingsWebViewController.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKAppSettingsWebViewController.m; path = Sources/InAppSettingsKit/Controllers/IASKAppSettingsWebViewController.m; sourceTree = ""; }; - 7EC0855EFD454BAAD7349B04D0B3969A /* ChromaColorPicker-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChromaColorPicker-umbrella.h"; sourceTree = ""; }; - 7EF63C3E15F57AA715B99A8749EFD4EB /* IASKTextField.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKTextField.h; path = Sources/InAppSettingsKit/include/IASKTextField.h; sourceTree = ""; }; - 7F19586280E9E0123961318EA3F48CB7 /* PopoverUtilities.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopoverUtilities.swift; path = Sources/PopoverUtilities.swift; sourceTree = ""; }; - 7F56A94B2F420C5731D2FBFCABB63CA3 /* Base.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = Base.lproj; path = Sources/InAppSettingsKit/Resources/Base.lproj; sourceTree = ""; }; - 7FF89A89B679AE4F6A3380F81F2EE264 /* GPXElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXElement.swift; path = Classes/GPXElement.swift; sourceTree = ""; }; - 821D52C94F6E441F57B341789E74F3D6 /* InAppSettingsKit.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = InAppSettingsKit.debug.xcconfig; sourceTree = ""; }; - 85296CDD82535607181AEBABD327B4C1 /* Popovers.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Popovers.swift; path = Sources/Popovers.swift; sourceTree = ""; }; - 857F979CC90DA1188FB0F31282DE580B /* IASKDatePickerViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKDatePickerViewCell.m; path = Sources/InAppSettingsKit/Views/IASKDatePickerViewCell.m; sourceTree = ""; }; - 8732372CDF401D995550F44116B37DF8 /* IASKSettingsStoreFile.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSettingsStoreFile.h; path = Sources/InAppSettingsKit/include/IASKSettingsStoreFile.h; sourceTree = ""; }; - 87C9FAA10E29C2355D18D13EC6D8342D /* es-MX.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-MX.lproj"; path = "Sources/InAppSettingsKit/Resources/es-MX.lproj"; sourceTree = ""; }; - 87D337E6A35D934BE179793B960AD9A7 /* InAppSettingsKit-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "InAppSettingsKit-dummy.m"; sourceTree = ""; }; - 8834F8A27DC7D4C31239C37BC6D08C88 /* IASKSettingsReader.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSettingsReader.h; path = Sources/InAppSettingsKit/include/IASKSettingsReader.h; sourceTree = ""; }; - 88A4C9751888DE5C4052A9F62AFE95BE /* CoreGPX-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "CoreGPX-Info.plist"; sourceTree = ""; }; + 678B5E0F8687D774D7160503E4460FA9 /* ChromaControlStylable.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChromaControlStylable.swift; path = Source/ChromaControlStylable.swift; sourceTree = ""; }; + 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Foundation.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/Foundation.framework; sourceTree = DEVELOPER_DIR; }; + 8022C6843E27E28D4190730D07BB4D44 /* UIMultiPicker-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIMultiPicker-umbrella.h"; sourceTree = ""; }; 8958A4B9C310BCF9D82B158E2AFAAD3B /* UIMultiPicker */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = UIMultiPicker; path = UIMultiPicker.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - 89B1066183318DFD567322AEEB59002A /* hr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = hr.lproj; path = Sources/InAppSettingsKit/Resources/hr.lproj; sourceTree = ""; }; - 8AC9F1BF987833C9AB831B7904FC6291 /* IASKMultipleValueSelection.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKMultipleValueSelection.h; path = Sources/InAppSettingsKit/include/IASKMultipleValueSelection.h; sourceTree = ""; }; - 8C8D9FE64941611D7FD8CDF568CAF385 /* CoreGPX-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "CoreGPX-dummy.m"; sourceTree = ""; }; - 8DF5F69CFE8A70A0FB0E2F6BABE8EAE7 /* GPXRoot.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoot.swift; path = Classes/GPXRoot.swift; sourceTree = ""; }; - 8EDA4F9200016EFFF6C1875ACCBBFA84 /* ChromaColorPicker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "ChromaColorPicker-dummy.m"; sourceTree = ""; }; - 8EEAFBF0D4128BD0256FD28417844A99 /* ca.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ca.lproj; path = Sources/InAppSettingsKit/Resources/ca.lproj; sourceTree = ""; }; - 8FF81D5AEBFFA884B39F8DE845F1A70D /* InAppSettingsKit.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = InAppSettingsKit.release.xcconfig; sourceTree = ""; }; - 9175F19D5F027DA90EBB5C9567C4E20E /* UIView+DropShadow.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+DropShadow.swift"; path = "Source/Extensions/UIView+DropShadow.swift"; sourceTree = ""; }; - 91AB13988912CB7C386322FC6A1A46F3 /* IASKPSTextFieldSpecifierViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKPSTextFieldSpecifierViewCell.h; path = Sources/InAppSettingsKit/include/IASKPSTextFieldSpecifierViewCell.h; sourceTree = ""; }; - 9226922D3292D9FF245F106D72F37356 /* Popover+Lifecycle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Popover+Lifecycle.swift"; path = "Sources/Popover+Lifecycle.swift"; sourceTree = ""; }; - 95B9CC5699C28B4BCAC7EA27A9C28030 /* Templates.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Templates.swift; path = Sources/Templates/Templates.swift; sourceTree = ""; }; - 99EFA32A87122290EC3A8A77E6C2FEDA /* IASKPSSliderSpecifierViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKPSSliderSpecifierViewCell.m; path = Sources/InAppSettingsKit/Views/IASKPSSliderSpecifierViewCell.m; sourceTree = ""; }; - 9D8D03180118E6B5D6C3D4E996D4FAA1 /* GPXRawElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRawElement.swift; path = Classes/GPXRawElement.swift; sourceTree = ""; }; + 8C025BE8A39091774B12C165AAD11A00 /* ChromaColorPicker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = ChromaColorPicker.debug.xcconfig; sourceTree = ""; }; + 8D5D32941653DAAACAA32CDE8E4B33A4 /* UIMultiPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIMultiPicker.swift; path = Classes/UIMultiPicker.swift; sourceTree = ""; }; + 8FDC518D568431747738B2C58B9C4793 /* UIColor+Brightness.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Brightness.swift"; path = "Source/Extensions/UIColor+Brightness.swift"; sourceTree = ""; }; + 9617C8EE0B0539F8622B6CACD60626A7 /* ColorWheelView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ColorWheelView.swift; path = Source/ColorWheelView.swift; sourceTree = ""; }; + 985F9102CAC0C38B04CA8CC563E6DC61 /* UIMultiPicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "UIMultiPicker-Info.plist"; sourceTree = ""; }; + 9A707B661E6F828F346EFB23EC4922C7 /* UIMultiPicker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = UIMultiPicker.modulemap; sourceTree = ""; }; 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */ = {isa = PBXFileReference; explicitFileType = text.script.ruby; includeInIndex = 1; indentWidth = 2; lastKnownFileType = text; name = Podfile; path = ../Podfile; sourceTree = SOURCE_ROOT; tabWidth = 2; xcLanguageSpecificationIdentifier = xcode.lang.ruby; }; - A020610EEC043BA02BF9994E6BF9BCC5 /* PopoverGestureContainer.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopoverGestureContainer.swift; path = Sources/PopoverGestureContainer.swift; sourceTree = ""; }; - A060379F483CC032BCF6768C3DE9BABE /* UIMultiPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = UIMultiPicker.swift; path = Classes/UIMultiPicker.swift; sourceTree = ""; }; - A16D3531CF2D667284F3142E91576B14 /* UIColor+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIColor+Utils.swift"; path = "Source/Extensions/UIColor+Utils.swift"; sourceTree = ""; }; - A18823A942ACEEFADA55B166DBF1288F /* GPXRoute.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRoute.swift; path = Classes/GPXRoute.swift; sourceTree = ""; }; - A1E891EAEB7D2C3402C1B341103DBC7C /* UIMultiPicker-dummy.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; path = "UIMultiPicker-dummy.m"; sourceTree = ""; }; - A36B01EF1C0C223AD6E8418EF59D729E /* SliderTrackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SliderTrackView.swift; path = "Source/Supporting Views/SliderTrackView.swift"; sourceTree = ""; }; - A5CEB98FF20F16F5704BF16C6BC05CD5 /* de.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = de.lproj; path = Sources/InAppSettingsKit/Resources/de.lproj; sourceTree = ""; }; - A862D55B078793F29D1FB58B868B1589 /* PopoverWindows.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = PopoverWindows.swift; path = Sources/PopoverWindows.swift; sourceTree = ""; }; - A9B99BB2D82C411E7774E80361135D14 /* pt.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = pt.lproj; path = Sources/InAppSettingsKit/Resources/pt.lproj; sourceTree = ""; }; - ACC82CD87A0882A87953E6F05BD08C83 /* tr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = tr.lproj; path = Sources/InAppSettingsKit/Resources/tr.lproj; sourceTree = ""; }; - AD7561B2F8F0A598FE4E0E350D4AD564 /* IASKSwitch.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSwitch.m; path = Sources/InAppSettingsKit/Views/IASKSwitch.m; sourceTree = ""; }; - AE8A5ECF6587333D91D9426ACBCAF2BF /* GPXExtensionsElement.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensionsElement.swift; path = Classes/GPXExtensionsElement.swift; sourceTree = ""; }; - AFA441C1FBBFE33119C690426F83EEC4 /* IASKSettingsStoreInMemory.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSettingsStoreInMemory.m; path = Sources/InAppSettingsKit/Models/IASKSettingsStoreInMemory.m; sourceTree = ""; }; - AFB935C7A57E8497C024C9DACD9157BA /* IASKTextView.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKTextView.h; path = Sources/InAppSettingsKit/include/IASKTextView.h; sourceTree = ""; }; - AFBE31EBA8C21D055550E8AD43C70BE9 /* UIMultiPicker.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UIMultiPicker.debug.xcconfig; sourceTree = ""; }; - B2349157577BF081F6907EEAE683A97C /* GPXTrack.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrack.swift; path = Classes/GPXTrack.swift; sourceTree = ""; }; - B3092955C0CB4F5FC36BF93F6E7927E8 /* NSMutableString+XML.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "NSMutableString+XML.swift"; path = "Classes/NSMutableString+XML.swift"; sourceTree = ""; }; - B758BF93FB6C428F0DA64DBDA965E672 /* it.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = it.lproj; path = Sources/InAppSettingsKit/Resources/it.lproj; sourceTree = ""; }; - B86232B720123781D6C995BE9F687503 /* ResourceBundle-InAppSettingsKit-InAppSettingsKit-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ResourceBundle-InAppSettingsKit-InAppSettingsKit-Info.plist"; sourceTree = ""; }; - B9E7C4B9C7CE9AEF9697D9B64A88B610 /* pt-PT.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "pt-PT.lproj"; path = "Sources/InAppSettingsKit/Resources/pt-PT.lproj"; sourceTree = ""; }; - BC1F75EEADEBE964BC15E0FEEA8AC6E2 /* Converters.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Converters.swift; path = Classes/Converters.swift; sourceTree = ""; }; - BC5DFEF8856A764E8414C854BE3C2EFF /* IASKMultipleValueSelection.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKMultipleValueSelection.m; path = Sources/InAppSettingsKit/Controllers/IASKMultipleValueSelection.m; sourceTree = ""; }; - BC96E5046A8E65619F6A3ECA2993705A /* es-419.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = "es-419.lproj"; path = "Sources/InAppSettingsKit/Resources/es-419.lproj"; sourceTree = ""; }; - BD0E085C2596E72A0FCA8E828680B7A0 /* ja.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ja.lproj; path = Sources/InAppSettingsKit/Resources/ja.lproj; sourceTree = ""; }; - BDB2A88F95FFA2B71F6333A81278D76F /* nl.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nl.lproj; path = Sources/InAppSettingsKit/Resources/nl.lproj; sourceTree = ""; }; - BE0194FA8C2FA5B3A6CFA12CAC882D98 /* IASKEmbeddedDatePickerViewCell.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKEmbeddedDatePickerViewCell.m; path = Sources/InAppSettingsKit/Views/IASKEmbeddedDatePickerViewCell.m; sourceTree = ""; }; - BEE64EC7352025EB09B5F32DFBAFB2D0 /* FrameTag.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = FrameTag.swift; path = Sources/SwiftUI/FrameTag.swift; sourceTree = ""; }; - C082AE78A2C795A7CD50CE6E5575AB9C /* InAppSettingsKit */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = InAppSettingsKit; path = InAppSettingsKit.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C1690EA90952DD3B9CB643FEAAFB4D8F /* ChromaColorPicker-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "ChromaColorPicker-prefix.pch"; sourceTree = ""; }; + A25C29ED86341A5FD068CBD97F93098A /* SliderTrackView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SliderTrackView.swift; path = "Source/Supporting Views/SliderTrackView.swift"; sourceTree = ""; }; + A7C95F8EA119E56B385C255D855F1032 /* ChromaColorHandle.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChromaColorHandle.swift; path = "Source/Supporting Views/ChromaColorHandle.swift"; sourceTree = ""; }; + AB2ECADBC99A1B748D78FE21EBE6FE2F /* UIView+Utils.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "UIView+Utils.swift"; path = "Source/Extensions/UIView+Utils.swift"; sourceTree = ""; }; + BE880D4C756226200AD58018517E7EAC /* ChromaColorPicker.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = ChromaColorPicker.modulemap; sourceTree = ""; }; + C044FE1410EA5DF092728968ED7B1FDC /* UIMultiPicker-prefix.pch */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "UIMultiPicker-prefix.pch"; sourceTree = ""; }; C2FDAE1536FF09CC2163C2DD3B704156 /* Pods-WunderLINQ */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = "Pods-WunderLINQ"; path = Pods_WunderLINQ.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - C3CE3A212AE982F14D013ADF91FED284 /* GPXBounds.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXBounds.swift; path = Classes/GPXBounds.swift; sourceTree = ""; }; - C4FE240B361E9690F32BB2A46A68AF89 /* UIKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = UIKit.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/UIKit.framework; sourceTree = DEVELOPER_DIR; }; + C5D1F6A7D1BEF8198BC71CF36EA2B804 /* ChromaColorPicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "ChromaColorPicker-Info.plist"; sourceTree = ""; }; C873F75C552BAAE952A6C27FE5A4A1B3 /* Pods-WunderLINQ-acknowledgements.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Pods-WunderLINQ-acknowledgements.plist"; sourceTree = ""; }; - CB9BCF037D92EA48AB125DDECD4B9CD4 /* IASKAppSettingsViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKAppSettingsViewController.h; path = Sources/InAppSettingsKit/include/IASKAppSettingsViewController.h; sourceTree = ""; }; - CC18B0D279844740F7F65314158B64D1 /* GPXError.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXError.swift; path = Classes/GPXError.swift; sourceTree = ""; }; - CE5B831EAA1F9DD416AD0A6E468B58F4 /* GPXRouteProtocol.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXRouteProtocol.swift; path = Classes/GPXRouteProtocol.swift; sourceTree = ""; }; - CEB4866C4114B58B72A6B2911F4C9173 /* GPXParser.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXParser.swift; path = Classes/GPXParser.swift; sourceTree = ""; }; - CF27D8613FF35E1D0B0CA527FFDFC936 /* IASKDatePicker.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKDatePicker.m; path = Sources/InAppSettingsKit/Views/IASKDatePicker.m; sourceTree = ""; }; - D21EB7CEE26D49C7CC50A6319FAD747D /* nb.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = nb.lproj; path = Sources/InAppSettingsKit/Resources/nb.lproj; sourceTree = ""; }; - D3B57CFF32F5E22295A7FF507EBDF96C /* GPXCompression.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXCompression.swift; path = Classes/GPXCompression.swift; sourceTree = ""; }; - D3F08FFBBFB822FD4C8AC62CC0448502 /* IASKSpecifierValuesViewController.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSpecifierValuesViewController.h; path = Sources/InAppSettingsKit/include/IASKSpecifierValuesViewController.h; sourceTree = ""; }; D40FF0F11E7F2EF29D1A92D25FB2D60D /* ChromaColorPicker */ = {isa = PBXFileReference; explicitFileType = wrapper.framework; includeInIndex = 0; name = ChromaColorPicker; path = ChromaColorPicker.framework; sourceTree = BUILT_PRODUCTS_DIR; }; - D4C67B358388EF56B4C1846DFDCC13C1 /* IASKEmbeddedDatePickerViewCell.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKEmbeddedDatePickerViewCell.h; path = Sources/InAppSettingsKit/include/IASKEmbeddedDatePickerViewCell.h; sourceTree = ""; }; - D60E0AEC214159E32DB560D8CAE1073D /* IASKTextView.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKTextView.m; path = Sources/InAppSettingsKit/Views/IASKTextView.m; sourceTree = ""; }; - D8267EBA9E066B0A346AA7759CAF9DAA /* SliderHandleView.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = SliderHandleView.swift; path = "Source/Supporting Views/SliderHandleView.swift"; sourceTree = ""; }; - DA6237BF204079788280EAE90F5B627A /* Popovers-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "Popovers-Info.plist"; sourceTree = ""; }; E0C17EC28151E583D62BB32E1CAB1504 /* Pods-WunderLINQ.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WunderLINQ.debug.xcconfig"; sourceTree = ""; }; - E20409BEDFE5BE3E8B7D05E8D87BBD98 /* Container.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Container.swift; path = Sources/Templates/Container.swift; sourceTree = ""; }; - E218635B62BFBD9D6E78E4C2164F0717 /* MessageUI.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = MessageUI.framework; path = Platforms/iPhoneOS.platform/Developer/SDKs/iPhoneOS14.0.sdk/System/Library/Frameworks/MessageUI.framework; sourceTree = DEVELOPER_DIR; }; - E5E969316AE9B854A2920CE32B9B31DA /* IASKSettingsStoreUserDefaults.m */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.objc; name = IASKSettingsStoreUserDefaults.m; path = Sources/InAppSettingsKit/Models/IASKSettingsStoreUserDefaults.m; sourceTree = ""; }; - E81A84FFEBB347E9241C17815213D3E1 /* UIMultiPicker-Info.plist */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.plist.xml; path = "UIMultiPicker-Info.plist"; sourceTree = ""; }; - EA0A22BF261EB4F5A728D3F12386734C /* UIMultiPicker.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = UIMultiPicker.release.xcconfig; sourceTree = ""; }; - EB6FC9F734F5E535B3A598413F4D9962 /* IASKSettingsStore.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; name = IASKSettingsStore.h; path = Sources/InAppSettingsKit/include/IASKSettingsStore.h; sourceTree = ""; }; - EC84A71CCF121D0B2E0C3D67AB572D3B /* GPXAuthor.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXAuthor.swift; path = Classes/GPXAuthor.swift; sourceTree = ""; }; - ED5C1CDFF124E795ABB8FD9B7A8B58DC /* Alert.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = Alert.swift; path = Sources/Templates/Alert.swift; sourceTree = ""; }; - EE791C857B1C0CB030B98BBCF51D41A8 /* GPXExtensions.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXExtensions.swift; path = Classes/GPXExtensions.swift; sourceTree = ""; }; F17ED7B0B064A63357452FDFB293CFCE /* Pods-WunderLINQ.modulemap */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.module; path = "Pods-WunderLINQ.modulemap"; sourceTree = ""; }; - F25BEF29EC58F408B0D37E1E374E3300 /* en.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = en.lproj; path = Sources/InAppSettingsKit/Resources/en.lproj; sourceTree = ""; }; - F4253039760EE37DA8B289470077DE06 /* ru.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = ru.lproj; path = Sources/InAppSettingsKit/Resources/ru.lproj; sourceTree = ""; }; - F475D83A488B11ADD8A3649FC6D67344 /* fr.lproj */ = {isa = PBXFileReference; includeInIndex = 1; name = fr.lproj; path = Sources/InAppSettingsKit/Resources/fr.lproj; sourceTree = ""; }; - F56500B6ED58B105D77E4A5164EA9B07 /* GPXTrackPoint.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXTrackPoint.swift; path = Classes/GPXTrackPoint.swift; sourceTree = ""; }; F59F27BFF82BC49099EE2D221CA623DA /* Pods-WunderLINQ.release.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = "Pods-WunderLINQ.release.xcconfig"; sourceTree = ""; }; - F99FCA154EE265FC35E62084A9903712 /* GPXEmail.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = GPXEmail.swift; path = Classes/GPXEmail.swift; sourceTree = ""; }; - FAD2EBA37C160A445D14AF835F533BBC /* ChromaColorPicker.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = ChromaColorPicker.swift; path = Source/ChromaColorPicker.swift; sourceTree = ""; }; - FB8BBACA438E91BE7C5DFFE5482FE08A /* Popovers-umbrella.h */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.c.h; path = "Popovers-umbrella.h"; sourceTree = ""; }; - FE23B05E95F1F4D0D7D04F7FAA518DE0 /* Menu+Model.swift */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = sourcecode.swift; name = "Menu+Model.swift"; path = "Sources/Templates/Menu+Model.swift"; sourceTree = ""; }; - FF9E13E16E1C689B91C8CE000A3EFC5C /* Popovers.debug.xcconfig */ = {isa = PBXFileReference; includeInIndex = 1; lastKnownFileType = text.xcconfig; path = Popovers.debug.xcconfig; sourceTree = ""; }; /* End PBXFileReference section */ /* Begin PBXFrameworksBuildPhase section */ - 217246518A13FAA6F30EAB43F8E31F11 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 32C64AB18CD3F2E60523E2AC1268AB16 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 6D38E16E532FCA4BD6E4FE344DFCD228 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 67040EA15B49C03FDAD58F27A8BEBB37 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 7EE39E9B0FB74BB94AFD880D4C02EC27 /* Frameworks */ = { + 667A50D1FD993D53BAF6A52017F1DC73 /* Frameworks */ = { isa = PBXFrameworksBuildPhase; buildActionMask = 2147483647; files = ( - 100B82CDA344F9B9585027C3D560C1C3 /* Foundation.framework in Frameworks */, - 1DCDF597266DBE3E35B912CFBB3A07B0 /* MessageUI.framework in Frameworks */, - BFC45B8A130718FC2E15F7C2A1C051E1 /* UIKit.framework in Frameworks */, + 0008539C25EFD58AC105AAAC93E580C4 /* Foundation.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -441,190 +115,42 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - C39C08BB6620B3C9E46898ED608249F2 /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - F611F708703CB2FCA8A22E04AF4FDAAE /* Frameworks */ = { - isa = PBXFrameworksBuildPhase; - buildActionMask = 2147483647; - files = ( - 78D8D33DB5E7DEE4D8E16E45F49012F1 /* Foundation.framework in Frameworks */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXFrameworksBuildPhase section */ /* Begin PBXGroup section */ - 03C5C200A0787E300053CFA8F53CA094 /* Frameworks */ = { - isa = PBXGroup; - children = ( - 3A326CE8E5EDD96FC082F85E8FC75E67 /* iOS */, - ); - name = Frameworks; - sourceTree = ""; - }; - 128506125F404F7CBC21AECC958DBAB0 /* Support Files */ = { - isa = PBXGroup; - children = ( - 7B271D344E28FA4ADF241F5F19C80E49 /* InAppSettingsKit.modulemap */, - 87D337E6A35D934BE179793B960AD9A7 /* InAppSettingsKit-dummy.m */, - 37859CBAA0D195FCBA44DD33372A0499 /* InAppSettingsKit-Info.plist */, - 4C46A2543B2867A2BA5D8C152AAE02F9 /* InAppSettingsKit-prefix.pch */, - 72D8E3627FF394675C765B93C034770C /* InAppSettingsKit-umbrella.h */, - 821D52C94F6E441F57B341789E74F3D6 /* InAppSettingsKit.debug.xcconfig */, - 8FF81D5AEBFFA884B39F8DE845F1A70D /* InAppSettingsKit.release.xcconfig */, - B86232B720123781D6C995BE9F687503 /* ResourceBundle-InAppSettingsKit-InAppSettingsKit-Info.plist */, - ); - name = "Support Files"; - path = "../Target Support Files/InAppSettingsKit"; - sourceTree = ""; - }; - 130CAA1A95F101C0476A569F3B832751 /* CoreGPX */ = { - isa = PBXGroup; - children = ( - BC1F75EEADEBE964BC15E0FEEA8AC6E2 /* Converters.swift */, - 4F5D9B883A6F7FCA7924440714B341DD /* DateTimeParsers.swift */, - EC84A71CCF121D0B2E0C3D67AB572D3B /* GPXAuthor.swift */, - C3CE3A212AE982F14D013ADF91FED284 /* GPXBounds.swift */, - D3B57CFF32F5E22295A7FF507EBDF96C /* GPXCompression.swift */, - 50B9873A49C26871B38809BD62AA32C2 /* GPXCopyright.swift */, - 7FF89A89B679AE4F6A3380F81F2EE264 /* GPXElement.swift */, - F99FCA154EE265FC35E62084A9903712 /* GPXEmail.swift */, - CC18B0D279844740F7F65314158B64D1 /* GPXError.swift */, - EE791C857B1C0CB030B98BBCF51D41A8 /* GPXExtensions.swift */, - AE8A5ECF6587333D91D9426ACBCAF2BF /* GPXExtensionsElement.swift */, - 3E3B75E6D74BEAD46E02934590F0C749 /* GPXFix.swift */, - 5DA0B088435D68A26FB61DC02282A6DF /* GPXLegacy.swift */, - 4F6D9C516FE20DDA9F620456EFE93F0D /* GPXLink.swift */, - 3F514549F377EC9D073BA0916C6F058D /* GPXMetadata.swift */, - CEB4866C4114B58B72A6B2911F4C9173 /* GPXParser.swift */, - 64275AF3168E886A9F16DBA2344120AA /* GPXPerson.swift */, - 525D5DD844A76D8DE0279465A2831E29 /* GPXPoint.swift */, - 6231EB39320135AFC339A5E66B3C0D2C /* GPXPointSegment.swift */, - 9D8D03180118E6B5D6C3D4E996D4FAA1 /* GPXRawElement.swift */, - 8DF5F69CFE8A70A0FB0E2F6BABE8EAE7 /* GPXRoot.swift */, - A18823A942ACEEFADA55B166DBF1288F /* GPXRoute.swift */, - 29949D7E3D4E9BB17897940E6FB77B99 /* GPXRoutePoint.swift */, - CE5B831EAA1F9DD416AD0A6E468B58F4 /* GPXRouteProtocol.swift */, - B2349157577BF081F6907EEAE683A97C /* GPXTrack.swift */, - F56500B6ED58B105D77E4A5164EA9B07 /* GPXTrackPoint.swift */, - 4B0FDAC7A3CC3F85A7F571A768FE58FF /* GPXTrackSegment.swift */, - 2FD8489546BBEA615B0F7E83C13394D2 /* GPXWaypoint.swift */, - 50E5F9699A48661BF8904884C3873CA1 /* GPXWaypointProtocol.swift */, - B3092955C0CB4F5FC36BF93F6E7927E8 /* NSMutableString+XML.swift */, - 14697DEB10AB9B4D2E0D0A05C55C28BB /* Support Files */, - ); - name = CoreGPX; - path = CoreGPX; - sourceTree = ""; - }; - 14697DEB10AB9B4D2E0D0A05C55C28BB /* Support Files */ = { + 1BF7AED0E1C466023762C01A0AFE32AD /* Products */ = { isa = PBXGroup; children = ( - 04A0CBFF7FC8DA5D16E4F985A87A8B30 /* CoreGPX.modulemap */, - 8C8D9FE64941611D7FD8CDF568CAF385 /* CoreGPX-dummy.m */, - 88A4C9751888DE5C4052A9F62AFE95BE /* CoreGPX-Info.plist */, - 6A26569688F3731CBAF1730B2CF91D26 /* CoreGPX-prefix.pch */, - 08E320DA89BBC5218593653295B68983 /* CoreGPX-umbrella.h */, - 4E822A6CF1CC6B6E92A9E69BA1DECF0E /* CoreGPX.debug.xcconfig */, - 73A2D70A20EDEACD402C364BF07EA1B7 /* CoreGPX.release.xcconfig */, + D40FF0F11E7F2EF29D1A92D25FB2D60D /* ChromaColorPicker */, + C2FDAE1536FF09CC2163C2DD3B704156 /* Pods-WunderLINQ */, + 8958A4B9C310BCF9D82B158E2AFAAD3B /* UIMultiPicker */, ); - name = "Support Files"; - path = "../Target Support Files/CoreGPX"; + name = Products; sourceTree = ""; }; - 241E50D27AFC3A389E39238BA2C11597 /* Support Files */ = { + 2A08D0CD0F56C25B2F3141845CCAD9A0 /* Support Files */ = { isa = PBXGroup; children = ( - 7C32B8D61E11050B1602EB5DF23AF3B3 /* UIMultiPicker.modulemap */, - A1E891EAEB7D2C3402C1B341103DBC7C /* UIMultiPicker-dummy.m */, - E81A84FFEBB347E9241C17815213D3E1 /* UIMultiPicker-Info.plist */, - 0C38AA75E6239EAB538F139CF9C7FD1B /* UIMultiPicker-prefix.pch */, - 6A65E09C9D431850D4F2CD9D7E30CC83 /* UIMultiPicker-umbrella.h */, - AFBE31EBA8C21D055550E8AD43C70BE9 /* UIMultiPicker.debug.xcconfig */, - EA0A22BF261EB4F5A728D3F12386734C /* UIMultiPicker.release.xcconfig */, + BE880D4C756226200AD58018517E7EAC /* ChromaColorPicker.modulemap */, + 33390DC97F6731D31AA8D8FD849FB42A /* ChromaColorPicker-dummy.m */, + C5D1F6A7D1BEF8198BC71CF36EA2B804 /* ChromaColorPicker-Info.plist */, + 55FCE4CF6B384F2446B51813263DFF78 /* ChromaColorPicker-prefix.pch */, + 5DFAA31A6985B0853DA37218E66C9385 /* ChromaColorPicker-umbrella.h */, + 8C025BE8A39091774B12C165AAD11A00 /* ChromaColorPicker.debug.xcconfig */, + 0C38FBC9FAC8D20324DD7C475E0226BF /* ChromaColorPicker.release.xcconfig */, ); name = "Support Files"; - path = "../Target Support Files/UIMultiPicker"; - sourceTree = ""; - }; - 32C62625A90311D4F8C7B0A1E4E691EB /* Resources */ = { - isa = PBXGroup; - children = ( - 7F56A94B2F420C5731D2FBFCABB63CA3 /* Base.lproj */, - 8EEAFBF0D4128BD0256FD28417844A99 /* ca.lproj */, - A5CEB98FF20F16F5704BF16C6BC05CD5 /* de.lproj */, - 22116EF531ECC23304F95D38AAA5082C /* el.lproj */, - F25BEF29EC58F408B0D37E1E374E3300 /* en.lproj */, - 7313BB817CE730F38909542390E29F46 /* es.lproj */, - BC96E5046A8E65619F6A3ECA2993705A /* es-419.lproj */, - 87C9FAA10E29C2355D18D13EC6D8342D /* es-MX.lproj */, - F475D83A488B11ADD8A3649FC6D67344 /* fr.lproj */, - 89B1066183318DFD567322AEEB59002A /* hr.lproj */, - 24E7D6CB740A33E53D8DB88B81A8C3FF /* hu.lproj */, - B758BF93FB6C428F0DA64DBDA965E672 /* it.lproj */, - BD0E085C2596E72A0FCA8E828680B7A0 /* ja.lproj */, - D21EB7CEE26D49C7CC50A6319FAD747D /* nb.lproj */, - BDB2A88F95FFA2B71F6333A81278D76F /* nl.lproj */, - 2F6A23D99EEA13ADE4DDEDAE13331BA9 /* pl.lproj */, - A9B99BB2D82C411E7774E80361135D14 /* pt.lproj */, - B9E7C4B9C7CE9AEF9697D9B64A88B610 /* pt-PT.lproj */, - F4253039760EE37DA8B289470077DE06 /* ru.lproj */, - 35CBD7116D03B8AE542F27C25BACD5EA /* sv.lproj */, - 17B4B9222F6184682F26A4D8DDA123A3 /* th.lproj */, - ACC82CD87A0882A87953E6F05BD08C83 /* tr.lproj */, - 33CADAC0595D3E3E180503216417B1D8 /* uk.lproj */, - 32F930DD3AD647DB052AEB5A72A70A21 /* zh-Hans.lproj */, - 7253BCE39F0D801968BFCA21E0A5A969 /* zh-Hant.lproj */, - ); - name = Resources; + path = "../Target Support Files/ChromaColorPicker"; sourceTree = ""; }; - 3A326CE8E5EDD96FC082F85E8FC75E67 /* iOS */ = { + 578452D2E740E91742655AC8F1636D1F /* iOS */ = { isa = PBXGroup; children = ( - 772245828F0E506C859B7A962DC70C92 /* Foundation.framework */, - E218635B62BFBD9D6E78E4C2164F0717 /* MessageUI.framework */, - C4FE240B361E9690F32BB2A46A68AF89 /* UIKit.framework */, + 73010CC983E3809BECEE5348DA1BB8C6 /* Foundation.framework */, ); name = iOS; sourceTree = ""; }; - 5F186A27752F9E3E55DE7B1B4304156E /* Popovers */ = { - isa = PBXGroup; - children = ( - ED5C1CDFF124E795ABB8FD9B7A8B58DC /* Alert.swift */, - 2B165D1AEFDA2E29AF31713003F47828 /* Blur.swift */, - E20409BEDFE5BE3E8B7D05E8D87BBD98 /* Container.swift */, - 38E27C2E9C2A4690A9EE76106F3796AB /* Extensions.swift */, - BEE64EC7352025EB09B5F32DFBAFB2D0 /* FrameTag.swift */, - 79550D1557C924468B9C90AD0B3A3FBB /* Menu.swift */, - FE23B05E95F1F4D0D7D04F7FAA518DE0 /* Menu+Model.swift */, - 6983A1C4A3687F478D6DB2F98A1CB243 /* Menu+UIKit.swift */, - 342A759E0C6E5B0C3AFC4E108D7D326C /* Modifiers.swift */, - 485D56E268AC91872A1C6946FEC6875C /* Popover.swift */, - 9226922D3292D9FF245F106D72F37356 /* Popover+Lifecycle.swift */, - 66FADCA4FF87D0FC1F95FA8691245271 /* Popover+Positioning.swift */, - 706FB67021BCA362C1FEC6B989F4FCB9 /* PopoverContainerView.swift */, - A020610EEC043BA02BF9994E6BF9BCC5 /* PopoverGestureContainer.swift */, - 3D6B78165E5CB8B2253A1708943BE80D /* PopoverModel.swift */, - 85296CDD82535607181AEBABD327B4C1 /* Popovers.swift */, - 7F19586280E9E0123961318EA3F48CB7 /* PopoverUtilities.swift */, - A862D55B078793F29D1FB58B868B1589 /* PopoverWindows.swift */, - 5FABA709DD703C10F157E8D6AB82F098 /* Readers.swift */, - 4E97F8CC6AAD46EF1F6804D508E6FB8E /* Shadow.swift */, - 5424C1E08824A30531B54B41AF6D3C5A /* Shapes.swift */, - 95B9CC5699C28B4BCAC7EA27A9C28030 /* Templates.swift */, - 80ADD4F79AA3418A35B8C41C13EA4C5C /* Support Files */, - ); - name = Popovers; - path = Popovers; - sourceTree = ""; - }; 603F5E2F7312283F9EF0E024EB440C6D /* Targets Support Files */ = { isa = PBXGroup; children = ( @@ -633,29 +159,11 @@ name = "Targets Support Files"; sourceTree = ""; }; - 80ADD4F79AA3418A35B8C41C13EA4C5C /* Support Files */ = { + 75E29C4F3D66E53888081F61C5E9E068 /* Pods */ = { isa = PBXGroup; children = ( - 59683CEDD075D091024D7D90EFAA5DCB /* Popovers.modulemap */, - 01C350E8CA3131ACFB167E4038739A82 /* Popovers-dummy.m */, - DA6237BF204079788280EAE90F5B627A /* Popovers-Info.plist */, - 6A6D9046921C4A3A61AEF7744FA9AFB1 /* Popovers-prefix.pch */, - FB8BBACA438E91BE7C5DFFE5482FE08A /* Popovers-umbrella.h */, - FF9E13E16E1C689B91C8CE000A3EFC5C /* Popovers.debug.xcconfig */, - 0DA51D2D1B0A398AD4A0D82C274B67AE /* Popovers.release.xcconfig */, - ); - name = "Support Files"; - path = "../Target Support Files/Popovers"; - sourceTree = ""; - }; - A26DA808B0D31454AE5F82FF96778E8E /* Pods */ = { - isa = PBXGroup; - children = ( - BD5BE8577367432E9AB5A5A018B68C98 /* ChromaColorPicker */, - 130CAA1A95F101C0476A569F3B832751 /* CoreGPX */, - E89606A94BA2AF416C291E6127F4C5AE /* InAppSettingsKit */, - 5F186A27752F9E3E55DE7B1B4304156E /* Popovers */, - FC5F32ECA315BB4FFE60380CA2EF6663 /* UIMultiPicker */, + F770D2C895A2FADBEBDEE64FC6B3476E /* ChromaColorPicker */, + DDFDC13DF11CE710FA140D4BAFFF2AC1 /* UIMultiPicker */, ); name = Pods; sourceTree = ""; @@ -677,145 +185,78 @@ path = "Target Support Files/Pods-WunderLINQ"; sourceTree = ""; }; - BD5BE8577367432E9AB5A5A018B68C98 /* ChromaColorPicker */ = { - isa = PBXGroup; - children = ( - 369BE74C06F714C4F9BF755E6C92370D /* ChromaBrightnessSlider.swift */, - 6BD6AEE50BFAD04D330074E42D0011D1 /* ChromaColorHandle.swift */, - FAD2EBA37C160A445D14AF835F533BBC /* ChromaColorPicker.swift */, - 3AF688645B6E7825293E93AB87EBD0F4 /* ChromaControlStylable.swift */, - 76B6A77FCEF15DB7D093039B8969C660 /* ColorWheelView.swift */, - D8267EBA9E066B0A346AA7759CAF9DAA /* SliderHandleView.swift */, - A36B01EF1C0C223AD6E8418EF59D729E /* SliderTrackView.swift */, - 7466FC0C9CCD05C64C465F97AA9340F6 /* UIColor+Brightness.swift */, - A16D3531CF2D667284F3142E91576B14 /* UIColor+Utils.swift */, - 9175F19D5F027DA90EBB5C9567C4E20E /* UIView+DropShadow.swift */, - 34F408EF00A982BBEAD6D39ED4456D1F /* UIView+Utils.swift */, - E7366B5FFB584E00F0B167950FA449C9 /* Support Files */, - ); - name = ChromaColorPicker; - path = ChromaColorPicker; - sourceTree = ""; - }; CF1408CF629C7361332E53B88F7BD30C = { isa = PBXGroup; children = ( 9D940727FF8FB9C785EB98E56350EF41 /* Podfile */, - 03C5C200A0787E300053CFA8F53CA094 /* Frameworks */, - A26DA808B0D31454AE5F82FF96778E8E /* Pods */, - F394837EAAC48F5F207F3AD82CD6EF52 /* Products */, + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */, + 75E29C4F3D66E53888081F61C5E9E068 /* Pods */, + 1BF7AED0E1C466023762C01A0AFE32AD /* Products */, 603F5E2F7312283F9EF0E024EB440C6D /* Targets Support Files */, ); sourceTree = ""; }; - E7366B5FFB584E00F0B167950FA449C9 /* Support Files */ = { + D210D550F4EA176C3123ED886F8F87F5 /* Frameworks */ = { isa = PBXGroup; children = ( - 5E11E864E5DCDE1D17E099FC608DC0E2 /* ChromaColorPicker.modulemap */, - 8EDA4F9200016EFFF6C1875ACCBBFA84 /* ChromaColorPicker-dummy.m */, - 2376F284B91CF011CBE35265BECDC135 /* ChromaColorPicker-Info.plist */, - C1690EA90952DD3B9CB643FEAAFB4D8F /* ChromaColorPicker-prefix.pch */, - 7EC0855EFD454BAAD7349B04D0B3969A /* ChromaColorPicker-umbrella.h */, - 41EC6D2EF2E593508B940414FDDA8B8A /* ChromaColorPicker.debug.xcconfig */, - 63E56DD2B2B97D058C78DE06BAB06EE5 /* ChromaColorPicker.release.xcconfig */, + 578452D2E740E91742655AC8F1636D1F /* iOS */, ); - name = "Support Files"; - path = "../Target Support Files/ChromaColorPicker"; + name = Frameworks; sourceTree = ""; }; - E89606A94BA2AF416C291E6127F4C5AE /* InAppSettingsKit */ = { + DDFDC13DF11CE710FA140D4BAFFF2AC1 /* UIMultiPicker */ = { isa = PBXGroup; children = ( - CB9BCF037D92EA48AB125DDECD4B9CD4 /* IASKAppSettingsViewController.h */, - 5D927066B7746CAF4C4391B4498A5D46 /* IASKAppSettingsViewController.m */, - 1D694988C563BD6415F49C6F25B956F3 /* IASKAppSettingsWebViewController.h */, - 7C8AB362D90D1AA349F91F369CFD56DF /* IASKAppSettingsWebViewController.m */, - 50722313F76518974FF52CFA7636DB56 /* IASKColor.h */, - 4EFD7C39121B59549CB60EE4E3C6F665 /* IASKColor.m */, - 59E80EAE43F58D4673A9E293CA5E5424 /* IASKDatePicker.h */, - CF27D8613FF35E1D0B0CA527FFDFC936 /* IASKDatePicker.m */, - 554A8CEDB54DCB35B1DDB114918CB58A /* IASKDatePickerViewCell.h */, - 857F979CC90DA1188FB0F31282DE580B /* IASKDatePickerViewCell.m */, - D4C67B358388EF56B4C1846DFDCC13C1 /* IASKEmbeddedDatePickerViewCell.h */, - BE0194FA8C2FA5B3A6CFA12CAC882D98 /* IASKEmbeddedDatePickerViewCell.m */, - 8AC9F1BF987833C9AB831B7904FC6291 /* IASKMultipleValueSelection.h */, - BC5DFEF8856A764E8414C854BE3C2EFF /* IASKMultipleValueSelection.m */, - 0F50699DE1B119E1DB9AC8D3712A7AB5 /* IASKPSSliderSpecifierViewCell.h */, - 99EFA32A87122290EC3A8A77E6C2FEDA /* IASKPSSliderSpecifierViewCell.m */, - 91AB13988912CB7C386322FC6A1A46F3 /* IASKPSTextFieldSpecifierViewCell.h */, - 127F0A1120E6B2F2E9F91C060C72F88B /* IASKPSTextFieldSpecifierViewCell.m */, - 8834F8A27DC7D4C31239C37BC6D08C88 /* IASKSettingsReader.h */, - 72E52A6BAD42EA2F296B8B4CD7A7651C /* IASKSettingsReader.m */, - EB6FC9F734F5E535B3A598413F4D9962 /* IASKSettingsStore.h */, - 5E5E0032B48981548FF527EA8B359D25 /* IASKSettingsStore.m */, - 8732372CDF401D995550F44116B37DF8 /* IASKSettingsStoreFile.h */, - 2F023D1FBA51D06D6507058336762EE0 /* IASKSettingsStoreFile.m */, - 29334BE03F4FE5A932BB6346B61E67A3 /* IASKSettingsStoreInMemory.h */, - AFA441C1FBBFE33119C690426F83EEC4 /* IASKSettingsStoreInMemory.m */, - 3F3B397EB6AAA89B542EABE8064FBC0C /* IASKSettingsStoreUserDefaults.h */, - E5E969316AE9B854A2920CE32B9B31DA /* IASKSettingsStoreUserDefaults.m */, - 478F76D4194C8A256BCB9767F7A3FD9D /* IASKSlider.h */, - 66426BBDAD31BF562CC8D848080A7E19 /* IASKSlider.m */, - 44EB6190CCBAA81C78A4804B45BA50A9 /* IASKSpecifier.h */, - 671B8F029126C219F70C79F2D1F23265 /* IASKSpecifier.m */, - D3F08FFBBFB822FD4C8AC62CC0448502 /* IASKSpecifierValuesViewController.h */, - 1B43B8984DCE6143EF2B1A45ACDD6F1A /* IASKSpecifierValuesViewController.m */, - 783379E8DC45B73554D9BA0AD8AEE396 /* IASKSwitch.h */, - AD7561B2F8F0A598FE4E0E350D4AD564 /* IASKSwitch.m */, - 7EF63C3E15F57AA715B99A8749EFD4EB /* IASKTextField.h */, - 6E0BC583838349978BFB03D649854625 /* IASKTextField.m */, - AFB935C7A57E8497C024C9DACD9157BA /* IASKTextView.h */, - D60E0AEC214159E32DB560D8CAE1073D /* IASKTextView.m */, - 0DADCA7619D3859856AA978AC1185DE4 /* IASKTextViewCell.h */, - 2A3212ECAF85B2C55493B54F1A5FD1B4 /* IASKTextViewCell.m */, - 3C4A90D9845344327FA4AC9D30B74E3C /* IASKViewController.h */, - 32C62625A90311D4F8C7B0A1E4E691EB /* Resources */, - 128506125F404F7CBC21AECC958DBAB0 /* Support Files */, + 8D5D32941653DAAACAA32CDE8E4B33A4 /* UIMultiPicker.swift */, + F1B51133156C5EE086E7D9ABC9388C04 /* Support Files */, ); - name = InAppSettingsKit; - path = InAppSettingsKit; + name = UIMultiPicker; + path = UIMultiPicker; sourceTree = ""; }; - F394837EAAC48F5F207F3AD82CD6EF52 /* Products */ = { + F1B51133156C5EE086E7D9ABC9388C04 /* Support Files */ = { isa = PBXGroup; children = ( - D40FF0F11E7F2EF29D1A92D25FB2D60D /* ChromaColorPicker */, - 68676CD591957EA4525B4B03D1CF22AD /* CoreGPX */, - C082AE78A2C795A7CD50CE6E5575AB9C /* InAppSettingsKit */, - 325E862631E06444E4504511C87F1E9C /* InAppSettingsKit-InAppSettingsKit */, - C2FDAE1536FF09CC2163C2DD3B704156 /* Pods-WunderLINQ */, - 19D355B137AADBEAE940E34A09FBDD01 /* Popovers */, - 8958A4B9C310BCF9D82B158E2AFAAD3B /* UIMultiPicker */, + 9A707B661E6F828F346EFB23EC4922C7 /* UIMultiPicker.modulemap */, + 4CDAB1D485973DB4E0DB632C5D52D862 /* UIMultiPicker-dummy.m */, + 985F9102CAC0C38B04CA8CC563E6DC61 /* UIMultiPicker-Info.plist */, + C044FE1410EA5DF092728968ED7B1FDC /* UIMultiPicker-prefix.pch */, + 8022C6843E27E28D4190730D07BB4D44 /* UIMultiPicker-umbrella.h */, + 42EBB9161EE83F317C04E488F24209B3 /* UIMultiPicker.debug.xcconfig */, + 1AD9198737C89F7533BC43B59DB121F2 /* UIMultiPicker.release.xcconfig */, ); - name = Products; + name = "Support Files"; + path = "../Target Support Files/UIMultiPicker"; sourceTree = ""; }; - FC5F32ECA315BB4FFE60380CA2EF6663 /* UIMultiPicker */ = { + F770D2C895A2FADBEBDEE64FC6B3476E /* ChromaColorPicker */ = { isa = PBXGroup; children = ( - A060379F483CC032BCF6768C3DE9BABE /* UIMultiPicker.swift */, - 241E50D27AFC3A389E39238BA2C11597 /* Support Files */, + 25D3FC818162AE0E98785F6F1D495A8F /* ChromaBrightnessSlider.swift */, + A7C95F8EA119E56B385C255D855F1032 /* ChromaColorHandle.swift */, + 3204C755521D99C795F46979F5F556E8 /* ChromaColorPicker.swift */, + 678B5E0F8687D774D7160503E4460FA9 /* ChromaControlStylable.swift */, + 9617C8EE0B0539F8622B6CACD60626A7 /* ColorWheelView.swift */, + 1CB430EB7BE11EB3597DABC6F5795FD8 /* SliderHandleView.swift */, + A25C29ED86341A5FD068CBD97F93098A /* SliderTrackView.swift */, + 8FDC518D568431747738B2C58B9C4793 /* UIColor+Brightness.swift */, + 3393DA658F5F6951233865E01E3DF790 /* UIColor+Utils.swift */, + 536396054714F6F6A7FF50AC11A33B07 /* UIView+DropShadow.swift */, + AB2ECADBC99A1B748D78FE21EBE6FE2F /* UIView+Utils.swift */, + 2A08D0CD0F56C25B2F3141845CCAD9A0 /* Support Files */, ); - name = UIMultiPicker; - path = UIMultiPicker; + name = ChromaColorPicker; + path = ChromaColorPicker; sourceTree = ""; }; /* End PBXGroup section */ /* Begin PBXHeadersBuildPhase section */ - 247DE0ADCA5EAEFFC5612D8E7FBF47DF /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 520289DBD833A3AB3DEEE04E572A1D24 /* CoreGPX-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 4E52FF020BCCE298007E15CAB2BAC8E2 /* Headers */ = { + 28565EED35FEAA66540132E3C8A0A156 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; files = ( - 992F30DEAF79C7AFA46D79BD795C0E85 /* Pods-WunderLINQ-umbrella.h in Headers */, + A0FC5DB302A508F2C0CFDAE6D3F2DE30 /* Pods-WunderLINQ-umbrella.h in Headers */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -827,36 +268,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 7DF9F658E13CB3392828770212C1205B /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - 7CC968B41F8A4F27993B2A317B2594FB /* IASKAppSettingsViewController.h in Headers */, - 289D7212FFEDAFDA7920632DF5EFA948 /* IASKAppSettingsWebViewController.h in Headers */, - 454313AF39193E4AD9CDBD2215BC68EF /* IASKColor.h in Headers */, - 1A68CA2DA40FCE5E93F5BE7364C89E7E /* IASKDatePicker.h in Headers */, - 7CEBD193D0FB3E2042A936E1B4369313 /* IASKDatePickerViewCell.h in Headers */, - 177C66F5AF1827606BFD679F79373F97 /* IASKEmbeddedDatePickerViewCell.h in Headers */, - AC5D57BB9401D3258B8E44CC58C70F52 /* IASKMultipleValueSelection.h in Headers */, - 29494A0AA2122A64690844C8FC7CC455 /* IASKPSSliderSpecifierViewCell.h in Headers */, - 06C2280561C2533DFD2C2AE0449DAA11 /* IASKPSTextFieldSpecifierViewCell.h in Headers */, - A291D43EF0F82A02D3BAD350DBF92FED /* IASKSettingsReader.h in Headers */, - 4DEC3AD2F9C8C658A526118D8C9249BB /* IASKSettingsStore.h in Headers */, - F7541D1FF54BE3EC531D616C4DF9DBF4 /* IASKSettingsStoreFile.h in Headers */, - 630F88C020E3036DB35AEA01A3718B06 /* IASKSettingsStoreInMemory.h in Headers */, - 16BF05CEC1D33148CEE3AB550416367C /* IASKSettingsStoreUserDefaults.h in Headers */, - 374714C76D014BB72583BDB5A7FD6F3F /* IASKSlider.h in Headers */, - 7C67EF2EC8FF95EFE216890F41D357F7 /* IASKSpecifier.h in Headers */, - BAD4C85464D4E640D6FFBCE04E7D7126 /* IASKSpecifierValuesViewController.h in Headers */, - 1E620625175517CAF606E20B645CCB8D /* IASKSwitch.h in Headers */, - DBD8F0B618E96A7533D29595E5CD1AF7 /* IASKTextField.h in Headers */, - BA4690E39D8078F3B865A3728BE1D1BB /* IASKTextView.h in Headers */, - 93B0FA516E3B50D26E317F7830DDE5E8 /* IASKTextViewCell.h in Headers */, - 1013B0C50126F3E25805ED89465FABB2 /* IASKViewController.h in Headers */, - EC905717C74F5130D14644F1365C1987 /* InAppSettingsKit-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; 991DD2EC53A8A1526E9812A909B660E6 /* Headers */ = { isa = PBXHeadersBuildPhase; buildActionMask = 2147483647; @@ -865,54 +276,9 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - D10503AA8D632748A3D5608ACE5DAF99 /* Headers */ = { - isa = PBXHeadersBuildPhase; - buildActionMask = 2147483647; - files = ( - F4173BC1CF9DC186AF4A2C7738FE5D84 /* Popovers-umbrella.h in Headers */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXHeadersBuildPhase section */ /* Begin PBXNativeTarget section */ - 493735E92C5B6068F445B48D0CA7B736 /* CoreGPX */ = { - isa = PBXNativeTarget; - buildConfigurationList = E3E118CB11A5DB1D2A8E0304E3AC5540 /* Build configuration list for PBXNativeTarget "CoreGPX" */; - buildPhases = ( - 247DE0ADCA5EAEFFC5612D8E7FBF47DF /* Headers */, - FC03CA6F651FCEFCE72C35F4005391DE /* Sources */, - 217246518A13FAA6F30EAB43F8E31F11 /* Frameworks */, - 505E9FDCDFF3AAF0D444AA66EB08695C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = CoreGPX; - productName = CoreGPX; - productReference = 68676CD591957EA4525B4B03D1CF22AD /* CoreGPX */; - productType = "com.apple.product-type.framework"; - }; - 5B4848122435F4C22D574A5DA6D2EFB3 /* InAppSettingsKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = F2E3E0F7C38AF8A9553FE5EDC42446C6 /* Build configuration list for PBXNativeTarget "InAppSettingsKit" */; - buildPhases = ( - 7DF9F658E13CB3392828770212C1205B /* Headers */, - A7CAF5B8D46DDDF6A0261AA0A0DA09FB /* Sources */, - 7EE39E9B0FB74BB94AFD880D4C02EC27 /* Frameworks */, - AF51AF0A947475C6E241999E6375D248 /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - 5101463198907B60ED87A5207AD58418 /* PBXTargetDependency */, - ); - name = InAppSettingsKit; - productName = InAppSettingsKit; - productReference = C082AE78A2C795A7CD50CE6E5575AB9C /* InAppSettingsKit */; - productType = "com.apple.product-type.framework"; - }; 7961A0F04FB3D96E3E703CF075D6DACD /* ChromaColorPicker */ = { isa = PBXNativeTarget; buildConfigurationList = FCAEE69EC10110ACC58369693354E44A /* Build configuration list for PBXNativeTarget "ChromaColorPicker" */; @@ -931,41 +297,6 @@ productReference = D40FF0F11E7F2EF29D1A92D25FB2D60D /* ChromaColorPicker */; productType = "com.apple.product-type.framework"; }; - 8A996938DFC560C0A3EF0DD6CA6B032A /* InAppSettingsKit-InAppSettingsKit */ = { - isa = PBXNativeTarget; - buildConfigurationList = 7B5D2AB8299E3E97B54A3C095F7919F7 /* Build configuration list for PBXNativeTarget "InAppSettingsKit-InAppSettingsKit" */; - buildPhases = ( - 8551461E2B851272AB2DBFB9AF90E74D /* Sources */, - C39C08BB6620B3C9E46898ED608249F2 /* Frameworks */, - E04F21F3FE75710A6E044E0AA3FD7D1C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = "InAppSettingsKit-InAppSettingsKit"; - productName = InAppSettingsKit; - productReference = 325E862631E06444E4504511C87F1E9C /* InAppSettingsKit-InAppSettingsKit */; - productType = "com.apple.product-type.bundle"; - }; - B748EFCD9F50067EF7DF853242BB3AB4 /* Popovers */ = { - isa = PBXNativeTarget; - buildConfigurationList = A7032E455707DD8D0CC26CAC9DE9BDF2 /* Build configuration list for PBXNativeTarget "Popovers" */; - buildPhases = ( - D10503AA8D632748A3D5608ACE5DAF99 /* Headers */, - 1C6CD39D622B6272ADED7E3E7BEA4313 /* Sources */, - F611F708703CB2FCA8A22E04AF4FDAAE /* Frameworks */, - C2DA19FA2CD8DD4C3FF99C1529F1538C /* Resources */, - ); - buildRules = ( - ); - dependencies = ( - ); - name = Popovers; - productName = Popovers; - productReference = 19D355B137AADBEAE940E34A09FBDD01 /* Popovers */; - productType = "com.apple.product-type.framework"; - }; C29B8E66676DEE2FC332C8BE854A34BA /* UIMultiPicker */ = { isa = PBXNativeTarget; buildConfigurationList = 210327EC22A4A16605838CCC729898DE /* Build configuration list for PBXNativeTarget "UIMultiPicker" */; @@ -986,21 +317,18 @@ }; FAF21BE37EB65063DA9127CAC1CE75D9 /* Pods-WunderLINQ */ = { isa = PBXNativeTarget; - buildConfigurationList = 8E96D1FDA78D8D8C34CD91EEC9791EA0 /* Build configuration list for PBXNativeTarget "Pods-WunderLINQ" */; + buildConfigurationList = 14DC5D4C4C227B364A8D20ADD73B9693 /* Build configuration list for PBXNativeTarget "Pods-WunderLINQ" */; buildPhases = ( - 4E52FF020BCCE298007E15CAB2BAC8E2 /* Headers */, - B0BE3CCC3416A02CF0D2D25867F12197 /* Sources */, - 6D38E16E532FCA4BD6E4FE344DFCD228 /* Frameworks */, - 96CF772647D3B5558CE4F7B990D8688C /* Resources */, + 28565EED35FEAA66540132E3C8A0A156 /* Headers */, + 12C523E419204C7F7FF82B68F66DCA62 /* Sources */, + 667A50D1FD993D53BAF6A52017F1DC73 /* Frameworks */, + 3E955C85408D0D5BC8E3DBF15870487C /* Resources */, ); buildRules = ( ); dependencies = ( - B89FEF1FFED57BA6551BAA485AF568DD /* PBXTargetDependency */, - DDAC8EB065CE08A31A234BC1E131C8A0 /* PBXTargetDependency */, - 04D5E249E6D00DA009A58E76DB5041A9 /* PBXTargetDependency */, - 351A619302D67627EEF08D1F011CFA14 /* PBXTargetDependency */, - 0B7449E7C2DAADACD37B1653F1D0DE00 /* PBXTargetDependency */, + 6D5F3968B5BBDC6AFF59C76F5C7A8AA7 /* PBXTargetDependency */, + 61E3C6F9A354833B82EB63D9C8DDF102 /* PBXTargetDependency */, ); name = "Pods-WunderLINQ"; productName = Pods_WunderLINQ; @@ -1022,42 +350,15 @@ hasScannedForEncodings = 0; knownRegions = ( Base, - ca, - de, - el, en, - es, - "es-419", - "es-MX", - fr, - hr, - hu, - it, - ja, - nb, - nl, - pl, - pt, - "pt-PT", - ru, - sv, - th, - tr, - uk, - "zh-Hans", - "zh-Hant", ); mainGroup = CF1408CF629C7361332E53B88F7BD30C; - productRefGroup = F394837EAAC48F5F207F3AD82CD6EF52 /* Products */; + productRefGroup = 1BF7AED0E1C466023762C01A0AFE32AD /* Products */; projectDirPath = ""; projectRoot = ""; targets = ( 7961A0F04FB3D96E3E703CF075D6DACD /* ChromaColorPicker */, - 493735E92C5B6068F445B48D0CA7B736 /* CoreGPX */, - 5B4848122435F4C22D574A5DA6D2EFB3 /* InAppSettingsKit */, - 8A996938DFC560C0A3EF0DD6CA6B032A /* InAppSettingsKit-InAppSettingsKit */, FAF21BE37EB65063DA9127CAC1CE75D9 /* Pods-WunderLINQ */, - B748EFCD9F50067EF7DF853242BB3AB4 /* Popovers */, C29B8E66676DEE2FC332C8BE854A34BA /* UIMultiPicker */, ); }; @@ -1071,104 +372,28 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 4425FBF1C39547A804861022E707A1D3 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - 505E9FDCDFF3AAF0D444AA66EB08695C /* Resources */ = { + 3E955C85408D0D5BC8E3DBF15870487C /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( ); runOnlyForDeploymentPostprocessing = 0; }; - 96CF772647D3B5558CE4F7B990D8688C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - AF51AF0A947475C6E241999E6375D248 /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - FF3D4B4390CD54DBE022DBBA3C76F5EC /* InAppSettingsKit-InAppSettingsKit in Resources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - C2DA19FA2CD8DD4C3FF99C1529F1538C /* Resources */ = { - isa = PBXResourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - E04F21F3FE75710A6E044E0AA3FD7D1C /* Resources */ = { + 4425FBF1C39547A804861022E707A1D3 /* Resources */ = { isa = PBXResourcesBuildPhase; buildActionMask = 2147483647; files = ( - EEB758733F4F9AEE9EFDCD60F0EBA4A1 /* Base.lproj in Resources */, - 20A57C501C416C826E2B45EE823B5852 /* ca.lproj in Resources */, - CCC2FE67693B8E9C2F9238FB9ADE2839 /* de.lproj in Resources */, - C507F238396AEBF9C8C6A85ADF0419C6 /* el.lproj in Resources */, - 6D7FDE6B449BA699FA6CC4F627153C64 /* en.lproj in Resources */, - FBF8A6DE59EAFB6BC4FEF1D9C082B064 /* es.lproj in Resources */, - D0CCE7D12EEDB8A903DE3F8A0685993E /* es-419.lproj in Resources */, - CD59FD960D2E59A22B1607CC6B853EC4 /* es-MX.lproj in Resources */, - 7233C7649C6E2DF3EA53F7A97570B4BF /* fr.lproj in Resources */, - 42BA147DE27A276FB142193CFB4EADF2 /* hr.lproj in Resources */, - 61D0B90CAEA50899D92AB7E9296BC50B /* hu.lproj in Resources */, - EEAF24F7298917EB78BB21BC172FBAFF /* it.lproj in Resources */, - 21D6E5163FCEA8B00C403BFB022E3317 /* ja.lproj in Resources */, - F294150179A23470E49CB8068D02EB61 /* nb.lproj in Resources */, - 5EE28FCB029438E6DCAEE83170EF60CC /* nl.lproj in Resources */, - 15372E5FA2EF49EC7E4863346934C018 /* pl.lproj in Resources */, - 1722E678F296F719EAC7560191753674 /* pt.lproj in Resources */, - 9135AEF6D68531937F90B32B136A0A33 /* pt-PT.lproj in Resources */, - 2F39ADB690E78CED92AB4AD7AB3B1D17 /* ru.lproj in Resources */, - 373EB52F1159C61F23A342FA9EF9E1DD /* sv.lproj in Resources */, - E995530C7E72C4CFBE5EC792E8065DBB /* th.lproj in Resources */, - 4AF4FF1C5DFA5E3F2B170D59807BC3E3 /* tr.lproj in Resources */, - FD3028C3BC747B9F19DE494F500C2A14 /* uk.lproj in Resources */, - 237E4C7ECAF93A8C661558BD09E15BB4 /* zh-Hans.lproj in Resources */, - B547CDD41E1B01C29886B887FC38E4B4 /* zh-Hant.lproj in Resources */, ); runOnlyForDeploymentPostprocessing = 0; }; /* End PBXResourcesBuildPhase section */ /* Begin PBXSourcesBuildPhase section */ - 1C6CD39D622B6272ADED7E3E7BEA4313 /* Sources */ = { + 12C523E419204C7F7FF82B68F66DCA62 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; files = ( - 6BF555F86AEE3607F005E37E05851675 /* Alert.swift in Sources */, - 6EAE5358A31A274AAC4D22D8CC378D5D /* Blur.swift in Sources */, - 473D3854493C0ECACBB7F4403E41A327 /* Container.swift in Sources */, - 0AB70C33A6E75D0F25CB1D1A2C633F8D /* Extensions.swift in Sources */, - 2EADFD3DA1BCB3B822739B43E4795F9C /* FrameTag.swift in Sources */, - 5FF91E4A8D3170E2F65631AF78FD04DA /* Menu.swift in Sources */, - C4C6848DF2564757FCEDB7695D03D9E0 /* Menu+Model.swift in Sources */, - 35711D800BF76ABA65B59B97109B126E /* Menu+UIKit.swift in Sources */, - 67EBECDF77394D67F9C46CF47F36725E /* Modifiers.swift in Sources */, - 0A315A670640FAF5C6F37591EA182982 /* Popover.swift in Sources */, - 6AECA00FCF45C4B7C8ACB0EF189B9419 /* Popover+Lifecycle.swift in Sources */, - 6BF9D577654629D4F82F327DED51D33B /* Popover+Positioning.swift in Sources */, - F42DD8C8044872ED99F5E516FC760C49 /* PopoverContainerView.swift in Sources */, - D16985F1540BC8F62B3F8827D6A7B429 /* PopoverGestureContainer.swift in Sources */, - ADB368EA86941343CBBED3B375CE38E4 /* PopoverModel.swift in Sources */, - 2DD991BCE46DD01C11E1DF654DF046F5 /* Popovers.swift in Sources */, - 8BEEE65591B0DF2D6B52E2BD628E8407 /* Popovers-dummy.m in Sources */, - DB920FF3D8837B48879FAF4D45B5CF05 /* PopoverUtilities.swift in Sources */, - A09E15A046C0A82F3F0C26A715E986A2 /* PopoverWindows.swift in Sources */, - 47DE32AA030CDB56DC4591902F948E6B /* Readers.swift in Sources */, - E54C583C4DBFD52F831BD22B4F3FCF06 /* Shadow.swift in Sources */, - 67E9C6444041F88BB19DC538C1CF4595 /* Shapes.swift in Sources */, - C83BF7F193EE0C02AA93721511E470E4 /* Templates.swift in Sources */, + C168B53A5280CEEA2BFD680395CAF412 /* Pods-WunderLINQ-dummy.m in Sources */, ); runOnlyForDeploymentPostprocessing = 0; }; @@ -1191,42 +416,6 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - 8551461E2B851272AB2DBFB9AF90E74D /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - ); - runOnlyForDeploymentPostprocessing = 0; - }; - A7CAF5B8D46DDDF6A0261AA0A0DA09FB /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 5A4F378854ED42A4067BEEEBED4E0628 /* IASKAppSettingsViewController.m in Sources */, - 5739225BB71AFF17386BEED4A5D28F35 /* IASKAppSettingsWebViewController.m in Sources */, - 206ABF35676484B0199D4931A1777618 /* IASKColor.m in Sources */, - 9DBA33AFE13F00E6A9CF34D0EBD0F197 /* IASKDatePicker.m in Sources */, - B2A5E6347E2249084A485CD2599C366D /* IASKDatePickerViewCell.m in Sources */, - 6563BD0971EEF92E7E65203A20DABB2A /* IASKEmbeddedDatePickerViewCell.m in Sources */, - E76FB2CAF2C220732A888E33D02427B6 /* IASKMultipleValueSelection.m in Sources */, - 1FD62FC49184BF87446C332911ADC36C /* IASKPSSliderSpecifierViewCell.m in Sources */, - 5621DF660AEDD509DC64D8955479D41A /* IASKPSTextFieldSpecifierViewCell.m in Sources */, - 4E1D4C2C72405D0BBBB9E3D04A500A9E /* IASKSettingsReader.m in Sources */, - 79F53FC5428CB171F848C06C37917054 /* IASKSettingsStore.m in Sources */, - 8BE6DA431B8C64475F3DE20D563B6671 /* IASKSettingsStoreFile.m in Sources */, - D31E18C9CD11F54D54CA99E855044110 /* IASKSettingsStoreInMemory.m in Sources */, - 34C5581CFD72256B12754F00652EE6AB /* IASKSettingsStoreUserDefaults.m in Sources */, - 4A6C1B39749347F26316E908223863EA /* IASKSlider.m in Sources */, - BF89DD38649E18456157DF8173FE4A47 /* IASKSpecifier.m in Sources */, - 15A490367AD0CFEDEA3242D712D1039A /* IASKSpecifierValuesViewController.m in Sources */, - C0578FACECCB7A8A5D6998C47584EFEE /* IASKSwitch.m in Sources */, - 1F7CD35AA80C025F245CC0B13163DD99 /* IASKTextField.m in Sources */, - 3BF99526314FFEF40A149EC8FB67F227 /* IASKTextView.m in Sources */, - ADAB9AE375E5E8AC3BC3A49B0A8B7BF0 /* IASKTextViewCell.m in Sources */, - F39AD9C98EC2071DEF2BDE3076B1FDF1 /* InAppSettingsKit-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; AAAF24EE74E1B3B86A39ABCF391AC1E0 /* Sources */ = { isa = PBXSourcesBuildPhase; buildActionMask = 2147483647; @@ -1236,95 +425,25 @@ ); runOnlyForDeploymentPostprocessing = 0; }; - B0BE3CCC3416A02CF0D2D25867F12197 /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 2A21E091359267D7F985AF77312F45B7 /* Pods-WunderLINQ-dummy.m in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; - FC03CA6F651FCEFCE72C35F4005391DE /* Sources */ = { - isa = PBXSourcesBuildPhase; - buildActionMask = 2147483647; - files = ( - 8561A7139E2AAFBDCA9A26ABA45796B2 /* Converters.swift in Sources */, - CB6B0AD88496E6436BC8D22B494F751D /* CoreGPX-dummy.m in Sources */, - 1B8EDB17F6F552AADD6A4C0889CC45B7 /* DateTimeParsers.swift in Sources */, - 066F140F881A30F460D97B28176AC535 /* GPXAuthor.swift in Sources */, - 792FB4D78BDBE1495508A9C35CED6ADB /* GPXBounds.swift in Sources */, - 6ADD5D4FA0D791F419447FA08EB7D206 /* GPXCompression.swift in Sources */, - 90A48FA25FE82EAE6FC4B1F85F30DE4D /* GPXCopyright.swift in Sources */, - 88A8B381273D76D3EA808663A34017E3 /* GPXElement.swift in Sources */, - 17A2FB0CA678F74913D74DD693722EDC /* GPXEmail.swift in Sources */, - 928845D9C73A9B7CD079198BCD8262DF /* GPXError.swift in Sources */, - 172A875560ED4CCAAFD7BD59343620CD /* GPXExtensions.swift in Sources */, - 4B6684199FCBDFD2E1D1FB1AE2FE4E12 /* GPXExtensionsElement.swift in Sources */, - EAF96204B65771082CC3C995EEA68E5D /* GPXFix.swift in Sources */, - 0398B9327CEFE5409D9780F7AB2FB480 /* GPXLegacy.swift in Sources */, - 2209F75959A56AB2EDE4450F8B1C1934 /* GPXLink.swift in Sources */, - 575B1EC64934071D8BAC834BE27618D0 /* GPXMetadata.swift in Sources */, - 35E2A5FDB8F88903F7E8A799C5085819 /* GPXParser.swift in Sources */, - 0AE4791906FF6CF77A501001CA758CB5 /* GPXPerson.swift in Sources */, - 0D56EB72B99B01416542A3B1BB27A0DF /* GPXPoint.swift in Sources */, - 9F0164977868A7659754D91695F705D8 /* GPXPointSegment.swift in Sources */, - 86BEB8439E47AD82EDB5E2F6AE4B0EDD /* GPXRawElement.swift in Sources */, - D6CAAC8130A312DA26B8DDBA431A64FB /* GPXRoot.swift in Sources */, - 4E0B1FF2EBB5F6579FEA1727D1491D17 /* GPXRoute.swift in Sources */, - 2A3EC6BA307F9B79F7B7A22F39DB8EAC /* GPXRoutePoint.swift in Sources */, - A325289F545C0EBF0D025CFA1D2DDB84 /* GPXRouteProtocol.swift in Sources */, - 4702768004D49FD9CA1DEDDC1E733116 /* GPXTrack.swift in Sources */, - F612401B4C88DAF8001512DF0EB81AD8 /* GPXTrackPoint.swift in Sources */, - 94AC918CF449E8BB5B1DF83963D2EE1C /* GPXTrackSegment.swift in Sources */, - D1A8A5DFE5D4DB1AEC0A8306FA6B463B /* GPXWaypoint.swift in Sources */, - E62FF4C45D4885E0DBC36CEE65CC62B6 /* GPXWaypointProtocol.swift in Sources */, - 37A1850CD71CA0BF9E3CD9BCC30C6AA2 /* NSMutableString+XML.swift in Sources */, - ); - runOnlyForDeploymentPostprocessing = 0; - }; /* End PBXSourcesBuildPhase section */ /* Begin PBXTargetDependency section */ - 04D5E249E6D00DA009A58E76DB5041A9 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = InAppSettingsKit; - target = 5B4848122435F4C22D574A5DA6D2EFB3 /* InAppSettingsKit */; - targetProxy = 9AD2A6337D9716FE9868C65590B49233 /* PBXContainerItemProxy */; - }; - 0B7449E7C2DAADACD37B1653F1D0DE00 /* PBXTargetDependency */ = { + 61E3C6F9A354833B82EB63D9C8DDF102 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = UIMultiPicker; target = C29B8E66676DEE2FC332C8BE854A34BA /* UIMultiPicker */; - targetProxy = 5D16117131584B5A6834F1AC48AA70E7 /* PBXContainerItemProxy */; + targetProxy = CF8055952F124364B3A54719D6BCCFF1 /* PBXContainerItemProxy */; }; - 351A619302D67627EEF08D1F011CFA14 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = Popovers; - target = B748EFCD9F50067EF7DF853242BB3AB4 /* Popovers */; - targetProxy = 01F3243B03172433218CD4816A948E64 /* PBXContainerItemProxy */; - }; - 5101463198907B60ED87A5207AD58418 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = "InAppSettingsKit-InAppSettingsKit"; - target = 8A996938DFC560C0A3EF0DD6CA6B032A /* InAppSettingsKit-InAppSettingsKit */; - targetProxy = 9819C0410A052C1C44754F4F1EB6500A /* PBXContainerItemProxy */; - }; - B89FEF1FFED57BA6551BAA485AF568DD /* PBXTargetDependency */ = { + 6D5F3968B5BBDC6AFF59C76F5C7A8AA7 /* PBXTargetDependency */ = { isa = PBXTargetDependency; name = ChromaColorPicker; target = 7961A0F04FB3D96E3E703CF075D6DACD /* ChromaColorPicker */; - targetProxy = 08DEF155CE2899EB26D278596637B278 /* PBXContainerItemProxy */; - }; - DDAC8EB065CE08A31A234BC1E131C8A0 /* PBXTargetDependency */ = { - isa = PBXTargetDependency; - name = CoreGPX; - target = 493735E92C5B6068F445B48D0CA7B736 /* CoreGPX */; - targetProxy = B5F394FFA07FE735856CEF5743E8D7D3 /* PBXContainerItemProxy */; + targetProxy = 2EEED5753A544CE49F679D5829D2A427 /* PBXContainerItemProxy */; }; /* End PBXTargetDependency section */ /* Begin XCBuildConfiguration section */ - 2A1E3A2B811E39B65A05B499855068AA /* Release */ = { + 1FF0E443D0C832B51210E0BB47BC91A5 /* Release */ = { isa = XCBuildConfiguration; baseConfigurationReference = F59F27BFF82BC49099EE2D221CA623DA /* Pods-WunderLINQ.release.xcconfig */; buildSettings = { @@ -1362,44 +481,9 @@ }; name = Release; }; - 431676882F3567099F7EC77CB1B9E5FB /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8FF81D5AEBFFA884B39F8DE845F1A70D /* InAppSettingsKit.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/InAppSettingsKit/InAppSettingsKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/InAppSettingsKit/InAppSettingsKit-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/InAppSettingsKit/InAppSettingsKit.modulemap"; - PRODUCT_MODULE_NAME = InAppSettingsKit; - PRODUCT_NAME = InAppSettingsKit; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 4794C8D03FDA55115B0F96A00D382CE8 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = AFBE31EBA8C21D055550E8AD43C70BE9 /* UIMultiPicker.debug.xcconfig */; + baseConfigurationReference = 42EBB9161EE83F317C04E488F24209B3 /* UIMultiPicker.debug.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1497,109 +581,6 @@ }; name = Debug; }; - 55F655F0330A82755BE86758D60F3D36 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 821D52C94F6E441F57B341789E74F3D6 /* InAppSettingsKit.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/InAppSettingsKit/InAppSettingsKit-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/InAppSettingsKit/InAppSettingsKit-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/InAppSettingsKit/InAppSettingsKit.modulemap"; - PRODUCT_MODULE_NAME = InAppSettingsKit; - PRODUCT_NAME = InAppSettingsKit; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 6B8F604E162CA356889CABA42F8E0D7B /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 4E822A6CF1CC6B6E92A9E69BA1DECF0E /* CoreGPX.debug.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CoreGPX/CoreGPX-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CoreGPX/CoreGPX-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/CoreGPX/CoreGPX.modulemap"; - PRODUCT_MODULE_NAME = CoreGPX; - PRODUCT_NAME = CoreGPX; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - 81E5C72C910588DCDD194B6E8A38ABD5 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 73A2D70A20EDEACD402C364BF07EA1B7 /* CoreGPX.release.xcconfig */; - buildSettings = { - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/CoreGPX/CoreGPX-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/CoreGPX/CoreGPX-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/CoreGPX/CoreGPX.modulemap"; - PRODUCT_MODULE_NAME = CoreGPX; - PRODUCT_NAME = CoreGPX; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.0; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; 8B5A46FF8D3C1289CDEE3BAFACABCD2A /* Release */ = { isa = XCBuildConfiguration; buildSettings = { @@ -1662,26 +643,9 @@ }; name = Release; }; - A1AD03C39C930BA8BF1FE61A75ACDF69 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 821D52C94F6E441F57B341789E74F3D6 /* InAppSettingsKit.debug.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/InAppSettingsKit"; - IBSC_MODULE = InAppSettingsKit; - INFOPLIST_FILE = "Target Support Files/InAppSettingsKit/ResourceBundle-InAppSettingsKit-InAppSettingsKit-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - PRODUCT_NAME = InAppSettingsKit; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Debug; - }; A409E8124DAD154B0116381A97FD6418 /* Debug */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 41EC6D2EF2E593508B940414FDDA8B8A /* ChromaColorPicker.debug.xcconfig */; + baseConfigurationReference = 8C025BE8A39091774B12C165AAD11A00 /* ChromaColorPicker.debug.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1714,26 +678,9 @@ }; name = Debug; }; - BCC09EE7D945087C7DD3E0DE5950A382 /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 8FF81D5AEBFFA884B39F8DE845F1A70D /* InAppSettingsKit.release.xcconfig */; - buildSettings = { - CODE_SIGNING_ALLOWED = NO; - CONFIGURATION_BUILD_DIR = "$(BUILD_DIR)/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME)/InAppSettingsKit"; - IBSC_MODULE = InAppSettingsKit; - INFOPLIST_FILE = "Target Support Files/InAppSettingsKit/ResourceBundle-InAppSettingsKit-InAppSettingsKit-Info.plist"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - PRODUCT_NAME = InAppSettingsKit; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - TARGETED_DEVICE_FAMILY = "1,2"; - WRAPPER_EXTENSION = bundle; - }; - name = Release; - }; C2CC36DB9B444667FAB7C6891FB4846F /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = 63E56DD2B2B97D058C78DE06BAB06EE5 /* ChromaColorPicker.release.xcconfig */; + baseConfigurationReference = 0C38FBC9FAC8D20324DD7C475E0226BF /* ChromaColorPicker.release.xcconfig */; buildSettings = { CLANG_ENABLE_OBJC_WEAK = NO; "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; @@ -1767,42 +714,7 @@ }; name = Release; }; - C47A7853BC0368403DD4DDF906AA14E5 /* Debug */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = FF9E13E16E1C689B91C8CE000A3EFC5C /* Popovers.debug.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Popovers/Popovers-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Popovers/Popovers-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/Popovers/Popovers.modulemap"; - PRODUCT_MODULE_NAME = Popovers; - PRODUCT_NAME = Popovers; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.5; - TARGETED_DEVICE_FAMILY = "1,2"; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Debug; - }; - CC1F73110F8643282ED865F7609D7114 /* Debug */ = { + DA6DCB68BB6E52DF29C4D98E84EE77FD /* Debug */ = { isa = XCBuildConfiguration; baseConfigurationReference = E0C17EC28151E583D62BB32E1CAB1504 /* Pods-WunderLINQ.debug.xcconfig */; buildSettings = { @@ -1839,45 +751,9 @@ }; name = Debug; }; - E70964864638E8ED3A9FC7A7ECA449DF /* Release */ = { - isa = XCBuildConfiguration; - baseConfigurationReference = 0DA51D2D1B0A398AD4A0D82C274B67AE /* Popovers.release.xcconfig */; - buildSettings = { - CLANG_ENABLE_OBJC_WEAK = NO; - "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; - "CODE_SIGN_IDENTITY[sdk=watchos*]" = ""; - CURRENT_PROJECT_VERSION = 1; - DEFINES_MODULE = YES; - DYLIB_COMPATIBILITY_VERSION = 1; - DYLIB_CURRENT_VERSION = 1; - DYLIB_INSTALL_NAME_BASE = "@rpath"; - GCC_PREFIX_HEADER = "Target Support Files/Popovers/Popovers-prefix.pch"; - INFOPLIST_FILE = "Target Support Files/Popovers/Popovers-Info.plist"; - INSTALL_PATH = "$(LOCAL_LIBRARY_DIR)/Frameworks"; - IPHONEOS_DEPLOYMENT_TARGET = 14.0; - LD_RUNPATH_SEARCH_PATHS = ( - "$(inherited)", - "@executable_path/Frameworks", - "@loader_path/Frameworks", - ); - MODULEMAP_FILE = "Target Support Files/Popovers/Popovers.modulemap"; - PRODUCT_MODULE_NAME = Popovers; - PRODUCT_NAME = Popovers; - SDKROOT = iphoneos; - SKIP_INSTALL = YES; - SWIFT_ACTIVE_COMPILATION_CONDITIONS = "$(inherited) "; - SWIFT_VERSION = 5.5; - TARGETED_DEVICE_FAMILY = "1,2"; - VALIDATE_PRODUCT = YES; - VERSIONING_SYSTEM = "apple-generic"; - VERSION_INFO_PREFIX = ""; - }; - name = Release; - }; E78D2A44B53E759EFC2CD540A5C1F245 /* Release */ = { isa = XCBuildConfiguration; - baseConfigurationReference = EA0A22BF261EB4F5A728D3F12386734C /* UIMultiPicker.release.xcconfig */; + baseConfigurationReference = 1AD9198737C89F7533BC43B59DB121F2 /* UIMultiPicker.release.xcconfig */; buildSettings = { "CODE_SIGN_IDENTITY[sdk=appletvos*]" = ""; "CODE_SIGN_IDENTITY[sdk=iphoneos*]" = ""; @@ -1913,65 +789,29 @@ /* End XCBuildConfiguration section */ /* Begin XCConfigurationList section */ - 210327EC22A4A16605838CCC729898DE /* Build configuration list for PBXNativeTarget "UIMultiPicker" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4794C8D03FDA55115B0F96A00D382CE8 /* Debug */, - E78D2A44B53E759EFC2CD540A5C1F245 /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - 4BC7450F9457737EE3E637BA155B56F7 /* Debug */, - 8B5A46FF8D3C1289CDEE3BAFACABCD2A /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - 7B5D2AB8299E3E97B54A3C095F7919F7 /* Build configuration list for PBXNativeTarget "InAppSettingsKit-InAppSettingsKit" */ = { + 14DC5D4C4C227B364A8D20ADD73B9693 /* Build configuration list for PBXNativeTarget "Pods-WunderLINQ" */ = { isa = XCConfigurationList; buildConfigurations = ( - A1AD03C39C930BA8BF1FE61A75ACDF69 /* Debug */, - BCC09EE7D945087C7DD3E0DE5950A382 /* Release */, + DA6DCB68BB6E52DF29C4D98E84EE77FD /* Debug */, + 1FF0E443D0C832B51210E0BB47BC91A5 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - 8E96D1FDA78D8D8C34CD91EEC9791EA0 /* Build configuration list for PBXNativeTarget "Pods-WunderLINQ" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - CC1F73110F8643282ED865F7609D7114 /* Debug */, - 2A1E3A2B811E39B65A05B499855068AA /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - A7032E455707DD8D0CC26CAC9DE9BDF2 /* Build configuration list for PBXNativeTarget "Popovers" */ = { - isa = XCConfigurationList; - buildConfigurations = ( - C47A7853BC0368403DD4DDF906AA14E5 /* Debug */, - E70964864638E8ED3A9FC7A7ECA449DF /* Release */, - ); - defaultConfigurationIsVisible = 0; - defaultConfigurationName = Release; - }; - E3E118CB11A5DB1D2A8E0304E3AC5540 /* Build configuration list for PBXNativeTarget "CoreGPX" */ = { + 210327EC22A4A16605838CCC729898DE /* Build configuration list for PBXNativeTarget "UIMultiPicker" */ = { isa = XCConfigurationList; buildConfigurations = ( - 6B8F604E162CA356889CABA42F8E0D7B /* Debug */, - 81E5C72C910588DCDD194B6E8A38ABD5 /* Release */, + 4794C8D03FDA55115B0F96A00D382CE8 /* Debug */, + E78D2A44B53E759EFC2CD540A5C1F245 /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; }; - F2E3E0F7C38AF8A9553FE5EDC42446C6 /* Build configuration list for PBXNativeTarget "InAppSettingsKit" */ = { + 4821239608C13582E20E6DA73FD5F1F9 /* Build configuration list for PBXProject "Pods" */ = { isa = XCConfigurationList; buildConfigurations = ( - 55F655F0330A82755BE86758D60F3D36 /* Debug */, - 431676882F3567099F7EC77CB1B9E5FB /* Release */, + 4BC7450F9457737EE3E637BA155B56F7 /* Debug */, + 8B5A46FF8D3C1289CDEE3BAFACABCD2A /* Release */, ); defaultConfigurationIsVisible = 0; defaultConfigurationName = Release; diff --git a/Pods/Popovers/LICENSE b/Pods/Popovers/LICENSE deleted file mode 100644 index e1003beb..00000000 --- a/Pods/Popovers/LICENSE +++ /dev/null @@ -1,21 +0,0 @@ -MIT License - -Copyright (c) 2022 A. Zheng - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. diff --git a/Pods/Popovers/README.md b/Pods/Popovers/README.md deleted file mode 100644 index 0ea9b917..00000000 --- a/Pods/Popovers/README.md +++ /dev/null @@ -1,955 +0,0 @@ -![Header Image](Assets/Header.png) - -# Popovers -A library to present popovers. - -- Present **any** view above your app's main content. -- Attach to source views or use picture-in-picture positioning. -- Display multiple popovers at the same time with smooth transitions. -- Supports SwiftUI, UIKit, and multitasking windows on iPadOS. -- Highly customizable API that's super simple — just add `.popover`. -- Drop-in replacement for iOS 14's `Menu` that works on iOS 13. -- SwiftUI-based core for a lightweight structure. 0 dependencies. -- It's 2022 — about time that popovers got interesting! - -## Showroom - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
-Alert - -Color - -Menu - -Tip - -Standard -
-Alert - -Color - -Menu - -Tip - -Standard -
-Tutorial - -Picture-in-Picture - -Notification -
-Tutorial - -Picture in Picture - -Notification -
- -## Example -I wrote the example app with Swift Playgrounds 4, so you can run it right on your iPad. If you're using a Mac, download the Xcode version. [Download for Swift Playgrounds 4](https://github.com/aheze/Popovers/raw/main/Examples/PopoversPlaygroundsApp.swiftpm.zip) • [Download for Xcode](https://github.com/aheze/Popovers/raw/main/Examples/PopoversXcodeApp.zip) - -![Example app](Assets/ExampleApp.png) - -## Installation -Requires iOS 13+. Popovers can be installed through the [Swift Package Manager](https://developer.apple.com/documentation/swift_packages/adding_package_dependencies_to_your_app) (recommended) or [Cocoapods](https://cocoapods.org/). - - - - - - - - - - - -
- -Swift Package Manager - -
-Add the Package URL: -
- -Cocoapods - -
-Add this to your Podfile: -
-
- -``` -https://github.com/aheze/Popovers -``` -
-
- -``` -pod 'Popovers' -``` -
- - - -## Usage - -To present a popover in SwiftUI, use the `.popover(present:attributes:view)` modifier. By default, the popover uses its parent view as the source frame. - -```swift -import SwiftUI -import Popovers - -struct ContentView: View { - @State var present = false - - var body: some View { - Button("Present popover!") { - present = true - } - .popover(present: $present) { /// here! - Text("Hi, I'm a popover.") - .padding() - .foregroundColor(.white) - .background(.blue) - .cornerRadius(16) - } - } -} -``` - -In UIKit, create a `Popover` instance, then present with `UIViewController.present(_:)`. You should also set the source frame. - -```swift -import SwiftUI -import Popovers - -class ViewController: UIViewController { - @IBOutlet weak var button: UIButton! - @IBAction func buttonPressed(_ sender: Any) { - var popover = Popover { PopoverView() } - popover.attributes.sourceFrame = { [weak button] in - button.windowFrame() - } - - present(popover) /// here! - } -} - -struct PopoverView: View { - var body: some View { - Text("Hi, I'm a popover.") - .padding() - .foregroundColor(.white) - .background(.blue) - .cornerRadius(16) - } -} -``` - -Button 'Present popover!' with a popover underneath. - -
- -## Customization -| [🔖](https://github.com/aheze/Popovers#tag--string)  | [💠](https://github.com/aheze/Popovers#position--position)  | [⬜](https://github.com/aheze/Popovers#source-frame-----cgrect)  | [🔲](https://github.com/aheze/Popovers#source-frame-inset--uiedgeinsets)  | [⏹](https://github.com/aheze/Popovers#screen-edge-padding--uiedgeinsets)  | [🟩](https://github.com/aheze/Popovers#presentation--presentation)  | [🟥](https://github.com/aheze/Popovers#dismissal--dismissal)  | [🎾](https://github.com/aheze/Popovers#rubber-banding-mode--rubberbandingmode)  | [🛑](https://github.com/aheze/Popovers#blocks-background-touches--bool)  | [👓](https://github.com/aheze/Popovers#accessibility--accessibility--v120)  | [👉](https://github.com/aheze/Popovers#on-tap-outside-----void)  | [🎈](https://github.com/aheze/Popovers#on-dismiss-----void)  | [🔰](https://github.com/aheze/Popovers#on-context-change--context---void)  | -| --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | - -Customize popovers through the `Attributes` struct. Pretty much everything is customizable, including positioning, animations, and dismissal behavior. - - - - - - - - - - - -
- -SwiftUI - -
-Configure in the attributes parameter. -
- -UIKit - -
-Modify the attributes property. -
-
- -```swift -.popover( - present: $present, - attributes: { - $0.position = .absolute( - originAnchor: .bottom, - popoverAnchor: .topLeft - ) - } -) { - Text("Hi, I'm a popover.") -} -``` -
-
- -```swift -var popover = Popover { - Text("Hi, I'm a popover.") -} - -popover.attributes.position = .absolute( - originAnchor: .bottom, - popoverAnchor: .topLeft -) - -present(popover) -``` -
- -### 🔖 Tag • `AnyHashable?` -Tag popovers to access them later from anywhere. This is useful for updating existing popovers. - -```swift -/// Set the tag. -$0.tag = "Your Tag" - -/// Access it later. -let popover = popover(tagged: "Your Tag") /// Where `self` is a `UIView` or `UIViewController`. - -/// If inside a SwiftUI View, use a `WindowReader`: -WindowReader { window in - let popover = window.popover(tagged: "Your Tag") -} -``` - -**Note:** When you use the `.popover(selection:tag:attributes:view:)` modifier, this `tag` is automatically set to what you provide in the parameter. - -### 💠 Position • `Position` -The popover's position can either be `.absolute` (attached to a view) or `.relative` (picture-in-picture). The enum's associated value additionally configures which sides and corners are used. - -- `Anchor`s represent sides and corners. -- For `.absolute`, provide the origin anchor and popover anchor. -- For `.relative`, provide the popover anchors. If there's multiple, the user will be able to drag between them like a PIP. - -Anchor Reference | `.absolute(originAnchor: .bottom, popoverAnchor: .topLeft)` | `.relative(popoverAnchors: [.right])` ---- | --- | --- -![](Assets/Anchors.png) | ![](Assets/Absolute.png) | ![](Assets/Relative.png) - -### ⬜ Source Frame • `(() -> CGRect)` -This is the frame that the popover attaches to or is placed within, depending on its position. This must be in global window coordinates. Because frames are can change so often, this property is a closure. Whenever the device rotates or some other bounds update happens, the closure will be called. - - - - - - - - - - - - -
- -SwiftUI - -
-By default, the source frame is automatically set to the parent view. Setting this will override it. -
- -UIKit - -
-It's highly recommended to provide a source frame, otherwise the popover will appear in the top-left of the screen. -
-
- -```swift -$0.sourceFrame = { - /** some CGRect here */ -} -``` -
-
- -```swift - /// use `weak` to prevent a retain cycle -attributes.sourceFrame = { [weak button] in - button.windowFrame() -} -``` -
- -### 🔲 Source Frame Inset • `UIEdgeInsets` -Edge insets to apply to the source frame. Positive values inset the frame, negative values expand it. - -Absolute | Relative ---- | --- -![Source view has padding around it, so the popover is offset down.](Assets/SourceFrameInsetAbsolute.png) | ![Source view is inset, so the popover is brought more towards the center of the screen.](Assets/SourceFrameInsetRelative.png) - -### ⏹ Screen Edge Padding • `UIEdgeInsets` -Global insets for all popovers to prevent them from overflowing off the screen. Kind of like a safe area. Default value is `UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16)`. - -### 🟩 Presentation • `Presentation` -This property stores the animation and transition that's applied when the popover appears. - -```swift -/// Default values: -$0.presentation.animation = .easeInOut -$0.presentation.transition = .opacity -``` - -### 🟥 Dismissal • `Dismissal` -This property stores the popover's dismissal behavior. There's a couple sub-properties here. - -```swift -/// Same thing as `Presentation`. -$0.dismissal.animation = .easeInOut -$0.dismissal.transition = .opacity - -/// Advanced stuff! Here's their default values: -$0.dismissal.mode = .tapOutside -$0.dismissal.tapOutsideIncludesOtherPopovers = false -$0.dismissal.excludedFrames = { [] } -$0.dismissal.dragMovesPopoverOffScreen = true -$0.dismissal.dragDismissalProximity = CGFloat(0.25) -``` - -**Mode:** Configure how the popover should auto-dismiss. You can have multiple at the same time! -- `.tapOutside` - dismiss the popover when the user taps outside it. -- `.dragDown` - dismiss the popover when the user drags it down. -- `.dragUp` - dismiss the popover when the user drags it up. -- `.none` - don't automatically dismiss the popover. - -**Tap Outside Includes Other Popovers:** Only applies when `mode` is `.tapOutside`. If this is enabled, the popover will be dismissed when the user taps outside, **even when another presented popover is what's tapped**. Normally when you tap another popover that's presented, the current one will not dismiss. - -**Excluded Frames:** Only applies when `mode` is `.tapOutside`. When the user taps outside the popover, but the tap lands on one of these frames, the popover will stay presented. If you want multiple popovers, you should set the source frames of your other popovers as the excluded frames. - -```swift -/// Set one popover's source frame as the other's excluded frame. -/// This prevents the the current popover from being dismissed before animating to the other one. - -let popover1 = Popover { Text("Hello") } -popover1.attributes.sourceFrame = { [weak button1] in button1.windowFrame() } -popover1.attributes.dismissal.excludedFrames = { [weak button2] in [ button2.windowFrame() ] } - -let popover2 = Popover { Text("Hello") } -popover2.attributes.sourceFrame = { [weak button2] in button2.windowFrame() } -popover2.attributes.dismissal.excludedFrames = { [weak button1] in [ button1.windowFrame() ] } -``` - -**Drag Moves Popover Off Screen:** Only applies when `mode` is `.dragDown` or `.dragUp`. If this is enabled, the popover will continue moving off the screen after the user drags. - -**Drag Dismissal Proximity:** Only applies when `mode` is `.dragDown` or `.dragUp`. Represents the point on the screen that the drag must reach in order to auto-dismiss. This property is multiplied by the screen's height. - - -Diagram with the top 25% of the screen highlighted in blue. - - -### 🎾 Rubber Banding Mode • `RubberBandingMode` -Configures which axes the popover can "rubber-band" on when dragged. The default is `[.xAxis, .yAxis]`. - -- `.xAxis` - enable rubber banding on the x-axis. -- `.yAxis` - enable rubber banding on the y-axis. -- `.none` - disable rubber banding. - -### 🛑 Blocks Background Touches • `Bool` -Set this to true to prevent underlying views from being pressed. - -Popover overlaid over some buttons. Tapping on the buttons has no effect. - -### 👓 Accessibility • `Accessibility` • [*`v1.2.0`*](https://github.com/aheze/Popovers/releases/tag/1.2.0) -Popovers is fully accessible! The `Accessibility` struct provides additional options for how VoiceOver should read out content. - -```swift -/// Default values: -$0.accessibility.shiftFocus = true -$0.accessibility.dismissButtonLabel = defaultDismissButtonLabel /// An X icon wrapped in `AnyView?` -``` -**Shift Focus:** If enabled, VoiceOver will focus the popover as soon as it's presented. - -**Dismiss Button Label:** A button next to the popover that appears when VoiceOver is on. By default, this is an X circle. - -| VoiceOver highlights the popover, which has a X button next to id. | -| --- | - -Tip: You can also use the accessibility escape gesture (a 2-fingered Z-shape swipe) to dismiss all popovers. - -### 👉 On Tap Outside • `(() -> Void)?` -A closure that's called whenever the user taps outside the popover. - -### 🎈 On Dismiss • `(() -> Void)?` -A closure that's called when the popover is dismissed. - -### 🔰 On Context Change • `((Context) -> Void)?` -A closure that's called whenever the context changed. The context contains the popover's attributes, current frame, and other visible traits. - -
- -## Utilities -| [📘](https://github.com/aheze/Popovers#menus)  | [🧩](https://github.com/aheze/Popovers#animating-between-popovers)  | [🌃](https://github.com/aheze/Popovers#background)  | [📖](https://github.com/aheze/Popovers#popover-reader)  | [🏷](https://github.com/aheze/Popovers#frame-tags)  | [📄](https://github.com/aheze/Popovers#templates)  | -| --- | --- | --- | --- | --- | --- | - -Popovers comes with some features to make your life easier. - -### 📘 Menus -New in [v1.3.0](https://github.com/aheze/Popovers/releases/tag/1.3.0)! The template `Menu` looks and behaves pretty much exactly like the system menu, but also works on iOS 13. It's also extremely customizable with support for manual presentation and custom views. - -| The system menu and Popovers' custom menu, side by side | -| --- | - -
-SwiftUI (Basic) - -```swift -struct ContentView: View { - var body: some View { - Templates.Menu { - Templates.MenuButton(title: "Button 1", systemImage: "1.circle.fill") { print("Button 1 pressed") } - Templates.MenuButton(title: "Button 2", systemImage: "2.circle.fill") { print("Button 2 pressed") } - } label: { fade in - Text("Present Menu!") - .opacity(fade ? 0.5 : 1) - } - } -} -``` - -
- -
-SwiftUI (Customized) - -```swift -Templates.Menu( - configuration: { - $0.width = 360 - $0.backgroundColor = .blue.opacity(0.2) - } -) { - Text("Hi, I'm a menu!") - .padding() - - Templates.MenuDivider() - - Templates.MenuItem { - print("Item tapped") - } label: { fade in - Color.clear.overlay( - AsyncImage(url: URL(string: "https://getfind.app/image.png")) { - $0.resizable().aspectRatio(contentMode: .fill) - } placeholder: { - Color.clear - } - ) - .frame(height: 180) - .clipped() - .opacity(fade ? 0.5 : 1) - } - -} label: { fade in - Text("Present Menu!") - .opacity(fade ? 0.5 : 1) -} -``` - -
- -
-SwiftUI (Manual Presentation) - -```swift -struct ContentView: View { - @State var present = false - var body: some View { - VStack { - Toggle("Activate", isOn: $present) - .padding() - .background(.regularMaterial) - .cornerRadius(12) - .padding() - - Templates.Menu(present: $present) { - Templates.MenuButton(title: "Button 1", systemImage: "1.circle.fill") { print("Button 1 pressed") } - Templates.MenuButton(title: "Button 2", systemImage: "2.circle.fill") { print("Button 2 pressed") } - } label: { fade in - Text("Present Menu!") - .opacity(fade ? 0.5 : 1) - } - } - } -} -``` - -
- -
-UIKit (Basic) - -```swift -class ViewController: UIViewController { - @IBOutlet var label: UILabel! - - lazy var menu = Templates.UIKitMenu(sourceView: label) { - Templates.MenuButton(title: "Button 1", systemImage: "1.circle.fill") { print("Button 1 pressed") } - Templates.MenuButton(title: "Button 2", systemImage: "2.circle.fill") { print("Button 2 pressed") } - } fadeLabel: { [weak self] fade in - self?.label.alpha = fade ? 0.5 : 1 - } - - override func viewDidLoad() { - super.viewDidLoad() - _ = menu /// Create the menu. - } -} -``` - -
- - -
-UIKit (Customized) - -```swift -class ViewController: UIViewController { - @IBOutlet var label: UILabel! - - lazy var menu = Templates.UIKitMenu( - sourceView: label, - configuration: { - $0.width = 360 - $0.backgroundColor = .blue.opacity(0.2) - } - ) { - Text("Hi, I'm a menu!") - .padding() - - Templates.MenuDivider() - - Templates.MenuItem { - print("Item tapped") - } label: { fade in - Color.clear.overlay( - AsyncImage(url: URL(string: "https://getfind.app/image.png")) { - $0.resizable().aspectRatio(contentMode: .fill) - } placeholder: { - Color.clear - } - ) - .frame(height: 180) - .clipped() - .opacity(fade ? 0.5 : 1) - } - } fadeLabel: { [weak self] fade in - UIView.animate(withDuration: 0.15) { - self?.label.alpha = fade ? 0.5 : 1 - } - } - - override func viewDidLoad() { - super.viewDidLoad() - _ = menu /// Create the menu. - } -} - -``` - -
- -
-UIKit (Manual Presentation) - -```swift -class ViewController: UIViewController { - /// ... - - @IBAction func switchPressed(_ sender: UISwitch) { - if menu.isPresented { - menu.dismiss() - } else { - menu.present() - } - } -} -``` - -
- - -Basic | Customized | Manual Activation ---- | --- | --- -![Menu with 2 buttons](Assets/MenuBasic.png) | ![Menu with image and divider](Assets/MenuCustomized.png) | ![Manually activate the menu with a toggle switch](Assets/MenuManual.png) - - -### 🧩 Animating Between Popovers -As long as the view structure is the same, you can smoothly transition from one popover to another. - - - - - - - - - - - -
- -SwiftUI - -
-Use the .popover(selection:tag:attributes:view:) modifier. -
- -UIKit - -
-Get the existing popover using UIResponder.popover(tagged:), then call UIResponder.replace(_:with:). -
-
- -```swift -struct ContentView: View { - @State var selection: String? - - var body: some View { - HStack { - Button("Present First Popover") { selection = "1" } - .popover(selection: $selection, tag: "1") { - - /// Will be presented when selection == "1". - Text("Hi, I'm a popover.") - .background(.blue) - } - - Button("Present Second Popover") { selection = "2" } - .popover(selection: $selection, tag: "2") { - - /// Will be presented when selection == "2". - Text("Hi, I'm a popover.") - .background(.green) - } - } - } -} -``` -
-
- -```swift -@IBAction func button1Pressed(_ sender: Any) { - var newPopover = Popover { Text("Hi, I'm a popover.").background(.blue) } - newPopover.attributes.sourceFrame = { [weak button1] in button1.windowFrame() } - newPopover.attributes.dismissal.excludedFrames = { [weak button2] in [button2.windowFrame()] } - newPopover.attributes.tag = "Popover 1" - - if let oldPopover = popover(tagged: "Popover 2") { - replace(oldPopover, with: newPopover) - } else { - present(newPopover) /// Present if the old popover doesn't exist. - } -} -@IBAction func button2Pressed(_ sender: Any) { - var newPopover = Popover { Text("Hi, I'm a popover.").background(.green) } - newPopover.attributes.sourceFrame = { [weak button2] in button2.windowFrame() } - newPopover.attributes.dismissal.excludedFrames = { [weak button1] in [button1.windowFrame()] } - newPopover.attributes.tag = "Popover 2" - - if let oldPopover = popover(tagged: "Popover 1") { - replace(oldPopover, with: newPopover) - } else { - present(newPopover) - } -} -``` -
- -| Smooth transition between popovers (from blue to green and back. | -| --- | - -### 🌃 Background -You can put anything in a popover's background. - - - - - - - - - - - -
- -SwiftUI - -
-Use the .popover(present:attributes:view:background:) modifier. -
- -UIKit - -
-Use the Popover(attributes:view:background:) initializer. -
-
- -```swift -.popover(present: $present) { - PopoverView() -} background: { /// here! - Color.green.opacity(0.5) -} -``` -
-
- -```swift -var popover = Popover { - PopoverView() -} background: { /// here! - Color.green.opacity(0.5) -} -``` -
- -Green background over the entire screen, but underneath the popover - - -### 📖 Popover Reader -This reads the popover's context, which contains its frame, window, attributes, and various other properties. It's kind of like [`GeometryReader`](https://www.hackingwithswift.com/quick-start/swiftui/how-to-provide-relative-sizes-using-geometryreader), but cooler. You can put it in the popover's view or its background. - -```swift -.popover(present: $present) { - PopoverView() -} background: { - PopoverReader { context in - Path { - $0.move(to: context.frame.point(at: .bottom)) - $0.addLine(to: context.windowBounds.point(at: .bottom)) - } - .stroke(Color.blue, lineWidth: 4) - } -} -``` - -| Line connects the bottom of the popover with the bottom of the screen | -| --- | - -### 🏷 Frame Tags -Popovers includes a mechanism for tagging and reading SwiftUI view frames. You can use this to provide a popover's `sourceFrame` or `excludedFrames`. Also works great when combined with `PopoverReader`, for connecting lines with anchor views. - -```swift -Text("This is a view") - .frameTag("Your Tag Name") /// Adds a tag inside the window. - -/// ... - -WindowReader { window in - Text("Click me!") - .popover( - present: $present, - attributes: { - $0.sourceFrame = window.frameTagged("Your Tag Name") /// Retrieves a tag from the window. - } - ) -} -``` - - -### 📄 Templates -Get started quickly with some templates. All of them are inside [`Templates`](Sources/Templates) with example usage in the example app. - -- `AlertButtonStyle` - a button style resembling a system alert. -- `VisualEffectView` - lets you use UIKit blurs in SwiftUI. -- `Container` - a wrapper view for the `BackgroundWithArrow` shape. -- `Shadow` - an easier way to apply shadows. -- `BackgroundWithArrow` - a shape with an arrow that looks like the system popover. -- `CurveConnector` - an animatable shape with endpoints that you can set. -- `Menu` - the system menu, but built from scratch. - -
- -## Notes -### State Re-Rendering -If you directly pass a variable down to the popover's view, it might not update. Instead, move the view into its own struct and pass down a `Binding`. - - - - - - - - - - - -
- -Yes - -
-The popover's view is in a separate struct, with $string passed down. -
- -No - -
-The button is directly inside the view parameter and receives string. -
-
- -```swift -struct ContentView: View { - @State var present = false - @State var string = "Hello, I'm a popover." - - var body: some View { - Button("Present popover!") { present = true } - .popover(present: $present) { - PopoverView(string: $string) /// Pass down a Binding ($). - } - } -} - -/// Create a separate view to ensure that the button updates. -struct PopoverView: View { - @Binding var string: String - - var body: some View { - Button(string) { string = "The string changed." } - .background(.mint) - .cornerRadius(16) - } -} -``` -
-
- -```swift -struct ContentView: View { - @State var present = false - @State var string = "Hello, I'm a popover." - - var body: some View { - Button("Present popover!") { - present = true - } - .popover(present: $present) { - - /// Directly passing down the variable (without $) is unsupported. - /// The button might not update. - Button(string) { - string = "The string changed." - } - .background(.mint) - .cornerRadius(16) - } - } -} -``` -
- -### Supporting Multiple Screens • [*`v1.1.0`*](https://github.com/aheze/Popovers/releases/tag/1.1.0) -Popovers comes with built-in support for multiple screens, but retrieving frame tags requires a reference to the hosting window. You can get this via `WindowReader` or `PopoverReader`'s context. - -```swift -WindowReader { window in - -} - -/// If inside a popover's `view` or `background`, use `PopoverReader` instead. -PopoverReader { context in - let window = context.window -} -``` - -### Popover Hierarchy -Manage a popover's z-axis level by attaching [`.zIndex(_:)`](https://developer.apple.com/documentation/swiftui/view/zindex(_:)) to its view. A higher index will bring it forwards. - - -## Community -### Author -Popovers is made by [aheze](https://github.com/aheze). - -### Contributing -All contributions are welcome. Just [fork](https://github.com/aheze/Popovers/fork) the repo, then make a pull request. - -### Need Help? -Open an [issue](https://github.com/aheze/Popovers/issues) or join the [Discord server](https://discord.com/invite/Pmq8fYcus2). You can also ping me on [Twitter](https://twitter.com/aheze0). Or read the source code — there's lots of comments. - -## License - -``` -MIT License - -Copyright (c) 2022 A. Zheng - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. -``` diff --git a/Pods/Popovers/Sources/Popover+Lifecycle.swift b/Pods/Popovers/Sources/Popover+Lifecycle.swift deleted file mode 100644 index 2e2be379..00000000 --- a/Pods/Popovers/Sources/Popover+Lifecycle.swift +++ /dev/null @@ -1,178 +0,0 @@ -// -// Popover+Lifecycle.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 1/4/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/** - Present a popover. - */ -public extension Popover { - /** - Present a popover in a window. It may be easier to use the `UIViewController.present(_:)` convenience method instead. - */ - internal func present(in window: UIWindow) { - /// Create a transaction for the presentation animation. - let transaction = Transaction(animation: attributes.presentation.animation) - - /// Inject the transaction into the popover, so following frame calculations are animated smoothly. - context.transaction = transaction - - /// Get the popover model that's tied to the window. - let model = window.popoverModel - - /** - Add the popover to the container view. - */ - func displayPopover(in container: PopoverGestureContainer) { - withTransaction(transaction) { - model.add(self) - - /// Stop VoiceOver from reading out background views if `blocksBackgroundTouches` is true. - if attributes.blocksBackgroundTouches { - container.accessibilityViewIsModal = true - } - - /// Shift VoiceOver focus to the popover. - if attributes.accessibility.shiftFocus { - UIAccessibility.post(notification: .screenChanged, argument: nil) - } - } - } - - /// Find the existing container view for popovers in this window. If it does not exist, we need to insert one. - let container: PopoverGestureContainer - if let existingContainer = window.popoverContainerView { - container = existingContainer - - /// The container is already laid out in the window, so we can go ahead and show the popover. - displayPopover(in: container) - } else { - container = PopoverGestureContainer(frame: window.bounds) - - /** - Wait until the container is present in the view hierarchy before showing the popover, - otherwise all the layout math will be working with wonky frames. - */ - container.onMovedToWindow = { [weak container] in - if let container = container { - displayPopover(in: container) - } - } - - window.addSubview(container) - } - - /// Hang on to the container for future dismiss/replace actions. - context.presentedPopoverContainer = container - } - - /** - Dismiss a popover. - - - parameter transaction: An optional transaction that can be applied for the dismissal animation. - */ - func dismiss(transaction: Transaction? = nil) { - guard let container = context.presentedPopoverContainer else { return } - - let model = container.popoverModel - let dismissalTransaction = transaction ?? Transaction(animation: attributes.dismissal.animation) - - /// Clean up the container view controller if no more popovers are visible. - context.onDisappear = { [weak context] in - if model.popovers.isEmpty { - context?.presentedPopoverContainer?.removeFromSuperview() - context?.presentedPopoverContainer = nil - } - - /// If at least one popover has `blocksBackgroundTouches` set to true, stop VoiceOver from reading out background views - context?.presentedPopoverContainer?.accessibilityViewIsModal = model.popovers.contains { $0.attributes.blocksBackgroundTouches } - } - - /// Remove this popover from the view model, dismissing it. - withTransaction(dismissalTransaction) { - model.remove(self) - } - - /// Let the internal SwiftUI modifiers know that the popover was automatically dismissed. - context.onAutoDismiss?() - - /// Let the client know that the popover was automatically dismissed. - attributes.onDismiss?() - } - - /** - Replace this popover with another popover smoothly. - */ - func replace(with newPopover: Popover) { - guard let popoverContainerViewController = context.presentedPopoverContainer else { return } - - let model = popoverContainerViewController.popoverModel - - /// Get the index of the previous popover. - if let oldPopoverIndex = model.index(of: self) { - /// Get the old popover's context. - let oldContext = model.popovers[oldPopoverIndex].context - - /// Create a new transaction for the replacing animation. - let transaction = Transaction(animation: newPopover.attributes.presentation.animation) - - /// Inject the transaction into the new popover, so following frame calculations are animated smoothly. - newPopover.context.transaction = transaction - - /// Use the same `UIViewController` presenting the previous popover, so we animate the popover in the same container. - newPopover.context.presentedPopoverContainer = oldContext.presentedPopoverContainer - - /// Use same ID so that SwiftUI animates the change. - newPopover.context.id = oldContext.id - - withTransaction(transaction) { - /// Temporarily use the same size for a smooth animation. - newPopover.updateFrame(with: oldContext.size) - - /// Replace the old popover with the new popover. - model.popovers[oldPopoverIndex] = newPopover - } - } - } -} - -public extension UIResponder { - /// Replace a popover with another popover. Convenience method for `Popover.replace(with:)`. - func replace(_ oldPopover: Popover, with newPopover: Popover) { - oldPopover.replace(with: newPopover) - } - - /// Dismiss a popover. Convenience method for `Popover.dismiss(transaction:)`. - func dismiss(_ popover: Popover) { - popover.dismiss() - } -} - -public extension UIViewController { - /// Present a `Popover` using this `UIViewController` as its presentation context. - func present(_ popover: Popover) { - guard let window = view.window else { return } - popover.present(in: window) - } -} - -extension UIView { - var popoverContainerView: PopoverGestureContainer? { - if let container = self as? PopoverGestureContainer { - return container - } else { - for subview in subviews { - if let container = subview.popoverContainerView { - return container - } - } - - return nil - } - } -} diff --git a/Pods/Popovers/Sources/Popover+Positioning.swift b/Pods/Popovers/Sources/Popover+Positioning.swift deleted file mode 100644 index f7fce3bd..00000000 --- a/Pods/Popovers/Sources/Popover+Positioning.swift +++ /dev/null @@ -1,295 +0,0 @@ -// -// Popover+Positioning.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/** - Extensions for popover positioning. - */ -public extension CGRect { - /// The point at an anchor. - /** - - topLeft top topRight - X──────────────X──────────────X - | | - | | - left X center X right - | | - | | - X──────────────X──────────────X - bottomLeft bottom bottomRight - - */ - func point(at anchor: Popover.Attributes.Position.Anchor) -> CGPoint { - switch anchor { - case .topLeft: - return origin - case .top: - return CGPoint( - x: origin.x + width / 2, - y: origin.y - ) - case .topRight: - return CGPoint( - x: origin.x + width, - y: origin.y - ) - case .right: - return CGPoint( - x: origin.x + width, - y: origin.y + height / 2 - ) - case .bottomRight: - return CGPoint( - x: origin.x + width, - y: origin.y + height - ) - case .bottom: - return CGPoint( - x: origin.x + width / 2, - y: origin.y + height - ) - case .bottomLeft: - return CGPoint( - x: origin.x, - y: origin.y + height - ) - case .left: - return CGPoint( - x: origin.x, - y: origin.y + height / 2 - ) - case .center: - return CGPoint( - x: origin.x + width / 2, - y: origin.y + height / 2 - ) - } - } -} - -public extension Popover.Attributes.Position { - /** - Get the frame of a popover if it's position is `.absolute`. - - parameter originAnchor: The popover's origin anchor. - - parameter popoverAnchor: The anchor of the popover that attaches to `originAnchor`. - - parameter originFrame: The source frame. - - parameter popoverSize: The size of the popover. - */ - func absoluteFrame( - originAnchor: Anchor, - popoverAnchor: Anchor, - originFrame: CGRect, - popoverSize: CGSize - ) -> CGRect { - /// Get the origin point from the origin frame. - let popoverOrigin = originFrame.point(at: originAnchor) - - /// Adjust `popoverOrigin` to account for `popoverAnchor.` - switch popoverAnchor { - case .topLeft: - return CGRect( - origin: popoverOrigin, - size: popoverSize - ) - case .top: - return CGRect( - origin: popoverOrigin - CGPoint(x: popoverSize.width / 2, y: 0), - size: popoverSize - ) - case .topRight: - return CGRect( - origin: popoverOrigin - CGPoint(x: popoverSize.width, y: 0), - size: popoverSize - ) - case .right: - return CGRect( - origin: popoverOrigin - CGPoint(x: popoverSize.width, y: popoverSize.height / 2), - size: popoverSize - ) - case .bottomRight: - return CGRect( - origin: popoverOrigin - CGPoint(x: popoverSize.width, y: popoverSize.height), - size: popoverSize - ) - case .bottom: - return CGRect( - origin: popoverOrigin - CGPoint(x: popoverSize.width / 2, y: popoverSize.height), - size: popoverSize - ) - case .bottomLeft: - return CGRect( - origin: popoverOrigin - CGPoint(x: 0, y: popoverSize.height), - size: popoverSize - ) - case .left: - return CGRect( - origin: popoverOrigin - CGPoint(x: 0, y: popoverSize.height / 2), - size: popoverSize - ) - case .center: - return CGRect( - origin: popoverOrigin - CGPoint(x: popoverSize.width / 2, y: popoverSize.height / 2), - size: popoverSize - ) - } - } - - /** - Get the origin of a popover if it's position is `.relative`. The origin is the top-left of the popover within a container frame. - - parameter popoverAnchor: The popover's position within the container frame. - - parameter containerFrame: The reference frame. - - parameter popoverSize: The size of the popover. - */ - func relativeOrigin( - popoverAnchor: Anchor, - containerFrame: CGRect, - popoverSize: CGSize - ) -> CGPoint { - switch popoverAnchor { - case .topLeft: - return CGPoint( - x: containerFrame.origin.x, - y: containerFrame.origin.y - ) - case .top: - return CGPoint( - x: containerFrame.origin.x + containerFrame.width / 2 - popoverSize.width / 2, - y: containerFrame.origin.y - ) - case .topRight: - return CGPoint( - x: containerFrame.origin.x + containerFrame.width - popoverSize.width, - y: containerFrame.origin.y - ) - case .right: - return CGPoint( - x: containerFrame.origin.x + containerFrame.width - popoverSize.width, - y: containerFrame.origin.y + containerFrame.height / 2 - popoverSize.height / 2 - ) - case .bottomRight: - return CGPoint( - x: containerFrame.origin.x + containerFrame.width - popoverSize.width, - y: containerFrame.origin.y + containerFrame.height - popoverSize.height - ) - case .bottom: - return CGPoint( - x: containerFrame.origin.x + containerFrame.width / 2 - popoverSize.width / 2, - y: containerFrame.origin.y + containerFrame.height - popoverSize.height - ) - case .bottomLeft: - return CGPoint( - x: containerFrame.origin.x, - y: containerFrame.origin.y + containerFrame.height - popoverSize.height - ) - case .left: - return CGPoint( - x: containerFrame.origin.x, - y: containerFrame.origin.y + containerFrame.height / 2 - popoverSize.height / 2 - ) - case .center: - return CGPoint( - x: containerFrame.origin.x + containerFrame.width / 2 - popoverSize.width / 2, - y: containerFrame.origin.y + containerFrame.height / 2 - popoverSize.height / 2 - ) - } - } - - /** - Get the closest anchor to a point, if the popover's anchor is `.relative`. - - parameter popoverAnchors: The popover's possible positions within the container frame. - - parameter containerFrame: The reference frame. - - parameter popoverSize: The size of the popover. - - parameter targetPoint: The point to check for the closest anchor. - */ - func relativeClosestAnchor( - popoverAnchors: [Anchor], - containerFrame: CGRect, - popoverSize: CGSize, - targetPoint: CGPoint - ) -> Popover.Attributes.Position.Anchor { - var (closestAnchor, closestDistance): (Popover.Attributes.Position.Anchor, CGFloat) = (.bottom, .infinity) - for popoverAnchor in popoverAnchors { - let origin = relativeOrigin( - popoverAnchor: popoverAnchor, - containerFrame: containerFrame, - popoverSize: popoverSize - ) - - /// Comparing distances, so no need to square the distance (saves processing power). - let distance = CGPointDistanceSquared(from: targetPoint, to: origin) - if distance < closestDistance { - closestAnchor = popoverAnchor - closestDistance = distance - } - } - - return closestAnchor - } - - /** - Get the frame of a popover if it's position is `.relative`. - - parameter selectedAnchor: The popover's position within the container frame. - - parameter containerFrame: The reference frame. - - parameter popoverSize: The size of the popover. - */ - func relativeFrame( - selectedAnchor: Popover.Attributes.Position.Anchor, - containerFrame: CGRect, - popoverSize: CGSize - ) -> CGRect { - let origin = relativeOrigin( - popoverAnchor: selectedAnchor, - containerFrame: containerFrame, - popoverSize: popoverSize - ) - - let frame = CGRect(origin: origin, size: popoverSize) - return frame - } -} - -public extension Popover.Attributes.Position.Anchor { - /// Convert an `Anchor` to UIKit's `UnitPoint`. - /** - - topLeft top topRight - X──────────────X──────────────X - | | - | | - left X center X right - | | - | | - X──────────────X──────────────X - bottomLeft bottom bottomRight - - */ - var unitPoint: UnitPoint { - switch self { - case .topLeft: - return .topLeading - case .top: - return .top - case .topRight: - return .topTrailing - case .right: - return .trailing - case .bottomRight: - return .bottomTrailing - case .bottom: - return .bottom - case .bottomLeft: - return .bottomLeading - case .left: - return .leading - case .center: - return .center - } - } -} diff --git a/Pods/Popovers/Sources/Popover.swift b/Pods/Popovers/Sources/Popover.swift deleted file mode 100644 index cf0c2734..00000000 --- a/Pods/Popovers/Sources/Popover.swift +++ /dev/null @@ -1,601 +0,0 @@ -// -// Popover.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import Combine -import SwiftUI - -/** - A view that is placed over other views. - */ -public struct Popover: Identifiable { - /** - Stores information about the popover. - This includes the attributes, frame, and acts like a view model. If using SwiftUI, access it using `PopoverReader`. - */ - public var context: Context - - /// The view that the popover presents. - public var view: AnyView - - /// A view that goes behind the popover. - public var background: AnyView - - /** - A popover. - - parameter attributes: Customize the popover. - - parameter view: The view to present. - */ - public init( - attributes: Attributes = .init(), - @ViewBuilder view: @escaping () -> Content - ) { - let context = Context() - context.attributes = attributes - self.context = context - self.view = AnyView(view().environmentObject(context)) - background = AnyView(Color.clear) - } - - /** - A popover with a background. - - parameter attributes: Customize the popover. - - parameter view: The view to present. - - parameter background: The view to present in the background. - */ - public init( - attributes: Attributes = .init(), - @ViewBuilder view: @escaping () -> MainContent, - @ViewBuilder background: @escaping () -> BackgroundContent - ) { - let context = Context() - context.attributes = attributes - self.context = context - self.view = AnyView(view().environmentObject(self.context)) - self.background = AnyView(background().environmentObject(self.context)) - } - - /** - Properties to customize the popover. - */ - public struct Attributes { - /** - Add a tag to reference the popover from anywhere. If you use `.popover(selection:tag:attributes:view:)`, this `tag` is automatically set to what you provide in the parameter. - - Use `Popovers.popovers(tagged: "Your Tag")` to access popovers that are currently presented. - */ - public var tag: AnyHashable? - - /// The popover's position. - public var position = Position.absolute(originAnchor: .bottom, popoverAnchor: .top) - - /** - The frame that the popover attaches to or is placed within (configure in `position`). This must be in global window coordinates. - - If you're using SwiftUI, this is automatically provided. - If you're using UIKit, you must provide this. Use `.windowFrame()` to convert to window coordinates. - - attributes.sourceFrame = { [weak button] in /// `weak` to prevent a retain cycle - button.windowFrame() - } - */ - public var sourceFrame: (() -> CGRect) = { .zero } - - /// Inset the source frame by this. - public var sourceFrameInset = UIEdgeInsets.zero - - /// Padding to prevent the popover from overflowing off the screen. - public var screenEdgePadding = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16) - - /// Stores popover animation and transition values for presentation. - public var presentation = Presentation() - - /// Stores popover animation and transition values for dismissal. - public var dismissal = Dismissal() - - /// The axes that the popover will "rubber-band" on when dragged - public var rubberBandingMode: RubberBandingMode = [.xAxis, .yAxis] - - /// Prevent views underneath the popover from being pressed. - public var blocksBackgroundTouches = false - - /// Stores accessibility values. - public var accessibility = Accessibility() - - /// Called when the user taps outside the popover. - public var onTapOutside: (() -> Void)? - - /// Called when the popover is dismissed. - public var onDismiss: (() -> Void)? - - /// Called when the context changes. - public var onContextChange: ((Context) -> Void)? - - /** - Create the default attributes for a popover. - */ - public init( - tag: AnyHashable? = nil, - position: Popover.Attributes.Position = Position.absolute(originAnchor: .bottom, popoverAnchor: .top), - sourceFrame: @escaping (() -> CGRect) = { .zero }, - sourceFrameInset: UIEdgeInsets = UIEdgeInsets.zero, - screenEdgePadding: UIEdgeInsets = UIEdgeInsets(top: 16, left: 16, bottom: 16, right: 16), - presentation: Popover.Attributes.Presentation = Presentation(), - dismissal: Popover.Attributes.Dismissal = Dismissal(), - rubberBandingMode: Popover.Attributes.RubberBandingMode = [.xAxis, .yAxis], - blocksBackgroundTouches: Bool = false, - accessibility: Accessibility = Accessibility(), - onTapOutside: (() -> Void)? = nil, - onDismiss: (() -> Void)? = nil, - onContextChange: ((Popover.Context) -> Void)? = nil - ) { - self.tag = tag - self.position = position - self.sourceFrame = sourceFrame - self.sourceFrameInset = sourceFrameInset - self.screenEdgePadding = screenEdgePadding - self.presentation = presentation - self.dismissal = dismissal - self.rubberBandingMode = rubberBandingMode - self.blocksBackgroundTouches = blocksBackgroundTouches - self.accessibility = accessibility - self.onTapOutside = onTapOutside - self.onDismiss = onDismiss - self.onContextChange = onContextChange - } - - /** - The position of the popover. - - `absolute` - attach the popover to a source view. - - `relative` - place the popover within a container view. - */ - public enum Position { - /** - Attach the popover to a source view (supplied by the attributes' `sourceFrame` property). - - parameter originAnchor: The corner of the source view used as the attaching point. - - parameter popoverAnchor: The corner of the popover that attaches to the source view. - */ - case absolute(originAnchor: Anchor, popoverAnchor: Anchor) - - /** - Place the popover within a container view (supplied by the attributes' `sourceFrame` property). - - parameter popoverAnchors: The corners of the container view that the popover can be placed. Supply multiple to get a picture-in-picture behavior.. - */ - case relative(popoverAnchors: [Anchor]) - - /// The edges and corners of a rectangle. - /** - - topLeft top topRight - X──────────────X──────────────X - | | - | | - left X center X right - | | - | | - X──────────────X──────────────X - bottomLeft bottom bottomRight - - */ - public enum Anchor { - /// The point at the **top-left** of a rectangle. - case topLeft - - /// The point at the **top** of a rectangle. - case top - - /// The point at the **top-right** of a rectangle. - case topRight - - /// The point at the **right** of a rectangle. - case right - - /// The point at the **bottom-right** of a rectangle. - case bottomRight - - /// The point at the **bottom** of a rectangle. - case bottom - - /// The point at the **bottom-left** of a rectangle. - case bottomLeft - - /// The point at the **left** of a rectangle. - case left - - /// The point at the **center** of a rectangle. - case center - } - } - - /** - The "rubber-banding" behavior of the popover when it is dragged. - */ - public struct RubberBandingMode: OptionSet { - public let rawValue: Int - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /// Enable rubber banding on the x-axis. - public static let xAxis = RubberBandingMode(rawValue: 1 << 0) // 1 - - /// Enable rubber banding on the y-axis. - public static let yAxis = RubberBandingMode(rawValue: 1 << 1) // 2 - - /// Disable rubber banding. - public static let none = RubberBandingMode([]) - } - - /// The popover's presentation animation and transition. - public struct Presentation { - /// The animation timing used when the popover is presented. - public var animation: Animation? = .easeOut - - /// The transition used when the popover is presented. - public var transition: AnyTransition? = .opacity - - /// Create the default animation and transition for the popover. - public init( - animation: Animation? = .easeOut, - transition: AnyTransition? = .opacity - ) { - self.animation = animation - self.transition = transition - } - } - - /// The popover's dismissal animation, transition, and other behavior. - public struct Dismissal { - /// The animation timing used when the popover is dismissed. - public var animation: Animation? = .easeOut - - /// The transition used when the popover is dismissed. - public var transition: AnyTransition? = .opacity - - /** - The auto-dismissal behavior of the popover. - - `.tapOutside` - dismiss the popover when the user taps outside the popover. - - `.dragDown` - dismiss the popover when the user drags it down. - - `.dragUp` - dismiss the popover when the user drags it up. - - `.none` - don't automatically dismiss the popover. - */ - public var mode = Mode.tapOutside - - /// Dismiss the popover when the user taps outside, **even when another presented popover is what's tapped**. Only applies when `mode` is `.tapOutside`. - public var tapOutsideIncludesOtherPopovers = false - - /// Don't dismiss the popover when the user taps on these frames. Only applies when `mode` is `.tapOutside`. - public var excludedFrames: (() -> [CGRect]) = { [] } - - /// Move the popover off the screen if a `.dragDown` or `.dragUp` happens. - public var dragMovesPopoverOffScreen = true - - /// The point on the screen until the popover can be dismissed. Only applies when `mode` is `.dragDown` or `.dragUp`. See diagram for details. - /** - - ┌────────────────┐ - |░░░░░░░░░░░░░░░░| ░ = if the popover is dragged - |░░░░░░░░░░░░░░░░| to this area, it will be dismissed. - |░░░░░░░░░░░░░░░░| - |░░░░░░░░░░░░░░░░| the height of this area is 0.25 * screen height. - | | - | | - | | - - */ - public var dragDismissalProximity = CGFloat(0.25) - - /// Create the default dismissal behavior for the popover. - public init( - animation: Animation? = .easeOut, - transition: AnyTransition? = .opacity, - mode: Popover.Attributes.Dismissal.Mode = Mode.tapOutside, - tapOutsideIncludesOtherPopovers: Bool = false, - excludedFrames: @escaping (() -> [CGRect]) = { [] }, - dragMovesPopoverOffScreen: Bool = true, - dragDismissalProximity: CGFloat = CGFloat(0.25) - ) { - self.animation = animation - self.transition = transition - self.mode = mode - self.tapOutsideIncludesOtherPopovers = tapOutsideIncludesOtherPopovers - self.excludedFrames = excludedFrames - self.dragMovesPopoverOffScreen = dragMovesPopoverOffScreen - self.dragDismissalProximity = dragDismissalProximity - } - - /** - The auto-dismissal behavior of the popover. - - `.tapOutside` - dismiss the popover when the user taps outside. - - `.dragDown` - dismiss the popover when the user drags it down. - - `.dragUp` - dismiss the popover when the user drags it up. - - `.none` - don't automatically dismiss the popover. - */ - public struct Mode: OptionSet { - public let rawValue: Int - public init(rawValue: Int) { - self.rawValue = rawValue - } - - /// Dismiss the popover when the user taps outside. - public static let tapOutside = Mode(rawValue: 1 << 0) // 1 - - /// Dismiss the popover when the user drags it down. - public static let dragDown = Mode(rawValue: 1 << 1) // 2 - - /// Dismiss the popover when the user drags it up. - public static let dragUp = Mode(rawValue: 1 << 2) // 4 - - /// Don't automatically dismiss the popover. - public static let none = Mode([]) - } - } - - /// Define VoiceOver behavior. - public struct Accessibility { - /// Focus the popover when presented. - public var shiftFocus = true - - /** - A view that's only shown when VoiceOver is running. Dismisses the popover when tapped. - - Tap-outside-to-dismiss is unsupported in VoiceOver, so this provides an alternate method for dismissal. - */ - public var dismissButtonLabel: AnyView? = defaultDismissButtonLabel - - /// Create the default VoiceOver behavior for the popover. - public init( - shiftFocus: Bool = true, - dismissButtonLabel: (() -> AnyView)? = { defaultDismissButtonLabel } - ) { - self.shiftFocus = shiftFocus - self.dismissButtonLabel = dismissButtonLabel?() - } - - /// The default voiceover dismiss button view, an X - public static let defaultDismissButtonLabel: AnyView = .init( - AnyView( - Image(systemName: "xmark") - .foregroundColor(.white) - .frame(width: 36, height: 36) - .background(Color.black.opacity(0.25)) - .cornerRadius(18) - ) - .accessibilityElement() - .accessibility(label: Text("Close")) - .accessibility(hint: Text("Dismiss this popover.")) - ) - } - } - - /** - The popover's view model (stores attributes, frame, and other visible traits). - */ - public class Context: Identifiable, ObservableObject { - /// The popover's ID. Must be unique, unless replacing an existing popover. - public var id = UUID() - - /// The popover's customizable properties. - public var attributes = Attributes() - - /// The popover's dynamic size, calculated from SwiftUI. If this is `nil`, the popover is not yet ready to be displayed. - @Published public var size: CGSize? - - /// The frame of the popover, without drag gesture offset applied. - @Published public var staticFrame = CGRect.zero - - /// The current frame of the popover. - @Published public var frame = CGRect.zero - - /// The currently selected anchor, if the popover has a `.relative` position. - @Published public var selectedAnchor: Popover.Attributes.Position.Anchor? - - /// For animation syncing. If this is not nil, the popover is in the middle of a frame refresh. - public var transaction: Transaction? - - /// Notify when the context changed. - public var changeSink: AnyCancellable? - - /// Indicates whether the popover can be dragged. - public var isDraggingEnabled: Bool { - get { - popoverModel?.popoversDraggable ?? false - } - set { - popoverModel?.popoversDraggable = newValue - } - } - - public var window: UIWindow { - if let window = presentedPopoverContainer?.window { - return window - } else { - print("[Popovers] - This popover is not tied to a window. Please file a bug report (https://github.com/aheze/Popovers/issues).") - return UIWindow() - } - } - - /** - The bounds of the window in which the `Popover` is being presented, or the `zero` frame if the popover has not been presented yet. - */ - public var windowBounds: CGRect { - presentedPopoverContainer?.window?.bounds ?? .zero - } - - /** - For the SwiftUI `.popover` view modifier. This is for internal use only - use `Popover.Attributes.onDismiss` if you want to know when the popover is dismissed. - - This is called just after the popover is removed from the model - inside the view modifier, set `$present` to false when this is called. - */ - internal var onAutoDismiss: (() -> Void)? - - /// Invoked by the SwiftUI container view when the view has fully disappeared. - internal var onDisappear: (() -> Void)? - - /// The `UIView` presenting this `Popover`, or `nil` if no popovers are currently being presented. - internal var presentedPopoverContainer: UIView? - - /// The `PopoverModel` managing the `Popover`. Sourced from the `presentedPopoverViewController`. - private var popoverModel: PopoverModel? { - return presentedPopoverContainer?.popoverModel - } - - /// Create a context for the popover. You shouldn't need to use this - it's done automatically when you create a new popover. - public init() { - changeSink = objectWillChange.sink { [weak self] in - guard let self = self else { return } - DispatchQueue.main.async { - self.attributes.onContextChange?(self) - } - } - } - } -} - -public extension Popover { - /** - Convenience accessor for the popover's ID. - */ - var id: UUID { - get { - context.id - } set { - context.id = newValue - } - } - - /// Convenience accessor for the popover's attributes. - var attributes: Attributes { - get { - context.attributes - } set { - context.attributes = newValue - } - } - - /// Updates the popover's frame using its size. - func updateFrame(with size: CGSize?) { - let frame = calculateFrame(from: size) - context.size = size - context.staticFrame = frame - context.frame = frame - } - - /// Calculate the popover's frame based on its size and position. - func calculateFrame(from size: CGSize?) -> CGRect { - guard let window = context.presentedPopoverContainer?.window else { return .zero } - - switch attributes.position { - case let .absolute(originAnchor, popoverAnchor): - var popoverFrame = attributes.position.absoluteFrame( - originAnchor: originAnchor, - popoverAnchor: popoverAnchor, - originFrame: attributes.sourceFrame().inset(by: attributes.sourceFrameInset), - popoverSize: size ?? .zero - ) - - let screenEdgePadding = attributes.screenEdgePadding - - let safeWindowFrame = window.safeAreaLayoutGuide.layoutFrame - let maxX = safeWindowFrame.maxX - screenEdgePadding.right - let maxY = safeWindowFrame.maxY - screenEdgePadding.bottom - - /// Popover overflows on left/top side. - if popoverFrame.origin.x < screenEdgePadding.left { - popoverFrame.origin.x = screenEdgePadding.left - } - if popoverFrame.origin.y < screenEdgePadding.top { - popoverFrame.origin.y = screenEdgePadding.top - } - - /// Popover overflows on the right/bottom side. - if popoverFrame.maxX > maxX { - let difference = popoverFrame.maxX - maxX - popoverFrame.origin.x -= difference - } - if popoverFrame.maxY > maxY { - let difference = popoverFrame.maxY - maxY - popoverFrame.origin.y -= difference - } - - return popoverFrame - case let .relative(popoverAnchors): - - /// Set the selected anchor to the first one. - if context.selectedAnchor == nil { - context.selectedAnchor = popoverAnchors.first - } - - let popoverFrame = attributes.position.relativeFrame( - selectedAnchor: context.selectedAnchor ?? popoverAnchors.first ?? .bottom, - containerFrame: attributes.sourceFrame().inset(by: attributes.sourceFrameInset), - popoverSize: size ?? .zero - ) - return popoverFrame - } - } - - /// Calculate if the popover should be dismissed via drag **or** animated to another position (if using `.relative` positioning with multiple anchors). Called when the user stops dragging the popover. - func positionChanged(to point: CGPoint) { - let windowBounds = context.windowBounds - - if - attributes.dismissal.mode.contains(.dragDown), - point.y >= windowBounds.height - windowBounds.height * attributes.dismissal.dragDismissalProximity - { - if attributes.dismissal.dragMovesPopoverOffScreen { - var newFrame = context.staticFrame - newFrame.origin.y = windowBounds.height - context.staticFrame = newFrame - context.frame = newFrame - } - dismiss() - return - } - if - attributes.dismissal.mode.contains(.dragUp), - point.y <= windowBounds.height * attributes.dismissal.dragDismissalProximity - { - if attributes.dismissal.dragMovesPopoverOffScreen { - var newFrame = context.staticFrame - newFrame.origin.y = -newFrame.height - context.staticFrame = newFrame - context.frame = newFrame - } - dismiss() - return - } - - if case let .relative(popoverAnchors) = attributes.position { - let frame = attributes.sourceFrame().inset(by: attributes.sourceFrameInset) - let size = context.size ?? .zero - - let closestAnchor = attributes.position.relativeClosestAnchor( - popoverAnchors: popoverAnchors, - containerFrame: frame, - popoverSize: size, - targetPoint: point - ) - let popoverFrame = attributes.position.relativeFrame( - selectedAnchor: closestAnchor, - containerFrame: frame, - popoverSize: size - ) - - context.selectedAnchor = closestAnchor - context.staticFrame = popoverFrame - context.frame = popoverFrame - } - } -} - -extension Popover: Equatable { - /// Conform to equatable. - public static func == (lhs: Popover, rhs: Popover) -> Bool { - return lhs.id == rhs.id - } -} diff --git a/Pods/Popovers/Sources/PopoverContainerView.swift b/Pods/Popovers/Sources/PopoverContainerView.swift deleted file mode 100644 index 705181af..00000000 --- a/Pods/Popovers/Sources/PopoverContainerView.swift +++ /dev/null @@ -1,252 +0,0 @@ -// -// PopoverContainerView.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/** - The container view that shows the popovers. This is automatically managed. - */ -struct PopoverContainerView: View { - /// The view model that stores the popovers. - @ObservedObject var popoverModel: PopoverModel - - /// The currently-dragging popover. - @State var selectedPopover: Popover? = nil - - /// How much to offset the currently-dragging popover. - @State var selectedPopoverOffset: CGSize = .zero - - var body: some View { - /// Support multiple popovers without interfering with each other. - ZStack { - /// Loop over the popovers. - ForEach(popoverModel.popovers) { popover in - - /// All frames are calculated from the origin at the top-left, so use `.topLeading`. - ZStack(alignment: .topLeading) { - /// Show the popover's background. - popover.background - - /// Show the popover's main content view. - HStack(alignment: .top) { - popover.view - - /// Have VoiceOver read the popover view first, before the dismiss button. - .accessibility(sortPriority: 1) - - /// If VoiceOver is on and a `dismissButtonLabel` was set, show it. - if - UIAccessibility.isVoiceOverRunning, - let dismissButtonLabel = popover.attributes.accessibility.dismissButtonLabel - { - Button { - popover.dismiss() - } label: { - dismissButtonLabel - } - } - } - /// Hide the popover until its size has been calculated. - .opacity(popover.context.size != nil ? 1 : 0) - - /// Read the popover's size in the view. - .sizeReader(transaction: popover.context.transaction) { size in - if let transaction = popover.context.transaction { - /// When `popover.context.size` is nil, the popover was just presented. - if popover.context.size == nil { - popover.updateFrame(with: size) - popoverModel.refresh(with: transaction) - } else { - /// Otherwise, the popover is *replacing* a previous popover, so animate it. - withTransaction(transaction) { - popover.updateFrame(with: size) - popoverModel.refresh(with: transaction) - } - } - popover.context.transaction = nil - } - } - - /// Offset the popover by the gesture's translation, if this current popover is the selected one. - .offset(popoverOffset(for: popover)) - /// Add the drag gesture. - .simultaneousGesture( - /// `minimumDistance: 2` is enough to allow scroll views to scroll, if one is contained in the popover. - DragGesture(minimumDistance: Popovers.minimumDragDistance) - .onChanged { value in - - func update() { - /// Apply the offset. - applyDraggingOffset(popover: popover, translation: value.translation) - - /// Update the visual frame to account for the dragging offset. - popover.context.frame = CGRect( - origin: popover.context.staticFrame.origin + CGPoint( - x: selectedPopoverOffset.width, - y: selectedPopoverOffset.height - ), - size: popover.context.size ?? .zero - ) - } - - /// Select the popover for dragging. - if selectedPopover == nil { - /// Apply an animation to make up for the `minimumDistance`. - withAnimation(.spring()) { - selectedPopover = popover - update() - } - } else { - /// The user is already dragging, so update the frames immediately. - update() - } - } - .onEnded { value in - - /// The expected dragging end point. - let finalOrigin = CGPoint( - x: popover.context.staticFrame.origin.x + value.predictedEndTranslation.width, - y: popover.context.staticFrame.origin.y + value.predictedEndTranslation.height - ) - - /// Recalculate the popover's frame. - withAnimation(.spring()) { - selectedPopoverOffset = .zero - - /// Let the popover know that it finished dragging. - popover.positionChanged(to: finalOrigin) - popover.context.frame = popover.context.staticFrame - } - - /// Unselect the popover. - self.selectedPopover = nil - }, - including: popover.attributes.rubberBandingMode.isEmpty - ? .subviews /// Stop gesture and only allow those in the popover's view if dragging is not enabled. - : (popoverModel.popoversDraggable ? .all : .subviews) /// Otherwise, allow dragging - but also check if `popoversDraggable` is true first. - ) - .padding(edgeInsets(for: popover)) /// Apply edge padding so that the popover doesn't overflow off the screen. - } - - /// Ensure the popover container can use up all available space. - .frame(maxWidth: .infinity, maxHeight: .infinity) - - /// Apply the presentation and dismissal transitions. - .transition( - .asymmetric( - insertion: popover.attributes.presentation.transition ?? .opacity, - removal: popover.attributes.dismissal.transition ?? .opacity - ) - ) - - /// Clean up the container view. - .onDisappear { - popover.context.onDisappear?() - } - } - } - .edgesIgnoringSafeArea(.all) /// All calculations are done from the screen bounds. - } - - /** - Apply edge padding to squish the available space, preventing screen overflow. - - Since the popover's top and left are set via the frame origin in `Popover.swift`, only apply padding to the bottom and right. - */ - func edgeInsets(for popover: Popover) -> EdgeInsets { - let horizontalInsets = popover.attributes.screenEdgePadding.left + popover.attributes.screenEdgePadding.right - let verticalInsets = popover.attributes.screenEdgePadding.top + popover.attributes.screenEdgePadding.bottom - - return EdgeInsets( - top: 0, - leading: 0, - bottom: verticalInsets, - trailing: horizontalInsets - ) - } - - /// Get the offset of a popover in order to place it in its correct location. - func popoverOffset(for popover: Popover) -> CGSize { - guard popover.context.size != nil else { return .zero } - let frame = popover.context.staticFrame - let offset = CGSize( - width: frame.origin.x + ((selectedPopover == popover) ? selectedPopoverOffset.width : 0), - height: frame.origin.y + ((selectedPopover == popover) ? selectedPopoverOffset.height : 0) - ) - return offset - } - - // MARK: - Dragging - - /// Apply the additional offset needed if a popover is dragged. - func applyDraggingOffset(popover: Popover, translation: CGSize) { - var selectedPopoverOffset = CGSize.zero - - /// If `.dragDown` or `.dragUp` is in the popover's dismissal mode, then apply rubber banding. - func applyVerticalOffset(dragDown: Bool) { - let condition = dragDown ? translation.height <= 0 : translation.height >= 0 - if condition { - /// Popover was dragged in the opposite direction, so apply rubber banding. - selectedPopoverOffset.height = getRubberBanding(translation: translation).height - } else { - selectedPopoverOffset.height = translation.height - } - } - - switch popover.attributes.position { - case .absolute: - if popover.attributes.dismissal.mode.contains(.dragDown) { - applyVerticalOffset(dragDown: true) - } else if popover.attributes.dismissal.mode.contains(.dragUp) { - applyVerticalOffset(dragDown: false) - } else { - selectedPopoverOffset = applyRubberBanding(to: popover, translation: translation) - } - case let .relative(popoverAnchors): - - /// There is only 1 anchor for the popovers, so it can't be dragged to a different position. - if popoverAnchors.count <= 1 { - if popover.attributes.dismissal.mode.contains(.dragDown) { - applyVerticalOffset(dragDown: true) - } else if popover.attributes.dismissal.mode.contains(.dragUp) { - applyVerticalOffset(dragDown: false) - } else { - selectedPopoverOffset = applyRubberBanding(to: popover, translation: translation) - } - } else { - /// Popover can be dragged to a different position, so don't apply any rubber banding and directly set its translation. - selectedPopoverOffset = translation - } - } - - self.selectedPopoverOffset = selectedPopoverOffset - } - - /// "Rubber-band" the popover's translation. - func getRubberBanding(translation: CGSize) -> CGSize { - var offset = CGSize.zero - offset.width = pow(abs(translation.width), 0.7) * (translation.width > 0 ? 1 : -1) - offset.height = pow(abs(translation.height), 0.7) * (translation.height > 0 ? 1 : -1) - return offset - } - - /// Apply rubber banding to the selected popover's offset. - func applyRubberBanding(to popover: Popover, translation: CGSize) -> CGSize { - let offset = getRubberBanding(translation: translation) - var selectedPopoverOffset = CGSize.zero - - if popover.attributes.rubberBandingMode.contains(.xAxis) { - selectedPopoverOffset.width = offset.width - } - if popover.attributes.rubberBandingMode.contains(.yAxis) { - selectedPopoverOffset.height = offset.height - } - - return selectedPopoverOffset - } -} diff --git a/Pods/Popovers/Sources/PopoverGestureContainer.swift b/Pods/Popovers/Sources/PopoverGestureContainer.swift deleted file mode 100644 index 903aa874..00000000 --- a/Pods/Popovers/Sources/PopoverGestureContainer.swift +++ /dev/null @@ -1,148 +0,0 @@ -// -// PopoverGestureContainer.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/// A hosting view for `PopoverContainerView` with tap filtering. -class PopoverGestureContainer: UIView { - /// A closure to be invoked when this view is inserted into a window's view hierarchy. - var onMovedToWindow: (() -> Void)? - - /// Create a new `PopoverGestureContainer`. - override init(frame: CGRect) { - super.init(frame: frame) - - /// Allow resizing. - autoresizingMask = [.flexibleWidth, .flexibleHeight] - } - - override func layoutSubviews() { - super.layoutSubviews() - - /// Orientation or screen bounds changed, so update popover frames. - popoverModel.updateFramesAfterBoundsChange() - } - - override func didMoveToWindow() { - super.didMoveToWindow() - - /// There might not be a window yet, but that's fine. Just wait until there's actually a window. - guard let window = window else { return } - - /// Create the SwiftUI view that contains all the popovers. - let popoverContainerView = PopoverContainerView(popoverModel: popoverModel) - .environment(\.window, window) /// Inject the window. - - let hostingController = UIHostingController(rootView: popoverContainerView) - hostingController.view.frame = bounds - hostingController.view.backgroundColor = .clear - hostingController.view.autoresizingMask = [.flexibleWidth, .flexibleHeight] - - addSubview(hostingController.view) - - /// Ensure the view is laid out so that SwiftUI animations don't stutter. - setNeedsLayout() - layoutIfNeeded() - - /// Let the presenter know that its window is available. - onMovedToWindow?() - } - - /** - Determine if touches should land on popovers or pass through to the underlying view. - - The popover container view takes up the entire screen, so normally it would block all touches from going through. This method fixes that. - */ - override func hitTest(_ point: CGPoint, with event: UIEvent?) -> UIView? { - /// Make sure the hit event was actually a touch and not a cursor hover or something else. - guard event.map({ $0.type == .touches }) ?? true else { return nil } - - /// Only loop through the popovers that are in this window. - let popovers = popoverModel.popovers - - /// The current popovers' frames - let popoverFrames = popovers.map { $0.context.frame } - - /// Dismiss a popover, knowing that its frame does not contain the touch. - func dismissPopoverIfNecessary(popoverToDismiss: Popover) { - if - popoverToDismiss.attributes.dismissal.mode.contains(.tapOutside), /// The popover can be automatically dismissed when tapped outside. - popoverToDismiss.attributes.dismissal.tapOutsideIncludesOtherPopovers || /// The popover can be dismissed even if the touch hit another popover, **or...** - !popoverFrames.contains(where: { $0.contains(point) }) /// ... no other popover frame contains the point (the touch landed outside) - { - popoverToDismiss.dismiss() - } - } - - /// Loop through the popovers and see if the touch hit it. - /// `reversed` to start from the most recently presented popovers, working backwards. - for popover in popovers.reversed() { - /// Check it the popover was hit. - if popover.context.frame.contains(point) { - /// Dismiss other popovers if they have `tapOutsideIncludesOtherPopovers` set to true. - for popoverToDismiss in popovers { - if - popoverToDismiss != popover, - !popoverToDismiss.context.frame.contains(point) /// The popover's frame doesn't contain the touch point. - { - dismissPopoverIfNecessary(popoverToDismiss: popoverToDismiss) - } - } - - /// Receive the touch and block it from going through. - return super.hitTest(point, with: event) - } - - /// The popover was not hit, so let it know that the user tapped outside. - popover.attributes.onTapOutside?() - - /// If the popover has `blocksBackgroundTouches` set to true, stop underlying views from receiving the touch. - if popover.attributes.blocksBackgroundTouches { - /// Receive the touch and block it from going through. - return super.hitTest(point, with: event) - } - - /// Check if the touch hit an excluded view. If so, don't dismiss it. - if popover.attributes.dismissal.mode.contains(.tapOutside) { - let excludedFrames = popover.attributes.dismissal.excludedFrames() - if excludedFrames.contains(where: { $0.contains(point) }) { - /** - The touch hit an excluded view, so don't dismiss it. - However, if the touch hit another popover, block it from passing through. - */ - if popoverFrames.contains(where: { $0.contains(point) }) { - return super.hitTest(point, with: event) - } else { - return nil - } - } - } - - /// All checks did not pass, which means the touch landed outside the popover. So, dismiss it if necessary. - dismissPopoverIfNecessary(popoverToDismiss: popover) - } - - /// The touch did not hit any popover, so pass it through to the hit testing target. - return nil - } - - /// Dismiss all popovers if the accessibility escape gesture was performed. - override func accessibilityPerformEscape() -> Bool { - for popover in popoverModel.popovers { - popover.dismiss() - } - - return true - } - - /// Boilerplate code. - @available(*, unavailable) - required init?(coder _: NSCoder) { - fatalError("[Popovers] - Create this view programmatically.") - } -} diff --git a/Pods/Popovers/Sources/PopoverModel.swift b/Pods/Popovers/Sources/PopoverModel.swift deleted file mode 100644 index 080405b8..00000000 --- a/Pods/Popovers/Sources/PopoverModel.swift +++ /dev/null @@ -1,109 +0,0 @@ -// -// PopoverModel.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import Combine -import SwiftUI - -/** - The view model for presented popovers within a window. - - Each view model is scoped to a window, which retains the view model. - Presenting or otherwise managing a popover automatically scopes interactions to the window of the current view hierarchy. - */ -class PopoverModel: ObservableObject { - /// The currently-presented popovers. The oldest are in front, the newest at the end. - @Published var popovers = [Popover]() - - /// Determines if the popovers can be dragged. - @Published var popoversDraggable = true - - /// Store the frames of views (for excluding popover dismissal or source frames). - @Published var frameTags: [AnyHashable: CGRect] = [:] - - /** - Store frames of popover source views when presented using `.popover(selection:tag:attributes:view:)`. These frames are then used as excluded frames for dismissal. - - To opt out of this behavior, set `attributes.dismissal.excludedFrames` manually. To clear this array (usually when you present another view where the frames don't apply), use a `FrameTagReader` to call `FrameTagProxy.clearSavedFrames()`. - */ - @Published var selectionFrameTags: [AnyHashable: CGRect] = [:] - - /// Force the container view to update. - func reload() { - objectWillChange.send() - } - - /** - Refresh the popovers with a new transaction. - - This is called when a popover's frame is being calculated. - */ - func refresh(with transaction: Transaction?) { - /// Set each popovers's transaction to the new transaction to keep the smooth animation. - for popover in popovers { - popover.context.transaction = transaction - } - - /// Update all popovers. - reload() - } - - /// Adds a `Popover` to this model. - func add(_ popover: Popover) { - popovers.append(popover) - } - - /// Removes a `Popover` from this model. - func remove(_ popover: Popover) { - popovers.removeAll { candidate in - candidate == popover - } - } - - /// Get the index in the for a popover. Returns `nil` if the popover is not in the array. - func index(of popover: Popover) -> Int? { - return popovers.firstIndex(of: popover) - } - - /** - Get a currently-presented popover with a tag. Returns `nil` if no popover with the tag was found. - - parameter tag: The tag of the popover to look for. - */ - func popover(tagged tag: AnyHashable) -> Popover? { - return popovers.first(where: { $0.attributes.tag == tag }) - } - - /** - Update all popover frames. - - This is called when the device rotates or has a bounds change. - */ - func updateFramesAfterBoundsChange() { - /** - First, update all popovers anyway. - - For some reason, relative positioning + `.center` doesn't need the rotation animation to complete before having a size change. - */ - for popover in popovers { - popover.updateFrame(with: popover.context.size) - } - - /// Reload the container view. - reload() - - /// Some other popovers need to wait until the rotation has completed before updating. - DispatchQueue.main.asyncAfter(deadline: .now() + Popovers.frameUpdateDelayAfterBoundsChange) { - self.refresh(with: Transaction(animation: .default)) - } - } - - /// Access this with `UIResponder.frameTagged(_:)` if inside a `WindowReader`, or `Popover.Context.frameTagged(_:)` if inside a `PopoverReader.` - func frame(tagged tag: AnyHashable) -> CGRect { - let frame = frameTags[tag] - return frame ?? .zero - } -} diff --git a/Pods/Popovers/Sources/PopoverUtilities.swift b/Pods/Popovers/Sources/PopoverUtilities.swift deleted file mode 100644 index 92093a4a..00000000 --- a/Pods/Popovers/Sources/PopoverUtilities.swift +++ /dev/null @@ -1,219 +0,0 @@ -// -// PopoverUtilities.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -public extension UIView { - /// Convert a view's frame to global coordinates, which are needed for `sourceFrame` and `excludedFrames.` - func windowFrame() -> CGRect { - return convert(bounds, to: nil) - } -} - -public extension Optional where Wrapped: UIView { - /// Convert a view's frame to global coordinates, which are needed for `sourceFrame` and `excludedFrames.` This is a convenience overload for optional `UIView`s. - func windowFrame() -> CGRect { - if let view = self { - return view.windowFrame() - } - return .zero - } -} - -public extension View { - /// Read a view's frame. From https://stackoverflow.com/a/66822461/14351818 - func frameReader(in coordinateSpace: CoordinateSpace = .global, rect: @escaping (CGRect) -> Void) -> some View { - return background( - GeometryReader { geometry in - Color.clear - .preference(key: ContentFrameReaderPreferenceKey.self, value: geometry.frame(in: coordinateSpace)) - .onPreferenceChange(ContentFrameReaderPreferenceKey.self) { newValue in - DispatchQueue.main.async { - rect(newValue) - } - } - } - .hidden() - ) - } - - /** - Read a view's size. The closure is called whenever the size itself changes, or the transaction changes (in the event of a screen rotation.) - - From https://stackoverflow.com/a/66822461/14351818 - */ - func sizeReader(transaction: Transaction? = nil, size: @escaping (CGSize) -> Void) -> some View { - return background( - GeometryReader { geometry in - Color.clear - .preference(key: ContentSizeReaderPreferenceKey.self, value: geometry.size) - .onPreferenceChange(ContentSizeReaderPreferenceKey.self) { newValue in - DispatchQueue.main.async { - size(newValue) - } - } - .onValueChange(of: transaction) { _, _ in - DispatchQueue.main.async { - size(geometry.size) - } - } - } - .hidden() - ) - } -} - -extension Transaction: Equatable { - public static func == (lhs: Transaction, rhs: Transaction) -> Bool { - lhs.animation == rhs.animation - } -} - -struct ContentFrameReaderPreferenceKey: PreferenceKey { - static var defaultValue: CGRect { return CGRect() } - static func reduce(value: inout CGRect, nextValue: () -> CGRect) { value = nextValue() } -} - -struct ContentSizeReaderPreferenceKey: PreferenceKey { - static var defaultValue: CGSize { return CGSize() } - static func reduce(value: inout CGSize, nextValue: () -> CGSize) { value = nextValue() } -} - -public extension UIColor { - /** - Create a UIColor from a hex code. - - Example: - - let color = UIColor(hex: 0x00aeef) - */ - convenience init(hex: UInt, alpha: CGFloat = 1) { - self.init( - red: CGFloat((hex & 0xFF0000) >> 16) / 255.0, - green: CGFloat((hex & 0x00FF00) >> 8) / 255.0, - blue: CGFloat(hex & 0x0000FF) / 255.0, - alpha: alpha - ) - } -} - -/// Position a view using a rectangular frame. Access using `.frame(rect:)`. -struct FrameRectModifier: ViewModifier { - let rect: CGRect - func body(content: Content) -> some View { - content - .frame(width: rect.width, height: rect.height, alignment: .topLeading) - .position(x: rect.origin.x + rect.width / 2, y: rect.origin.y + rect.height / 2) - } -} - -public extension View { - /// Position a view using a rectangular frame. - func frame(rect: CGRect) -> some View { - return modifier(FrameRectModifier(rect: rect)) - } -} - -/// For easier CGPoint math -public extension CGPoint { - /// Add 2 CGPoints. - static func + (left: CGPoint, right: CGPoint) -> CGPoint { - return CGPoint(x: left.x + right.x, y: left.y + right.y) - } - - /// Subtract 2 CGPoints. - static func - (left: CGPoint, right: CGPoint) -> CGPoint { - return CGPoint(x: left.x - right.x, y: left.y - right.y) - } -} - -/// Get the distance between 2 CGPoints. From https://www.hackingwithswift.com/example-code/core-graphics/how-to-calculate-the-distance-between-two-cgpoints -public func CGPointDistanceSquared(from: CGPoint, to: CGPoint) -> CGFloat { - return (from.x - to.x) * (from.x - to.x) + (from.y - to.y) * (from.y - to.y) -} - -public extension Shape { - /// Fill and stroke a shape at the same time. https://www.hackingwithswift.com/quick-start/swiftui/how-to-fill-and-stroke-shapes-at-the-same-time - func fill(_ fillStyle: Fill, strokeBorder strokeStyle: Stroke, lineWidth: CGFloat = 1) -> some View { - stroke(strokeStyle, lineWidth: lineWidth) - .background(fill(fillStyle)) - } -} - -public extension InsettableShape { - /// Fill and stroke a shape at the same time. https://www.hackingwithswift.com/quick-start/swiftui/how-to-fill-and-stroke-shapes-at-the-same-time - func fill(_ fillStyle: Fill, strokeBorder strokeStyle: Stroke, lineWidth: CGFloat = 1) -> some View { - strokeBorder(strokeStyle, lineWidth: lineWidth) - .background(fill(fillStyle)) - } -} - -public extension UIEdgeInsets { - /// The left + right insets. - var horizontal: CGFloat { - get { - left + right - } set { - left = newValue - right = newValue - } - } - - /// The top + bottom insets. - var vertical: CGFloat { - get { - top + bottom - } set { - top = newValue - bottom = newValue - } - } - - /// Create equal insets on all 4 sides. - init(_ inset: CGFloat) { - self = UIEdgeInsets(top: inset, left: inset, bottom: inset, right: inset) - } -} - -/// Detect changes in bindings (fallback of `.onChange` for iOS 13+). From https://stackoverflow.com/a/64402663/14351818 -struct ChangeObserver: View { - let content: Content - let value: Value - let action: (Value, Value) -> Void - - init(value: Value, action: @escaping (Value, Value) -> Void, content: @escaping () -> Content) { - self.value = value - self.action = action - self.content = content() - _oldValue = State(initialValue: value) - } - - @State private var oldValue: Value - - var body: some View { - DispatchQueue.main.async { - if oldValue != value { - action(oldValue, value) - oldValue = value - } - } - return content - } -} - -public extension View { - /// Detect changes in bindings (fallback of `.onChange` for iOS 13+). - func onValueChange( - of value: Value, - perform action: @escaping (_ oldValue: Value, _ newValue: Value) -> Void - ) -> some View { - ChangeObserver(value: value, action: action) { - self - } - } -} diff --git a/Pods/Popovers/Sources/PopoverWindows.swift b/Pods/Popovers/Sources/PopoverWindows.swift deleted file mode 100644 index ca99a6cd..00000000 --- a/Pods/Popovers/Sources/PopoverWindows.swift +++ /dev/null @@ -1,145 +0,0 @@ -// -// PopoverWindows.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 1/4/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/** - Popovers supports multiple windows (iOS) by associating each `PopoverModel` with a window. - */ - -/// A map of `PopoverModel`s scoped to each window. -class WindowPopoverModels { - /// The singleton `WindowPopoverMap` instance. - static let shared = WindowPopoverModels() - - /** - Aggregates the collection of models applicable to each `UIWindow` in the application. - - `UIWindow` references are weakly retained to avoid us leaking application scenes that have been disposed of by iOS, - e.g. when dismissed from the multitasking UI or explicitly closed by the app. - */ - private var windowModels = [Weak: PopoverModel]() - - private init() { - /// Enforcing singleton by marking `init` as private. - } - - /** - Retrieves the `PopoverModel` associated with the given `UIWindow`. - - When a `PopoverModel` already exists for the given `UIWindow`, the same reference will be returned by this function. - Otherwise, a new model is created and associated with the window. - - - parameter window: The `UIWindow` whose `PopoverModel` is being requested, e.g. to present a popover. - - Returns: The `PopoverModel` used to model the visible popovers for the given window. - */ - func popoverModel(for window: UIWindow) -> PopoverModel { - /** - Continually remove entries that refer to `UIWindow`s that are no longer about. - The view hierarchies have already been dismantled - this is just for our own book keeping. - */ - pruneDeallocatedWindowModels() - - if let existingModel = existingPopoverModel(for: window) { - return existingModel - } else { - return prepareAndRetainModel(for: window) - } - } - - private func pruneDeallocatedWindowModels() { - let keysToRemove = windowModels.keys.filter(\.isPointeeDeallocated) - for key in keysToRemove { - windowModels[key] = nil - } - } - - /// Get an existing popover model for this window if it exists. - private func existingPopoverModel(for window: UIWindow) -> PopoverModel? { - return windowModels.first(where: { holder, _ in holder.pointee === window })?.value - } - - private func prepareAndRetainModel(for window: UIWindow) -> PopoverModel { - let newModel = PopoverModel() - let weakWindowReference = Weak(pointee: window) - windowModels[weakWindowReference] = newModel - - return newModel - } - - /// Container type to enable storage of an object type without incrementing its retain count. - private class Weak: NSObject where T: AnyObject { - private(set) weak var pointee: T? - - var isPointeeDeallocated: Bool { - pointee == nil - } - - init(pointee: T) { - self.pointee = pointee - } - } -} - -extension UIResponder { - /** - The `PopoverModel` in the current responder chain. - - Each responder chain hosts a single `PopoverModel` at the window level. - Each scene containing a separate window will contain its own `PopoverModel`, scoping the layout code to each window. - - - Important: Attempting to request the `PopoverModel` for a responder not present in the chain is programmer error. - */ - var popoverModel: PopoverModel { - /// If we're a view, continue to walk up the responder chain until we hit the root view. - if let view = self as? UIView, let superview = view.superview { - return superview.popoverModel - } - - /// If we're a window, we define the scoping for the model - access it. - if let window = self as? UIWindow { - return WindowPopoverModels.shared.popoverModel(for: window) - } - - /// If we're a view controller, begin walking the responder chain up to the root view. - if let viewController = self as? UIViewController { - return viewController.view.popoverModel - } - - fatalError("[Popovers] - No `PopoverModel` present in responder chain (\(self)) - has the source view been installed into a window?") - } -} - -public extension UIResponder { - /** - Get a currently-presented popover with a tag. Returns `nil` if no popover with the tag was found. - - parameter tag: The tag of the popover to look for. - */ - func popover(tagged tag: AnyHashable) -> Popover? { - return popoverModel.popover(tagged: tag) - } -} - -/// For passing the hosting window into the environment. -extension EnvironmentValues { - /// Designates the `UIWindow` hosting the views within the current environment. - var window: UIWindow? { - get { - self[WindowEnvironmentKey.self] - } - set { - self[WindowEnvironmentKey.self] = newValue - } - } - - private struct WindowEnvironmentKey: EnvironmentKey { - typealias Value = UIWindow? - - static var defaultValue: UIWindow? = nil - } -} diff --git a/Pods/Popovers/Sources/Popovers.swift b/Pods/Popovers/Sources/Popovers.swift deleted file mode 100644 index f585154e..00000000 --- a/Pods/Popovers/Sources/Popovers.swift +++ /dev/null @@ -1,20 +0,0 @@ -// -// Popovers.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 1/17/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/** - A collection of constants. - */ -public enum Popovers { - /// The minimum distance a popover needs to be dragged before it starts getting offset. - public static var minimumDragDistance = CGFloat(2) - - /// The delay after a bounds change before recalculating popover frames. - public static var frameUpdateDelayAfterBoundsChange = CGFloat(0.6) -} diff --git a/Pods/Popovers/Sources/SwiftUI/FrameTag.swift b/Pods/Popovers/Sources/SwiftUI/FrameTag.swift deleted file mode 100644 index b5c1cd8d..00000000 --- a/Pods/Popovers/Sources/SwiftUI/FrameTag.swift +++ /dev/null @@ -1,88 +0,0 @@ -// -// FrameTag.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/** - Frame tags are used to store the frames - */ - -/// Store a view's frame for later use. -struct FrameTagModifier: ViewModifier { - /// The name of the frame. - let tag: AnyHashable - @State var frame = CGRect.zero - - func body(content: Content) -> some View { - WindowReader { window in - content - .frameReader { frame in - self.frame = frame - if let window = window { - window.save(frame, for: tag) - } - } - .onValueChange(of: window) { _, newValue in - if let window = window { - window.save(frame, for: tag) - } - } - } - } -} - -public extension View { - /** - Tag a view and store its frame. Access using `Popovers.frameTagged(_:)`. - - You can use this for supplying source frames or excluded frames. **Do not** use it anywhere else, due to State re-rendering issues. - - - parameter tag: The tag for the frame - */ - func frameTag(_ tag: AnyHashable) -> some View { - return modifier(FrameTagModifier(tag: tag)) - } -} - -public extension UIResponder { - /** - Get the saved frame of a frame-tagged view inside this window. You must first set the frame using `.frameTag(_:)`. - - parameter tag: The tag that you used for the frame. - - Returns: The frame of a frame-tagged view, or `nil` if no view with the tag exists. - */ - func frameTagged(_ tag: AnyHashable) -> CGRect { - return popoverModel.frame(tagged: tag) - } - - /** - Remove all saved frames inside this window for `.popover(selection:tag:attributes:view:)`. - Call this method when you present another view where the frames don't apply. - */ - func clearSavedFrames() { - popoverModel.selectionFrameTags.removeAll() - } - - /// Save a frame in this window's `frameTags`. - internal func save(_ frame: CGRect, for tag: AnyHashable) { - popoverModel.frameTags[tag] = frame - } -} - -public extension Optional where Wrapped: UIResponder { - /** - Get the saved frame of a frame-tagged view inside this window. You must first set the frame using `.frameTag(_:)`. This is a convenience overload for optional `UIResponder`s. - - parameter tag: The tag that you used for the frame. - - Returns: The frame of a frame-tagged view, or `nil` if no view with the tag exists. - */ - func frameTagged(_ tag: AnyHashable) -> CGRect { - if let responder = self { - return responder.frameTagged(tag) - } - return .zero - } -} diff --git a/Pods/Popovers/Sources/SwiftUI/Modifiers.swift b/Pods/Popovers/Sources/SwiftUI/Modifiers.swift deleted file mode 100644 index 24111c6f..00000000 --- a/Pods/Popovers/Sources/SwiftUI/Modifiers.swift +++ /dev/null @@ -1,370 +0,0 @@ -// -// Modifiers.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import Combine -import SwiftUI - -/** - Present a popover in SwiftUI. Access using `.popover(present:attributes:view:)`. - */ -struct PopoverModifier: ViewModifier { - /** - Binding to the popover's presentation state. - - Set to `true` to present, `false` to dismiss. - */ - @Binding var present: Bool - - /// Build the attributes. - let buildAttributes: (inout Popover.Attributes) -> Void - - /// The popover's view. - let view: AnyView - - /// The popover's background. - let background: AnyView - - /// Reference to the popover. - @State var popover: Popover? - - /// The source frame to present from. Calculated by reading the frame of whatever view the modifier is attached to. - @State var sourceFrame: CGRect? - - /// Create a popover. Use `.popover(present:attributes:view:)` to access. - init( - present: Binding, - buildAttributes: @escaping ((inout Popover.Attributes) -> Void) = { _ in }, - @ViewBuilder view: @escaping () -> Content - ) { - _present = present - self.buildAttributes = buildAttributes - self.view = AnyView(view()) - background = AnyView(Color.clear) - } - - /// Create a popover with a background. Use `.popover(present:attributes:view:background:)` to access. - init( - present: Binding, - buildAttributes: @escaping ((inout Popover.Attributes) -> Void) = { _ in }, - @ViewBuilder view: @escaping () -> MainContent, - @ViewBuilder background: @escaping () -> BackgroundContent - ) { - _present = present - self.buildAttributes = buildAttributes - self.view = AnyView(view()) - self.background = AnyView(background()) - } - - func body(content: Content) -> some View { - WindowReader { window in - content - - /// Read the frame of the source view. - .frameReader { frame in - sourceFrame = frame - } - - /// Detect a state change in `$present`. - .onValueChange(of: present) { oldValue, newValue in - - /// Make sure there is a window first. - guard let window = window else { - print("[Popovers] - No window was found when presenting popover. Please file a bug report (https://github.com/aheze/Popovers/issues).") - return - } - - /// `newValue` is true, so present the popover. - if newValue { - guard popover == nil else { return } - var attributes = Popover.Attributes() - - /// Set the default source frame to the source view. - attributes.sourceFrame = { - if case .absolute = attributes.position { - return sourceFrame ?? .zero - } else { - return window.safeAreaLayoutGuide.layoutFrame - } - } - - /// Build the attributes using the closure. If you supply a custom source frame, the default will be overridden. - buildAttributes(&attributes) - - let popover = Popover( - attributes: attributes, - view: { view }, - background: { background } - ) - - /// Store a reference to the popover. - self.popover = popover - - /** - Listen to the internal `onDismiss` callback. - - This is called just after the popover is removed from the model. - */ - popover.context.onAutoDismiss = { - self.present = false - self.popover = nil /// Remove the reference to the popover. - } - - /// Present the popover. - popover.present(in: window) - - } else { - /// `$present` was set to `false`, dismiss the popover. - - /// If there is still a popover, it means the client set `$present` to false. - guard let popover = popover else { return } - - popover.dismiss() - } - } - } - } -} - -/** - Present a popover that can transition to another popover in SwiftUI. Access using `.popover(selection:tag:attributes:view:)`. - */ -struct MultiPopoverModifier: ViewModifier { - /// The current selection. Present the popover when this equals `tag.` - @Binding var selection: String? - - /// The popover's tag. - let tag: String - - /// Build the attributes. - let buildAttributes: (inout Popover.Attributes) -> Void - - /// The popover's view. - let view: AnyView - - /// The popover's background. - let background: AnyView - - /// Reference to the popover. - @State var popover: Popover? - - /// The source frame to present from. Calculated by reading the frame of whatever view the modifier is attached to. - @State var sourceFrame: CGRect? - - /// Create a popover. Use `.popover(selection:tag:attributes:view)` to access. - init( - selection: Binding, - tag: String, - buildAttributes: @escaping ((inout Popover.Attributes) -> Void), - @ViewBuilder view: @escaping () -> Content - ) { - _selection = selection - self.tag = tag - self.buildAttributes = buildAttributes - self.view = AnyView(view()) - background = AnyView(Color.clear) - } - - /// Create a popover with a background. Use `.popover(selection:tag:attributes:view:background:)` to access. - init( - selection: Binding, - tag: String, - buildAttributes: @escaping ((inout Popover.Attributes) -> Void), - @ViewBuilder view: @escaping () -> MainContent, - @ViewBuilder background: @escaping () -> BackgroundContent - ) { - _selection = selection - self.tag = tag - self.buildAttributes = buildAttributes - self.view = AnyView(view()) - self.background = AnyView(background()) - } - - func body(content: Content) -> some View { - WindowReader { window in - content - - /// Read the frame of the source view. - .frameReader { frame in - - /// Save the frame for now, until the selection changes (by that time, the window scene should be ready). - sourceFrame = frame - } - - /// `$selection` was changed, determine if the popover should be presented, animated, or dismissed. - .onValueChange(of: selection) { oldSelection, newSelection in - - /// Make sure there is a window first. - guard let window = window else { - print("[Popovers] - No window was found when presenting popover. Please file a bug report (https://github.com/aheze/Popovers/issues).") - return - } - - let model = window.popoverModel - - /// Save the frame in `selectionFrameTags` to provide `excludedFrames`. - model.selectionFrameTags[tag] = sourceFrame - - /// If the new selection is nil, dismiss the popover. - guard newSelection != nil else { - if let popover = popover { - popover.dismiss() - } - return - } - - /// New selection is this popover, so present. - if newSelection == tag { - var attributes = Popover.Attributes() - - /// Set the attributes' tag as `self.tag`. - attributes.tag = tag - - /** - Provide the other views' frames excluded frames. - This makes sure that the popover isn't dismissed when you tap outside to present another popover. - To opt-out, set `attributes.dismissal.excludedFrames` manually. - */ - attributes.dismissal.excludedFrames = { Array(window.popoverModel.selectionFrameTags.values) } - - /// Set the source frame. - attributes.sourceFrame = { - if case .absolute = attributes.position { - return sourceFrame ?? .zero - } else { - return window.safeAreaLayoutGuide.layoutFrame - } - } - - /// Build the attributes. - buildAttributes(&attributes) - - let popover = Popover( - attributes: attributes, - view: { view }, - background: { background } - ) - - /// Store a reference to the popover. - self.popover = popover - - /** - Listen to the internal `onDismiss` callback. - - This is called just after the popover is removed from the model. - */ - popover.context.onAutoDismiss = { - self.selection = nil - self.popover = nil /// Remove the reference to the popover. - } - - /// If an old selection with the same tag exists, animate the change. - if let oldSelection = oldSelection, let oldPopover = window.popover(tagged: oldSelection) { - oldPopover.replace(with: popover) - } else { - /// Otherwise, present the popover. - popover.present(in: window) - } - } - } - } - } -} - -public extension View { - /** - Popover for SwiftUI. - - parameter present: The binding to the popover's presentation state. Set to `true` to present, `false` to dismiss. - - parameter attributes: The popover's attributes. - - parameter view: The popover's view. - */ - func popover( - present: Binding, - attributes buildAttributes: @escaping ((inout Popover.Attributes) -> Void) = { _ in }, - @ViewBuilder view: @escaping () -> Content - ) -> some View { - return modifier( - PopoverModifier( - present: present, - buildAttributes: buildAttributes, - view: view - ) - ) - } - - /** - Popover for SwiftUI with a background. - - parameter present: The binding to the popover's presentation state. Set to `true` to present, `false` to dismiss. - - parameter attributes: The popover's attributes. - - parameter view: The popover's view. - - parameter background: The popover's background. - */ - func popover( - present: Binding, - attributes buildAttributes: @escaping ((inout Popover.Attributes) -> Void) = { _ in }, - @ViewBuilder view: @escaping () -> MainContent, - @ViewBuilder background: @escaping () -> BackgroundContent - ) -> some View { - return modifier( - PopoverModifier( - present: present, - buildAttributes: buildAttributes, - view: view, - background: background - ) - ) - } - - /** - For presenting multiple popovers in SwiftUI. - - parameter selection: The binding to the popover's presentation state. When this is equal to `tag`, the popover will present. - - parameter tag: The popover's tag. Equivalent to `attributes.tag`. - - parameter attributes: The popover's attributes. - - parameter view: The popover's view. - */ - func popover( - selection: Binding, - tag: String, - attributes buildAttributes: @escaping ((inout Popover.Attributes) -> Void) = { _ in }, - @ViewBuilder view: @escaping () -> Content - ) -> some View { - return modifier( - MultiPopoverModifier( - selection: selection, - tag: tag, - buildAttributes: buildAttributes, - view: view - ) - ) - } - - /** - For presenting multiple popovers with backgrounds in SwiftUI. - - parameter selection: The binding to the popover's presentation state. When this is equal to `tag`, the popover will present. - - parameter tag: The popover's tag. Equivalent to `attributes.tag`. - - parameter attributes: The popover's attributes. - - parameter view: The popover's view. - - parameter background: The popover's background. - */ - func popover( - selection: Binding, - tag: String, - attributes buildAttributes: @escaping ((inout Popover.Attributes) -> Void) = { _ in }, - @ViewBuilder view: @escaping () -> MainContent, - @ViewBuilder background: @escaping () -> BackgroundContent - ) -> some View { - return modifier( - MultiPopoverModifier( - selection: selection, - tag: tag, - buildAttributes: buildAttributes, - view: view, - background: background - ) - ) - } -} diff --git a/Pods/Popovers/Sources/SwiftUI/Readers.swift b/Pods/Popovers/Sources/SwiftUI/Readers.swift deleted file mode 100644 index c6c8c482..00000000 --- a/Pods/Popovers/Sources/SwiftUI/Readers.swift +++ /dev/null @@ -1,97 +0,0 @@ -// -// Readers.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/** - Read the popover's context from within its `view` or `background`. - Use this just like `GeometryReader`. - - **Warning:** This must be placed inside a popover's `view` or `background`. - */ -public struct PopoverReader: View { - /// Read the popover's context from within its `view` or `background`. - public init(@ViewBuilder view: @escaping (Popover.Context) -> Content) { - self.view = view - } - - /// The parent view. - @ViewBuilder var view: (Popover.Context) -> Content - - /// The popover's context (passed down from `Popover.swift`). - @EnvironmentObject var context: Popover.Context - - public var body: some View { - /// Pass the context down. - view(context) - } -} - -/** - Read the current `UIWindow` that hosts the view. - Use this just like `GeometryReader`. - - **Warning:** Do *not* place this inside a popover's `view` or its `background`. - Instead, use the `window` property of the popover's context. - */ -public struct WindowReader: View { - /// Your SwiftUI view. - public let view: (UIWindow?) -> Content - - /// The read window. - @State var window: UIWindow? - - /// An environment value to pass down into your SwiftUI view. - @Environment(\.window) var environmentWindow - - /// Reads the `UIWindow` that hosts some SwiftUI content. - public init(@ViewBuilder view: @escaping (UIWindow?) -> Content) { - self.view = view - } - - public var body: some View { - view(window) - .environment(\.window, window) - .background( - WindowHandlerRepresentable(binding: $window) - ) - } - - /// A wrapper view to read the parent window. - private struct WindowHandlerRepresentable: UIViewRepresentable { - var binding: Binding - - func makeUIView(context _: Context) -> WindowHandler { - WindowHandler(binding: binding) - } - - func updateUIView(_: WindowHandler, context _: Context) {} - } - - private class WindowHandler: UIView { - @Binding var binding: UIWindow? - - init(binding: Binding) { - _binding = binding - super.init(frame: .zero) - backgroundColor = .clear - } - - @available(*, unavailable) - required init?(coder _: NSCoder) { - fatalError("[Popovers] - Create this view programmatically.") - } - - override func didMoveToWindow() { - super.didMoveToWindow() - - /// Set the window. - binding = window - } - } -} diff --git a/Pods/Popovers/Sources/Templates/Alert.swift b/Pods/Popovers/Sources/Templates/Alert.swift deleted file mode 100644 index b8bbd958..00000000 --- a/Pods/Popovers/Sources/Templates/Alert.swift +++ /dev/null @@ -1,26 +0,0 @@ -// -// Alert.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/4/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -public extension Templates { - /// A button style to resemble that of a system alert. - struct AlertButtonStyle: ButtonStyle { - /// A button style to resemble that of a system alert. - public init() {} - public func makeBody(configuration: Configuration) -> some View { - configuration.label - .frame(maxWidth: .infinity) - .contentShape(Rectangle()) - .padding() - .background( - configuration.isPressed ? Templates.buttonHighlightColor : Color.clear - ) - } - } -} diff --git a/Pods/Popovers/Sources/Templates/Blur.swift b/Pods/Popovers/Sources/Templates/Blur.swift deleted file mode 100644 index 30d423fb..00000000 --- a/Pods/Popovers/Sources/Templates/Blur.swift +++ /dev/null @@ -1,30 +0,0 @@ -// -// Blur.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/4/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -public extension Templates { - /// Use UIKit blurs in SwiftUI. - struct VisualEffectView: UIViewRepresentable { - /// The blur's style. - public var style: UIBlurEffect.Style - - /// Use UIKit blurs in SwiftUI. - public init(_ style: UIBlurEffect.Style) { - self.style = style - } - - public func makeUIView(context _: UIViewRepresentableContext) -> UIVisualEffectView { - UIVisualEffectView() - } - - public func updateUIView(_ uiView: UIVisualEffectView, context _: UIViewRepresentableContext) { - uiView.effect = UIBlurEffect(style: style) - } - } -} diff --git a/Pods/Popovers/Sources/Templates/Container.swift b/Pods/Popovers/Sources/Templates/Container.swift deleted file mode 100644 index 112a0336..00000000 --- a/Pods/Popovers/Sources/Templates/Container.swift +++ /dev/null @@ -1,107 +0,0 @@ -// -// Container.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/4/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -public extension Templates { - /** - A standard container for popovers, complete with arrow. - */ - struct Container: View { - /// Which side to place the arrow on. - public var arrowSide: ArrowSide? - - /// The container's corner radius. - public var cornerRadius = CGFloat(12) - - /// The container's background/fill color. - public var backgroundColor = Color(.systemBackground) - - /// The padding around the content view. - public var padding = CGFloat(16) - - /// The content view. - @ViewBuilder public var view: Content - - /** - A standard container for popovers, complete with arrow. - - parameter arrowSide: Which side to place the arrow on. - - parameter cornerRadius: The container's corner radius. - - parameter backgroundColor: The container's background/fill color. - - parameter padding: The padding around the content view. - - parameter view: The content view. - */ - public init( - arrowSide: Templates.ArrowSide? = nil, - cornerRadius: CGFloat = CGFloat(12), - backgroundColor: Color = Color(.systemBackground), - padding: CGFloat = CGFloat(16), - @ViewBuilder view: () -> Content - ) { - self.arrowSide = arrowSide - self.cornerRadius = cornerRadius - self.backgroundColor = backgroundColor - self.padding = padding - self.view = view() - } - - public var body: some View { - PopoverReader { context in - view - .padding(padding) - .background( - BackgroundWithArrow( - arrowSide: arrowSide ?? context.attributes.position.getArrowPosition(), - cornerRadius: cornerRadius - ) - .fill(backgroundColor) - .shadow( - color: Color(.label.withAlphaComponent(0.25)), - radius: 40, - x: 0, - y: 4 - ) - ) - } - } - } - - /// The side of the popover that the arrow should be placed on. - /** - - top - X──────────────X──────────────X - | | - | | - left X X right - | | - | | - X──────────────X──────────────X - bottom - */ - enum ArrowSide { - case top(ArrowAlignment) - case right(ArrowAlignment) - case bottom(ArrowAlignment) - case left(ArrowAlignment) - - /// Place the arrow on the left, middle, or right on a side. - /** - - mostCounterClockwise centered mostClockwise - ────X──────────────────────X──────────────────────X──── - | | - * diagram is for `ArrowSide.top` - */ - public enum ArrowAlignment { - case mostCounterClockwise - case centered - case mostClockwise - } - } -} diff --git a/Pods/Popovers/Sources/Templates/Extensions.swift b/Pods/Popovers/Sources/Templates/Extensions.swift deleted file mode 100644 index 9035b1a2..00000000 --- a/Pods/Popovers/Sources/Templates/Extensions.swift +++ /dev/null @@ -1,343 +0,0 @@ -// -// Extensions.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/4/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -// MARK: - Shadows - -public extension View { - /// A convenient way to apply a shadow. - func popoverShadow(shadow: Templates.Shadow = .system) -> some View { - self.shadow( - color: shadow.color, - radius: shadow.radius, - x: shadow.x, - y: shadow.y - ) - } -} - -// MARK: - Arrow Positioning - -public extension Popover.Attributes.Position { - /// Determine which side an arrow is best placed. - func getArrowPosition() -> Templates.ArrowSide { - /// This only applied when the position is `.absolute`. - if case let .absolute(originAnchor, popoverAnchor) = self { - /// X = popover - switch originAnchor { - case .topLeft: - // X ------------ - // | source frame - // | - switch popoverAnchor { - case .topRight: - return .right(.mostCounterClockwise) - case .right: - return .right(.centered) - case .bottomLeft: - return .bottom(.mostClockwise) - case .bottom: - return .bottom(.centered) - default: - break - } - case .top: - // -------X------- - // | source frame | - // | | - switch popoverAnchor { - case .bottomRight: - return .bottom(.mostCounterClockwise) - case .bottom: - return .bottom(.centered) - case .bottomLeft: - return .bottom(.mostClockwise) - default: - break - } - case .topRight: - // ------------- X - // source frame | - // | - switch popoverAnchor { - case .bottomRight: - return .bottom(.mostCounterClockwise) - case .bottom: - return .bottom(.centered) - case .left: - return .left(.centered) - case .topLeft: - return .left(.mostClockwise) - default: - break - } - case .right: - // ------------- | - // source frame X - // ______________| - switch popoverAnchor { - case .bottomLeft: - return .left(.mostCounterClockwise) - case .left: - return .left(.centered) - case .topLeft: - return .left(.mostClockwise) - default: - break - } - case .bottomRight: - // | - // source frame | - // ______________ X - switch popoverAnchor { - case .bottomLeft: - return .left(.mostCounterClockwise) - case .left: - return .left(.centered) - case .top: - return .top(.centered) - case .topRight: - return .top(.mostClockwise) - default: - break - } - case .bottom: - // | | - // | source frame | - // |_______X________| - switch popoverAnchor { - case .topRight: - return .top(.mostCounterClockwise) - case .top: - return .top(.centered) - case .topLeft: - return .top(.mostClockwise) - default: - break - } - case .bottomLeft: - // | - // | source frame - // X ______________ - switch popoverAnchor { - case .topLeft: - return .top(.mostCounterClockwise) - case .top: - return .top(.centered) - case .right: - return .right(.centered) - case .bottomRight: - return .top(.mostClockwise) - default: - break - } - case .left: - // |-------------- - // X source frame - // |______________ - switch popoverAnchor { - case .topRight: - return .right(.mostCounterClockwise) - case .right: - return .right(.centered) - case .bottomRight: - return .right(.mostClockwise) - default: - break - } - case .center: - break - } - } - - /// No preferred arrow. Just go with a top-centered one. - return .top(.centered) - } -} - -// MARK: - Utilities - -/// Convert degrees to radians and back. From https://stackoverflow.com/a/29179878 -public extension BinaryInteger { - var degreesToRadians: CGFloat { CGFloat(self) * .pi / 180 } -} - -public extension FloatingPoint { - var degreesToRadians: Self { self * .pi / 180 } - var radiansToDegrees: Self { self * 180 / .pi } -} - -/// Get an array of views from `@ViewBuilder`. From https://github.com/GeorgeElsham/ViewExtractor -/// Used for the Menu template. -/// Extract SwiftUI views from ViewBuilder content. -public struct ViewExtractor { - /// Represents a `View`. Can be used to get `AnyView` from `Any`. - public struct GenericView { - let body: Any - - /// Get `AnyView` from a generic view. - var anyView: AnyView? { - AnyView(_fromValue: body) - } - } - - /// If the content is a `ForEach`, this gives the range. If it fails, it returns `nil`. - public var forEachRange: Range? { - struct FakeCollection { - let indices: Range - } - - // Reflect `ForEach` to get the `data`. - guard let forEach = forEach else { return nil } - let mirror = Mirror(reflecting: forEach) - guard let data = mirror.descendant("data") else { return nil } - - // Bind the collection to `FakeCollection`, to get the `indices`. - return withUnsafeBytes(of: data) { ptr -> Range? in - let binded = ptr.bindMemory(to: FakeCollection.self) - return binded.first?.indices - } - } - - private let forEach: DynamicViewContentProvider? - - public init(content: ForEachContent) { - forEach = content() - } - - /// Get the view at this exact index, ignoring types of views - /// checks. For example, `EmptyView` won't be ignored. - /// - /// - Parameter index: Index within `ForEach` to get. - /// - Returns: View at this index, or `nil` if none. - public func uncheckedView(at index: Int) -> AnyView? { - forEach?.extractContent(at: index) - } - - /// Gets views from a `TupleView`. - /// - Parameter content: Content to extract the views from. - /// - Returns: Extracted views. - public static func getViews(@ViewBuilder from content: TupleContent) -> [AnyView] { - content().views - } - - /// Get views from a normal view closure. - /// - Parameter content: Content to extract the views from. - /// - Returns: Extracted views. - public static func getViews(@ViewBuilder from content: NormalContent) -> [AnyView] { - ViewExtractor.views(from: content()) - } - - /// Gets views from `Any`. Also splits up `DynamicViewContent` into separate views. - /// - Parameter view: View of `Any` type. - /// - Returns: Views contained by this `view`. - public static func views(from view: Any) -> [AnyView] { - checkingViewContent(view) { - // Just a normal view. Convert it from type `Any` to `AnyView`. - withUnsafeBytes(of: view) { ptr -> [AnyView] in - // Cast from type `Any` to `GenericView`, - // which mimics the structure of a `View`. - let binded = ptr.bindMemory(to: GenericView.self) - - // Get `AnyView` from the 'fake' view body. - return binded.first?.anyView.map { [$0] } ?? [] - } - } - } - - /// Return the view content. This removes views like `EmptyView`, - /// and gets content from within `ForEach`. - /// - /// - Parameters: - /// - view: View to test. - /// - actual: If this is a normal view, this content is used. - /// - Returns: Array of content views. - fileprivate static func checkingViewContent(_ view: Any, actual: () -> [AnyView]) -> [AnyView] { - // Check this is not an empty view with no content. - if view is EmptyView { - return [] - } - - // Check this is not a `nil` view. Can occur due to conditionals. - if case Optional.none = view { - return [] - } - - // If this view is a `ForEach`, extract all contained views. - if let forEach = view as? DynamicViewContentProvider { - return forEach.extractContent() - } - - // Actual view. - return actual() - } -} - -// MARK: - Content types - -public typealias TupleContent = () -> TupleView -public typealias NormalContent = () -> Content -public typealias ForEachContent = () -> Content - -// MARK: - TupleView views - -public extension TupleView { - /// Convert tuple of views to array of `AnyView`s. - var views: [AnyView] { - let children = Mirror(reflecting: value).children - return children.flatMap { ViewExtractor.views(from: $0.value) } - } -} - -// MARK: - Dynamic view content - -public protocol DynamicViewContentProvider { - func extractContent() -> [AnyView] - func extractContent(at index: Int) -> AnyView? -} - -extension ForEach: DynamicViewContentProvider where Content: View { - public func extractContent() -> [AnyView] { - // Dynamically mirrors the current instance. - let mirror = Mirror(reflecting: self) - - // Retrieving hidden properties containing the data and content. - if let data = mirror.descendant("data") as? Data, - let content = mirror.descendant("content") as? (Data.Element) -> Content - { - return data.flatMap { element -> [AnyView] in - // Create content given the data for this `ForEach` element. - let newContent = content(element) - - // Gets content for element. - return ViewExtractor.checkingViewContent(newContent) { - [AnyView(newContent)] - } - } - } else { - // Return no content if failure. - return [] - } - } - - public func extractContent(at index: Int) -> AnyView? { - // Dynamically mirrors the current instance. - let mirror = Mirror(reflecting: self) - - // Check view is valid. - guard let data = mirror.descendant("data") as? Data, - 0 ..< data.count ~= index, - let content = mirror.descendant("content") as? (Data.Element) -> Content - else { return nil } - - // Return view for specific index. - let dataIndex = data.index(data.startIndex, offsetBy: index) - return AnyView(content(data[dataIndex])) - } -} diff --git a/Pods/Popovers/Sources/Templates/Menu+Model.swift b/Pods/Popovers/Sources/Templates/Menu+Model.swift deleted file mode 100644 index 1ffb5871..00000000 --- a/Pods/Popovers/Sources/Templates/Menu+Model.swift +++ /dev/null @@ -1,204 +0,0 @@ -// -// Menu+Model.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/6/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -extension Templates { - class MenuModel: ObservableObject { - /// Whether to show the popover or not. - @Published var present = false - - /// The popover's scale (for rubber banding). - @Published var scale = CGFloat(1) - - /// The index of the menu button that the user's finger hovers on. - @Published var hoveringIndex: Int? - - /// The selected menu button if it exists. - @Published var selectedIndex: Int? - - /// The frames of the menu buttons, relative to the window. - @Published var sizes: [MenuItemSize] = [] - - /** - The indices of tappable menu buttons. - `getIndex` will only return indices that are contained in here. - */ - @Published var itemIndices = [Int]() - - /// The frame of the menu in global coordinates. - @Published var menuFrame = CGRect.zero - - /// Get the menu button index that intersects the drag gesture's touch location. - func getIndex(from location: CGPoint) -> Int? { - /// Create frames from the sizes. - var frames = [Int: CGRect]() - for item in sizes { - let previousSizes = sizes.filter { $0.index < item.index } - let previousHeight = previousSizes.map { $0.size.height }.reduce(0, +) - let frame = CGRect(x: 0, y: previousHeight, width: item.size.width, height: item.size.height) - frames[item.index] = frame - } - - let zeroedLocation = CGPoint(x: location.x - menuFrame.minX, y: location.y - menuFrame.minY) - - for (index, frame) in frames { - if - frame.contains(zeroedLocation), - itemIndices.contains(index) /// Make sure that the index is a tappable button. - { - return index - } - } - return nil - } - - func getDistanceFromMenu(from location: CGPoint) -> CGFloat? { - let menuCenter = CGPoint(x: menuFrame.midX, y: menuFrame.midY) - - /// The location relative to the popover menu's center (0, 0) - let normalizedLocation = CGPoint(x: location.x - menuCenter.x, y: location.y - menuCenter.y) - - if abs(normalizedLocation.y) >= menuFrame.height / 2, abs(normalizedLocation.y) >= abs(normalizedLocation.x) { - /// top and bottom - let distance = abs(normalizedLocation.y) - menuFrame.height / 2 - return distance - } else { - /// left and right - let distance = abs(normalizedLocation.x) - menuFrame.width / 2 - return distance - } - } - - /// Get the anchor point to scale from. - func getScaleAnchor(from context: Popover.Context) -> UnitPoint { - if case let .absolute(_, popoverAnchor) = context.attributes.position { - return popoverAnchor.unitPoint - } - - return .center - } - - /// Process the drag gesture, updating the menu to match. - static func onDragChanged( - location: CGPoint, - model: MenuModel, - id: UUID, - labelPressUUID: inout UUID?, - labelFrame: CGRect, - configuration: MenuConfiguration, - window: UIWindow?, - labelPressedWhenAlreadyPresented: inout Bool, - getCurrentLabelPressUUID: @escaping (() -> UUID?), - getDragLocation: @escaping (() -> CGPoint?), - present: @escaping ((Bool) -> Void), - fadeLabel: @escaping ((Bool) -> Void) - ) { - if model.present == false { - /// The menu is not yet presented. - if labelPressUUID == nil { - labelPressUUID = UUID() - let currentUUID = labelPressUUID - DispatchQueue.main.asyncAfter(deadline: .now() + configuration.holdDelay) { - if - currentUUID == getCurrentLabelPressUUID(), - let dragLocation = getDragLocation() - { - if labelFrame.contains(dragLocation) { - present(true) - } - } - } - } - - withAnimation(configuration.labelFadeAnimation) { - let shouldFade = labelFrame.contains(location) - fadeLabel(shouldFade) - } - } else if labelPressUUID == nil { - /// The menu was already presented. - labelPressUUID = UUID() - labelPressedWhenAlreadyPresented = true - } else { - /// Highlight the button that the user's finger is over. - model.hoveringIndex = model.getIndex(from: location) - - /// Rubber-band the menu. - withAnimation { - if let distance = model.getDistanceFromMenu(from: location) { - if configuration.scaleRange.contains(distance) { - let percentage = (distance - configuration.scaleRange.lowerBound) / (configuration.scaleRange.upperBound - configuration.scaleRange.lowerBound) - let scale = 1 - (1 - configuration.minimumScale) * percentage - model.scale = scale - } else if distance < configuration.scaleRange.lowerBound { - model.scale = 1 - } else { - model.scale = configuration.minimumScale - } - } - } - } - } - - /// Process the drag gesture ending, updating the menu to match. - static func onDragEnded( - location: CGPoint, - model: MenuModel, - id: UUID, - labelPressUUID: inout UUID?, - labelFrame: CGRect, - configuration: MenuConfiguration, - window: UIWindow?, - labelPressedWhenAlreadyPresented: inout Bool, - present: @escaping ((Bool) -> Void), - fadeLabel: @escaping ((Bool) -> Void) - ) { - withAnimation { - model.scale = 1 - } - - labelPressUUID = nil - - /// The user started long pressing when the menu was **already** presented. - if labelPressedWhenAlreadyPresented { - labelPressedWhenAlreadyPresented = false - - let selectedIndex = model.getIndex(from: location) - model.selectedIndex = selectedIndex - model.hoveringIndex = nil - - /// The user lifted their finger on the label **and** it did not hit a menu item. - if - selectedIndex == nil, - labelFrame.contains(location) - { - present(false) - } - } else { - if !model.present { - if labelFrame.contains(location) { - present(true) - } else { - withAnimation(configuration.labelFadeAnimation) { - fadeLabel(false) - } - } - } else { - let selectedIndex = model.getIndex(from: location) - model.selectedIndex = selectedIndex - model.hoveringIndex = nil - - /// The user lifted their finger on a button. - if selectedIndex != nil { - present(false) - } - } - } - } - } -} diff --git a/Pods/Popovers/Sources/Templates/Menu+UIKit.swift b/Pods/Popovers/Sources/Templates/Menu+UIKit.swift deleted file mode 100644 index b5acf15d..00000000 --- a/Pods/Popovers/Sources/Templates/Menu+UIKit.swift +++ /dev/null @@ -1,232 +0,0 @@ -// -// Menu+UIKit.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/5/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import Combine -import SwiftUI - -public extension Templates { - /// A built-from-scratch version of the system menu, for UIKit. - class UIKitMenu: NSObject { - // MARK: - Menu properties - - /// A unique ID for the menu (to support multiple menus in the same screen). - var id = UUID() - - /// If the user is pressing down on the label, this will be a unique `UUID`. - var labelPressUUID: UUID? - - /** - If the label was pressed/dragged when the menu was already presented. - In this case, dismiss the menu if the user lifts their finger on the label. - */ - var labelPressedWhenAlreadyPresented = false - - /// The current position of the user's finger. - var dragLocation: CGPoint? - - /// View model for the menu buttons. - var model = MenuModel() - - /// Attributes that determine what the menu looks like. - public let configuration: MenuConfiguration - - /// The menu buttons. - public let content: [AnyView] - - /// The origin label. - public let sourceView: UIView - - /// Fade the origin label. - var fadeLabel: ((Bool) -> Void)? - - // MARK: - UIKit properties - - var popover: Popover? - var longPressGestureRecognizer: UILongPressGestureRecognizer! - - /** - A built-from-scratch version of the system menu, for UIKit. - This initializer lets you pass in a multiple menu items. - */ - public init( - sourceView: UIView, - configuration buildConfiguration: @escaping ((inout MenuConfiguration) -> Void) = { _ in }, - @ViewBuilder content: @escaping () -> TupleView, - fadeLabel: ((Bool) -> Void)? = nil - ) { - self.sourceView = sourceView - - var configuration = MenuConfiguration() - buildConfiguration(&configuration) - self.configuration = configuration - - self.content = ViewExtractor.getViews(from: content) - self.fadeLabel = fadeLabel - super.init() - - addGestureRecognizer() - } - - /** - A built-from-scratch version of the system menu, for UIKit. - This initializer lets you pass in a single menu item. - */ - public init( - sourceView: UIView, - configuration buildConfiguration: @escaping ((inout MenuConfiguration) -> Void) = { _ in }, - @ViewBuilder content: @escaping () -> Content, - fadeLabel: ((Bool) -> Void)? = nil - ) { - self.sourceView = sourceView - - var configuration = MenuConfiguration() - buildConfiguration(&configuration) - self.configuration = configuration - - self.content = [AnyView(content())] - self.fadeLabel = fadeLabel - super.init() - - addGestureRecognizer() - } - - /// Set up the drag gesture recognizer (enable "pull-down" behavior). - func addGestureRecognizer() { - let longPressGestureRecognizer = UILongPressGestureRecognizer(target: self, action: #selector(dragged)) - longPressGestureRecognizer.minimumPressDuration = 0 - sourceView.addGestureRecognizer(longPressGestureRecognizer) - sourceView.isUserInteractionEnabled = true - } - - @objc func dragged(_ gestureRecognizer: UILongPressGestureRecognizer) { - let location = gestureRecognizer.location(in: sourceView.window) - dragLocation = location - - if gestureRecognizer.state == .began || gestureRecognizer.state == .changed { - MenuModel.onDragChanged( - location: location, - model: model, - id: id, - labelPressUUID: &labelPressUUID, - labelFrame: sourceView.windowFrame(), - configuration: configuration, - window: sourceView.window, - labelPressedWhenAlreadyPresented: &labelPressedWhenAlreadyPresented - ) { [weak self] in - self?.labelPressUUID - } getDragLocation: { [weak self] in - self?.dragLocation - } present: { [weak self] present in - self?.updatePresent(present) - } fadeLabel: { [weak self] fade in - self?.fadeLabel?(fade) - } - } else { - MenuModel.onDragEnded( - location: location, - model: model, - id: id, - labelPressUUID: &labelPressUUID, - labelFrame: sourceView.windowFrame(), - configuration: configuration, - window: sourceView.window, - labelPressedWhenAlreadyPresented: &labelPressedWhenAlreadyPresented - ) { [weak self] present in - self?.updatePresent(present) - } fadeLabel: { [weak self] fade in - self?.fadeLabel?(fade) - } - } - } - - /** - Set `model.present` and show/hide the popover. - - This is called when a menu button is pressed, - or some other action happened that should hide the menu. - This is **not** called when the user taps outside the menu, - since the menu would already be automatically dismissed. - */ - func updatePresent(_ present: Bool) { - model.present = present - if - present, - let window = sourceView.window - { - presentPopover() - popover?.present(in: window) - fadeLabel?(true) - } else { - popover?.dismiss() - popover = nil - fadeLabel?(false) - } - } - - /// Present the menu popover. - func presentPopover() { - var popover = Popover { [weak self] in - if let self = self { - MenuView( - model: self.model, - present: { [weak self] present in - self?.updatePresent(present) - }, - configuration: self.configuration, - content: self.content - ) - } - } background: { [weak self] in - if let self = self { - self.configuration.backgroundColor - } - } - - popover.attributes.sourceFrame = { [weak sourceView] in sourceView.windowFrame() } - popover.attributes.position = .absolute(originAnchor: configuration.originAnchor, popoverAnchor: configuration.popoverAnchor) - popover.attributes.rubberBandingMode = .none - popover.attributes.dismissal.excludedFrames = { [weak self] in - guard let self = self else { return [] } - return [ - self.sourceView.windowFrame() - ] - + self.configuration.excludedFrames() - } - popover.attributes.sourceFrameInset = configuration.sourceFrameInset - - /** - Make sure to set `model.present` back to false when the menu is dismissed. - Don't call `updatePresent`, since the popover has already been automatically dismissed. - */ - popover.context.onAutoDismiss = { [weak self] in - self?.model.present = false - self?.fadeLabel?(false) - } - - self.popover = popover - } - } -} - -/// Control menu state externally. -public extension Templates.UIKitMenu { - /// Whether the menu is currently presented or not. - var isPresented: Bool { - model.present - } - - /// Present the menu. - func present() { - updatePresent(true) - } - - /// Dismiss the menu. - func dismiss() { - updatePresent(false) - } -} diff --git a/Pods/Popovers/Sources/Templates/Menu.swift b/Pods/Popovers/Sources/Templates/Menu.swift deleted file mode 100644 index dd71b9db..00000000 --- a/Pods/Popovers/Sources/Templates/Menu.swift +++ /dev/null @@ -1,513 +0,0 @@ -// -// Menu.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/3/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -public extension Templates { - /// A set of attributes for the popover menu. - struct MenuConfiguration { - public var holdDelay = CGFloat(0.2) /// The duration of a long press to activate the menu. - public var presentationAnimation = Animation.spring(response: 0.4, dampingFraction: 0.7, blendDuration: 1) - public var dismissalAnimation = Animation.spring(response: 0.5, dampingFraction: 0.9, blendDuration: 1) - public var labelFadeAnimation = Animation.default /// The animation used when calling the `fadeLabel`. - public var clipContent = true /// Replicate the system's default clipping animation. - public var sourceFrameInset = UIEdgeInsets(top: -8, left: -8, bottom: -8, right: -8) - public var originAnchor = Popover.Attributes.Position.Anchor.bottom /// The label's anchor. - public var popoverAnchor = Popover.Attributes.Position.Anchor.top /// The menu's anchor. - public var scaleAnchor: Popover.Attributes.Position.Anchor? /// If nil, the anchor will be automatically picked. - public var excludedFrames: (() -> [CGRect]) = { [] } - public var menuBlur = UIBlurEffect.Style.prominent - public var width: CGFloat? = CGFloat(240) /// If nil, hug the content. - public var cornerRadius = CGFloat(14) - public var showDivider = true /// Show divider between menu items. - public var shadow = Shadow.system - public var backgroundColor = Color.clear /// A color that is overlaid over the entire screen, just underneath the menu. - public var scaleRange = CGFloat(40) ... CGFloat(90) /// For rubber banding - the range at which rubber banding should be applied. - public var minimumScale = CGFloat(0.7) /// For rubber banding - the scale the the popover should shrink to when rubber banding. - - /// Create the default attributes for the popover menu. - public init( - holdDelay: CGFloat = CGFloat(0.2), - presentationAnimation: Animation = .spring(response: 0.4, dampingFraction: 0.7, blendDuration: 1), - dismissalAnimation: Animation = .spring(response: 0.5, dampingFraction: 0.9, blendDuration: 1), - labelFadeAnimation: Animation = .easeOut, - sourceFrameInset: UIEdgeInsets = .init(top: -8, left: -8, bottom: -8, right: -8), - originAnchor: Popover.Attributes.Position.Anchor = .bottom, - popoverAnchor: Popover.Attributes.Position.Anchor = .top, - scaleAnchor: Popover.Attributes.Position.Anchor? = nil, - excludedFrames: @escaping (() -> [CGRect]) = { [] }, - menuBlur: UIBlurEffect.Style = .prominent, - width: CGFloat? = CGFloat(240), - cornerRadius: CGFloat = CGFloat(14), - showDivider: Bool = true, - shadow: Shadow = .system, - backgroundColor: Color = .clear, - scaleRange: ClosedRange = 30 ... 80, - minimumScale: CGFloat = 0.85 - ) { - self.holdDelay = holdDelay - self.presentationAnimation = presentationAnimation - self.dismissalAnimation = dismissalAnimation - self.labelFadeAnimation = labelFadeAnimation - self.sourceFrameInset = sourceFrameInset - self.originAnchor = originAnchor - self.popoverAnchor = popoverAnchor - self.scaleAnchor = scaleAnchor - self.excludedFrames = excludedFrames - self.menuBlur = menuBlur - self.width = width - self.cornerRadius = cornerRadius - self.showDivider = showDivider - self.shadow = shadow - self.backgroundColor = backgroundColor - self.scaleRange = scaleRange - self.minimumScale = minimumScale - } - } - - /** - A built-from-scratch version of the system menu. - */ - struct Menu: View { - /// A unique ID for the menu (to support multiple menus in the same screen). - @State var id = UUID() - - /// If the user is pressing down on the label, this will be a unique `UUID`. - @State var labelPressUUID: UUID? - - /** - If the label was pressed/dragged when the menu was already presented. - In this case, dismiss the menu if the user lifts their finger on the label. - */ - @State var labelPressedWhenAlreadyPresented = false - - /// The current position of the user's finger. - @State var dragLocation: CGPoint? - - /// View model for the menu buttons. - @ObservedObject var model = MenuModel() - - /// Allow presenting from an external view via `$present`. - @Binding var overridePresent: Bool - - /// Attributes that determine what the menu looks like. - public let configuration: MenuConfiguration - - /// The menu buttons. - public let content: [AnyView] - - /// The origin label. - public let label: (Bool) -> Label - - /// Fade the origin label. - @State var fadeLabel = false - - /** - A built-from-scratch version of the system menu, for SwiftUI. - This initializer lets you pass in a multiple menu items. - */ - public init( - present: Binding = .constant(false), - configuration buildConfiguration: @escaping ((inout MenuConfiguration) -> Void) = { _ in }, - @ViewBuilder content: @escaping () -> TupleView, - @ViewBuilder label: @escaping (Bool) -> Label - ) { - _overridePresent = present - - var configuration = MenuConfiguration() - buildConfiguration(&configuration) - self.configuration = configuration - self.content = ViewExtractor.getViews(from: content) - self.label = label - } - - /** - A built-from-scratch version of the system menu, for SwiftUI. - This initializer lets you pass in a single menu item. - */ - public init( - present: Binding = .constant(false), - configuration buildConfiguration: @escaping ((inout MenuConfiguration) -> Void) = { _ in }, - @ViewBuilder content: @escaping () -> Content, - @ViewBuilder label: @escaping (Bool) -> Label - ) { - _overridePresent = present - - var configuration = MenuConfiguration() - buildConfiguration(&configuration) - self.configuration = configuration - self.content = [AnyView(content())] - self.label = label - } - - public var body: some View { - WindowReader { window in - label(fadeLabel) - .frameTag(id) - .contentShape(Rectangle()) - .simultaneousGesture( - DragGesture(minimumDistance: 0, coordinateSpace: .global) - .onChanged { value in - - /// Keep the drag position updated for the `asyncAfter`. - dragLocation = value.location - - MenuModel.onDragChanged( - location: value.location, - model: model, - id: id, - labelPressUUID: &labelPressUUID, - labelFrame: window.frameTagged(id), - configuration: configuration, - window: window, - labelPressedWhenAlreadyPresented: &labelPressedWhenAlreadyPresented - ) { - labelPressUUID - } getDragLocation: { - dragLocation - } present: { present in - model.present = present - } fadeLabel: { fade in - fadeLabel = fade - } - } - .onEnded { value in - MenuModel.onDragEnded( - location: value.location, - model: model, - id: id, - labelPressUUID: &labelPressUUID, - labelFrame: window.frameTagged(id), - configuration: configuration, - window: window, - labelPressedWhenAlreadyPresented: &labelPressedWhenAlreadyPresented - ) { present in - model.present = present - } fadeLabel: { fade in - fadeLabel = fade - } - } - ) - .onValueChange(of: model.present) { _, present in - if !present { - withAnimation(configuration.labelFadeAnimation) { - fadeLabel = false - model.selectedIndex = nil - model.hoveringIndex = nil - } - overridePresent = present - } - } - .onValueChange(of: overridePresent) { _, present in - if present != model.present { - model.present = present - withAnimation(configuration.labelFadeAnimation) { - fadeLabel = present - } - } - } - .popover( - present: $model.present, - attributes: { - $0.position = .absolute(originAnchor: configuration.originAnchor, popoverAnchor: configuration.popoverAnchor) - $0.rubberBandingMode = .none - $0.dismissal.excludedFrames = { - [ - window.frameTagged(id) - ] - + configuration.excludedFrames() - } - $0.sourceFrameInset = configuration.sourceFrameInset - } - ) { - MenuView( - model: model, - present: { model.present = $0 }, - configuration: configuration, - content: content - ) - } background: { - configuration.backgroundColor - } - } - } - } - - /// Map each menu item index with its size. - struct MenuItemSize { - var index: Int - var size: CGSize - } - - /// The popover that gets presented. - internal struct MenuView: View { - @ObservedObject var model: MenuModel - let present: (Bool) -> Void - let configuration: MenuConfiguration - - /// The menu buttons. - let content: [AnyView] - - /// For the scale animation. - @State var expanded = false - - init( - model: MenuModel, - present: @escaping (Bool) -> Void, - configuration: MenuConfiguration, - content: [AnyView] - ) { - self.model = model - self.present = present - self.configuration = configuration - self.content = content - } - - var body: some View { - PopoverReader { context in - VStack(spacing: 0) { - ForEach(content.indices) { index in - content[index] - - /// Inject index and model. - .environment(\.index, index) - .environmentObject(model) - - /// Work with frames. - .frame(maxWidth: .infinity) - .contentShape(Rectangle()) - - /// Use `sizeReader` to prevent interfering with the scale effect. - .sizeReader { size in - if let firstIndex = model.sizes.firstIndex(where: { $0.index == index }) { - model.sizes[firstIndex].size = size - } else { - model.sizes.append(MenuItemSize(index: index, size: size)) - } - } - - if configuration.showDivider, index != content.count - 1 { - Rectangle() - .fill(Color(UIColor.label)) - .frame(height: 0.4) - .opacity(0.3) - } - } - } - .frame(width: configuration.width) - .fixedSize() /// Hug the width of the inner content. - .modifier(ClippedBackgroundModifier(context: context, configuration: configuration, expanded: expanded)) /// Clip the content if desired. - .scaleEffect(expanded ? 1 : 0.1, anchor: configuration.scaleAnchor?.unitPoint ?? model.getScaleAnchor(from: context)) - .scaleEffect(model.scale, anchor: configuration.scaleAnchor?.unitPoint ?? model.getScaleAnchor(from: context)) - .simultaneousGesture( - DragGesture(minimumDistance: 0, coordinateSpace: .global) - .onChanged { value in - model.hoveringIndex = model.getIndex(from: value.location) - - /// Rubber-band the menu. - withAnimation { - if let distance = model.getDistanceFromMenu(from: value.location) { - if configuration.scaleRange.contains(distance) { - let percentage = (distance - configuration.scaleRange.lowerBound) / (configuration.scaleRange.upperBound - configuration.scaleRange.lowerBound) - let scale = 1 - (1 - configuration.minimumScale) * percentage - model.scale = scale - } else if distance < configuration.scaleRange.lowerBound { - model.scale = 1 - } else { - model.scale = configuration.minimumScale - } - } - } - } - .onEnded { value in - withAnimation { - model.scale = 1 - } - - let activeIndex = model.getIndex(from: value.location) - model.selectedIndex = activeIndex - model.hoveringIndex = nil - if activeIndex != nil { - present(false) - } - } - ) - .onAppear { - withAnimation(configuration.presentationAnimation) { - expanded = true - } - /// When the popover is about to be dismissed, shrink it again. - context.attributes.onDismiss = { - withAnimation(configuration.dismissalAnimation) { - expanded = false - } - } - context.attributes.onContextChange = { context in - model.menuFrame = context.frame - } - } - } - } - } - - /// A special button for use inside `PopoverMenu`s. - struct MenuItem: View { - @Environment(\.index) var index: Int? - @EnvironmentObject var model: MenuModel - - public let action: () -> Void - public let label: (Bool) -> Content - - public init( - _ action: @escaping (() -> Void), - label: @escaping (Bool) -> Content - ) { - self.action = action - self.label = label - } - - public var body: some View { - label(model.hoveringIndex == index) - .onValueChange(of: model.selectedIndex) { _, newValue in - if newValue == index { - action() - } - } - .onAppear { - if - let index = index, - !model.itemIndices.contains(index) - { - /// Append this button's index to the model's item indices. - model.itemIndices.append(index) - } - } - } - } - - /// A wrapper for `PopoverMenuItem` that mimics the system menu button style. - struct MenuButton: View { - public let text: Text? - public let image: Image? - public let action: () -> Void - - /// A wrapper for `PopoverMenuItem` that mimics the system menu button style (title + image) - public init( - title: String? = nil, - systemImage: String? = nil, - _ action: @escaping (() -> Void) - ) { - if let title = title { - text = Text(title) - } else { - text = nil - } - - if let systemImage = systemImage { - image = Image(systemName: systemImage) - } else { - image = nil - } - - self.action = action - } - - /// A wrapper for `PopoverMenuItem` that mimics the system menu button style (title + image). - public init( - text: Text? = nil, - image: Image? = nil, - _ action: @escaping (() -> Void) - ) { - self.text = text - self.image = image - self.action = action - } - - public var body: some View { - MenuItem(action) { pressed in - HStack { - if let text = text { - text - .frame(maxWidth: .infinity, alignment: .leading) - } - - if let image = image { - image - } - } - .frame(maxWidth: .infinity) - .padding(EdgeInsets(top: 14, leading: 18, bottom: 14, trailing: 18)) - .background(pressed ? Templates.buttonHighlightColor : Color.clear) /// Add highlight effect when pressed. - } - } - } - - /// Place this inside a Menu to separate content. - struct MenuDivider: View { - /// Place this inside a Menu to separate content. - public init() {} - public var body: some View { - Rectangle() - .fill(Color(UIColor.label)) - .opacity(0.15) - .frame(height: 7) - } - } - - /// Replicates the system menu's subtle clip effect. - internal struct ClippedBackgroundModifier: ViewModifier { - let context: Popover.Context - let configuration: MenuConfiguration - let expanded: Bool - func body(content: Content) -> some View { - if configuration.clipContent { - content - - /// Replicates the system menu's subtle clip effect. - .mask( - Color.clear - .overlay( - RoundedRectangle(cornerRadius: configuration.cornerRadius) - .frame(height: expanded ? nil : context.frame.height / 3), - alignment: .top - ) - ) - - /// Avoid limiting the frame of the content to ensure proper hit-testing (for popover dismissal). - .background( - Templates.VisualEffectView(configuration.menuBlur) - .cornerRadius(configuration.cornerRadius) - .popoverShadow(shadow: configuration.shadow) - .frame(height: expanded ? nil : context.frame.height / 3), - alignment: .top - ) - } else { - content - } - } - } -} - -/// For passing the index of the `MenuItem` into the view itself -extension EnvironmentValues { - /// The index of the `MenuItem`. - var index: Int? { - get { - self[IndexEnvironmentKey.self] - } - set { - self[IndexEnvironmentKey.self] = newValue - } - } - - private struct IndexEnvironmentKey: EnvironmentKey { - typealias Value = Int? - - static var defaultValue: Int? = nil - } -} diff --git a/Pods/Popovers/Sources/Templates/Shadow.swift b/Pods/Popovers/Sources/Templates/Shadow.swift deleted file mode 100644 index 4a5810d0..00000000 --- a/Pods/Popovers/Sources/Templates/Shadow.swift +++ /dev/null @@ -1,33 +0,0 @@ -// -// Shadow.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/4/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -public extension Templates { - /// A convenient way to apply shadows. Access using the `.popoverShadow()` modifier. - struct Shadow { - /// The shadow color. - public var color = Color(.label.withAlphaComponent(0.3)) - - /// The shadow radius. - public var radius = CGFloat(0) - - /// The shadow's x offset. - public var x = CGFloat(0) - - /// The shadow's y offset. - public var y = CGFloat(0) - - public static let system = Self( - color: Color(.label.withAlphaComponent(0.25)), - radius: 40, - x: 0, - y: 4 - ) - } -} diff --git a/Pods/Popovers/Sources/Templates/Shapes.swift b/Pods/Popovers/Sources/Templates/Shapes.swift deleted file mode 100644 index 9fe67ff6..00000000 --- a/Pods/Popovers/Sources/Templates/Shapes.swift +++ /dev/null @@ -1,209 +0,0 @@ -// -// Shapes.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 2/4/22. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -public extension Templates { - // MARK: - Background With Arrow - - /** - A shape that has an arrow protruding. - */ - struct BackgroundWithArrow: Shape { - /// The side of the rectangle to have the arrow - public var arrowSide: ArrowSide - - /// The shape's corner radius - public var cornerRadius: CGFloat - - /// The rectangle's width. - public static var width = CGFloat(48) - - /// The rectangle's height. - public static var height = CGFloat(12) - - /// The corner radius for the arrow's tip. - public static var tipCornerRadius = CGFloat(4) - - /// The inverse corner radius for the arrow's base. - public static var edgeCornerRadius = CGFloat(10) - - /// Offset the arrow from the sides - otherwise it will overflow out of the corner radius. - /// This is multiplied by the `cornerRadius`. - /** - - /\ - /_ \ - ---------- <---- Avoid this gap. - \ - rectangle | - */ - public static var arrowSidePadding = CGFloat(1.8) - - /// Path for the triangular arrow. - public func arrowPath() -> Path { - let arrowHalfWidth = (BackgroundWithArrow.width / 2) * 0.6 - - let arrowPath = Path { path in - let arrowRect = CGRect(x: 0, y: 0, width: BackgroundWithArrow.width, height: BackgroundWithArrow.height) - - path.move(to: CGPoint(x: arrowRect.minX, y: arrowRect.maxY)) - path.addArc( - tangent1End: CGPoint(x: arrowRect.midX - arrowHalfWidth, y: arrowRect.maxY), - tangent2End: CGPoint(x: arrowRect.midX, y: arrowRect.minX), - radius: BackgroundWithArrow.edgeCornerRadius - ) - path.addArc( - tangent1End: CGPoint(x: arrowRect.midX, y: arrowRect.minX), - tangent2End: CGPoint(x: arrowRect.midX + arrowHalfWidth, y: arrowRect.maxY), - radius: BackgroundWithArrow.tipCornerRadius - ) - path.addArc( - tangent1End: CGPoint(x: arrowRect.midX + arrowHalfWidth, y: arrowRect.maxY), - tangent2End: CGPoint(x: arrowRect.maxX, y: arrowRect.maxY), - radius: BackgroundWithArrow.edgeCornerRadius - ) - path.addLine(to: CGPoint(x: arrowRect.maxX, y: arrowRect.maxY)) - } - return arrowPath - } - - /// Draw the shape. - public func path(in rect: CGRect) -> Path { - var arrowPath = arrowPath() - arrowPath = arrowPath.applying( - .init(translationX: -(BackgroundWithArrow.width / 2), y: -(BackgroundWithArrow.height)) - ) - - var path = Path() - path.addRoundedRect(in: rect, cornerSize: CGSize(width: cornerRadius, height: cornerRadius)) - - /// Rotation transform to make the arrow hit a different side. - let arrowTransform: CGAffineTransform - - /// Half of the rectangle's smallest side length, used for the arrow's alignment. - let popoverRadius: CGFloat - - let alignment: ArrowSide.ArrowAlignment - switch arrowSide { - case let .top(arrowAlignment): - alignment = arrowAlignment - arrowTransform = .init(translationX: rect.midX, y: 0) - popoverRadius = (rect.width / 2) - BackgroundWithArrow.arrowSidePadding * cornerRadius - case let .right(arrowAlignment): - alignment = arrowAlignment - arrowTransform = .init(rotationAngle: 90.degreesToRadians) - .translatedBy(x: rect.midY, y: -rect.maxX) - popoverRadius = (rect.height / 2) - BackgroundWithArrow.arrowSidePadding * cornerRadius - case let .bottom(arrowAlignment): - alignment = arrowAlignment - arrowTransform = .init(rotationAngle: 180.degreesToRadians) - .translatedBy(x: -rect.midX, y: -rect.maxY) - popoverRadius = (rect.width / 2) - BackgroundWithArrow.arrowSidePadding * cornerRadius - case let .left(arrowAlignment): - alignment = arrowAlignment - arrowTransform = .init(rotationAngle: 270.degreesToRadians) - .translatedBy(x: -rect.midY, y: 0) - popoverRadius = (rect.height / 2) - BackgroundWithArrow.arrowSidePadding * cornerRadius - } - - switch alignment { - case .mostCounterClockwise: - arrowPath = arrowPath.applying( - .init(translationX: -popoverRadius, y: 0) - ) - case .centered: - break - case .mostClockwise: - arrowPath = arrowPath.applying( - .init(translationX: popoverRadius, y: 0) - ) - } - - path.addPath(arrowPath, transform: arrowTransform) - - return path - } - } - - // MARK: - Curve Connector - - /** - A curved line between 2 points. - */ - struct CurveConnector: Shape { - /// The start point. - public var start: CGPoint - - /// The end point. - public var end: CGPoint - - /// The curve's steepness. - public var steepness = CGFloat(0.3) - - /// The curve's direction. - public var direction = Direction.vertical - - /** - A curved line between 2 points. - - parameter start: The start point. - - parameter end: The end point. - - parameter steepness: The curve's steepness. - - parameter direction: The curve's direction. - */ - public init( - start: CGPoint, - end: CGPoint, - steepness: CGFloat = CGFloat(0.3), - direction: Templates.CurveConnector.Direction = Direction.vertical - ) { - self.start = start - self.end = end - self.steepness = steepness - self.direction = direction - } - - /** - Horizontal or Vertical line. - */ - public enum Direction { - case horizontal - case vertical - } - - /// Allow animations. From https://www.objc.io/blog/2020/03/10/swiftui-path-animations/ - public var animatableData: AnimatablePair { - get { AnimatablePair(start.animatableData, end.animatableData) } - set { (start.animatableData, end.animatableData) = (newValue.first, newValue.second) } - } - - /// Draw the curve. - public func path(in _: CGRect) -> Path { - let startControlPoint: CGPoint - let endControlPoint: CGPoint - - switch direction { - case .horizontal: - let curveWidth = end.x - start.x - let curveSteepness = curveWidth * steepness - startControlPoint = CGPoint(x: start.x + curveSteepness, y: start.y) - endControlPoint = CGPoint(x: end.x - curveSteepness, y: end.y) - case .vertical: - let curveHeight = end.y - start.y - let curveSteepness = curveHeight * steepness - startControlPoint = CGPoint(x: start.x, y: start.y + curveSteepness) - endControlPoint = CGPoint(x: end.x, y: end.y - curveSteepness) - } - - var path = Path() - path.move(to: start) - path.addCurve(to: end, control1: startControlPoint, control2: endControlPoint) - return path - } - } -} diff --git a/Pods/Popovers/Sources/Templates/Templates.swift b/Pods/Popovers/Sources/Templates/Templates.swift deleted file mode 100644 index 98312500..00000000 --- a/Pods/Popovers/Sources/Templates/Templates.swift +++ /dev/null @@ -1,19 +0,0 @@ -// -// Templates.swift -// Popovers -// -// Created by A. Zheng (github.com/aheze) on 12/23/21. -// Copyright © 2022 A. Zheng. All rights reserved. -// - -import SwiftUI - -/** - Some templates to get started with Popovers. - - The rest of the files in this folder extend `Templates`. - */ -public enum Templates { - /// Highlight color for the alert and menu buttons. - public static var buttonHighlightColor = Color.secondary.opacity(0.2) -} diff --git a/Pods/Target Support Files/CoreGPX/CoreGPX-Info.plist b/Pods/Target Support Files/CoreGPX/CoreGPX-Info.plist deleted file mode 100644 index 70895387..00000000 --- a/Pods/Target Support Files/CoreGPX/CoreGPX-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 0.9.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/CoreGPX/CoreGPX-dummy.m b/Pods/Target Support Files/CoreGPX/CoreGPX-dummy.m deleted file mode 100644 index bd10c722..00000000 --- a/Pods/Target Support Files/CoreGPX/CoreGPX-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_CoreGPX : NSObject -@end -@implementation PodsDummy_CoreGPX -@end diff --git a/Pods/Target Support Files/CoreGPX/CoreGPX-prefix.pch b/Pods/Target Support Files/CoreGPX/CoreGPX-prefix.pch deleted file mode 100644 index beb2a244..00000000 --- a/Pods/Target Support Files/CoreGPX/CoreGPX-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/CoreGPX/CoreGPX-umbrella.h b/Pods/Target Support Files/CoreGPX/CoreGPX-umbrella.h deleted file mode 100644 index d8c01bf9..00000000 --- a/Pods/Target Support Files/CoreGPX/CoreGPX-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double CoreGPXVersionNumber; -FOUNDATION_EXPORT const unsigned char CoreGPXVersionString[]; - diff --git a/Pods/Target Support Files/CoreGPX/CoreGPX.debug.xcconfig b/Pods/Target Support Files/CoreGPX/CoreGPX.debug.xcconfig deleted file mode 100644 index 7b6b9f0e..00000000 --- a/Pods/Target Support Files/CoreGPX/CoreGPX.debug.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/CoreGPX -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/CoreGPX/CoreGPX.modulemap b/Pods/Target Support Files/CoreGPX/CoreGPX.modulemap deleted file mode 100644 index c0a149b9..00000000 --- a/Pods/Target Support Files/CoreGPX/CoreGPX.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module CoreGPX { - umbrella header "CoreGPX-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/CoreGPX/CoreGPX.release.xcconfig b/Pods/Target Support Files/CoreGPX/CoreGPX.release.xcconfig deleted file mode 100644 index 7b6b9f0e..00000000 --- a/Pods/Target Support Files/CoreGPX/CoreGPX.release.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/CoreGPX -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/CoreGPX/CoreGPX.xcconfig b/Pods/Target Support Files/CoreGPX/CoreGPX.xcconfig deleted file mode 100644 index 9d48e2e5..00000000 --- a/Pods/Target Support Files/CoreGPX/CoreGPX.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/CoreGPX -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-Info.plist b/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-Info.plist deleted file mode 100644 index 2129f0ed..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 3.3.6 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-dummy.m b/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-dummy.m deleted file mode 100644 index aaee2cc4..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_InAppSettingsKit : NSObject -@end -@implementation PodsDummy_InAppSettingsKit -@end diff --git a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-prefix.pch b/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-prefix.pch deleted file mode 100644 index beb2a244..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-umbrella.h b/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-umbrella.h deleted file mode 100644 index 8f770139..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit-umbrella.h +++ /dev/null @@ -1,38 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - -#import "IASKAppSettingsViewController.h" -#import "IASKAppSettingsWebViewController.h" -#import "IASKColor.h" -#import "IASKDatePicker.h" -#import "IASKDatePickerViewCell.h" -#import "IASKEmbeddedDatePickerViewCell.h" -#import "IASKMultipleValueSelection.h" -#import "IASKPSSliderSpecifierViewCell.h" -#import "IASKPSTextFieldSpecifierViewCell.h" -#import "IASKSettingsReader.h" -#import "IASKSettingsStore.h" -#import "IASKSettingsStoreFile.h" -#import "IASKSettingsStoreInMemory.h" -#import "IASKSettingsStoreUserDefaults.h" -#import "IASKSlider.h" -#import "IASKSpecifier.h" -#import "IASKSpecifierValuesViewController.h" -#import "IASKSwitch.h" -#import "IASKTextField.h" -#import "IASKTextView.h" -#import "IASKTextViewCell.h" -#import "IASKViewController.h" - -FOUNDATION_EXPORT double InAppSettingsKitVersionNumber; -FOUNDATION_EXPORT const unsigned char InAppSettingsKitVersionString[]; - diff --git a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.debug.xcconfig b/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.debug.xcconfig deleted file mode 100644 index c6ffb320..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.debug.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -framework "MessageUI" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/InAppSettingsKit -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.modulemap b/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.modulemap deleted file mode 100644 index b9b30cbb..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module InAppSettingsKit { - umbrella header "InAppSettingsKit-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.release.xcconfig b/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.release.xcconfig deleted file mode 100644 index c6ffb320..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.release.xcconfig +++ /dev/null @@ -1,13 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -framework "MessageUI" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/InAppSettingsKit -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.xcconfig b/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.xcconfig deleted file mode 100644 index f48e9efd..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/InAppSettingsKit.xcconfig +++ /dev/null @@ -1,10 +0,0 @@ -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -OTHER_LDFLAGS = $(inherited) -framework "MessageUI" -framework "UIKit" -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/InAppSettingsKit -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/InAppSettingsKit/ResourceBundle-InAppSettingsKit-InAppSettingsKit-Info.plist b/Pods/Target Support Files/InAppSettingsKit/ResourceBundle-InAppSettingsKit-InAppSettingsKit-Info.plist deleted file mode 100644 index 8ee01d97..00000000 --- a/Pods/Target Support Files/InAppSettingsKit/ResourceBundle-InAppSettingsKit-InAppSettingsKit-Info.plist +++ /dev/null @@ -1,24 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - BNDL - CFBundleShortVersionString - 3.3.6 - CFBundleSignature - ???? - CFBundleVersion - 1 - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-acknowledgements.markdown b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-acknowledgements.markdown index ad6b22f5..cfb38d24 100644 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-acknowledgements.markdown +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-acknowledgements.markdown @@ -25,72 +25,4 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. - -## CoreGPX - -MIT License - -Copyright (c) 2018 Vincent Neo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - -## InAppSettingsKit - -Copyright (c) 2009-2014: -Luc Vandal, Edovia Inc., http://www.edovia.com -Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -All rights reserved. - -It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -as the original authors of this code. You can give credit in a blog post, a tweet or on -a info page of your app. Also, the original authors appreciate letting them know if you -use this code. - -The above copyright notice and this permission notice shall be included in all copies -or substantial portions of the Software. - -This code is licensed under the BSD license that is available at: - - -## Popovers - -MIT License - -Copyright (c) 2022 A. Zheng - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-acknowledgements.plist b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-acknowledgements.plist index 54952b44..39ce8ee8 100644 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-acknowledgements.plist +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-acknowledgements.plist @@ -43,92 +43,6 @@ SOFTWARE. Type PSGroupSpecifier - - FooterText - MIT License - -Copyright (c) 2018 Vincent Neo - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - License - MIT - Title - CoreGPX - Type - PSGroupSpecifier - - - FooterText - Copyright (c) 2009-2014: -Luc Vandal, Edovia Inc., http://www.edovia.com -Ortwin Gentz, FutureTap GmbH, http://www.futuretap.com -All rights reserved. - -It is appreciated but not required that you give credit to Luc Vandal and Ortwin Gentz, -as the original authors of this code. You can give credit in a blog post, a tweet or on -a info page of your app. Also, the original authors appreciate letting them know if you -use this code. - -The above copyright notice and this permission notice shall be included in all copies -or substantial portions of the Software. - -This code is licensed under the BSD license that is available at: <http://www.opensource.org/licenses/bsd-license.php> - - License - BSD - Title - InAppSettingsKit - Type - PSGroupSpecifier - - - FooterText - MIT License - -Copyright (c) 2022 A. Zheng - -Permission is hereby granted, free of charge, to any person obtaining a copy -of this software and associated documentation files (the "Software"), to deal -in the Software without restriction, including without limitation the rights -to use, copy, modify, merge, publish, distribute, sublicense, and/or sell -copies of the Software, and to permit persons to whom the Software is -furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice shall be included in all -copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR -IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, -FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE -AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER -LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, -OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE -SOFTWARE. - - License - MIT - Title - Popovers - Type - PSGroupSpecifier - FooterText Generated by CocoaPods - https://cocoapods.org diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Debug-input-files.xcfilelist b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Debug-input-files.xcfilelist index c580942a..b3db7670 100644 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Debug-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Debug-input-files.xcfilelist @@ -1,6 +1,3 @@ ${PODS_ROOT}/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks.sh ${BUILT_PRODUCTS_DIR}/ChromaColorPicker/ChromaColorPicker.framework -${BUILT_PRODUCTS_DIR}/CoreGPX/CoreGPX.framework -${BUILT_PRODUCTS_DIR}/InAppSettingsKit/InAppSettingsKit.framework -${BUILT_PRODUCTS_DIR}/Popovers/Popovers.framework ${BUILT_PRODUCTS_DIR}/UIMultiPicker/UIMultiPicker.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Debug-output-files.xcfilelist b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Debug-output-files.xcfilelist index 8e539c54..5c29b6e4 100644 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Debug-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Debug-output-files.xcfilelist @@ -1,5 +1,2 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ChromaColorPicker.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CoreGPX.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/InAppSettingsKit.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Popovers.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/UIMultiPicker.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Release-input-files.xcfilelist b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Release-input-files.xcfilelist index c580942a..b3db7670 100644 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Release-input-files.xcfilelist +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Release-input-files.xcfilelist @@ -1,6 +1,3 @@ ${PODS_ROOT}/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks.sh ${BUILT_PRODUCTS_DIR}/ChromaColorPicker/ChromaColorPicker.framework -${BUILT_PRODUCTS_DIR}/CoreGPX/CoreGPX.framework -${BUILT_PRODUCTS_DIR}/InAppSettingsKit/InAppSettingsKit.framework -${BUILT_PRODUCTS_DIR}/Popovers/Popovers.framework ${BUILT_PRODUCTS_DIR}/UIMultiPicker/UIMultiPicker.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Release-output-files.xcfilelist b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Release-output-files.xcfilelist index 8e539c54..5c29b6e4 100644 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Release-output-files.xcfilelist +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks-Release-output-files.xcfilelist @@ -1,5 +1,2 @@ ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/ChromaColorPicker.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/CoreGPX.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/InAppSettingsKit.framework -${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/Popovers.framework ${TARGET_BUILD_DIR}/${FRAMEWORKS_FOLDER_PATH}/UIMultiPicker.framework \ No newline at end of file diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks.sh b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks.sh index e2b9e6d1..fe55f709 100755 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks.sh +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ-frameworks.sh @@ -177,16 +177,10 @@ code_sign_if_enabled() { if [[ "$CONFIGURATION" == "Debug" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/ChromaColorPicker/ChromaColorPicker.framework" - install_framework "${BUILT_PRODUCTS_DIR}/CoreGPX/CoreGPX.framework" - install_framework "${BUILT_PRODUCTS_DIR}/InAppSettingsKit/InAppSettingsKit.framework" - install_framework "${BUILT_PRODUCTS_DIR}/Popovers/Popovers.framework" install_framework "${BUILT_PRODUCTS_DIR}/UIMultiPicker/UIMultiPicker.framework" fi if [[ "$CONFIGURATION" == "Release" ]]; then install_framework "${BUILT_PRODUCTS_DIR}/ChromaColorPicker/ChromaColorPicker.framework" - install_framework "${BUILT_PRODUCTS_DIR}/CoreGPX/CoreGPX.framework" - install_framework "${BUILT_PRODUCTS_DIR}/InAppSettingsKit/InAppSettingsKit.framework" - install_framework "${BUILT_PRODUCTS_DIR}/Popovers/Popovers.framework" install_framework "${BUILT_PRODUCTS_DIR}/UIMultiPicker/UIMultiPicker.framework" fi if [ "${COCOAPODS_PARALLEL_CODE_SIGN}" == "true" ]; then diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ.debug.xcconfig b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ.debug.xcconfig index 5bbc6205..86fe8eff 100644 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ.debug.xcconfig +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ.debug.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker" "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX" "${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit" "${PODS_CONFIGURATION_BUILD_DIR}/Popovers" "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker" "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker/ChromaColorPicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX/CoreGPX.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit/InAppSettingsKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Popovers/Popovers.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker/UIMultiPicker.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker/ChromaColorPicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker/UIMultiPicker.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker/ChromaColorPicker.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX/CoreGPX.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit/InAppSettingsKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Popovers/Popovers.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker/UIMultiPicker.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Popovers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker" -OTHER_LDFLAGS = $(inherited) -framework "ChromaColorPicker" -framework "CoreGPX" -framework "InAppSettingsKit" -framework "MessageUI" -framework "Popovers" -framework "UIKit" -framework "UIMultiPicker" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker/ChromaColorPicker.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker/UIMultiPicker.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker" +OTHER_LDFLAGS = $(inherited) -framework "ChromaColorPicker" -framework "UIMultiPicker" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ.release.xcconfig b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ.release.xcconfig index 5bbc6205..86fe8eff 100644 --- a/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ.release.xcconfig +++ b/Pods/Target Support Files/Pods-WunderLINQ/Pods-WunderLINQ.release.xcconfig @@ -1,12 +1,12 @@ ALWAYS_EMBED_SWIFT_STANDARD_LIBRARIES = YES CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker" "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX" "${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit" "${PODS_CONFIGURATION_BUILD_DIR}/Popovers" "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker" +FRAMEWORK_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker" "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker" GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker/ChromaColorPicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX/CoreGPX.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit/InAppSettingsKit.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/Popovers/Popovers.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker/UIMultiPicker.framework/Headers" +HEADER_SEARCH_PATHS = $(inherited) "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker/ChromaColorPicker.framework/Headers" "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker/UIMultiPicker.framework/Headers" LD_RUNPATH_SEARCH_PATHS = $(inherited) /usr/lib/swift '@executable_path/Frameworks' '@loader_path/Frameworks' LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker/ChromaColorPicker.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX/CoreGPX.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit/InAppSettingsKit.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/Popovers/Popovers.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker/UIMultiPicker.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/CoreGPX" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/InAppSettingsKit" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/Popovers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker" -OTHER_LDFLAGS = $(inherited) -framework "ChromaColorPicker" -framework "CoreGPX" -framework "InAppSettingsKit" -framework "MessageUI" -framework "Popovers" -framework "UIKit" -framework "UIMultiPicker" +OTHER_CFLAGS = $(inherited) -isystem "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker/ChromaColorPicker.framework/Headers" -isystem "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker/UIMultiPicker.framework/Headers" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/ChromaColorPicker" -iframework "${PODS_CONFIGURATION_BUILD_DIR}/UIMultiPicker" +OTHER_LDFLAGS = $(inherited) -framework "ChromaColorPicker" -framework "UIMultiPicker" OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS PODS_BUILD_DIR = ${BUILD_DIR} PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) diff --git a/Pods/Target Support Files/Popovers/Popovers-Info.plist b/Pods/Target Support Files/Popovers/Popovers-Info.plist deleted file mode 100644 index 9bba304e..00000000 --- a/Pods/Target Support Files/Popovers/Popovers-Info.plist +++ /dev/null @@ -1,26 +0,0 @@ - - - - - CFBundleDevelopmentRegion - ${PODS_DEVELOPMENT_LANGUAGE} - CFBundleExecutable - ${EXECUTABLE_NAME} - CFBundleIdentifier - ${PRODUCT_BUNDLE_IDENTIFIER} - CFBundleInfoDictionaryVersion - 6.0 - CFBundleName - ${PRODUCT_NAME} - CFBundlePackageType - FMWK - CFBundleShortVersionString - 1.3.0 - CFBundleSignature - ???? - CFBundleVersion - ${CURRENT_PROJECT_VERSION} - NSPrincipalClass - - - diff --git a/Pods/Target Support Files/Popovers/Popovers-dummy.m b/Pods/Target Support Files/Popovers/Popovers-dummy.m deleted file mode 100644 index 4032cab8..00000000 --- a/Pods/Target Support Files/Popovers/Popovers-dummy.m +++ /dev/null @@ -1,5 +0,0 @@ -#import -@interface PodsDummy_Popovers : NSObject -@end -@implementation PodsDummy_Popovers -@end diff --git a/Pods/Target Support Files/Popovers/Popovers-prefix.pch b/Pods/Target Support Files/Popovers/Popovers-prefix.pch deleted file mode 100644 index beb2a244..00000000 --- a/Pods/Target Support Files/Popovers/Popovers-prefix.pch +++ /dev/null @@ -1,12 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - diff --git a/Pods/Target Support Files/Popovers/Popovers-umbrella.h b/Pods/Target Support Files/Popovers/Popovers-umbrella.h deleted file mode 100644 index 763c321c..00000000 --- a/Pods/Target Support Files/Popovers/Popovers-umbrella.h +++ /dev/null @@ -1,16 +0,0 @@ -#ifdef __OBJC__ -#import -#else -#ifndef FOUNDATION_EXPORT -#if defined(__cplusplus) -#define FOUNDATION_EXPORT extern "C" -#else -#define FOUNDATION_EXPORT extern -#endif -#endif -#endif - - -FOUNDATION_EXPORT double PopoversVersionNumber; -FOUNDATION_EXPORT const unsigned char PopoversVersionString[]; - diff --git a/Pods/Target Support Files/Popovers/Popovers.debug.xcconfig b/Pods/Target Support Files/Popovers/Popovers.debug.xcconfig deleted file mode 100644 index 80ea27a0..00000000 --- a/Pods/Target Support Files/Popovers/Popovers.debug.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Popovers -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/Popovers -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/Pods/Target Support Files/Popovers/Popovers.modulemap b/Pods/Target Support Files/Popovers/Popovers.modulemap deleted file mode 100644 index 141c54fb..00000000 --- a/Pods/Target Support Files/Popovers/Popovers.modulemap +++ /dev/null @@ -1,6 +0,0 @@ -framework module Popovers { - umbrella header "Popovers-umbrella.h" - - export * - module * { export * } -} diff --git a/Pods/Target Support Files/Popovers/Popovers.release.xcconfig b/Pods/Target Support Files/Popovers/Popovers.release.xcconfig deleted file mode 100644 index 80ea27a0..00000000 --- a/Pods/Target Support Files/Popovers/Popovers.release.xcconfig +++ /dev/null @@ -1,14 +0,0 @@ -CLANG_WARN_QUOTED_INCLUDE_IN_FRAMEWORK_HEADER = NO -CONFIGURATION_BUILD_DIR = ${PODS_CONFIGURATION_BUILD_DIR}/Popovers -GCC_PREPROCESSOR_DEFINITIONS = $(inherited) COCOAPODS=1 -LIBRARY_SEARCH_PATHS = $(inherited) "${TOOLCHAIN_DIR}/usr/lib/swift/${PLATFORM_NAME}" /usr/lib/swift -OTHER_SWIFT_FLAGS = $(inherited) -D COCOAPODS -suppress-warnings -PODS_BUILD_DIR = ${BUILD_DIR} -PODS_CONFIGURATION_BUILD_DIR = ${PODS_BUILD_DIR}/$(CONFIGURATION)$(EFFECTIVE_PLATFORM_NAME) -PODS_DEVELOPMENT_LANGUAGE = ${DEVELOPMENT_LANGUAGE} -PODS_ROOT = ${SRCROOT} -PODS_TARGET_SRCROOT = ${PODS_ROOT}/Popovers -PODS_XCFRAMEWORKS_BUILD_DIR = $(PODS_CONFIGURATION_BUILD_DIR)/XCFrameworkIntermediates -PRODUCT_BUNDLE_IDENTIFIER = org.cocoapods.${PRODUCT_NAME:rfc1034identifier} -SKIP_INSTALL = YES -USE_RECURSIVE_SCRIPT_INPUTS_IN_SCRIPT_PHASES = YES diff --git a/WunderLINQ.xcodeproj/project.pbxproj b/WunderLINQ.xcodeproj/project.pbxproj index dbaf3982..119d3280 100644 --- a/WunderLINQ.xcodeproj/project.pbxproj +++ b/WunderLINQ.xcodeproj/project.pbxproj @@ -106,6 +106,9 @@ D81CBFAE2C8119580029C5AB /* Entitlements.plist in Resources */ = {isa = PBXBuildFile; fileRef = D81CBFAD2C8119580029C5AB /* Entitlements.plist */; }; D826545A2C82768000049F9E /* SceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82654582C82768000049F9E /* SceneDelegate.swift */; }; D826545B2C82768000049F9E /* CarPlaySceneDelegate.swift in Sources */ = {isa = PBXBuildFile; fileRef = D82654592C82768000049F9E /* CarPlaySceneDelegate.swift */; }; + D828FB992DC5A6CB001AE485 /* InAppSettingsKit in Frameworks */ = {isa = PBXBuildFile; productRef = D828FB982DC5A6CB001AE485 /* InAppSettingsKit */; }; + D828FB9C2DC5A79A001AE485 /* CoreGPX in Frameworks */ = {isa = PBXBuildFile; productRef = D828FB9B2DC5A79A001AE485 /* CoreGPX */; }; + D828FB9F2DC5A7FA001AE485 /* Popovers in Frameworks */ = {isa = PBXBuildFile; productRef = D828FB9E2DC5A7FA001AE485 /* Popovers */; }; D834BC3F2CB4C154002884B7 /* WLQ_X.swift in Sources */ = {isa = PBXBuildFile; fileRef = D834BC3E2CB4C154002884B7 /* WLQ_X.swift */; }; D8585C53293EBD550025D0AB /* Main_iPad.storyboard in Resources */ = {isa = PBXBuildFile; fileRef = D8585C51293EBD540025D0AB /* Main_iPad.storyboard */; }; D87629122A7EDEB90021E7A7 /* standard-dashboard-portrait.svg in Resources */ = {isa = PBXBuildFile; fileRef = D87629112A7EDEB90021E7A7 /* standard-dashboard-portrait.svg */; }; @@ -307,6 +310,7 @@ 7E068BE92102C8820076EAAD /* libz.tbd in Frameworks */, 7E068BEB2102C8820076EAAD /* CoreLocation.framework in Frameworks */, 7E068BEC2102C8820076EAAD /* UIKit.framework in Frameworks */, + D828FB9F2DC5A7FA001AE485 /* Popovers in Frameworks */, 7E068BEE2102C8820076EAAD /* CoreImage.framework in Frameworks */, D80D16482DA2018100F64D78 /* GoogleMaps in Frameworks */, 7E068BEF2102C8820076EAAD /* ImageIO.framework in Frameworks */, @@ -314,9 +318,11 @@ 7E068BF12102C8820076EAAD /* CoreText.framework in Frameworks */, 7E068BF22102C8820076EAAD /* CoreTelephony.framework in Frameworks */, 7E068BF32102C8820076EAAD /* libc++.tbd in Frameworks */, + D828FB992DC5A6CB001AE485 /* InAppSettingsKit in Frameworks */, 7E068BF42102C8820076EAAD /* CoreData.framework in Frameworks */, 7E068BF52102C8820076EAAD /* QuartzCore.framework in Frameworks */, 7E068BD92102C7DE0076EAAD /* Accelerate.framework in Frameworks */, + D828FB9C2DC5A79A001AE485 /* CoreGPX in Frameworks */, 482C618362EA74729FE53E2A /* Pods_WunderLINQ.framework in Frameworks */, ); runOnlyForDeploymentPostprocessing = 0; @@ -686,6 +692,9 @@ packageReferences = ( D88FC3792CA4EF2C00F18A7E /* XCRemoteSwiftPackageReference "ios-sdk" */, D80D16462DA2018100F64D78 /* XCRemoteSwiftPackageReference "ios-maps-sdk" */, + D828FB972DC5A624001AE485 /* XCRemoteSwiftPackageReference "InAppSettingsKit" */, + D828FB9A2DC5A79A001AE485 /* XCRemoteSwiftPackageReference "CoreGPX" */, + D828FB9D2DC5A7FA001AE485 /* XCRemoteSwiftPackageReference "Popovers" */, ); productRefGroup = 7EA4784B1F40B154000CEDDC /* Products */; projectDirPath = ""; @@ -1218,6 +1227,30 @@ minimumVersion = 9.4.0; }; }; + D828FB972DC5A624001AE485 /* XCRemoteSwiftPackageReference "InAppSettingsKit" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/futuretap/InAppSettingsKit.git"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 3.8.5; + }; + }; + D828FB9A2DC5A79A001AE485 /* XCRemoteSwiftPackageReference "CoreGPX" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/vincentneo/CoreGPX"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 0.9.3; + }; + }; + D828FB9D2DC5A7FA001AE485 /* XCRemoteSwiftPackageReference "Popovers" */ = { + isa = XCRemoteSwiftPackageReference; + repositoryURL = "https://github.com/aheze/Popovers"; + requirement = { + kind = upToNextMajorVersion; + minimumVersion = 1.3.2; + }; + }; D88FC3792CA4EF2C00F18A7E /* XCRemoteSwiftPackageReference "ios-sdk" */ = { isa = XCRemoteSwiftPackageReference; repositoryURL = "https://github.com/spotify/ios-sdk"; @@ -1234,6 +1267,20 @@ package = D80D16462DA2018100F64D78 /* XCRemoteSwiftPackageReference "ios-maps-sdk" */; productName = GoogleMaps; }; + D828FB982DC5A6CB001AE485 /* InAppSettingsKit */ = { + isa = XCSwiftPackageProductDependency; + productName = InAppSettingsKit; + }; + D828FB9B2DC5A79A001AE485 /* CoreGPX */ = { + isa = XCSwiftPackageProductDependency; + package = D828FB9A2DC5A79A001AE485 /* XCRemoteSwiftPackageReference "CoreGPX" */; + productName = CoreGPX; + }; + D828FB9E2DC5A7FA001AE485 /* Popovers */ = { + isa = XCSwiftPackageProductDependency; + package = D828FB9D2DC5A7FA001AE485 /* XCRemoteSwiftPackageReference "Popovers" */; + productName = Popovers; + }; /* End XCSwiftPackageProductDependency section */ }; rootObject = 7EA478421F40B154000CEDDC /* Project object */; diff --git a/WunderLINQ.xcworkspace/xcshareddata/swiftpm/Package.resolved b/WunderLINQ.xcworkspace/xcshareddata/swiftpm/Package.resolved index a47c147d..b4783488 100644 --- a/WunderLINQ.xcworkspace/xcshareddata/swiftpm/Package.resolved +++ b/WunderLINQ.xcworkspace/xcshareddata/swiftpm/Package.resolved @@ -1,6 +1,24 @@ { - "originHash" : "3f2b8280b32df82869389da82850b33168a09a16a3d48337090180d9e6d6cda6", + "originHash" : "33a2f7a7e09ccc9cab5b6caed5d7eda2d11d5840aa3f306f88e812aabe92c66d", "pins" : [ + { + "identity" : "coregpx", + "kind" : "remoteSourceControl", + "location" : "https://github.com/vincentneo/CoreGPX", + "state" : { + "revision" : "42662cc9235d385bdd0356c8f4cb7b581da24e39", + "version" : "0.9.3" + } + }, + { + "identity" : "inappsettingskit", + "kind" : "remoteSourceControl", + "location" : "https://github.com/futuretap/InAppSettingsKit.git", + "state" : { + "revision" : "b60959ac31106a404774f641e063096014269188", + "version" : "3.8.5" + } + }, { "identity" : "ios-maps-sdk", "kind" : "remoteSourceControl", @@ -18,6 +36,15 @@ "revision" : "af71ec0bcf3baa7ec88c72119b7fdf65eb91fd67", "version" : "3.0.0" } + }, + { + "identity" : "popovers", + "kind" : "remoteSourceControl", + "location" : "https://github.com/aheze/Popovers", + "state" : { + "revision" : "de44c4dd7271ec6413fe350f7efadb14e5e18dce", + "version" : "1.3.2" + } } ], "version" : 3