From f40335ce193f09f4b9fddeecc1b5c39a484b0f99 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Thu, 9 Jan 2020 10:46:00 -0500 Subject: [PATCH 1/3] progress, multi progress, caret --- MVMCoreUI/Atoms/Views/CaretView.swift | 39 ++++--------------- MVMCoreUI/Atoms/Views/CaretViewModel.swift | 30 +++++++++++++- MVMCoreUI/Atoms/Views/MultiProgress.swift | 14 ++++--- .../Atoms/Views/MultiProgressModel.swift | 4 ++ MVMCoreUI/Atoms/Views/ProgressBar.swift | 26 +++---------- MVMCoreUI/Atoms/Views/ProgressBarModel.swift | 2 +- .../Molecules/ModelMoleculeViewProtocol.swift | 7 ++++ MVMCoreUI/Organisms/MoleculeStackView.swift | 1 - .../OtherHandlers/MoleculeObjectMapping.swift | 1 + 9 files changed, 62 insertions(+), 62 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/CaretView.swift b/MVMCoreUI/Atoms/Views/CaretView.swift index fb9689e5..4a0b9c36 100644 --- a/MVMCoreUI/Atoms/Views/CaretView.swift +++ b/MVMCoreUI/Atoms/Views/CaretView.swift @@ -102,27 +102,10 @@ open class CaretView: View { @objc open override func setAsMolecule() { defaultState() } - - open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) - // Configure class properties with JSON values - guard let dictionary = json else { return } - - if let strokeColorHex = dictionary["strokeColor"] as? String { - strokeColor = UIColor.mfGet(forHex: strokeColorHex) - } - - if let isHiddenValue = dictionary[KeyIsHidden] as? Bool { - isHidden = isHiddenValue - } - - if let isOpaqueValue = dictionary[KeyIsOpaque] as? Bool { - isOpaque = isOpaqueValue - } - - if let lineWidthValue = dictionary["lineWidth"] as? CGFloat { - lineWidth = lineWidthValue - } + + public override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + guard let json = json, let model = try? Self.decodeJSONToModel(json: json, type: CaretViewModel.self) else { return } + setWithModel(model, delegateObject, additionalData as? [String : AnyHashable]) } //MARK: - MVMCoreMoleculeViewProtocol @@ -131,17 +114,9 @@ open class CaretView: View { guard let caretModel = model as? CaretViewModel else { return } - if let strokeColorHex = caretModel.strokeColor { - strokeColor = UIColor.mfGet(forHex: strokeColorHex) - } - - if let isHiddenValue = caretModel.isHidden { - isHidden = isHiddenValue - } - - if let isOpaqueValue = caretModel.isOpaque { - isOpaque = isOpaqueValue - } + strokeColor = caretModel.strokeColor.uiColor + isHidden = caretModel.isHidden ?? false + isOpaque = caretModel.isOpaque ?? false if let lineWidthValue = caretModel.lineWidth { lineWidth = lineWidthValue diff --git a/MVMCoreUI/Atoms/Views/CaretViewModel.swift b/MVMCoreUI/Atoms/Views/CaretViewModel.swift index 8d2bc16c..f26a150f 100644 --- a/MVMCoreUI/Atoms/Views/CaretViewModel.swift +++ b/MVMCoreUI/Atoms/Views/CaretViewModel.swift @@ -12,8 +12,36 @@ import Foundation public static var identifier: String = "caretView" public var backgroundColor: Color? - public var strokeColor: String? + public var strokeColor: Color = Color(uiColor: .black) public var isHidden: Bool? public var isOpaque: Bool? public var lineWidth: CGFloat? + + enum CodingKeys: String, CodingKey { + case backgroundColor + case strokeColor + case isHidden + case isOpaque + case lineWidth + } + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + if let strokeColor = try typeContainer.decodeIfPresent(Color.self, forKey: .strokeColor) { + self.strokeColor = strokeColor + } + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + isHidden = try typeContainer.decodeIfPresent(Bool.self, forKey: .isHidden) + isOpaque = try typeContainer.decodeIfPresent(Bool.self, forKey: .isOpaque) + lineWidth = try typeContainer.decodeIfPresent(CGFloat.self, forKey: .lineWidth) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(strokeColor, forKey: .strokeColor) + try container.encodeIfPresent(isHidden, forKey: .isHidden) + try container.encodeIfPresent(isOpaque, forKey: .isOpaque) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encodeIfPresent(lineWidth, forKey: .lineWidth) + } } diff --git a/MVMCoreUI/Atoms/Views/MultiProgress.swift b/MVMCoreUI/Atoms/Views/MultiProgress.swift index aceaf775..29fbf465 100644 --- a/MVMCoreUI/Atoms/Views/MultiProgress.swift +++ b/MVMCoreUI/Atoms/Views/MultiProgress.swift @@ -9,7 +9,10 @@ import UIKit @objcMembers open class MultiProgress: View { - + var multiProgressModel: MultiProgressBarModel? { + get { return model as? MultiProgressBarModel } + } + ///passing value to progressList creates corresponding progress bars var progressList: Array? { didSet { @@ -63,7 +66,7 @@ import UIKit //MARK: - MVMCoreMoleculeViewProtocol public override func setWithModel(_ model: MoleculeProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [String : AnyHashable]?) { super.setWithModel(model, delegateObject, additionalData) - guard let multiProgressModel = model as? MultiProgressBarModel else { + guard let multiProgressModel = multiProgressModel else { return } roundedRect = multiProgressModel.roundedRect ?? false @@ -78,9 +81,8 @@ import UIKit progressList = nil } - override open func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) - thicknessConstraint?.constant = json?.optionalCGFloatForKey("thickness") ?? defaultHeight - roundedRect = json?.optionalBoolForKey("roundedRect") ?? false + public override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { + guard let json = json, let model = try? Self.decodeJSONToModel(json: json, type: MultiProgressBarModel.self) else { return } + setWithModel(model, delegateObject, additionalData as? [String : AnyHashable]) } } diff --git a/MVMCoreUI/Atoms/Views/MultiProgressModel.swift b/MVMCoreUI/Atoms/Views/MultiProgressModel.swift index da2b8f69..b0251ff6 100644 --- a/MVMCoreUI/Atoms/Views/MultiProgressModel.swift +++ b/MVMCoreUI/Atoms/Views/MultiProgressModel.swift @@ -32,6 +32,10 @@ import Foundation case backgroundColor } + public init(_ progressList: [SingleProgressBarModel]) { + self.progressList = progressList + } + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) progressList = try typeContainer.decode([SingleProgressBarModel].self, forKey: .progressList) diff --git a/MVMCoreUI/Atoms/Views/ProgressBar.swift b/MVMCoreUI/Atoms/Views/ProgressBar.swift index 8a3b0bb0..dff5bfc4 100644 --- a/MVMCoreUI/Atoms/Views/ProgressBar.swift +++ b/MVMCoreUI/Atoms/Views/ProgressBar.swift @@ -9,11 +9,12 @@ import Foundation @objcMembers open class ProgressBar: UIProgressView, MVMCoreViewProtocol, ModelMoleculeViewProtocol, MVMCoreUIMoleculeViewProtocol { - var isRounded = false + var progressBarModel: ProgressBarModel? + var thickness: CGFloat = 8.0 { willSet(newValue) { heightAnchor.constraint(equalToConstant: newValue).isActive = true - if isRounded { + if progressBarModel?.isRounded ?? false { layer.cornerRadius = newValue/2.0 } else { progressViewStyle = .bar @@ -40,7 +41,6 @@ import Foundation public func setupView() { clipsToBounds = true translatesAutoresizingMaskIntoConstraints = false - isRounded = false thickness = 8 progress = 0 progressTintColor = UIColor.mfCerulean() @@ -55,7 +55,6 @@ import Foundation guard let progressBarModel = model as? ProgressBarModel else { return } - isRounded = progressBarModel.isRounded ?? false thickness = progressBarModel.thickness ?? 8 progress = Float((progressBarModel.percent)/100.0) progressTintColor = progressBarModel.progressColor.uiColor @@ -66,26 +65,11 @@ import Foundation // MARK: - MVMCoreUIMoleculeViewProtocol public func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { - if let isRounded = json?.optionalBoolForKey("roundedRect") { - self.isRounded = isRounded - } - if let thickness = json?.optionalCGFloatForKey("thickness") { - self.thickness = thickness - } - // as? Float returns nil, apple defect. - if let percentage = json?["percent"] as? CGFloat { - progress = Float(percentage/100.0) - } - if let progressColor = json?.optionalStringForKey("progressColor") { - progressTintColor = UIColor.mfGet(forHex: progressColor) - } - if let backgroundColor = json?.optionalStringForKey("backgroundColor") { - trackTintColor = UIColor.mfGet(forHex: backgroundColor) - } + guard let json = json, let model = try? Self.decodeJSONToModel(json: json, type: ProgressBarModel.self) else { return } + setWithModel(model, delegateObject, additionalData as? [String : AnyHashable]) } public func reset() { - isRounded = false thickness = 8 progress = 0 progressTintColor = UIColor.mfCerulean() diff --git a/MVMCoreUI/Atoms/Views/ProgressBarModel.swift b/MVMCoreUI/Atoms/Views/ProgressBarModel.swift index 1e0bfeb1..1850c411 100644 --- a/MVMCoreUI/Atoms/Views/ProgressBarModel.swift +++ b/MVMCoreUI/Atoms/Views/ProgressBarModel.swift @@ -25,7 +25,7 @@ import Foundation case backgroundColor } - init(_ percent: CGFloat) { + public init(_ percent: CGFloat) { self.percent = percent } diff --git a/MVMCoreUI/Molecules/ModelMoleculeViewProtocol.swift b/MVMCoreUI/Molecules/ModelMoleculeViewProtocol.swift index a1828fa7..8b06ab0e 100644 --- a/MVMCoreUI/Molecules/ModelMoleculeViewProtocol.swift +++ b/MVMCoreUI/Molecules/ModelMoleculeViewProtocol.swift @@ -25,4 +25,11 @@ extension ModelMoleculeViewProtocol { public static func requiredModules(_ molecule: MoleculeProtocol?, delegateObject: MVMCoreUIDelegateObject?, error: AutoreleasingUnsafeMutablePointer?) -> [String]? { return nil } + + // Temporary + public static func decodeJSONToModel(json: [AnyHashable: Any], type: T.Type) throws -> T where T : Decodable { + let data = try JSONSerialization.data(withJSONObject: json) + let decoder = JSONDecoder() + return try decoder.decode(type, from: data) + } } diff --git a/MVMCoreUI/Organisms/MoleculeStackView.swift b/MVMCoreUI/Organisms/MoleculeStackView.swift index 05e10c0d..8dd43193 100644 --- a/MVMCoreUI/Organisms/MoleculeStackView.swift +++ b/MVMCoreUI/Organisms/MoleculeStackView.swift @@ -143,7 +143,6 @@ open class MoleculeStackView: Container { } else { setWithModel(model, delegateObject, additionalData as? [String : AnyHashable]) } - } public class func name(forReuse molecule: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> String? { diff --git a/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift b/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift index d66c1558..2b9b78a5 100644 --- a/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift +++ b/MVMCoreUI/OtherHandlers/MoleculeObjectMapping.swift @@ -33,5 +33,6 @@ import Foundation // //ModelRegistry.register(ModuleMoleculeModel.self) ModelRegistry.register(LeftRightLabelModel.self) + ModelRegistry.register(CaretViewModel.self) } } From d651fb5783519e7160ecd3dae332cea44c55828f Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Thu, 9 Jan 2020 11:00:00 -0500 Subject: [PATCH 2/3] Dash line color require for model, optional for server --- MVMCoreUI/Atoms/Views/DashLine.swift | 26 ++++++++--------------- MVMCoreUI/Atoms/Views/DashLineModel.swift | 24 ++++++++++++++++++++- 2 files changed, 32 insertions(+), 18 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/DashLine.swift b/MVMCoreUI/Atoms/Views/DashLine.swift index 48decdf9..89541b0c 100644 --- a/MVMCoreUI/Atoms/Views/DashLine.swift +++ b/MVMCoreUI/Atoms/Views/DashLine.swift @@ -15,8 +15,11 @@ open class DashLine: View { // MARK: - Properties //------------------------------------------------------ - @objc public var dashColor: UIColor? - @objc public var dashLayer: CAShapeLayer? + var dashModel: DashLineModel? { + get { return model as? DashLineModel } + } + + @objc private var dashLayer: CAShapeLayer? //------------------------------------------------------ // MARK: - Lifecycle @@ -53,7 +56,7 @@ open class DashLine: View { dashLayer.lineCap = .round dashLayer.lineDashPattern = [NSNumber(value: 2), NSNumber(value: 2)] dashLayer.path = path.cgPath - dashLayer.strokeColor = dashColor?.cgColor ?? UIColor.mfLighterGray().cgColor + dashLayer.strokeColor = dashModel?.dashColor.uiColor.cgColor ?? UIColor.mfLighterGray().cgColor dashLayer.fillColor = UIColor.clear.cgColor dashLayer.backgroundColor = backgroundColor?.cgColor ?? UIColor.white.cgColor self.dashLayer = dashLayer @@ -70,27 +73,16 @@ open class DashLine: View { } open override func setWithJSON(_ json: [AnyHashable: Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable: Any]?) { - super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) - - // Configure class properties with JSON values - guard let jsonDictionary = json else { return } - - if let isHiddenValue = jsonDictionary[KeyIsHidden] as? Bool { - isHidden = isHiddenValue - } - - if let dashColorHex = jsonDictionary["dashColor"] as? String { - dashColor = UIColor.mfGet(forHex: dashColorHex) - } + guard let json = json, let model = try? Self.decodeJSONToModel(json: json, type: DashLineModel.self) else { return } + setWithModel(model, delegateObject, additionalData as? [String : AnyHashable]) } //MARK: - MVMCoreMoleculeViewProtocol public override func setWithModel(_ model: MoleculeProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [String : AnyHashable]?) { super.setWithModel(model, delegateObject, additionalData) - guard let dashLineModel = model as? DashLineModel else { + guard let dashLineModel = dashModel else { return } - dashColor = dashLineModel.dashColor.uiColor if let isHiddenValue = dashLineModel.isHidden { isHidden = isHiddenValue } diff --git a/MVMCoreUI/Atoms/Views/DashLineModel.swift b/MVMCoreUI/Atoms/Views/DashLineModel.swift index 06d85f08..ec6b8a15 100644 --- a/MVMCoreUI/Atoms/Views/DashLineModel.swift +++ b/MVMCoreUI/Atoms/Views/DashLineModel.swift @@ -12,10 +12,32 @@ import Foundation public static var identifier: String = "dashLine" public var backgroundColor: Color? - public var dashColor: Color + public var dashColor: Color = Color(uiColor: .mfLighterGray()) public var isHidden: Bool? public init(dashColor: Color) { self.dashColor = dashColor } + + enum CodingKeys: String, CodingKey { + case backgroundColor + case dashColor + case isHidden + } + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + if let dashColor = try typeContainer.decodeIfPresent(Color.self, forKey: .dashColor) { + self.dashColor = dashColor + } + backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) + isHidden = try typeContainer.decodeIfPresent(Bool.self, forKey: .isHidden) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encode(dashColor, forKey: .dashColor) + try container.encodeIfPresent(isHidden, forKey: .isHidden) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + } } From 3e8b69a0bc76c53a4fad50e5badd1770bf89c6c6 Mon Sep 17 00:00:00 2001 From: "Pfeil, Scott Robert" Date: Thu, 9 Jan 2020 11:38:32 -0500 Subject: [PATCH 3/3] Line and image update --- MVMCoreUI/Atoms/Views/ImageViewModel.swift | 1 - .../Atoms/Views/LeftRightLabelModel.swift | 1 - MVMCoreUI/Atoms/Views/Line.swift | 68 +++++++++---------- .../Containers/NavigationController.swift | 2 +- MVMCoreUI/Models/Molecules/LineModel.swift | 38 ++++++++++- .../Items/DropDownFilterTableViewCell.swift | 4 +- MVMCoreUI/Molecules/Items/TableViewCell.swift | 24 +++---- MVMCoreUI/Molecules/StandardHeaderView.swift | 4 +- 8 files changed, 88 insertions(+), 54 deletions(-) diff --git a/MVMCoreUI/Atoms/Views/ImageViewModel.swift b/MVMCoreUI/Atoms/Views/ImageViewModel.swift index a65c946a..0944c36e 100644 --- a/MVMCoreUI/Atoms/Views/ImageViewModel.swift +++ b/MVMCoreUI/Atoms/Views/ImageViewModel.swift @@ -10,7 +10,6 @@ import Foundation @objcMembers public class ImageViewModel: MoleculeProtocol { public static var identifier: String = "image" - public var moleculeName: String public var backgroundColor: Color? public var image: String diff --git a/MVMCoreUI/Atoms/Views/LeftRightLabelModel.swift b/MVMCoreUI/Atoms/Views/LeftRightLabelModel.swift index e006afc9..5e091446 100644 --- a/MVMCoreUI/Atoms/Views/LeftRightLabelModel.swift +++ b/MVMCoreUI/Atoms/Views/LeftRightLabelModel.swift @@ -13,5 +13,4 @@ import UIKit public var backgroundColor: Color? public var leftText: LabelModel public var rightText: LabelModel - } diff --git a/MVMCoreUI/Atoms/Views/Line.swift b/MVMCoreUI/Atoms/Views/Line.swift index d5f4f4b6..7b80d59a 100644 --- a/MVMCoreUI/Atoms/Views/Line.swift +++ b/MVMCoreUI/Atoms/Views/Line.swift @@ -9,42 +9,35 @@ import UIKit @objcMembers open class Line: View { + var lineModel: LineModel? { + get { return model as? LineModel } + } public var heightConstraint: NSLayoutConstraint? - public enum Style: String, Codable { - case standard - case thin - case medium - case heavy - case none - } - - public var style = Style.standard { - didSet { - switch style { - case .standard: - heightConstraint?.constant = 1 - backgroundColor = .mfSilver() - case .thin: - heightConstraint?.constant = 1 - backgroundColor = .black - case .medium: - heightConstraint?.constant = 2 - backgroundColor = .black - case .heavy: - heightConstraint?.constant = 4 - backgroundColor = .black - case .none: - heightConstraint?.constant = 0 - } + open func setStyle(_ style: LineModel.Style) { + switch style { + case .standard: + heightConstraint?.constant = 1 + backgroundColor = .mfSilver() + case .thin: + heightConstraint?.constant = 1 + backgroundColor = .black + case .medium: + heightConstraint?.constant = 2 + backgroundColor = .black + case .heavy: + heightConstraint?.constant = 4 + backgroundColor = .black + case .none: + heightConstraint?.constant = 0 } } // MARK: - Helpers open func shouldBeVisible() -> Bool { - guard let type = json?.optionalStringForKey(KeyType) else { return false } - return type != "none" + guard let type = lineModel?.type else { return false } + return type != .none } public convenience init(pinTo view: UIView, edge: UIRectEdge, useMargin: Bool) { @@ -56,26 +49,33 @@ import UIKit // MARK: - MVMCoreViewProtocol open override func setupView() { super.setupView() - backgroundColor = .black heightConstraint = heightAnchor.constraint(equalToConstant: 1) heightConstraint?.isActive = true + setStyle(.standard) } // MARK: - MVMCoreUIMoleculeViewProtocol open override func setWithJSON(_ json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?, additionalData: [AnyHashable : Any]?) { // If no type, default to standard. - if let typeString = json?.optionalStringForKey(KeyType), let type = Style.init(rawValue: typeString) { - style = type + if let typeString = json?.optionalStringForKey(KeyType), let type = LineModel.Style.init(rawValue: typeString) { + setStyle(type) } else { - style = .standard + setStyle(.standard) } super.setWithJSON(json, delegateObject: delegateObject, additionalData: additionalData) } + open override func setWithModel(_ model: MoleculeProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [String : AnyHashable]?) { + if let lineModel = model as? LineModel { + setStyle(lineModel.type ?? .standard) + } + super.setWithModel(model, delegateObject, additionalData) + } + open override func reset() { - style = .standard + setStyle(.standard) } open func copyBackgroundColor() -> Bool { @@ -83,7 +83,7 @@ import UIKit } public static func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat { - guard let type = json?.optionalStringForKey(KeyType), let style = Style(rawValue: type) else { return 1 } + guard let type = json?.optionalStringForKey(KeyType), let style = LineModel.Style(rawValue: type) else { return 1 } switch style { case .none: return 0 diff --git a/MVMCoreUI/Containers/NavigationController.swift b/MVMCoreUI/Containers/NavigationController.swift index 353ea861..623b2f47 100644 --- a/MVMCoreUI/Containers/NavigationController.swift +++ b/MVMCoreUI/Containers/NavigationController.swift @@ -29,7 +29,7 @@ import UIKit let navigationController = self.init() style(navigationController.navigationBar) navigationController.separatorView = Line(pinTo: navigationController.navigationBar, edge: .bottom, useMargin: false) - navigationController.separatorView?.style = .standard + navigationController.separatorView?.setStyle(.standard) MVMCoreUISession.sharedGlobal()?.navigationController = navigationController MVMCoreNavigationHandler.shared()?.viewControllerToPresentOn = navigationController MVMCoreNavigationHandler.shared()?.navigationController = navigationController diff --git a/MVMCoreUI/Models/Molecules/LineModel.swift b/MVMCoreUI/Models/Molecules/LineModel.swift index 66010536..88e09be0 100644 --- a/MVMCoreUI/Models/Molecules/LineModel.swift +++ b/MVMCoreUI/Models/Molecules/LineModel.swift @@ -9,7 +9,43 @@ import UIKit @objcMembers public class LineModel: MoleculeProtocol { + + /* + The frequency of the line in a moleculeList. + all (between all cells, above top, below bottom) + allExceptTop (between all cells, below bottom) + allExceptBottom (between all cells, above top) + between (between all cells) + */ + public enum Frequency: String, Codable { + case all + case allExceptTop + case allExceptBottom + case between + } + + /* + The style of the line. + standard (1 height, silver) + thin (1 height, black) + medium (2 height, black) + heavy (4 height, black) + none (hidden) + */ + public enum Style: String, Codable { + case standard + case thin + case medium + case heavy + case none + } + public static var identifier: String = "line" + public var type: Style? = .standard + public var frequency: Frequency? = .allExceptTop public var backgroundColor: Color? - public var type: String? + + public init(type: Style) { + self.type = type + } } diff --git a/MVMCoreUI/Molecules/Items/DropDownFilterTableViewCell.swift b/MVMCoreUI/Molecules/Items/DropDownFilterTableViewCell.swift index 2f856074..a9d9c360 100644 --- a/MVMCoreUI/Molecules/Items/DropDownFilterTableViewCell.swift +++ b/MVMCoreUI/Molecules/Items/DropDownFilterTableViewCell.swift @@ -53,7 +53,7 @@ import UIKit } public override func setWithModel(_ model: MoleculeProtocol?, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [String : AnyHashable]?) { - bottomSeparatorView?.style = .none + bottomSeparatorView?.setStyle(.none) self.delegateObject = delegateObject super.setWithModel(model, delegateObject, additionalData) @@ -65,6 +65,6 @@ import UIKit public override func reset() { super.reset() bottomMarginPadding = 0 - bottomSeparatorView?.style = .none + bottomSeparatorView?.setStyle(.none) } } diff --git a/MVMCoreUI/Molecules/Items/TableViewCell.swift b/MVMCoreUI/Molecules/Items/TableViewCell.swift index d74f0ee5..ba017c4e 100644 --- a/MVMCoreUI/Molecules/Items/TableViewCell.swift +++ b/MVMCoreUI/Molecules/Items/TableViewCell.swift @@ -62,29 +62,29 @@ import UIKit open func styleStandard() { topMarginPadding = 24 bottomMarginPadding = 24 - topSeparatorView?.style = .none - bottomSeparatorView?.style = .standard + topSeparatorView?.setStyle(.none) + bottomSeparatorView?.setStyle(.standard) } open func styleHeader() { topMarginPadding = 48 bottomMarginPadding = 16 - topSeparatorView?.style = .none - bottomSeparatorView?.style = .thin + topSeparatorView?.setStyle(.none) + bottomSeparatorView?.setStyle(.thin) } open func styleFooter() { topMarginPadding = 24 bottomMarginPadding = 0 - topSeparatorView?.style = .none - bottomSeparatorView?.style = .none + topSeparatorView?.setStyle(.none) + bottomSeparatorView?.setStyle(.none) } open func styleNone() { topMarginPadding = 0 bottomMarginPadding = 0 - topSeparatorView?.style = .none - bottomSeparatorView?.style = .none + topSeparatorView?.setStyle(.none) + bottomSeparatorView?.setStyle(.none) } /// Adds the molecule to the view. @@ -264,8 +264,8 @@ import UIKit setSeparatorFrequency(separatorFrequency, indexPath: indexPath) } } else { - topSeparatorView?.style = .standard - bottomSeparatorView?.style = .standard + topSeparatorView?.setStyle(.standard) + bottomSeparatorView?.setStyle(.standard) setSeparatorFrequency(TableViewCell.SeparatorFrequency.allExceptTop, indexPath: indexPath) } } @@ -285,7 +285,7 @@ import UIKit open func addSeparatorsIfNeeded() { if topSeparatorView == nil { let line = Line() - line.style = .none + line.setStyle(.none) addSubview(line) NSLayoutConstraint.pinViewTop(toSuperview: line, useMargins: false, constant: 0).isActive = true NSLayoutConstraint.pinViewLeft(toSuperview: line, useMargins: true, constant: 0).isActive = true @@ -294,7 +294,7 @@ import UIKit } if bottomSeparatorView == nil { let line = Line() - line.style = .none + line.setStyle(.none) addSubview(line) NSLayoutConstraint.pinViewBottom(toSuperview: line, useMargins: false, constant: 0).isActive = true NSLayoutConstraint.pinViewLeft(toSuperview: line, useMargins: true, constant: 0).isActive = true diff --git a/MVMCoreUI/Molecules/StandardHeaderView.swift b/MVMCoreUI/Molecules/StandardHeaderView.swift index 686aac3b..eeb46a6a 100644 --- a/MVMCoreUI/Molecules/StandardHeaderView.swift +++ b/MVMCoreUI/Molecules/StandardHeaderView.swift @@ -26,7 +26,7 @@ public class StandardHeaderView: MoleculeContainer { guard line == nil else { return } let line = Line() - line.style = .heavy + line.setStyle(.heavy) addSubview(line) NSLayoutConstraint.pinViewBottom(toSuperview: line, useMargins: false, constant: 0).isActive = true NSLayoutConstraint.pinViewLeft(toSuperview: line, useMargins: true, constant: 0).isActive = true @@ -56,7 +56,7 @@ public class StandardHeaderView: MoleculeContainer { open override func reset() { super.reset() - line?.style = .heavy + line?.setStyle(.heavy) } public class func estimatedHeight(forRow json: [AnyHashable : Any]?, delegateObject: MVMCoreUIDelegateObject?) -> CGFloat {