added classes
Signed-off-by: Matt Bruce <matt.bruce@verizon.com>
This commit is contained in:
parent
30fe60ddb8
commit
01083bd8c8
@ -20,7 +20,7 @@
|
|||||||
EA3361AF288B26310071C351 /* FormFieldable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361AE288B26310071C351 /* FormFieldable.swift */; };
|
EA3361AF288B26310071C351 /* FormFieldable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361AE288B26310071C351 /* FormFieldable.swift */; };
|
||||||
EA3361B1288B26490071C351 /* Invertable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B0288B26490071C351 /* Invertable.swift */; };
|
EA3361B1288B26490071C351 /* Invertable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B0288B26490071C351 /* Invertable.swift */; };
|
||||||
EA3361B3288B265D0071C351 /* Changable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B2288B265D0071C351 /* Changable.swift */; };
|
EA3361B3288B265D0071C351 /* Changable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B2288B265D0071C351 /* Changable.swift */; };
|
||||||
EA3361B6288B2A410071C351 /* Control.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B5288B2A410071C351 /* Control.swift */; };
|
EA3361B6288B2A410071C351 /* VDSControl.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B5288B2A410071C351 /* VDSControl.swift */; };
|
||||||
EA3361B8288B2AAA0071C351 /* ViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */; };
|
EA3361B8288B2AAA0071C351 /* ViewProtocol.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */; };
|
||||||
EA3361BD288B2C760071C351 /* TypeAlias.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361BC288B2C760071C351 /* TypeAlias.swift */; };
|
EA3361BD288B2C760071C351 /* TypeAlias.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361BC288B2C760071C351 /* TypeAlias.swift */; };
|
||||||
EA3361BF288B2EA60071C351 /* Modelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361BE288B2EA60071C351 /* Modelable.swift */; };
|
EA3361BF288B2EA60071C351 /* Modelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3361BE288B2EA60071C351 /* Modelable.swift */; };
|
||||||
@ -37,6 +37,13 @@
|
|||||||
EA3362302891EB4A0071C351 /* VDSFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33622F2891EB4A0071C351 /* VDSFonts.swift */; };
|
EA3362302891EB4A0071C351 /* VDSFonts.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33622F2891EB4A0071C351 /* VDSFonts.swift */; };
|
||||||
EA3362322891F2ED0071C351 /* VDSFontStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3362312891F2ED0071C351 /* VDSFontStyles.swift */; };
|
EA3362322891F2ED0071C351 /* VDSFontStyles.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3362312891F2ED0071C351 /* VDSFontStyles.swift */; };
|
||||||
EA33623E2892EE950071C351 /* UIDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33623D2892EE950071C351 /* UIDevice.swift */; };
|
EA33623E2892EE950071C351 /* UIDevice.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33623D2892EE950071C351 /* UIDevice.swift */; };
|
||||||
|
EA3362402892EF6C0071C351 /* VDSLabel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33623F2892EF6B0071C351 /* VDSLabel.swift */; };
|
||||||
|
EA3362432892EFF20071C351 /* VDSLabelModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3362422892EFF20071C351 /* VDSLabelModel.swift */; };
|
||||||
|
EA3362452892F9130071C351 /* Labelable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA3362442892F9130071C351 /* Labelable.swift */; };
|
||||||
|
EA33624728931B050071C351 /* Initable.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33624628931B050071C351 /* Initable.swift */; };
|
||||||
|
EA33624928931B5C0071C351 /* ViewModelState.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33624828931B5C0071C351 /* ViewModelState.swift */; };
|
||||||
|
EA33624B28931B750071C351 /* Published.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33624A28931B750071C351 /* Published.swift */; };
|
||||||
|
EA33624D28931BB50071C351 /* List.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA33624C28931BB50071C351 /* List.swift */; };
|
||||||
/* End PBXBuildFile section */
|
/* End PBXBuildFile section */
|
||||||
|
|
||||||
/* Begin PBXContainerItemProxy section */
|
/* Begin PBXContainerItemProxy section */
|
||||||
@ -64,7 +71,7 @@
|
|||||||
EA3361AE288B26310071C351 /* FormFieldable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormFieldable.swift; sourceTree = "<group>"; };
|
EA3361AE288B26310071C351 /* FormFieldable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = FormFieldable.swift; sourceTree = "<group>"; };
|
||||||
EA3361B0288B26490071C351 /* Invertable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Invertable.swift; sourceTree = "<group>"; };
|
EA3361B0288B26490071C351 /* Invertable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Invertable.swift; sourceTree = "<group>"; };
|
||||||
EA3361B2288B265D0071C351 /* Changable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Changable.swift; sourceTree = "<group>"; };
|
EA3361B2288B265D0071C351 /* Changable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Changable.swift; sourceTree = "<group>"; };
|
||||||
EA3361B5288B2A410071C351 /* Control.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Control.swift; sourceTree = "<group>"; };
|
EA3361B5288B2A410071C351 /* VDSControl.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSControl.swift; sourceTree = "<group>"; };
|
||||||
EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewProtocol.swift; sourceTree = "<group>"; };
|
EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewProtocol.swift; sourceTree = "<group>"; };
|
||||||
EA3361BC288B2C760071C351 /* TypeAlias.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeAlias.swift; sourceTree = "<group>"; };
|
EA3361BC288B2C760071C351 /* TypeAlias.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TypeAlias.swift; sourceTree = "<group>"; };
|
||||||
EA3361BE288B2EA60071C351 /* Modelable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Modelable.swift; sourceTree = "<group>"; };
|
EA3361BE288B2EA60071C351 /* Modelable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Modelable.swift; sourceTree = "<group>"; };
|
||||||
@ -81,6 +88,13 @@
|
|||||||
EA33622F2891EB4A0071C351 /* VDSFonts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSFonts.swift; sourceTree = "<group>"; };
|
EA33622F2891EB4A0071C351 /* VDSFonts.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSFonts.swift; sourceTree = "<group>"; };
|
||||||
EA3362312891F2ED0071C351 /* VDSFontStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSFontStyles.swift; sourceTree = "<group>"; };
|
EA3362312891F2ED0071C351 /* VDSFontStyles.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSFontStyles.swift; sourceTree = "<group>"; };
|
||||||
EA33623D2892EE950071C351 /* UIDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIDevice.swift; sourceTree = "<group>"; };
|
EA33623D2892EE950071C351 /* UIDevice.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = UIDevice.swift; sourceTree = "<group>"; };
|
||||||
|
EA33623F2892EF6B0071C351 /* VDSLabel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSLabel.swift; sourceTree = "<group>"; };
|
||||||
|
EA3362422892EFF20071C351 /* VDSLabelModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = VDSLabelModel.swift; sourceTree = "<group>"; };
|
||||||
|
EA3362442892F9130071C351 /* Labelable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Labelable.swift; sourceTree = "<group>"; };
|
||||||
|
EA33624628931B050071C351 /* Initable.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Initable.swift; sourceTree = "<group>"; };
|
||||||
|
EA33624828931B5C0071C351 /* ViewModelState.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ViewModelState.swift; sourceTree = "<group>"; };
|
||||||
|
EA33624A28931B750071C351 /* Published.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Published.swift; sourceTree = "<group>"; };
|
||||||
|
EA33624C28931BB50071C351 /* List.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = List.swift; sourceTree = "<group>"; };
|
||||||
/* End PBXFileReference section */
|
/* End PBXFileReference section */
|
||||||
|
|
||||||
/* Begin PBXFrameworksBuildPhase section */
|
/* Begin PBXFrameworksBuildPhase section */
|
||||||
@ -127,7 +141,7 @@
|
|||||||
EA33616E288B19200071C351 /* VDS */ = {
|
EA33616E288B19200071C351 /* VDS */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
EA3361B4288B2A360071C351 /* BaseClasses */,
|
EA3361B4288B2A360071C351 /* Classes */,
|
||||||
EA33619D288B1E330071C351 /* Components */,
|
EA33619D288B1E330071C351 /* Components */,
|
||||||
EA3361A6288B23240071C351 /* Extensions */,
|
EA3361A6288B23240071C351 /* Extensions */,
|
||||||
EA3361AB288B25EC0071C351 /* Protocols */,
|
EA3361AB288B25EC0071C351 /* Protocols */,
|
||||||
@ -162,6 +176,7 @@
|
|||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
EA3361A0288B1E6F0071C351 /* Toggle */,
|
EA3361A0288B1E6F0071C351 /* Toggle */,
|
||||||
|
EA3362412892EF700071C351 /* Label */,
|
||||||
);
|
);
|
||||||
path = Components;
|
path = Components;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
@ -193,7 +208,9 @@
|
|||||||
EA3361AC288B26190071C351 /* DataTrackable.swift */,
|
EA3361AC288B26190071C351 /* DataTrackable.swift */,
|
||||||
EA3361A9288B25E40071C351 /* Disabling.swift */,
|
EA3361A9288B25E40071C351 /* Disabling.swift */,
|
||||||
EA3361AE288B26310071C351 /* FormFieldable.swift */,
|
EA3361AE288B26310071C351 /* FormFieldable.swift */,
|
||||||
|
EA33624628931B050071C351 /* Initable.swift */,
|
||||||
EA3361B0288B26490071C351 /* Invertable.swift */,
|
EA3361B0288B26490071C351 /* Invertable.swift */,
|
||||||
|
EA3362442892F9130071C351 /* Labelable.swift */,
|
||||||
EA3361BE288B2EA60071C351 /* Modelable.swift */,
|
EA3361BE288B2EA60071C351 /* Modelable.swift */,
|
||||||
EA3361C8289054C50071C351 /* Surfaceable.swift */,
|
EA3361C8289054C50071C351 /* Surfaceable.swift */,
|
||||||
EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */,
|
EA3361B7288B2AAA0071C351 /* ViewProtocol.swift */,
|
||||||
@ -201,12 +218,15 @@
|
|||||||
path = Protocols;
|
path = Protocols;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
EA3361B4288B2A360071C351 /* BaseClasses */ = {
|
EA3361B4288B2A360071C351 /* Classes */ = {
|
||||||
isa = PBXGroup;
|
isa = PBXGroup;
|
||||||
children = (
|
children = (
|
||||||
EA3361B5288B2A410071C351 /* Control.swift */,
|
EA3361B5288B2A410071C351 /* VDSControl.swift */,
|
||||||
|
EA33624A28931B750071C351 /* Published.swift */,
|
||||||
|
EA33624828931B5C0071C351 /* ViewModelState.swift */,
|
||||||
|
EA33624C28931BB50071C351 /* List.swift */,
|
||||||
);
|
);
|
||||||
path = BaseClasses;
|
path = Classes;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
EA3361B9288B2BE30071C351 /* Utilities */ = {
|
EA3361B9288B2BE30071C351 /* Utilities */ = {
|
||||||
@ -246,6 +266,15 @@
|
|||||||
path = Fonts;
|
path = Fonts;
|
||||||
sourceTree = "<group>";
|
sourceTree = "<group>";
|
||||||
};
|
};
|
||||||
|
EA3362412892EF700071C351 /* Label */ = {
|
||||||
|
isa = PBXGroup;
|
||||||
|
children = (
|
||||||
|
EA33623F2892EF6B0071C351 /* VDSLabel.swift */,
|
||||||
|
EA3362422892EFF20071C351 /* VDSLabelModel.swift */,
|
||||||
|
);
|
||||||
|
path = Label;
|
||||||
|
sourceTree = "<group>";
|
||||||
|
};
|
||||||
/* End PBXGroup section */
|
/* End PBXGroup section */
|
||||||
|
|
||||||
/* Begin PBXHeadersBuildPhase section */
|
/* Begin PBXHeadersBuildPhase section */
|
||||||
@ -361,17 +390,24 @@
|
|||||||
files = (
|
files = (
|
||||||
EA3362322891F2ED0071C351 /* VDSFontStyles.swift in Sources */,
|
EA3362322891F2ED0071C351 /* VDSFontStyles.swift in Sources */,
|
||||||
EA3361C328902D960071C351 /* VDSToggle.swift in Sources */,
|
EA3361C328902D960071C351 /* VDSToggle.swift in Sources */,
|
||||||
|
EA3362402892EF6C0071C351 /* VDSLabel.swift in Sources */,
|
||||||
EA33622E2891EA3C0071C351 /* DispatchQueue+Once.swift in Sources */,
|
EA33622E2891EA3C0071C351 /* DispatchQueue+Once.swift in Sources */,
|
||||||
EA3361C5289030FC0071C351 /* Accessable.swift in Sources */,
|
EA3361C5289030FC0071C351 /* Accessable.swift in Sources */,
|
||||||
|
EA33624928931B5C0071C351 /* ViewModelState.swift in Sources */,
|
||||||
EA33622C2891E73B0071C351 /* FontProtocol.swift in Sources */,
|
EA33622C2891E73B0071C351 /* FontProtocol.swift in Sources */,
|
||||||
EA3361C9289054C50071C351 /* Surfaceable.swift in Sources */,
|
EA3361C9289054C50071C351 /* Surfaceable.swift in Sources */,
|
||||||
EA3361A2288B1E840071C351 /* VDSToggleModel.swift in Sources */,
|
EA3361A2288B1E840071C351 /* VDSToggleModel.swift in Sources */,
|
||||||
|
EA3362432892EFF20071C351 /* VDSLabelModel.swift in Sources */,
|
||||||
|
EA33624728931B050071C351 /* Initable.swift in Sources */,
|
||||||
EA3361BD288B2C760071C351 /* TypeAlias.swift in Sources */,
|
EA3361BD288B2C760071C351 /* TypeAlias.swift in Sources */,
|
||||||
EA3361AF288B26310071C351 /* FormFieldable.swift in Sources */,
|
EA3361AF288B26310071C351 /* FormFieldable.swift in Sources */,
|
||||||
EA3361B3288B265D0071C351 /* Changable.swift in Sources */,
|
EA3361B3288B265D0071C351 /* Changable.swift in Sources */,
|
||||||
EA336171288B19200071C351 /* VDS.docc in Sources */,
|
EA336171288B19200071C351 /* VDS.docc in Sources */,
|
||||||
EA3361AA288B25E40071C351 /* Disabling.swift in Sources */,
|
EA3361AA288B25E40071C351 /* Disabling.swift in Sources */,
|
||||||
EA3361B6288B2A410071C351 /* Control.swift in Sources */,
|
EA3361B6288B2A410071C351 /* VDSControl.swift in Sources */,
|
||||||
|
EA33624D28931BB50071C351 /* List.swift in Sources */,
|
||||||
|
EA3362452892F9130071C351 /* Labelable.swift in Sources */,
|
||||||
|
EA33624B28931B750071C351 /* Published.swift in Sources */,
|
||||||
EA3361B1288B26490071C351 /* Invertable.swift in Sources */,
|
EA3361B1288B26490071C351 /* Invertable.swift in Sources */,
|
||||||
EA3361AD288B26190071C351 /* DataTrackable.swift in Sources */,
|
EA3361AD288B26190071C351 /* DataTrackable.swift in Sources */,
|
||||||
EA33623E2892EE950071C351 /* UIDevice.swift in Sources */,
|
EA33623E2892EE950071C351 /* UIDevice.swift in Sources */,
|
||||||
|
|||||||
79
VDS/Classes/List.swift
Normal file
79
VDS/Classes/List.swift
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
//
|
||||||
|
// List.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 7/28/22.
|
||||||
|
//
|
||||||
|
// https://www.swiftbysundell.com/articles/picking-the-right-data-structure-in-swift/
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public struct List<Value> {
|
||||||
|
public private(set) var firstNode: Node?
|
||||||
|
public private(set) var lastNode: Node?
|
||||||
|
}
|
||||||
|
|
||||||
|
extension List {
|
||||||
|
public class Node {
|
||||||
|
public var value: Value
|
||||||
|
public fileprivate(set) weak var previous: Node?
|
||||||
|
public fileprivate(set) var next: Node?
|
||||||
|
|
||||||
|
public init(value: Value) {
|
||||||
|
self.value = value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension List: Sequence {
|
||||||
|
public func makeIterator() -> AnyIterator<Value> {
|
||||||
|
var node = firstNode
|
||||||
|
|
||||||
|
return AnyIterator {
|
||||||
|
// Iterate through all of our nodes by continuously
|
||||||
|
// moving to the next one and extract its value:
|
||||||
|
let value = node?.value
|
||||||
|
node = node?.next
|
||||||
|
return value
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension List {
|
||||||
|
@discardableResult
|
||||||
|
public mutating func append(_ value: Value) -> Node {
|
||||||
|
let node = Node(value: value)
|
||||||
|
node.previous = lastNode
|
||||||
|
|
||||||
|
lastNode?.next = node
|
||||||
|
lastNode = node
|
||||||
|
|
||||||
|
if firstNode == nil {
|
||||||
|
firstNode = node
|
||||||
|
}
|
||||||
|
|
||||||
|
return node
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
extension List {
|
||||||
|
public mutating func remove(_ node: Node) {
|
||||||
|
node.previous?.next = node.next
|
||||||
|
node.next?.previous = node.previous
|
||||||
|
|
||||||
|
// Using "triple-equals" we can compare two class
|
||||||
|
// instances by identity, rather than by value:
|
||||||
|
if firstNode === node {
|
||||||
|
firstNode = node.next
|
||||||
|
}
|
||||||
|
|
||||||
|
if lastNode === node {
|
||||||
|
lastNode = node.previous
|
||||||
|
}
|
||||||
|
|
||||||
|
// Completely disconnect the node by removing its
|
||||||
|
// sibling references:
|
||||||
|
node.next = nil
|
||||||
|
node.previous = nil
|
||||||
|
}
|
||||||
|
}
|
||||||
83
VDS/Classes/Published.swift
Normal file
83
VDS/Classes/Published.swift
Normal file
@ -0,0 +1,83 @@
|
|||||||
|
////
|
||||||
|
//// Published.swift
|
||||||
|
//// VDS
|
||||||
|
////
|
||||||
|
//// Created by Matt Bruce on 7/28/22.
|
||||||
|
////
|
||||||
|
//
|
||||||
|
//import Foundation
|
||||||
|
//
|
||||||
|
////https://www.swiftbysundell.com/articles/published-properties-in-swift/
|
||||||
|
//@propertyWrapper
|
||||||
|
//public struct Published<Value> {
|
||||||
|
// public var projectedValue: Published { self }
|
||||||
|
// public var wrappedValue: Value {
|
||||||
|
// didSet {
|
||||||
|
// valueDidChange()
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// private var observations = MutableReference(
|
||||||
|
// value: List<(Value) -> Void>()
|
||||||
|
// )
|
||||||
|
//
|
||||||
|
// public init(wrappedValue: Value) {
|
||||||
|
// self.wrappedValue = wrappedValue
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//private extension Published {
|
||||||
|
// func valueDidChange() {
|
||||||
|
// for closure in observations.value {
|
||||||
|
// closure(wrappedValue)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//extension Published {
|
||||||
|
// public func observe(with closure: @escaping (Value) -> Void) -> Cancellable {
|
||||||
|
// // To further mimmic Combine's behaviors, we'll call
|
||||||
|
// // each observation closure as soon as it's attached to
|
||||||
|
// // our property:
|
||||||
|
// closure(wrappedValue)
|
||||||
|
//
|
||||||
|
// let node = observations.value.append(closure)
|
||||||
|
//
|
||||||
|
// return Cancellable { [weak observations] in
|
||||||
|
// observations?.value.remove(node)
|
||||||
|
// }
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//public class Cancellable {
|
||||||
|
// private var closure: (() -> Void)?
|
||||||
|
//
|
||||||
|
// public init(closure: @escaping () -> Void) {
|
||||||
|
// self.closure = closure
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// deinit {
|
||||||
|
// cancel()
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// public func cancel() {
|
||||||
|
// closure?()
|
||||||
|
// closure = nil
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//
|
||||||
|
/////https://www.swiftbysundell.com/articles/combining-value-and-reference-types-in-swift/
|
||||||
|
//public class Reference<Value> {
|
||||||
|
// fileprivate(set) var value: Value
|
||||||
|
//
|
||||||
|
// public init(value: Value) {
|
||||||
|
// self.value = value
|
||||||
|
// }
|
||||||
|
//}
|
||||||
|
//
|
||||||
|
//public class MutableReference<Value>: Reference<Value> {
|
||||||
|
// public func update(with value: Value) {
|
||||||
|
// self.value = value
|
||||||
|
// }
|
||||||
|
//}
|
||||||
@ -8,12 +8,11 @@
|
|||||||
import Foundation
|
import Foundation
|
||||||
import UIKit
|
import UIKit
|
||||||
|
|
||||||
@objcMembers open class Control<ModelType>: UIControl, Modelable, ViewProtocol {
|
@objcMembers open class VDSControl: UIControl, ViewProtocol {
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Properties
|
// MARK: - Properties
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
private var initialSetupPerformed = false
|
private var initialSetupPerformed = false
|
||||||
public var model: ModelType?
|
|
||||||
|
|
||||||
//--------------------------------------------------
|
//--------------------------------------------------
|
||||||
// MARK: - Initializers
|
// MARK: - Initializers
|
||||||
@ -45,10 +44,6 @@ import UIKit
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
open func set(with model: ModelType) {
|
|
||||||
self.model = model
|
|
||||||
}
|
|
||||||
|
|
||||||
open func reset() {
|
open func reset() {
|
||||||
backgroundColor = .clear
|
backgroundColor = .clear
|
||||||
}
|
}
|
||||||
21
VDS/Classes/ViewModelState.swift
Normal file
21
VDS/Classes/ViewModelState.swift
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
//
|
||||||
|
// ViewModelState.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 7/28/22.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import Combine
|
||||||
|
|
||||||
|
////final public class ViewModelState<ViewModelType:Initable>: ObservableObject, Initable {
|
||||||
|
//// @Published public var viewModel = ViewModelType()
|
||||||
|
//// public init(){}
|
||||||
|
////}
|
||||||
|
//final public class ViewModelState<ViewModelType>: ObservableObject, Modelable {
|
||||||
|
// @Published public var model: ViewModelType
|
||||||
|
// public init(){}
|
||||||
|
// public func set(with model: ViewModelType) {
|
||||||
|
// self.model = model
|
||||||
|
// }
|
||||||
|
//}
|
||||||
103
VDS/Components/Label/VDSLabel.swift
Normal file
103
VDS/Components/Label/VDSLabel.swift
Normal file
@ -0,0 +1,103 @@
|
|||||||
|
//
|
||||||
|
// VDSLabel.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 7/28/22.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import UIKit
|
||||||
|
import VDSColorTokens
|
||||||
|
import Combine
|
||||||
|
|
||||||
|
open class DefaultLabelModel: VDSLabelModel {
|
||||||
|
public var fontCategory: VDSFontCategory = .body
|
||||||
|
public var fontSize: VDSFontSize = .large
|
||||||
|
public var fontWeight: VDSFontWeight = .regular
|
||||||
|
public var textPosition: VDSTextPosition = .left
|
||||||
|
public var surface: Surface = .light
|
||||||
|
required public init(){}
|
||||||
|
}
|
||||||
|
|
||||||
|
open class VDSLabel: UILabel, Modelable, ObservableObject {
|
||||||
|
@Published public var model: VDSLabelModel = DefaultLabelModel()
|
||||||
|
private var cancellable: AnyCancellable?
|
||||||
|
|
||||||
|
public var fontSize: VDSFontSize = .large {
|
||||||
|
didSet {
|
||||||
|
if fontSize != model.fontSize {
|
||||||
|
model.fontSize = fontSize
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public var textPosition: VDSTextPosition = .left{
|
||||||
|
didSet {
|
||||||
|
if textPosition != model.textPosition {
|
||||||
|
model.textPosition = textPosition
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public var fontWeight: VDSFontWeight = .regular {
|
||||||
|
didSet {
|
||||||
|
if fontWeight != model.fontWeight {
|
||||||
|
model.fontWeight = fontWeight
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public var fontCategory: VDSFontCategory = .body {
|
||||||
|
didSet {
|
||||||
|
if fontCategory != model.fontCategory {
|
||||||
|
model.fontCategory = fontCategory
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public var surface: Surface = .light {
|
||||||
|
didSet {
|
||||||
|
if surface != model.surface {
|
||||||
|
model.surface = surface
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//Initializers
|
||||||
|
public convenience init() {
|
||||||
|
self.init(frame: .zero)
|
||||||
|
}
|
||||||
|
|
||||||
|
public override init(frame: CGRect) {
|
||||||
|
super.init(frame: frame)
|
||||||
|
setup()
|
||||||
|
}
|
||||||
|
|
||||||
|
required public init?(coder: NSCoder) {
|
||||||
|
super.init(coder: coder)
|
||||||
|
setup()
|
||||||
|
}
|
||||||
|
|
||||||
|
func setup() {
|
||||||
|
cancellable = $model.sink { [weak self] viewModel in
|
||||||
|
self?.onStateChange(viewModel: viewModel)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//functions
|
||||||
|
private func onStateChange(viewModel: VDSLabelModel) {
|
||||||
|
textAlignment = viewModel.textPosition.textAlignment
|
||||||
|
textColor = viewModel.surface == .dark ? VDSColor.elementsPrimaryOndark : VDSColor.elementsPrimaryOnlight
|
||||||
|
|
||||||
|
guard let vdsFont = try? VDSFontStyle.font(for: viewModel.fontCategory, fontWeight: viewModel.fontWeight, fontSize: viewModel.fontSize) else {
|
||||||
|
font = VDSFontStyle.RegularBodyLarge.font
|
||||||
|
return
|
||||||
|
}
|
||||||
|
font = vdsFont
|
||||||
|
}
|
||||||
|
|
||||||
|
//Modelable
|
||||||
|
public func set(with model: VDSLabelModel) {
|
||||||
|
self.model = model
|
||||||
|
}
|
||||||
|
}
|
||||||
12
VDS/Components/Label/VDSLabelModel.swift
Normal file
12
VDS/Components/Label/VDSLabelModel.swift
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
//
|
||||||
|
// VDSLabelModel.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 7/28/22.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
import UIKit
|
||||||
|
|
||||||
|
public protocol VDSLabelModel: Labelable, Surfaceable {
|
||||||
|
}
|
||||||
12
VDS/Protocols/Initable.swift
Normal file
12
VDS/Protocols/Initable.swift
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
//
|
||||||
|
// Initable.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 7/28/22.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public protocol Initable {
|
||||||
|
init()
|
||||||
|
}
|
||||||
15
VDS/Protocols/Labelable.swift
Normal file
15
VDS/Protocols/Labelable.swift
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
//
|
||||||
|
// LabelModelable.swift
|
||||||
|
// VDS
|
||||||
|
//
|
||||||
|
// Created by Matt Bruce on 7/28/22.
|
||||||
|
//
|
||||||
|
|
||||||
|
import Foundation
|
||||||
|
|
||||||
|
public protocol Labelable {
|
||||||
|
var fontSize: VDSFontSize { get set }
|
||||||
|
var textPosition: VDSTextPosition { get set }
|
||||||
|
var fontWeight: VDSFontWeight { get set }
|
||||||
|
var fontCategory: VDSFontCategory { get set }
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue
Block a user