From 33ffbf91295bdf7a87b75b9b6ad17090dd66e83d Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 28 Apr 2020 13:51:03 -0400 Subject: [PATCH 01/16] adding comments and structure. code alignment. --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 35 ++++++++++++++++++- .../MoleculeModelProtocol.swift | 6 ++++ .../BaseControllers/ViewController.swift | 10 +++--- .../Views/Container/Container.swift | 2 ++ 4 files changed, 47 insertions(+), 6 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index abdc1242..22969196 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -8,6 +8,7 @@ import UIKit + public enum ButtonStyle: String, Codable { case primary case secondary @@ -19,8 +20,13 @@ public enum ButtonSize: String, Codable { } public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "button" public var backgroundColor: Color? + public var isInverted: Bool = false public var title: String public var action: ActionModelProtocol public var enabled: Bool = true @@ -34,14 +40,22 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var disabledBorderColor: Color? public var groupName: String = "" + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + public func setValidity(_ valid: Bool, group: FormGroupRule) { enabled = valid updateUI?() } /// Temporary binding mechanism for the view to update on enable changes. - public var updateUI: (() -> Void)? + public var updateUI: (() -> ())? + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + public init(with title: String, action: ActionModelProtocol) { self.title = title self.action = action @@ -59,9 +73,14 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW style = .primary } + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor + case isInverted = "inverted" case title case action case enabled @@ -76,24 +95,37 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case groupName } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + + if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) { + self.isInverted = isInverted + } backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) + if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } + if let style = try typeContainer.decodeIfPresent(ButtonStyle.self, forKey: .style) { self.style = style } + if let size = try typeContainer.decodeIfPresent(ButtonSize.self, forKey: .size) { self.size = size } + if let enabled = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) { self.enabled = enabled } + fillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) textColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) borderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) @@ -106,6 +138,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) + try container.encode(isInverted, forKey: .isInverted) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeModel(action, forKey: .action) try container.encode(enabled, forKey: .enabled) diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift index dda19b35..f4d528f5 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift @@ -9,6 +9,7 @@ public enum MolecularError: Swift.Error { public protocol MoleculeModelProtocol: ModelProtocol { var moleculeName: String { get } + var isInverted: Bool { get set } var backgroundColor: Color? { get set } } @@ -25,4 +26,9 @@ public extension MoleculeModelProtocol { static var categoryCodingKey: String { return "moleculeName" } + + var isInverted: Bool { + get { return false } + set { } + } } diff --git a/MVMCoreUI/BaseControllers/ViewController.swift b/MVMCoreUI/BaseControllers/ViewController.swift index b12440a6..ade66d03 100644 --- a/MVMCoreUI/BaseControllers/ViewController.swift +++ b/MVMCoreUI/BaseControllers/ViewController.swift @@ -338,18 +338,18 @@ import UIKit } // MARK: - MVMCoreActionDelegateProtocol - open func handleOpenPage(for requestParameters: MVMCoreRequestParameters, actionInformation: [AnyHashable : Any]?, additionalData: [AnyHashable : Any]?) { + open func handleOpenPage(for requestParameters: MVMCoreRequestParameters, actionInformation: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?) { formValidator?.addFormParams(requestParameters: requestParameters) requestParameters.parentPageType = loadObject?.pageJSON?.optionalStringForKey("parentPageType") MVMCoreActionHandler.defaultHandleOpenPage(for: requestParameters, additionalData: additionalData, delegateObject: delegateObject()) } - open func logAction(withActionInformation actionInformation: [AnyHashable : Any]?, additionalData: [AnyHashable : Any]?) { + open func logAction(withActionInformation actionInformation: [AnyHashable: Any]?, additionalData: [AnyHashable: Any]?) { MVMCoreUILoggingHandler.shared()?.defaultLogAction(forController: self, actionInformation: actionInformation, additionalData: additionalData) } // MARK: - MoleculeDelegateProtocol - open func getModuleWithName(_ name: String?) -> [AnyHashable : Any]? { + open func getModuleWithName(_ name: String?) -> [AnyHashable: Any]? { guard let name = name else { return nil } return loadObject?.modulesJSON?.optionalDictionaryForKey(name) } @@ -390,7 +390,7 @@ import UIKit view.accessibilityElements = [pickerView, toolBar] } DispatchQueue.main.asyncAfter(deadline: .now() + 0.1) { - UIAccessibility.post(notification: UIAccessibility.Notification.layoutChanged, argument: textField.inputView) + UIAccessibility.post(notification: .layoutChanged, argument: textField.inputView) } } } @@ -399,7 +399,7 @@ import UIKit if textField === selectedField { if UIAccessibility.isVoiceOverRunning { view.accessibilityElements = nil - UIAccessibility.post(notification: UIAccessibility.Notification.layoutChanged, argument: textField) + UIAccessibility.post(notification: .layoutChanged, argument: textField) } selectedField = nil } diff --git a/MVMCoreUI/Containers/Views/Container/Container.swift b/MVMCoreUI/Containers/Views/Container/Container.swift index eb05cd21..8c95f110 100644 --- a/MVMCoreUI/Containers/Views/Container/Container.swift +++ b/MVMCoreUI/Containers/Views/Container/Container.swift @@ -9,8 +9,10 @@ import UIKit open class Container: View, ContainerProtocol { + public var view: UIView? let containerHelper = ContainerHelper() + var containerModel: ContainerModelProtocol? { get { return model as? ContainerModelProtocol } } From 80b9f985b178a172c178d2c2341c90be47a77ccc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 30 Apr 2020 14:26:25 -0400 Subject: [PATCH 02/16] latest updated for color inversion --- MVMCoreUI.xcodeproj/project.pbxproj | 4 + .../Atomic/Atoms/Buttons/ButtonModel.swift | 108 +++++++---- .../Atomic/Atoms/Buttons/PillButton.swift | 118 +++++++----- .../TwoButtonView.swift | 52 ++++- .../TwoButtonViewModel.swift | 22 ++- .../Templates/MoleculeListTemplate.swift | 1 + .../Atomic/Templates/TemplateModel.swift | 19 ++ .../Atomic/Templates/ThreeLayerTemplate.swift | 18 +- .../BaseControllers/ViewController.swift | 2 +- MVMCoreUI/Styles/Facade.swift | 177 ++++++++++++++++++ 10 files changed, 414 insertions(+), 107 deletions(-) create mode 100644 MVMCoreUI/Styles/Facade.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index 58eea2d8..de055ff7 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -102,6 +102,7 @@ 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; + 0A96140B245B06F0006FA18B /* Facade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A96140A245B06F0006FA18B /* Facade.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; 0AB764D124460F6300E7FE72 /* UIDatePicker+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D024460F6300E7FE72 /* UIDatePicker+Extension.swift */; }; 0AB764D324460FA400E7FE72 /* UIPickerView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D224460FA400E7FE72 /* UIPickerView+Extension.swift */; }; @@ -558,6 +559,7 @@ 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; + 0A96140A245B06F0006FA18B /* Facade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Facade.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; 0AB764D024460F6300E7FE72 /* UIDatePicker+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDatePicker+Extension.swift"; sourceTree = ""; }; @@ -1715,6 +1717,7 @@ D29DF13921E68637003B2FB9 /* MFStyler.m */, 0A6682A92435125F00AD3CA1 /* Styler.swift */, 0A6682AB243531C300AD3CA1 /* Padding.swift */, + 0A96140A245B06F0006FA18B /* Facade.swift */, ); path = Styles; sourceTree = ""; @@ -2239,6 +2242,7 @@ 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */, D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */, 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */, + 0A96140B245B06F0006FA18B /* Facade.swift in Sources */, D22D8395241FB41200D3DF69 /* UIStackView+Extension.swift in Sources */, 52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */, 525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 22969196..ca90db94 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -26,20 +26,52 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public static var identifier: String = "button" public var backgroundColor: Color? - public var isInverted: Bool = false public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - public var style: ButtonStyle? + public var isInverted: Bool = false { + didSet { facade?.isInverted = isInverted } + } + public var facade: Facade? + public var style: ButtonStyle = .primary { + didSet { + switch style { + case .primary: + facade = primaryFacade + case .secondary: + facade = secondaryFacade + } + } + } public var size: ButtonSize? = .standard - public var fillColor: Color? - public var textColor: Color? - public var borderColor: Color? - public var disabledFillColor: Color? - public var disabledTextColor: Color? - public var disabledBorderColor: Color? public var groupName: String = "" - + + //-------------------------------------------------- + // MARK: - Default Button Facades + //-------------------------------------------------- + + private var primaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmBlack), + enabledTextColor: Color(uiColor: .mvmWhite), + disabledFillColor: Color(uiColor: .mvmCoolGray6), + disabledTextColor: Color(uiColor: .mvmWhite), + enabledFillColor_inverted: Color(uiColor: .mvmWhite), + enabledTextColor_inverted: Color(uiColor: .mvmBlack), + disabledFillColor_inverted: Color(uiColor: .mvmCoolGray6), + disabledTextColor_inverted: Color(uiColor: .mvmBlack)) + + private var secondaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmWhite), + enabledTextColor: Color(uiColor: .mvmBlack), + enabledBorderColor: Color(uiColor: .mvmBlack), + disabledFillColor: Color(uiColor: .mvmWhite), + disabledTextColor: Color(uiColor: .mvmCoolGray6), + disabledBorderColor: Color(uiColor: .mvmCoolGray6), + enabledFillColor_inverted: Color(uiColor: .mvmBlack), + enabledTextColor_inverted: Color(uiColor: .mvmWhite), + enabledBorderColor_inverted: Color(uiColor: .mvmWhite), + disabledFillColor_inverted: Color(uiColor: .mvmWhite), + disabledTextColor_inverted: Color(uiColor: .mvmCoolGray6), + disabledBorderColor_inverted: Color(uiColor: .mvmCoolGray6)) + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -48,10 +80,10 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabled = valid updateUI?() } - + /// Temporary binding mechanism for the view to update on enable changes. - public var updateUI: (() -> ())? - + public var updateUI: ActionBlock? + //-------------------------------------------------- // MARK: - Initializers //-------------------------------------------------- @@ -66,7 +98,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.action = action style = .secondary } - + public init(primaryButtonWith title: String, action: ActionModelProtocol) { self.title = title self.action = action @@ -80,21 +112,16 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor - case isInverted = "inverted" case title + case inverted case action case enabled case style case size - case fillColor - case textColor - case borderColor - case disabledFillColor - case disabledTextColor - case disabledBorderColor + case facade case groupName } - + //-------------------------------------------------- // MARK: - Codec //-------------------------------------------------- @@ -102,10 +129,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .enabled) { - self.isInverted = isInverted - } - backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) @@ -126,30 +149,33 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.enabled = enabled } - fillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) - textColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) - borderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) - disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) - disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) - disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) - } + if let facade = try typeContainer.decodeIfPresent(Facade.self, forKey: .facade) { + self.facade = facade + switch style { + case .primary: + primaryFacade = facade + case .secondary: + secondaryFacade = facade + } + } + + if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { + self.isInverted = isInverted + } + } + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) - try container.encode(isInverted, forKey: .isInverted) - try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) - try container.encodeModel(action, forKey: .action) + try container.encode(isInverted, forKey: .inverted) try container.encode(enabled, forKey: .enabled) + try container.encodeModel(action, forKey: .action) + try container.encodeIfPresent(facade, forKey: .facade) + try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(style, forKey: .style) try container.encodeIfPresent(size, forKey: .size) - try container.encodeIfPresent(fillColor, forKey: .fillColor) - try container.encodeIfPresent(textColor, forKey: .textColor) - try container.encodeIfPresent(borderColor, forKey: .borderColor) - try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) - try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) - try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) try container.encodeIfPresent(groupName, forKey: .groupName) } } diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 19f032fc..3cea7765 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -8,78 +8,93 @@ import UIKit + open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { - // Used to size the button. + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + /// Used to size the button. var size = MVMCoreUIUtility.getWidth() var buttonModel: ButtonModel? { get { return model as? ButtonModel } } - // Need to re-style on set. + /// Need to re-style on set. open override var isEnabled: Bool { - didSet { - style() - } + didSet { style() } } - private enum ButtonHeight: CGFloat { + private enum Height: CGFloat { case tiny = 20 case standard = 42 } + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - setTitleColor(.white, for: .normal) - setTitleColor(.white, for: .disabled) + + buttonModel?.style = .primary + setTitleColor(buttonModel?.facade?.enabled.text ?? .mvmWhite, for: .normal) + setTitleColor(buttonModel?.facade?.disabled.text ?? .mvmWhite, for: .disabled) layer.borderWidth = 0 - if isEnabled { - backgroundColor = .black - } else { - backgroundColor = .mvmCoolGray6 - } + backgroundColor = isEnabled ? buttonModel?.facade?.enabled.fill ?? .mvmBlack : buttonModel?.facade?.enabled.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - setTitleColor(.black, for: .normal) - setTitleColor(.mvmCoolGray6, for: .disabled) + + buttonModel?.style = .secondary + setTitleColor(buttonModel?.facade?.enabled.text ?? .mvmBlack, for: .normal) + setTitleColor(buttonModel?.facade?.disabled.text ?? .mvmCoolGray6, for: .disabled) backgroundColor = .clear layer.borderWidth = 1 + if isEnabled { - layer.borderColor = UIColor.black.cgColor + layer.borderColor = buttonModel?.facade?.enabled.border?.cgColor ?? UIColor.mvmBlack.cgColor } else { - layer.borderColor = UIColor.mvmCoolGray6.cgColor + layer.borderColor = buttonModel?.facade?.enabled.border?.cgColor ?? UIColor.mvmCoolGray6.cgColor } } /// Styles the button based on the model style private func style() { + switch buttonModel?.style { case .secondary: styleSecondary() + default: stylePrimary() } - if let titleColor = buttonModel?.textColor { - setTitleColor(titleColor.uiColor, for: .normal) + + if let titleColor = buttonModel?.facade?.enabled.text { + setTitleColor(titleColor, for: .normal) } - if let disabledTitleColor = buttonModel?.disabledTextColor { - setTitleColor(disabledTitleColor.uiColor, for: .disabled) + + if let disabledTitleColor = buttonModel?.facade?.disabled.text { + setTitleColor(disabledTitleColor, for: .disabled) } + if isEnabled { - if let fillColor = buttonModel?.fillColor { - backgroundColor = fillColor.uiColor + if let fillColor = buttonModel?.facade?.enabled.fill { + backgroundColor = fillColor } - if let borderColor = buttonModel?.borderColor { + + if let borderColor = buttonModel?.facade?.enabled.border { layer.borderWidth = 1 layer.borderColor = borderColor.cgColor } } else { - if let fillColor = buttonModel?.disabledFillColor { - backgroundColor = fillColor.uiColor + if let fillColor = buttonModel?.facade?.disabled.fill { + backgroundColor = fillColor } - if let borderColor = buttonModel?.disabledBorderColor { + + if let borderColor = buttonModel?.facade?.disabledBorderColor { layer.borderWidth = 1 layer.borderColor = borderColor.cgColor } @@ -87,7 +102,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } private func getInnerPadding() -> CGFloat { - return getHeight() / 2.0 + return getHeight() / 2 } private func getHeight() -> CGFloat { @@ -95,78 +110,95 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } public static func getHeight(for buttonSize: ButtonSize?, size: CGFloat) -> CGFloat { + switch buttonSize { case .tiny: - return MFSizeObject(standardSize: ButtonHeight.tiny.rawValue, standardiPadPortraitSize: 34, iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? ButtonHeight.tiny.rawValue + return MFSizeObject(standardSize: Height.tiny.rawValue, standardiPadPortraitSize: 34, iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? Height.tiny.rawValue + default: - return MFSizeObject(standardSize: ButtonHeight.standard.rawValue, standardiPadPortraitSize: 46, iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? ButtonHeight.standard.rawValue + return MFSizeObject(standardSize: Height.standard.rawValue, standardiPadPortraitSize: 46, iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? Height.standard.rawValue } } - + private func getMinimumWidth() -> CGFloat { + switch buttonModel?.size { case .tiny: - return MFSizeObject(standardSize: 49.0, standardiPadPortraitSize: 90.0, iPadProLandscapeSize: 135.0)?.getValueBased(onSize: size) ?? 49.0 + return MFSizeObject(standardSize: 49, standardiPadPortraitSize: 90, iPadProLandscapeSize: 135)?.getValueBased(onSize: size) ?? 49 + default: - return 151.0 + return 151 } } open override var intrinsicContentSize: CGSize { + let size = super.intrinsicContentSize let width = size.width + (2 * getInnerPadding()) return CGSize(width: max(width, getMinimumWidth()), height: getHeight()) } - // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + // MARK: - MVMCoreViewProtocol + //-------------------------------------------------- + open override func set(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?, _ additionalData: [AnyHashable: Any]?) { // The button will get styled in the enable check in super. super.set(with: model, delegateObject, additionalData) - + guard let model = model as? ButtonModel else { return } setTitle(model.title, for: .normal) - + model.updateUI = { [weak self] in MVMCoreDispatchUtility.performBlock(onMainThread: { self?.enableField(model.enabled) }) } + style() + FormValidator.setupValidation(for: model, delegate: delegateObject?.formHolderDelegate) } - + open override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { PillButton.getHeight(for: (model as? ButtonModel)?.size, size: MVMCoreUIUtility.getWidth()) } - // MARK: - MVMCoreViewProtocol open override func updateView(_ size: CGFloat) { super.updateView(size) self.size = size + invalidateIntrinsicContentSize() + switch buttonModel?.size { case .tiny: - titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / ButtonHeight.tiny.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Height.tiny.rawValue)) + default: - titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / ButtonHeight.standard.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Height.standard.rawValue)) } + layer.cornerRadius = getInnerPadding() } - + open override func setupView() { super.setupView() + titleLabel?.numberOfLines = 1 titleLabel?.lineBreakMode = .byTruncatingTail titleLabel?.textAlignment = .center contentHorizontalAlignment = .center stylePrimary() } - + + //-------------------------------------------------- // MARK: - MVMCoreUIViewConstrainingProtocol + //-------------------------------------------------- + open func horizontalAlignment() -> UIStackView.Alignment { return .center } - + public func enableField(_ enable: Bool) { isEnabled = enable } diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index 285c429c..a789eebb 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -9,11 +9,24 @@ import UIKit @objcMembers open class TwoButtonView: View, MVMCoreUIViewConstrainingProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + open var primaryButton: PillButton = PillButton() open var secondaryButton: PillButton = PillButton() private var stack = UIStackView() + + //-------------------------------------------------- + // MARK: - Constraints + //-------------------------------------------------- + private var equalWidthConstraint: NSLayoutConstraint? - + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + public init() { super.init(frame: .zero) } @@ -26,12 +39,15 @@ import UIKit super.init(frame: frame) } + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + public func setDefault() { primaryButton.stylePrimary() secondaryButton.styleSecondary() } - // MARK: - MVMCoreViewProtocol open override func updateView(_ size: CGFloat) { super.updateView(size) self.primaryButton.updateView(size) @@ -52,58 +68,68 @@ import UIKit equalWidthConstraint?.isActive = true } + //-------------------------------------------------- // MARK: - Stack Manipulation + //-------------------------------------------------- + public func showPrimaryButton() { + if !stack.arrangedSubviews.contains(primaryButton) { stack.addArrangedSubview(primaryButton) primaryButton.isHidden = false } + if secondaryButton.superview != nil { equalWidthConstraint?.isActive = true } } public func showSecondaryButton() { + if !stack.arrangedSubviews.contains(secondaryButton) { stack.insertArrangedSubview(secondaryButton, at: 0) secondaryButton.isHidden = false } + if primaryButton.superview != nil { equalWidthConstraint?.isActive = true } } public func hidePrimaryButton() { + if primaryButton.superview != nil { stack.removeArrangedSubview(primaryButton) primaryButton.isHidden = true } + equalWidthConstraint?.isActive = false } public func hideSecondaryButton() { + if secondaryButton.superview != nil { stack.removeArrangedSubview(secondaryButton) secondaryButton.isHidden = true } + equalWidthConstraint?.isActive = false } + //-------------------------------------------------- // MARK: - MoleculeViewProtocol + //-------------------------------------------------- + open override func reset() { super.reset() setDefault() } - - // MARK: - MVMCoreUIViewConstrainingProtocol - open func horizontalAlignment() -> UIStackView.Alignment { - return .center - } - // MARK: - MoleculeViewProtocol public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { guard let model = model as? TwoButtonViewModel, - let buttonModel = model.primaryButton ?? model.secondaryButton else { return 0 } + let buttonModel = model.primaryButton ?? model.secondaryButton + else { return 0 } + return PillButton.estimatedHeight(with: buttonModel, delegateObject) } @@ -118,6 +144,7 @@ import UIKit } else { hideSecondaryButton() } + if let primaryModel = model.primaryButton { showPrimaryButton() primaryButton.set(with: primaryModel, delegateObject, additionalData) @@ -125,4 +152,11 @@ import UIKit hidePrimaryButton() } } + //-------------------------------------------------- + // MARK: - MVMCoreUIViewConstrainingProtocol + //-------------------------------------------------- + + open func horizontalAlignment() -> UIStackView.Alignment { + return .center + } } diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index 057203e9..4e0c8363 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -8,12 +8,21 @@ import UIKit + public class TwoButtonViewModel: MoleculeModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public static var identifier: String = "twoButtonView" public var backgroundColor: Color? public var primaryButton: ButtonModel? public var secondaryButton: ButtonModel? + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case moleculeName case backgroundColor @@ -21,20 +30,25 @@ public class TwoButtonViewModel: MoleculeModelProtocol { case secondaryButton } + //-------------------------------------------------- + // MARK: - Initialzer + //-------------------------------------------------- + public init(_ primaryButton: ButtonModel?, _ secondaryButton: ButtonModel?) { self.primaryButton = primaryButton self.secondaryButton = secondaryButton } + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) primaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .primaryButton) secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton) - // Default value - if secondaryButton?.style == nil { - secondaryButton?.style = .secondary - } + secondaryButton?.style = .secondary } public func encode(to encoder: Encoder) throws { diff --git a/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift b/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift index e40fbc33..09ca1b41 100644 --- a/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/MoleculeListTemplate.swift @@ -12,6 +12,7 @@ open class MoleculeListTemplate: ThreeLayerTableViewController, TemplateProtocol //-------------------------------------------------- // MARK: - Stored Properties //-------------------------------------------------- + public var moleculesInfo: [(identifier: String, class: AnyClass, molecule: (ListItemModelProtocol & MoleculeModelProtocol))]? var observer: NSKeyValueObservation? diff --git a/MVMCoreUI/Atomic/Templates/TemplateModel.swift b/MVMCoreUI/Atomic/Templates/TemplateModel.swift index 86da1981..3dcf3964 100644 --- a/MVMCoreUI/Atomic/Templates/TemplateModel.swift +++ b/MVMCoreUI/Atomic/Templates/TemplateModel.swift @@ -8,24 +8,39 @@ import Foundation + @objcMembers public class TemplateModel: MVMControllerModelProtocol { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + public class var identifier: String { return "" } + public var pageType: String public var template: String { // Although this is done in the extension, it is needed for the encoding. return Self.identifier } + public var backgroundColor: Color? public var screenHeading: String? public var navigationItem: (NavigationItemModelProtocol & MoleculeModelProtocol)? public var formRules: [FormGroupRule]? + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + public init(pageType: String) { self.pageType = pageType } + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + private enum CodingKeys: String, CodingKey { case pageType case template @@ -34,6 +49,10 @@ import Foundation case formRules case navigationItem } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- required public init(from decoder: Decoder) throws { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) diff --git a/MVMCoreUI/Atomic/Templates/ThreeLayerTemplate.swift b/MVMCoreUI/Atomic/Templates/ThreeLayerTemplate.swift index 4884d5b1..cc305ee5 100644 --- a/MVMCoreUI/Atomic/Templates/ThreeLayerTemplate.swift +++ b/MVMCoreUI/Atomic/Templates/ThreeLayerTemplate.swift @@ -24,25 +24,25 @@ import UIKit open override func viewForTop() -> UIView? { guard let headerModel = templateModel?.header, - let molecule = MoleculeObjectMapping.shared()?.createMolecule(headerModel, delegateObject: delegateObjectIVar) else { - return nil - } + let molecule = MoleculeObjectMapping.shared()?.createMolecule(headerModel, delegateObject: delegateObjectIVar) + else { return nil } + return molecule } open override func viewForMiddle() -> UIView? { guard let middleModel = templateModel?.middle, - let molecule = MoleculeObjectMapping.shared()?.createMolecule(middleModel, delegateObject: delegateObjectIVar) else { - return nil - } + let molecule = MoleculeObjectMapping.shared()?.createMolecule(middleModel, delegateObject: delegateObjectIVar) + else { return nil } + return molecule } override open func viewForBottom() -> UIView? { guard let footerModel = templateModel?.footer, - let molecule = MoleculeObjectMapping.shared()?.createMolecule(footerModel, delegateObject: delegateObjectIVar) else { - return nil - } + let molecule = MoleculeObjectMapping.shared()?.createMolecule(footerModel, delegateObject: delegateObjectIVar) + else { return nil } + return molecule } diff --git a/MVMCoreUI/BaseControllers/ViewController.swift b/MVMCoreUI/BaseControllers/ViewController.swift index ade66d03..6dede18f 100644 --- a/MVMCoreUI/BaseControllers/ViewController.swift +++ b/MVMCoreUI/BaseControllers/ViewController.swift @@ -257,7 +257,7 @@ import UIKit viewRespectsSystemMinimumLayoutMargins = false // Presents from the bottom. - modalPresentationStyle = MVMCoreGetterUtility.isOnIPad() ? UIModalPresentationStyle.formSheet : UIModalPresentationStyle.overCurrentContext + modalPresentationStyle = MVMCoreGetterUtility.isOnIPad() ? .formSheet : .overCurrentContext // Create the default delegate object. delegateObjectIVar = MVMCoreUIDelegateObject.create(withDelegateForAll: self) diff --git a/MVMCoreUI/Styles/Facade.swift b/MVMCoreUI/Styles/Facade.swift new file mode 100644 index 00000000..6940b92f --- /dev/null +++ b/MVMCoreUI/Styles/Facade.swift @@ -0,0 +1,177 @@ +// +// Facade.swift +// MVMCoreUI +// +// Created by Kevin Christiano on 4/30/20. +// Copyright © 2020 Verizon Wireless. All rights reserved. +// + +import Foundation + +public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) + + +public class Facade: Codable { + //-------------------------------------------------- + // MARK: - Properties + //-------------------------------------------------- + + public var isInverted: Bool = false + + public lazy var enabled: FacadeElements = (fill: enabled_fillColor(), + text: enabled_textColor(), + border: enabled_borderColor()) + + public lazy var disabled: FacadeElements = (fill: disabled_fillColor(), + text: disabled_textColor(), + border: disabled_borderColor()) + + public var backgroundColor_standard: Color? + public var backgroundColor_inverted: Color? + + public var enabledFillColor: Color? + public var enabledTextColor: Color? + public var enabledBorderColor: Color? + + public var enabledFillColor_inverted: Color? + public var enabledTextColor_inverted: Color? + public var enabledBorderColor_inverted: Color? + + public var disabledFillColor: Color? + public var disabledTextColor: Color? + public var disabledBorderColor: Color? + + public var disabledFillColor_inverted: Color? + public var disabledTextColor_inverted: Color? + public var disabledBorderColor_inverted: Color? + + //-------------------------------------------------- + // MARK: - Initializer + //-------------------------------------------------- + + public init(isInverted: Bool = false, + backgroundColor_standard: Color? = nil, + backgroundColor_inverted: Color? = nil, + enabledFillColor: Color? = nil, + enabledTextColor: Color? = nil, + enabledBorderColor: Color? = nil, + disabledFillColor: Color? = nil, + disabledTextColor: Color? = nil, + disabledBorderColor: Color? = nil, + enabledFillColor_inverted: Color? = nil, + enabledTextColor_inverted: Color? = nil, + enabledBorderColor_inverted: Color? = nil, + disabledFillColor_inverted: Color? = nil, + disabledTextColor_inverted: Color? = nil, + disabledBorderColor_inverted: Color? = nil) { + + self.isInverted = isInverted + self.backgroundColor_standard = backgroundColor_standard + self.backgroundColor_inverted = backgroundColor_inverted + self.enabledFillColor = enabledFillColor + self.enabledTextColor = enabledTextColor + self.enabledBorderColor = enabledBorderColor + self.disabledFillColor = disabledFillColor + self.disabledTextColor = disabledTextColor + self.disabledBorderColor = disabledBorderColor + self.enabledFillColor_inverted = enabledFillColor_inverted + self.enabledTextColor_inverted = enabledTextColor_inverted + self.enabledBorderColor_inverted = enabledBorderColor_inverted + self.disabledFillColor_inverted = disabledFillColor_inverted + self.disabledTextColor_inverted = disabledTextColor_inverted + self.disabledBorderColor_inverted = disabledBorderColor_inverted + } + + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + public func backgroundColor() -> UIColor? { + return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor + } + + public func enabled_fillColor() -> UIColor? { + return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor + } + + public func enabled_textColor() -> UIColor? { + return (isInverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor + } + + public func enabled_borderColor() -> UIColor? { + return (isInverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor + } + + public func disabled_fillColor() -> UIColor? { + return (isInverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor + } + + public func disabled_textColor() -> UIColor? { + return (isInverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor + } + + public func disabled_borderColor() -> UIColor? { + return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor + } + + //-------------------------------------------------- + // MARK: - Keys + //-------------------------------------------------- + + private enum CodingKeys: String, CodingKey { + case backgroundColor_standard + case backgroundColor_inverted + case enabledFillColor + case enabledTextColor + case enabledBorderColor + case enabledFillColor_inverted + case enabledTextColor_inverted + case enabledBorderColor_inverted + case disabledFillColor + case disabledTextColor + case disabledBorderColor + case disabledFillColor_inverted + case disabledTextColor_inverted + case disabledBorderColor_inverted + } + + //-------------------------------------------------- + // MARK: - Codec + //-------------------------------------------------- + + required public init(from decoder: Decoder) throws { + let typeContainer = try decoder.container(keyedBy: CodingKeys.self) + backgroundColor_standard = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_standard) + backgroundColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_inverted) + enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor) + enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) + enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor) + enabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor_inverted) + enabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor_inverted) + enabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor_inverted) + disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) + disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) + disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) + disabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor_inverted) + disabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor_inverted) + disabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor_inverted) + } + + public func encode(to encoder: Encoder) throws { + var container = encoder.container(keyedBy: CodingKeys.self) + try container.encodeIfPresent(backgroundColor_standard, forKey: .backgroundColor_standard) + try container.encodeIfPresent(backgroundColor_inverted, forKey: .backgroundColor_inverted) + try container.encodeIfPresent(enabledFillColor, forKey: .enabledFillColor) + try container.encodeIfPresent(enabledTextColor, forKey: .enabledTextColor) + try container.encodeIfPresent(enabledBorderColor, forKey: .enabledBorderColor) + try container.encodeIfPresent(enabledFillColor_inverted, forKey: .enabledFillColor_inverted) + try container.encodeIfPresent(enabledTextColor_inverted, forKey: .enabledTextColor_inverted) + try container.encodeIfPresent(enabledBorderColor_inverted, forKey: .enabledBorderColor_inverted) + try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) + try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) + try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) + try container.encodeIfPresent(disabledFillColor_inverted, forKey: .disabledFillColor_inverted) + try container.encodeIfPresent(disabledTextColor_inverted, forKey: .disabledTextColor_inverted) + try container.encodeIfPresent(disabledBorderColor_inverted, forKey: .disabledBorderColor_inverted) + } +} From 2f6fa19233196ba60f900c4795c526c8ffd2d801 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 30 Apr 2020 14:40:33 -0400 Subject: [PATCH 03/16] adding border width --- MVMCoreUI/Styles/Facade.swift | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Styles/Facade.swift b/MVMCoreUI/Styles/Facade.swift index 6940b92f..7b8fb8c9 100644 --- a/MVMCoreUI/Styles/Facade.swift +++ b/MVMCoreUI/Styles/Facade.swift @@ -45,6 +45,9 @@ public class Facade: Codable { public var disabledTextColor_inverted: Color? public var disabledBorderColor_inverted: Color? + public var borderWidth: CGFloat? + public var borderWidth_inverted: CGFloat? + //-------------------------------------------------- // MARK: - Initializer //-------------------------------------------------- @@ -63,7 +66,9 @@ public class Facade: Codable { enabledBorderColor_inverted: Color? = nil, disabledFillColor_inverted: Color? = nil, disabledTextColor_inverted: Color? = nil, - disabledBorderColor_inverted: Color? = nil) { + disabledBorderColor_inverted: Color? = nil, + borderWidth: CGFloat? = nil, + borderWidth_inverted: CGFloat? = nil) { self.isInverted = isInverted self.backgroundColor_standard = backgroundColor_standard @@ -80,6 +85,8 @@ public class Facade: Codable { self.disabledFillColor_inverted = disabledFillColor_inverted self.disabledTextColor_inverted = disabledTextColor_inverted self.disabledBorderColor_inverted = disabledBorderColor_inverted + self.borderWidth = borderWidth + self.borderWidth_inverted = borderWidth_inverted } //-------------------------------------------------- @@ -90,6 +97,10 @@ public class Facade: Codable { return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor } + public func getBorderWidth() -> CGFloat? { + return isInverted ? borderWidth_inverted : borderWidth + } + public func enabled_fillColor() -> UIColor? { return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor } From cbcb1c37c07ac740a6b7d3feee1cfb4a0a730d95 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Thu, 30 Apr 2020 15:48:30 -0400 Subject: [PATCH 04/16] bringing borderwidth in. --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 6 +- .../Atomic/Atoms/Buttons/PillButton.swift | 55 ++++++++++++------- 2 files changed, 40 insertions(+), 21 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index ca90db94..816371dd 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -57,7 +57,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabledFillColor_inverted: Color(uiColor: .mvmWhite), enabledTextColor_inverted: Color(uiColor: .mvmBlack), disabledFillColor_inverted: Color(uiColor: .mvmCoolGray6), - disabledTextColor_inverted: Color(uiColor: .mvmBlack)) + disabledTextColor_inverted: Color(uiColor: .mvmBlack), + borderWidth: 0) private var secondaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmWhite), enabledTextColor: Color(uiColor: .mvmBlack), @@ -70,7 +71,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabledBorderColor_inverted: Color(uiColor: .mvmWhite), disabledFillColor_inverted: Color(uiColor: .mvmWhite), disabledTextColor_inverted: Color(uiColor: .mvmCoolGray6), - disabledBorderColor_inverted: Color(uiColor: .mvmCoolGray6)) + disabledBorderColor_inverted: Color(uiColor: .mvmCoolGray6), + borderWidth: 1) //-------------------------------------------------- // MARK: - Methods diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 3cea7765..9503168e 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -31,6 +31,28 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { case standard = 42 } + //-------------------------------------------------- + // MARK: - Computed Properties + //-------------------------------------------------- + + public var enabledTitleColor: UIColor? { + get { return titleColor(for: .normal) } + set { setTitleColor(newValue, for: .normal) } + } + + public var disabledTitleColor: UIColor? { + get { return titleColor(for: .disabled) } + set { setTitleColor(newValue, for: .disabled) } + } + + public var borderColor: UIColor? { + get { + guard let currentColor = layer.borderColor else { return nil } + return UIColor(cgColor: currentColor) + } + set { layer.borderColor = newValue?.cgColor} + } + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -39,9 +61,9 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { public func stylePrimary() { buttonModel?.style = .primary - setTitleColor(buttonModel?.facade?.enabled.text ?? .mvmWhite, for: .normal) - setTitleColor(buttonModel?.facade?.disabled.text ?? .mvmWhite, for: .disabled) - layer.borderWidth = 0 + enabledTitleColor = buttonModel?.facade?.enabled.text ?? .mvmWhite + disabledTitleColor = buttonModel?.facade?.disabled.text ?? .mvmWhite + layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 0 backgroundColor = isEnabled ? buttonModel?.facade?.enabled.fill ?? .mvmBlack : buttonModel?.facade?.enabled.fill ?? .mvmCoolGray6 } @@ -49,16 +71,11 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { public func styleSecondary() { buttonModel?.style = .secondary - setTitleColor(buttonModel?.facade?.enabled.text ?? .mvmBlack, for: .normal) - setTitleColor(buttonModel?.facade?.disabled.text ?? .mvmCoolGray6, for: .disabled) + enabledTitleColor = buttonModel?.facade?.enabled.text ?? .mvmBlack + disabledTitleColor = buttonModel?.facade?.disabled.text ?? .mvmCoolGray6 backgroundColor = .clear - layer.borderWidth = 1 - - if isEnabled { - layer.borderColor = buttonModel?.facade?.enabled.border?.cgColor ?? UIColor.mvmBlack.cgColor - } else { - layer.borderColor = buttonModel?.facade?.enabled.border?.cgColor ?? UIColor.mvmCoolGray6.cgColor - } + layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + borderColor = isEnabled ? buttonModel?.facade?.enabled.border ?? .mvmBlack : buttonModel?.facade?.enabled.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -73,11 +90,11 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } if let titleColor = buttonModel?.facade?.enabled.text { - setTitleColor(titleColor, for: .normal) + enabledTitleColor = titleColor } if let disabledTitleColor = buttonModel?.facade?.disabled.text { - setTitleColor(disabledTitleColor, for: .disabled) + self.disabledTitleColor = disabledTitleColor } if isEnabled { @@ -86,17 +103,17 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } if let borderColor = buttonModel?.facade?.enabled.border { - layer.borderWidth = 1 - layer.borderColor = borderColor.cgColor + layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + self.borderColor = borderColor } } else { if let fillColor = buttonModel?.facade?.disabled.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade?.disabledBorderColor { - layer.borderWidth = 1 - layer.borderColor = borderColor.cgColor + if let borderColor = buttonModel?.facade?.disabled.border { + layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + self.borderColor = borderColor } } } From 43778c537a4c8a8baa602bc1434d27d1492cfc0f Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Fri, 1 May 2020 14:14:01 -0400 Subject: [PATCH 05/16] current developemnt --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 68 +++++++++---------- .../Atomic/Atoms/Buttons/PillButton.swift | 34 +++++----- ...htVariableButtonAllTextAndLinksModel.swift | 2 +- MVMCoreUI/CustomPrimitives/Color.swift | 7 ++ MVMCoreUI/Styles/Facade.swift | 56 +++++++-------- MVMCoreUI/Styles/Styler.swift | 10 +++ 6 files changed, 94 insertions(+), 83 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 816371dd..62c48d4a 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -9,16 +9,6 @@ import UIKit -public enum ButtonStyle: String, Codable { - case primary - case secondary -} - -public enum ButtonSize: String, Codable { - case standard - case tiny -} - public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { //-------------------------------------------------- // MARK: - Properties @@ -29,11 +19,14 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true + public var isInverted: Bool = false { - didSet { facade?.isInverted = isInverted } + didSet { facade.isInverted = isInverted } } - public var facade: Facade? - public var style: ButtonStyle = .primary { + + public lazy var facade: Facade = primaryFacade + + public var style: Styler.Button = .primary { didSet { switch style { case .primary: @@ -43,35 +36,35 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW } } } - public var size: ButtonSize? = .standard + public var size: Styler.Button.Size? = .standard public var groupName: String = "" //-------------------------------------------------- // MARK: - Default Button Facades //-------------------------------------------------- - private var primaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmBlack), - enabledTextColor: Color(uiColor: .mvmWhite), - disabledFillColor: Color(uiColor: .mvmCoolGray6), - disabledTextColor: Color(uiColor: .mvmWhite), - enabledFillColor_inverted: Color(uiColor: .mvmWhite), - enabledTextColor_inverted: Color(uiColor: .mvmBlack), - disabledFillColor_inverted: Color(uiColor: .mvmCoolGray6), - disabledTextColor_inverted: Color(uiColor: .mvmBlack), + private var primaryFacade = Facade(enabledFillColor: .mvmBlack, + enabledTextColor: .mvmWhite, + disabledFillColor: .mvmCoolGray6, + disabledTextColor: .mvmWhite, + enabledFillColor_inverted: .mvmWhite, + enabledTextColor_inverted: .mvmBlack, + disabledFillColor_inverted: .mvmCoolGray6, + disabledTextColor_inverted: .mvmBlack, borderWidth: 0) - private var secondaryFacade = Facade(enabledFillColor: Color(uiColor: .mvmWhite), - enabledTextColor: Color(uiColor: .mvmBlack), - enabledBorderColor: Color(uiColor: .mvmBlack), - disabledFillColor: Color(uiColor: .mvmWhite), - disabledTextColor: Color(uiColor: .mvmCoolGray6), - disabledBorderColor: Color(uiColor: .mvmCoolGray6), - enabledFillColor_inverted: Color(uiColor: .mvmBlack), - enabledTextColor_inverted: Color(uiColor: .mvmWhite), - enabledBorderColor_inverted: Color(uiColor: .mvmWhite), - disabledFillColor_inverted: Color(uiColor: .mvmWhite), - disabledTextColor_inverted: Color(uiColor: .mvmCoolGray6), - disabledBorderColor_inverted: Color(uiColor: .mvmCoolGray6), + private var secondaryFacade = Facade(enabledFillColor: .mvmWhite, + enabledTextColor: .mvmBlack, + enabledBorderColor: .mvmBlack, + disabledFillColor: .mvmWhite, + disabledTextColor: .mvmCoolGray6, + disabledBorderColor: .mvmCoolGray6, + enabledFillColor_inverted: .mvmBlack, + enabledTextColor_inverted: .mvmWhite, + enabledBorderColor_inverted: .mvmWhite, + disabledFillColor_inverted: .mvmWhite, + disabledTextColor_inverted: .mvmCoolGray6, + disabledBorderColor_inverted: .mvmCoolGray6, borderWidth: 1) //-------------------------------------------------- @@ -139,11 +132,11 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.groupName = groupName } - if let style = try typeContainer.decodeIfPresent(ButtonStyle.self, forKey: .style) { + if let style = try typeContainer.decodeIfPresent(Styler.Button.self, forKey: .style) { self.style = style } - if let size = try typeContainer.decodeIfPresent(ButtonSize.self, forKey: .size) { + if let size = try typeContainer.decodeIfPresent(Styler.Button.Size.self, forKey: .size) { self.size = size } @@ -153,7 +146,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let facade = try typeContainer.decodeIfPresent(Facade.self, forKey: .facade) { self.facade = facade - + switch style { case .primary: primaryFacade = facade @@ -164,6 +157,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { self.isInverted = isInverted + facade.isInverted = isInverted } } diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 9503168e..d98b531b 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -61,21 +61,21 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { public func stylePrimary() { buttonModel?.style = .primary - enabledTitleColor = buttonModel?.facade?.enabled.text ?? .mvmWhite - disabledTitleColor = buttonModel?.facade?.disabled.text ?? .mvmWhite - layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 0 - backgroundColor = isEnabled ? buttonModel?.facade?.enabled.fill ?? .mvmBlack : buttonModel?.facade?.enabled.fill ?? .mvmCoolGray6 + enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmWhite + disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmWhite + layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 0 + backgroundColor = isEnabled ? buttonModel?.facade.enabled.fill ?? .mvmBlack : buttonModel?.facade.enabled.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { buttonModel?.style = .secondary - enabledTitleColor = buttonModel?.facade?.enabled.text ?? .mvmBlack - disabledTitleColor = buttonModel?.facade?.disabled.text ?? .mvmCoolGray6 + enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmBlack + disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmCoolGray6 backgroundColor = .clear - layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 - borderColor = isEnabled ? buttonModel?.facade?.enabled.border ?? .mvmBlack : buttonModel?.facade?.enabled.border ?? .mvmCoolGray6 + layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 + borderColor = isEnabled ? buttonModel?.facade.enabled.border ?? .mvmBlack : buttonModel?.facade.enabled.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -89,30 +89,30 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { stylePrimary() } - if let titleColor = buttonModel?.facade?.enabled.text { + if let titleColor = buttonModel?.facade.enabled.text { enabledTitleColor = titleColor } - if let disabledTitleColor = buttonModel?.facade?.disabled.text { + if let disabledTitleColor = buttonModel?.facade.disabled.text { self.disabledTitleColor = disabledTitleColor } if isEnabled { - if let fillColor = buttonModel?.facade?.enabled.fill { + if let fillColor = buttonModel?.facade.enabled.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade?.enabled.border { - layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + if let borderColor = buttonModel?.facade.enabled.border { + layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 self.borderColor = borderColor } } else { - if let fillColor = buttonModel?.facade?.disabled.fill { + if let fillColor = buttonModel?.facade.disabled.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade?.disabled.border { - layer.borderWidth = buttonModel?.facade?.getBorderWidth() ?? 1 + if let borderColor = buttonModel?.facade.disabled.border { + layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 self.borderColor = borderColor } } @@ -126,7 +126,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { PillButton.getHeight(for: buttonModel?.size, size: size) } - public static func getHeight(for buttonSize: ButtonSize?, size: CGFloat) -> CGFloat { + public static func getHeight(for buttonSize: Styler.Button.Size?, size: CGFloat) -> CGFloat { switch buttonSize { case .tiny: diff --git a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableButtonAllTextAndLinksModel.swift b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableButtonAllTextAndLinksModel.swift index 41d4ec72..de9e5d63 100644 --- a/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableButtonAllTextAndLinksModel.swift +++ b/MVMCoreUI/Atomic/Molecules/DesignedComponents/List/RightVariable/ListRightVariableButtonAllTextAndLinksModel.swift @@ -22,7 +22,7 @@ public class ListRightVariableButtonAllTextAndLinksModel: ListItemModel, Molecul override public func setDefaults() { super.setDefaults() self.button.size = .tiny - self.button.style = ButtonStyle.secondary + self.button.style = .secondary } private enum CodingKeys: String, CodingKey { diff --git a/MVMCoreUI/CustomPrimitives/Color.swift b/MVMCoreUI/CustomPrimitives/Color.swift index f06b337c..42c7a600 100644 --- a/MVMCoreUI/CustomPrimitives/Color.swift +++ b/MVMCoreUI/CustomPrimitives/Color.swift @@ -55,6 +55,13 @@ public final class Color: Codable { determineRGBA() } + public init?(uiColor: UIColor?) { + guard let uiColor = uiColor else { return nil } + self.uiColor = uiColor + hex = UIColor.hexString(for: uiColor) ?? "" + determineRGBA() + } + init?(name: String) { guard let colorTuple = UIColor.names[name] else { return nil } self.uiColor = colorTuple.uiColor diff --git a/MVMCoreUI/Styles/Facade.swift b/MVMCoreUI/Styles/Facade.swift index 7b8fb8c9..2bd525cd 100644 --- a/MVMCoreUI/Styles/Facade.swift +++ b/MVMCoreUI/Styles/Facade.swift @@ -53,38 +53,38 @@ public class Facade: Codable { //-------------------------------------------------- public init(isInverted: Bool = false, - backgroundColor_standard: Color? = nil, - backgroundColor_inverted: Color? = nil, - enabledFillColor: Color? = nil, - enabledTextColor: Color? = nil, - enabledBorderColor: Color? = nil, - disabledFillColor: Color? = nil, - disabledTextColor: Color? = nil, - disabledBorderColor: Color? = nil, - enabledFillColor_inverted: Color? = nil, - enabledTextColor_inverted: Color? = nil, - enabledBorderColor_inverted: Color? = nil, - disabledFillColor_inverted: Color? = nil, - disabledTextColor_inverted: Color? = nil, - disabledBorderColor_inverted: Color? = nil, + backgroundColor_standard: UIColor? = nil, + backgroundColor_inverted: UIColor? = nil, + enabledFillColor: UIColor? = nil, + enabledTextColor: UIColor? = nil, + enabledBorderColor: UIColor? = nil, + disabledFillColor: UIColor? = nil, + disabledTextColor: UIColor? = nil, + disabledBorderColor: UIColor? = nil, + enabledFillColor_inverted: UIColor? = nil, + enabledTextColor_inverted: UIColor? = nil, + enabledBorderColor_inverted: UIColor? = nil, + disabledFillColor_inverted: UIColor? = nil, + disabledTextColor_inverted: UIColor? = nil, + disabledBorderColor_inverted: UIColor? = nil, borderWidth: CGFloat? = nil, borderWidth_inverted: CGFloat? = nil) { self.isInverted = isInverted - self.backgroundColor_standard = backgroundColor_standard - self.backgroundColor_inverted = backgroundColor_inverted - self.enabledFillColor = enabledFillColor - self.enabledTextColor = enabledTextColor - self.enabledBorderColor = enabledBorderColor - self.disabledFillColor = disabledFillColor - self.disabledTextColor = disabledTextColor - self.disabledBorderColor = disabledBorderColor - self.enabledFillColor_inverted = enabledFillColor_inverted - self.enabledTextColor_inverted = enabledTextColor_inverted - self.enabledBorderColor_inverted = enabledBorderColor_inverted - self.disabledFillColor_inverted = disabledFillColor_inverted - self.disabledTextColor_inverted = disabledTextColor_inverted - self.disabledBorderColor_inverted = disabledBorderColor_inverted + self.backgroundColor_standard = Color(uiColor: backgroundColor_standard) + self.backgroundColor_inverted = Color(uiColor: backgroundColor_inverted) + self.enabledFillColor = Color(uiColor: enabledFillColor) + self.enabledTextColor = Color(uiColor: enabledTextColor) + self.enabledBorderColor = Color(uiColor: enabledBorderColor) + self.disabledFillColor = Color(uiColor: disabledFillColor) + self.disabledTextColor = Color(uiColor: disabledTextColor) + self.disabledBorderColor = Color(uiColor: disabledBorderColor) + self.enabledFillColor_inverted = Color(uiColor: enabledFillColor_inverted) + self.enabledTextColor_inverted = Color(uiColor: enabledTextColor_inverted) + self.enabledBorderColor_inverted = Color(uiColor: enabledBorderColor_inverted) + self.disabledFillColor_inverted = Color(uiColor: disabledFillColor_inverted) + self.disabledTextColor_inverted = Color(uiColor: disabledTextColor_inverted) + self.disabledBorderColor_inverted = Color(uiColor: disabledBorderColor_inverted) self.borderWidth = borderWidth self.borderWidth_inverted = borderWidth_inverted } diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index 509ad107..405eb2bb 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -172,6 +172,16 @@ open class Styler { } } + public enum Button: String, Codable { + case primary + case secondary + + public enum Size: String, Codable { + case standard + case tiny + } + } + //-------------------------------------------------- // MARK: - Functions //-------------------------------------------------- From 3de0c4865a4874370bef5c625cd9979f28ee382a Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 09:01:38 -0400 Subject: [PATCH 06/16] latest state --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 34 +++---------------- .../Atomic/Atoms/Buttons/PillButton.swift | 25 ++++++-------- .../TwoButtonView.swift | 2 ++ MVMCoreUI/Styles/Styler.swift | 5 +++ 4 files changed, 22 insertions(+), 44 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 62c48d4a..5f6e2621 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -19,23 +19,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - - public var isInverted: Bool = false { - didSet { facade.isInverted = isInverted } - } - public lazy var facade: Facade = primaryFacade - - public var style: Styler.Button = .primary { - didSet { - switch style { - case .primary: - facade = primaryFacade - case .secondary: - facade = secondaryFacade - } - } - } + public var style: Styler.Button? public var size: Styler.Button.Size? = .standard public var groupName: String = "" @@ -128,10 +113,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) - if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { - self.groupName = groupName - } - if let style = try typeContainer.decodeIfPresent(Styler.Button.self, forKey: .style) { self.style = style } @@ -146,26 +127,21 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let facade = try typeContainer.decodeIfPresent(Facade.self, forKey: .facade) { self.facade = facade - - switch style { - case .primary: - primaryFacade = facade - case .secondary: - secondaryFacade = facade - } } if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { - self.isInverted = isInverted facade.isInverted = isInverted } + + if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { + self.groupName = groupName + } } public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) - try container.encode(isInverted, forKey: .inverted) try container.encode(enabled, forKey: .enabled) try container.encodeModel(action, forKey: .action) try container.encodeIfPresent(facade, forKey: .facade) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index d98b531b..210c6a43 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -26,11 +26,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { didSet { style() } } - private enum Height: CGFloat { - case tiny = 20 - case standard = 42 - } - //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -60,22 +55,20 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - buttonModel?.style = .primary enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmWhite disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmWhite layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 0 - backgroundColor = isEnabled ? buttonModel?.facade.enabled.fill ?? .mvmBlack : buttonModel?.facade.enabled.fill ?? .mvmCoolGray6 + backgroundColor = isEnabled ? buttonModel?.facade.enabled.fill ?? .mvmBlack : buttonModel?.facade.disabled.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - buttonModel?.style = .secondary enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmBlack disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmCoolGray6 backgroundColor = .clear layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 - borderColor = isEnabled ? buttonModel?.facade.enabled.border ?? .mvmBlack : buttonModel?.facade.enabled.border ?? .mvmCoolGray6 + borderColor = isEnabled ? buttonModel?.facade.enabled.border ?? .mvmBlack : buttonModel?.facade.disabled.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -130,10 +123,14 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonSize { case .tiny: - return MFSizeObject(standardSize: Height.tiny.rawValue, standardiPadPortraitSize: 34, iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? Height.tiny.rawValue + return MFSizeObject(standardSize: Styler.Button.Height.tiny.rawValue, + standardiPadPortraitSize: 34, + iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? Styler.Button.Height.tiny.rawValue default: - return MFSizeObject(standardSize: Height.standard.rawValue, standardiPadPortraitSize: 46, iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? Height.standard.rawValue + return MFSizeObject(standardSize: Styler.Button.Height.standard.rawValue, + standardiPadPortraitSize: 46, + iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? Styler.Button.Height.standard.rawValue } } @@ -172,8 +169,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { }) } - style() - FormValidator.setupValidation(for: model, delegate: delegateObject?.formHolderDelegate) } @@ -189,10 +184,10 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonModel?.size { case .tiny: - titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Height.tiny.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Styler.Button.Height.tiny.rawValue)) default: - titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Height.standard.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Styler.Button.Height.standard.rawValue)) } layer.cornerRadius = getInnerPadding() diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index a789eebb..c8a97136 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -140,6 +140,7 @@ import UIKit if let secondaryModel = model.secondaryButton { showSecondaryButton() + secondaryModel.style = .secondary secondaryButton.set(with: secondaryModel, delegateObject, additionalData) } else { hideSecondaryButton() @@ -147,6 +148,7 @@ import UIKit if let primaryModel = model.primaryButton { showPrimaryButton() + primaryModel.style = .primary primaryButton.set(with: primaryModel, delegateObject, additionalData) } else { hidePrimaryButton() diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index 1adc8796..c342b5a1 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -180,6 +180,11 @@ open class Styler { case standard case tiny } + + public enum Height: CGFloat { + case tiny = 20 + case standard = 42 + } } //-------------------------------------------------- From 4ffd07dd3d58f617e2ed8c89f86133e6b787e069 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 12:43:54 -0400 Subject: [PATCH 07/16] beginning rework --- MVMCoreUI.xcodeproj/project.pbxproj | 6 +- .../Atomic/Atoms/Buttons/ButtonModel.swift | 125 +++++++++++- MVMCoreUI/Styles/Facade.swift | 188 ------------------ 3 files changed, 119 insertions(+), 200 deletions(-) delete mode 100644 MVMCoreUI/Styles/Facade.swift diff --git a/MVMCoreUI.xcodeproj/project.pbxproj b/MVMCoreUI.xcodeproj/project.pbxproj index b7b6852b..c17abf62 100644 --- a/MVMCoreUI.xcodeproj/project.pbxproj +++ b/MVMCoreUI.xcodeproj/project.pbxproj @@ -91,7 +91,6 @@ 0A7EF86323D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86223D8AFA000B2AAD1 /* BaseDropdownEntryFieldModel.swift */; }; 0A7EF86523D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */; }; 0A7EF86723D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */; }; - 0A96140B245B06F0006FA18B /* Facade.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0A96140A245B06F0006FA18B /* Facade.swift */; }; 0AA33B3A2398524F0067DD0F /* Toggle.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AA33B392398524F0067DD0F /* Toggle.swift */; }; 0AB764D124460F6300E7FE72 /* UIDatePicker+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D024460F6300E7FE72 /* UIDatePicker+Extension.swift */; }; 0AB764D324460FA400E7FE72 /* UIPickerView+Extension.swift in Sources */ = {isa = PBXBuildFile; fileRef = 0AB764D224460FA400E7FE72 /* UIPickerView+Extension.swift */; }; @@ -495,7 +494,6 @@ 0A7EF86423D8AFFF00B2AAD1 /* ItemDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ItemDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A7EF86623D8B0AE00B2AAD1 /* DateDropdownEntryFieldModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DateDropdownEntryFieldModel.swift; sourceTree = ""; }; 0A8321AE2355FE9500CB7F00 /* DigitBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = DigitBox.swift; sourceTree = ""; }; - 0A96140A245B06F0006FA18B /* Facade.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Facade.swift; sourceTree = ""; }; 0AA33B33239813C50067DD0F /* UIColor+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+Extension.swift"; sourceTree = ""; }; 0AA33B392398524F0067DD0F /* Toggle.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Toggle.swift; sourceTree = ""; }; 0AB764D024460F6300E7FE72 /* UIDatePicker+Extension.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIDatePicker+Extension.swift"; sourceTree = ""; }; @@ -1522,7 +1520,6 @@ D29DF13921E68637003B2FB9 /* MFStyler.m */, 0A6682A92435125F00AD3CA1 /* Styler.swift */, 0A6682AB243531C300AD3CA1 /* Padding.swift */, - 0A96140A245B06F0006FA18B /* Facade.swift */, ); path = Styles; sourceTree = ""; @@ -1993,7 +1990,6 @@ 012A88C4238D86E600FE3DA1 /* CarouselItemModelProtocol.swift in Sources */, D2E2A9A123E095AB000B42E6 /* ButtonModelProtocol.swift in Sources */, 94C2D9AB23872EB50006CF46 /* LabelAttributeActionModel.swift in Sources */, - 0A96140B245B06F0006FA18B /* Facade.swift in Sources */, D22D8395241FB41200D3DF69 /* UIStackView+Extension.swift in Sources */, 52B201D324081CFB00D2011E /* ListLeftVariableRadioButtonAndPaymentMethodModel.swift in Sources */, 525239C02407BCFF00454969 /* ListTwoColumnPriceDetailsModel.swift in Sources */, @@ -2082,7 +2078,7 @@ 0A7BAFA1232BE61800FB8E22 /* Checkbox.swift in Sources */, 011B58F023A2AA980085F53C /* ListItemModelProtocol.swift in Sources */, D22479962316AF6E003FCCF9 /* HeadlineBodyLink.swift in Sources */, - 8DE5BECD2456F7A200772E76 /* ListTwoColumnDropdownSelectorsModel.swift in Sources */, + 8DE5BECD2456F7A200772E76 /* ListTwoColumnDropdownSelectorsModel.swift in Sources */, 0A41BA7F23453A6400D4C0BC /* TextEntryField.swift in Sources */, BB55B51D244482C1002001AD /* ListRightVariablePriceChangeBodyText.swift in Sources */, 017BEB382360C6AC0024EF95 /* RadioButtonLabel.swift in Sources */, diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 5f6e2621..a7f679b5 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -8,6 +8,8 @@ import UIKit +public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) + public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { //-------------------------------------------------- @@ -19,15 +21,46 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - public lazy var facade: Facade = primaryFacade public var style: Styler.Button? public var size: Styler.Button.Size? = .standard public var groupName: String = "" + public var isInverted: Bool = false + + public lazy var enabledElements: FacadeElements = (fill: enabled_fillColor(), + text: enabled_textColor(), + border: enabled_borderColor()) + + public lazy var disabledElements: FacadeElements = (fill: disabled_fillColor(), + text: disabled_textColor(), + border: disabled_borderColor()) + + public var backgroundColor_standard: Color? + public var backgroundColor_inverted: Color? + + public var enabledFillColor: Color? + public var enabledTextColor: Color? + public var enabledBorderColor: Color? + + public var enabledFillColor_inverted: Color? + public var enabledTextColor_inverted: Color? + public var enabledBorderColor_inverted: Color? + + public var disabledFillColor: Color? + public var disabledTextColor: Color? + public var disabledBorderColor: Color? + + public var disabledFillColor_inverted: Color? + public var disabledTextColor_inverted: Color? + public var disabledBorderColor_inverted: Color? + + public var borderWidth: CGFloat? + public var borderWidth_inverted: CGFloat? + //-------------------------------------------------- // MARK: - Default Button Facades //-------------------------------------------------- - + /* private var primaryFacade = Facade(enabledFillColor: .mvmBlack, enabledTextColor: .mvmWhite, disabledFillColor: .mvmCoolGray6, @@ -51,7 +84,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW disabledTextColor_inverted: .mvmCoolGray6, disabledBorderColor_inverted: .mvmCoolGray6, borderWidth: 1) - + */ //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -85,6 +118,43 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW style = .primary } + //-------------------------------------------------- + // MARK: - Methods + //-------------------------------------------------- + + public func backgroundColor() -> UIColor? { + return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor + } + + public func getBorderWidth() -> CGFloat? { + return isInverted ? borderWidth_inverted : borderWidth + } + + public func enabled_fillColor() -> UIColor? { + return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor + } + + public func enabled_textColor() -> UIColor? { + return (isInverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor + } + + public func enabled_borderColor() -> UIColor? { + return (isInverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor + } + + public func disabled_fillColor() -> UIColor? { + return (isInverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor + } + + public func disabled_textColor() -> UIColor? { + return (isInverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor + } + + public func disabled_borderColor() -> UIColor? { + return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor + } + + //-------------------------------------------------- // MARK: - Keys //-------------------------------------------------- @@ -100,6 +170,21 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case size case facade case groupName + + case backgroundColor_standard + case backgroundColor_inverted + case enabledFillColor + case enabledTextColor + case enabledBorderColor + case enabledFillColor_inverted + case enabledTextColor_inverted + case enabledBorderColor_inverted + case disabledFillColor + case disabledTextColor + case disabledBorderColor + case disabledFillColor_inverted + case disabledTextColor_inverted + case disabledBorderColor_inverted } //-------------------------------------------------- @@ -125,10 +210,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.enabled = enabled } - if let facade = try typeContainer.decodeIfPresent(Facade.self, forKey: .facade) { - self.facade = facade - } - if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { facade.isInverted = isInverted } @@ -136,6 +217,21 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } + + backgroundColor_standard = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_standard) + backgroundColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_inverted) + enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor) + enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) + enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor) + enabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor_inverted) + enabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor_inverted) + enabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor_inverted) + disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) + disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) + disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) + disabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor_inverted) + disabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor_inverted) + disabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor_inverted) } public func encode(to encoder: Encoder) throws { @@ -149,5 +245,20 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encodeIfPresent(style, forKey: .style) try container.encodeIfPresent(size, forKey: .size) try container.encodeIfPresent(groupName, forKey: .groupName) + + try container.encodeIfPresent(backgroundColor_standard, forKey: .backgroundColor_standard) + try container.encodeIfPresent(backgroundColor_inverted, forKey: .backgroundColor_inverted) + try container.encodeIfPresent(enabledFillColor, forKey: .enabledFillColor) + try container.encodeIfPresent(enabledTextColor, forKey: .enabledTextColor) + try container.encodeIfPresent(enabledBorderColor, forKey: .enabledBorderColor) + try container.encodeIfPresent(enabledFillColor_inverted, forKey: .enabledFillColor_inverted) + try container.encodeIfPresent(enabledTextColor_inverted, forKey: .enabledTextColor_inverted) + try container.encodeIfPresent(enabledBorderColor_inverted, forKey: .enabledBorderColor_inverted) + try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) + try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) + try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) + try container.encodeIfPresent(disabledFillColor_inverted, forKey: .disabledFillColor_inverted) + try container.encodeIfPresent(disabledTextColor_inverted, forKey: .disabledTextColor_inverted) + try container.encodeIfPresent(disabledBorderColor_inverted, forKey: .disabledBorderColor_inverted) } } diff --git a/MVMCoreUI/Styles/Facade.swift b/MVMCoreUI/Styles/Facade.swift deleted file mode 100644 index 2bd525cd..00000000 --- a/MVMCoreUI/Styles/Facade.swift +++ /dev/null @@ -1,188 +0,0 @@ -// -// Facade.swift -// MVMCoreUI -// -// Created by Kevin Christiano on 4/30/20. -// Copyright © 2020 Verizon Wireless. All rights reserved. -// - -import Foundation - -public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) - - -public class Facade: Codable { - //-------------------------------------------------- - // MARK: - Properties - //-------------------------------------------------- - - public var isInverted: Bool = false - - public lazy var enabled: FacadeElements = (fill: enabled_fillColor(), - text: enabled_textColor(), - border: enabled_borderColor()) - - public lazy var disabled: FacadeElements = (fill: disabled_fillColor(), - text: disabled_textColor(), - border: disabled_borderColor()) - - public var backgroundColor_standard: Color? - public var backgroundColor_inverted: Color? - - public var enabledFillColor: Color? - public var enabledTextColor: Color? - public var enabledBorderColor: Color? - - public var enabledFillColor_inverted: Color? - public var enabledTextColor_inverted: Color? - public var enabledBorderColor_inverted: Color? - - public var disabledFillColor: Color? - public var disabledTextColor: Color? - public var disabledBorderColor: Color? - - public var disabledFillColor_inverted: Color? - public var disabledTextColor_inverted: Color? - public var disabledBorderColor_inverted: Color? - - public var borderWidth: CGFloat? - public var borderWidth_inverted: CGFloat? - - //-------------------------------------------------- - // MARK: - Initializer - //-------------------------------------------------- - - public init(isInverted: Bool = false, - backgroundColor_standard: UIColor? = nil, - backgroundColor_inverted: UIColor? = nil, - enabledFillColor: UIColor? = nil, - enabledTextColor: UIColor? = nil, - enabledBorderColor: UIColor? = nil, - disabledFillColor: UIColor? = nil, - disabledTextColor: UIColor? = nil, - disabledBorderColor: UIColor? = nil, - enabledFillColor_inverted: UIColor? = nil, - enabledTextColor_inverted: UIColor? = nil, - enabledBorderColor_inverted: UIColor? = nil, - disabledFillColor_inverted: UIColor? = nil, - disabledTextColor_inverted: UIColor? = nil, - disabledBorderColor_inverted: UIColor? = nil, - borderWidth: CGFloat? = nil, - borderWidth_inverted: CGFloat? = nil) { - - self.isInverted = isInverted - self.backgroundColor_standard = Color(uiColor: backgroundColor_standard) - self.backgroundColor_inverted = Color(uiColor: backgroundColor_inverted) - self.enabledFillColor = Color(uiColor: enabledFillColor) - self.enabledTextColor = Color(uiColor: enabledTextColor) - self.enabledBorderColor = Color(uiColor: enabledBorderColor) - self.disabledFillColor = Color(uiColor: disabledFillColor) - self.disabledTextColor = Color(uiColor: disabledTextColor) - self.disabledBorderColor = Color(uiColor: disabledBorderColor) - self.enabledFillColor_inverted = Color(uiColor: enabledFillColor_inverted) - self.enabledTextColor_inverted = Color(uiColor: enabledTextColor_inverted) - self.enabledBorderColor_inverted = Color(uiColor: enabledBorderColor_inverted) - self.disabledFillColor_inverted = Color(uiColor: disabledFillColor_inverted) - self.disabledTextColor_inverted = Color(uiColor: disabledTextColor_inverted) - self.disabledBorderColor_inverted = Color(uiColor: disabledBorderColor_inverted) - self.borderWidth = borderWidth - self.borderWidth_inverted = borderWidth_inverted - } - - //-------------------------------------------------- - // MARK: - Methods - //-------------------------------------------------- - - public func backgroundColor() -> UIColor? { - return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor - } - - public func getBorderWidth() -> CGFloat? { - return isInverted ? borderWidth_inverted : borderWidth - } - - public func enabled_fillColor() -> UIColor? { - return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor - } - - public func enabled_textColor() -> UIColor? { - return (isInverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor - } - - public func enabled_borderColor() -> UIColor? { - return (isInverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor - } - - public func disabled_fillColor() -> UIColor? { - return (isInverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor - } - - public func disabled_textColor() -> UIColor? { - return (isInverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor - } - - public func disabled_borderColor() -> UIColor? { - return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor - } - - //-------------------------------------------------- - // MARK: - Keys - //-------------------------------------------------- - - private enum CodingKeys: String, CodingKey { - case backgroundColor_standard - case backgroundColor_inverted - case enabledFillColor - case enabledTextColor - case enabledBorderColor - case enabledFillColor_inverted - case enabledTextColor_inverted - case enabledBorderColor_inverted - case disabledFillColor - case disabledTextColor - case disabledBorderColor - case disabledFillColor_inverted - case disabledTextColor_inverted - case disabledBorderColor_inverted - } - - //-------------------------------------------------- - // MARK: - Codec - //-------------------------------------------------- - - required public init(from decoder: Decoder) throws { - let typeContainer = try decoder.container(keyedBy: CodingKeys.self) - backgroundColor_standard = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_standard) - backgroundColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_inverted) - enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor) - enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) - enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor) - enabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor_inverted) - enabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor_inverted) - enabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor_inverted) - disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) - disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) - disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) - disabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor_inverted) - disabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor_inverted) - disabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor_inverted) - } - - public func encode(to encoder: Encoder) throws { - var container = encoder.container(keyedBy: CodingKeys.self) - try container.encodeIfPresent(backgroundColor_standard, forKey: .backgroundColor_standard) - try container.encodeIfPresent(backgroundColor_inverted, forKey: .backgroundColor_inverted) - try container.encodeIfPresent(enabledFillColor, forKey: .enabledFillColor) - try container.encodeIfPresent(enabledTextColor, forKey: .enabledTextColor) - try container.encodeIfPresent(enabledBorderColor, forKey: .enabledBorderColor) - try container.encodeIfPresent(enabledFillColor_inverted, forKey: .enabledFillColor_inverted) - try container.encodeIfPresent(enabledTextColor_inverted, forKey: .enabledTextColor_inverted) - try container.encodeIfPresent(enabledBorderColor_inverted, forKey: .enabledBorderColor_inverted) - try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) - try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) - try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) - try container.encodeIfPresent(disabledFillColor_inverted, forKey: .disabledFillColor_inverted) - try container.encodeIfPresent(disabledTextColor_inverted, forKey: .disabledTextColor_inverted) - try container.encodeIfPresent(disabledBorderColor_inverted, forKey: .disabledBorderColor_inverted) - } -} From 257420c3e444bb5181ac9a204911d2fbd9322c5e Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Tue, 5 May 2020 13:44:18 -0400 Subject: [PATCH 08/16] Reforming inversion --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 76 +++++-------------- .../Atomic/Atoms/Buttons/PillButton.swift | 53 +++++++------ MVMCoreUI/Styles/Styler.swift | 15 ---- 3 files changed, 46 insertions(+), 98 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index a7f679b5..939b0ece 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -11,6 +11,17 @@ import UIKit public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) +public enum ButtonStyle: String, Codable { + case primary + case secondary +} + +public enum ButtonSize: String, Codable { + case standard + case tiny +} + + public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { //-------------------------------------------------- // MARK: - Properties @@ -21,8 +32,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - public var style: Styler.Button? - public var size: Styler.Button.Size? = .standard + public var style: ButtonStyle? + public var size: ButtonSize? = .standard public var groupName: String = "" public var isInverted: Bool = false @@ -35,9 +46,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW text: disabled_textColor(), border: disabled_borderColor()) - public var backgroundColor_standard: Color? - public var backgroundColor_inverted: Color? - public var enabledFillColor: Color? public var enabledTextColor: Color? public var enabledBorderColor: Color? @@ -61,7 +69,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW // MARK: - Default Button Facades //-------------------------------------------------- /* - private var primaryFacade = Facade(enabledFillColor: .mvmBlack, + private var primaryFacade = Facade(enabledFillColor: , enabledTextColor: .mvmWhite, disabledFillColor: .mvmCoolGray6, disabledTextColor: .mvmWhite, @@ -122,10 +130,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW // MARK: - Methods //-------------------------------------------------- - public func backgroundColor() -> UIColor? { - return (isInverted ? backgroundColor_inverted : backgroundColor_standard)?.uiColor - } - public func getBorderWidth() -> CGFloat? { return isInverted ? borderWidth_inverted : borderWidth } @@ -170,21 +174,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case size case facade case groupName - - case backgroundColor_standard - case backgroundColor_inverted - case enabledFillColor - case enabledTextColor - case enabledBorderColor - case enabledFillColor_inverted - case enabledTextColor_inverted - case enabledBorderColor_inverted - case disabledFillColor - case disabledTextColor - case disabledBorderColor - case disabledFillColor_inverted - case disabledTextColor_inverted - case disabledBorderColor_inverted } //-------------------------------------------------- @@ -198,11 +187,11 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) - if let style = try typeContainer.decodeIfPresent(Styler.Button.self, forKey: .style) { + if let style = try typeContainer.decodeIfPresent(ButtonStyle.self, forKey: .style) { self.style = style } - if let size = try typeContainer.decodeIfPresent(Styler.Button.Size.self, forKey: .size) { + if let size = try typeContainer.decodeIfPresent(ButtonSize.self, forKey: .size) { self.size = size } @@ -211,27 +200,12 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW } if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { - facade.isInverted = isInverted + self.isInverted = isInverted } if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } - - backgroundColor_standard = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_standard) - backgroundColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor_inverted) - enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor) - enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor) - enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor) - enabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledFillColor_inverted) - enabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledTextColor_inverted) - enabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .enabledBorderColor_inverted) - disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) - disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) - disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) - disabledFillColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor_inverted) - disabledTextColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor_inverted) - disabledBorderColor_inverted = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor_inverted) } public func encode(to encoder: Encoder) throws { @@ -240,25 +214,9 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encode(title, forKey: .title) try container.encode(enabled, forKey: .enabled) try container.encodeModel(action, forKey: .action) - try container.encodeIfPresent(facade, forKey: .facade) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(style, forKey: .style) try container.encodeIfPresent(size, forKey: .size) try container.encodeIfPresent(groupName, forKey: .groupName) - - try container.encodeIfPresent(backgroundColor_standard, forKey: .backgroundColor_standard) - try container.encodeIfPresent(backgroundColor_inverted, forKey: .backgroundColor_inverted) - try container.encodeIfPresent(enabledFillColor, forKey: .enabledFillColor) - try container.encodeIfPresent(enabledTextColor, forKey: .enabledTextColor) - try container.encodeIfPresent(enabledBorderColor, forKey: .enabledBorderColor) - try container.encodeIfPresent(enabledFillColor_inverted, forKey: .enabledFillColor_inverted) - try container.encodeIfPresent(enabledTextColor_inverted, forKey: .enabledTextColor_inverted) - try container.encodeIfPresent(enabledBorderColor_inverted, forKey: .enabledBorderColor_inverted) - try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) - try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) - try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) - try container.encodeIfPresent(disabledFillColor_inverted, forKey: .disabledFillColor_inverted) - try container.encodeIfPresent(disabledTextColor_inverted, forKey: .disabledTextColor_inverted) - try container.encodeIfPresent(disabledBorderColor_inverted, forKey: .disabledBorderColor_inverted) } } diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 210c6a43..e29af8b3 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -7,7 +7,7 @@ // import UIKit - + open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { //-------------------------------------------------- @@ -26,6 +26,11 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { didSet { style() } } + private enum ButtonHeight: CGFloat { + case tiny = 20 + case standard = 42 + } + //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -55,20 +60,20 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmWhite - disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmWhite - layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 0 - backgroundColor = isEnabled ? buttonModel?.facade.enabled.fill ?? .mvmBlack : buttonModel?.facade.disabled.fill ?? .mvmCoolGray6 + enabledTitleColor = buttonModel?.enabledElements.text ?? .mvmWhite + disabledTitleColor = buttonModel?.disabledElements.text ?? .mvmWhite + layer.borderWidth = buttonModel?.getBorderWidth() ?? 0 + backgroundColor = isEnabled ? buttonModel?.enabledElements.fill ?? .mvmBlack : buttonModel?.disabledElements.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - enabledTitleColor = buttonModel?.facade.enabled.text ?? .mvmBlack - disabledTitleColor = buttonModel?.facade.disabled.text ?? .mvmCoolGray6 + enabledTitleColor = buttonModel?.enabledElements.text ?? .mvmBlack + disabledTitleColor = buttonModel?.disabledElements.text ?? .mvmCoolGray6 backgroundColor = .clear - layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 - borderColor = isEnabled ? buttonModel?.facade.enabled.border ?? .mvmBlack : buttonModel?.facade.disabled.border ?? .mvmCoolGray6 + layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 + borderColor = isEnabled ? buttonModel?.enabledElements.border ?? .mvmBlack : buttonModel?.disabledElements.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -82,30 +87,30 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { stylePrimary() } - if let titleColor = buttonModel?.facade.enabled.text { + if let titleColor = buttonModel?.enabledElements.text { enabledTitleColor = titleColor } - if let disabledTitleColor = buttonModel?.facade.disabled.text { + if let disabledTitleColor = buttonModel?.disabledElements.text { self.disabledTitleColor = disabledTitleColor } if isEnabled { - if let fillColor = buttonModel?.facade.enabled.fill { + if let fillColor = buttonModel?.enabledElements.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade.enabled.border { - layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 + if let borderColor = buttonModel?.enabledElements.border { + layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 self.borderColor = borderColor } } else { - if let fillColor = buttonModel?.facade.disabled.fill { + if let fillColor = buttonModel?.disabledElements.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.facade.disabled.border { - layer.borderWidth = buttonModel?.facade.getBorderWidth() ?? 1 + if let borderColor = buttonModel?.disabledElements.border { + layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 self.borderColor = borderColor } } @@ -119,18 +124,18 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { PillButton.getHeight(for: buttonModel?.size, size: size) } - public static func getHeight(for buttonSize: Styler.Button.Size?, size: CGFloat) -> CGFloat { + public static func getHeight(for buttonSize: ButtonSize?, size: CGFloat) -> CGFloat { switch buttonSize { case .tiny: - return MFSizeObject(standardSize: Styler.Button.Height.tiny.rawValue, + return MFSizeObject(standardSize: ButtonHeight.tiny.rawValue, standardiPadPortraitSize: 34, - iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? Styler.Button.Height.tiny.rawValue + iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? ButtonHeight.tiny.rawValue default: - return MFSizeObject(standardSize: Styler.Button.Height.standard.rawValue, + return MFSizeObject(standardSize: ButtonHeight.standard.rawValue, standardiPadPortraitSize: 46, - iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? Styler.Button.Height.standard.rawValue + iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? ButtonHeight.standard.rawValue } } @@ -184,10 +189,10 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonModel?.size { case .tiny: - titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Styler.Button.Height.tiny.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / ButtonHeight.tiny.rawValue)) default: - titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Styler.Button.Height.standard.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / ButtonHeight.standard.rawValue)) } layer.cornerRadius = getInnerPadding() diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index c342b5a1..863d4703 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -172,21 +172,6 @@ open class Styler { } } - public enum Button: String, Codable { - case primary - case secondary - - public enum Size: String, Codable { - case standard - case tiny - } - - public enum Height: CGFloat { - case tiny = 20 - case standard = 42 - } - } - //-------------------------------------------------- // MARK: - Functions //-------------------------------------------------- From c141f5968508aa2368f90a7b67a439d7f48f6e89 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 10:04:39 -0400 Subject: [PATCH 09/16] encode fix --- MVMCoreUI/BaseClasses/TextViewModel.swift | 1 + 1 file changed, 1 insertion(+) diff --git a/MVMCoreUI/BaseClasses/TextViewModel.swift b/MVMCoreUI/BaseClasses/TextViewModel.swift index 49ac664c..d9505275 100644 --- a/MVMCoreUI/BaseClasses/TextViewModel.swift +++ b/MVMCoreUI/BaseClasses/TextViewModel.swift @@ -81,6 +81,7 @@ open class TextViewModel: TextEntryFieldModel { } public override func encode(to encoder: Encoder) throws { + try super.encode(to: encoder) var container = encoder.container(keyedBy: CodingKeys.self) try container.encodeIfPresent(accessibilityText, forKey: .accessibilityText) try container.encodeIfPresent(height, forKey: .height) From e43ad863a481dc601d04befc73cb4694c6e29dcb Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 14:14:09 -0400 Subject: [PATCH 10/16] latest changes with inversion --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 96 ++++++++++--------- .../Atomic/Atoms/Buttons/PillButton.swift | 56 +++++------ .../TwoButtonView.swift | 20 ++-- .../TwoButtonViewModel.swift | 5 +- MVMCoreUI/Styles/Styler.swift | 23 +++++ 5 files changed, 115 insertions(+), 85 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 939b0ece..49149026 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -11,17 +11,6 @@ import UIKit public typealias FacadeElements = (fill: UIColor?, text: UIColor?, border: UIColor?) -public enum ButtonStyle: String, Codable { - case primary - case secondary -} - -public enum ButtonSize: String, Codable { - case standard - case tiny -} - - public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupWatcherFieldProtocol { //-------------------------------------------------- // MARK: - Properties @@ -32,19 +21,29 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var title: String public var action: ActionModelProtocol public var enabled: Bool = true - public var style: ButtonStyle? - public var size: ButtonSize? = .standard + public var style: Styler.Button.Style? { + didSet { + guard let style = style else { return } + switch style { + case .primary: + setPrimaryFacade() + + case .secondary: + setSecondaryFacade() + } + } + } + public var size: Styler.Button.Size? = .standard public var groupName: String = "" - public var isInverted: Bool = false - public lazy var enabledElements: FacadeElements = (fill: enabled_fillColor(), - text: enabled_textColor(), - border: enabled_borderColor()) + public lazy var enabledColors: FacadeElements = (fill: enabled_fillColor(), + text: enabled_textColor(), + border: enabled_borderColor()) - public lazy var disabledElements: FacadeElements = (fill: disabled_fillColor(), - text: disabled_textColor(), - border: disabled_borderColor()) + public lazy var disabledColors: FacadeElements = (fill: disabled_fillColor(), + text: disabled_textColor(), + border: disabled_borderColor()) public var enabledFillColor: Color? public var enabledTextColor: Color? @@ -68,31 +67,8 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW //-------------------------------------------------- // MARK: - Default Button Facades //-------------------------------------------------- - /* - private var primaryFacade = Facade(enabledFillColor: , - enabledTextColor: .mvmWhite, - disabledFillColor: .mvmCoolGray6, - disabledTextColor: .mvmWhite, - enabledFillColor_inverted: .mvmWhite, - enabledTextColor_inverted: .mvmBlack, - disabledFillColor_inverted: .mvmCoolGray6, - disabledTextColor_inverted: .mvmBlack, - borderWidth: 0) - private var secondaryFacade = Facade(enabledFillColor: .mvmWhite, - enabledTextColor: .mvmBlack, - enabledBorderColor: .mvmBlack, - disabledFillColor: .mvmWhite, - disabledTextColor: .mvmCoolGray6, - disabledBorderColor: .mvmCoolGray6, - enabledFillColor_inverted: .mvmBlack, - enabledTextColor_inverted: .mvmWhite, - enabledBorderColor_inverted: .mvmWhite, - disabledFillColor_inverted: .mvmWhite, - disabledTextColor_inverted: .mvmCoolGray6, - disabledBorderColor_inverted: .mvmCoolGray6, - borderWidth: 1) - */ + //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -158,6 +134,33 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor } + /// Defines the default appearance for the primary style. + func setPrimaryFacade() { + + enabledFillColor = Color(uiColor: .mvmBlack) + enabledTextColor = Color(uiColor: .mvmWhite) + disabledFillColor = Color(uiColor: .mvmCoolGray6) + disabledTextColor = Color(uiColor: .mvmWhite) + enabledFillColor_inverted = Color(uiColor: .mvmWhite) + enabledTextColor_inverted = Color(uiColor: .mvmBlack) + disabledFillColor_inverted = Color(uiColor: .mvmCoolGray6) + disabledTextColor_inverted = Color(uiColor: .mvmBlack) + borderWidth = 0 + } + + /// Defines the default appearance for the Secondary style. + func setSecondaryFacade() { + + enabledTextColor = Color(uiColor: .mvmBlack) + enabledBorderColor = Color(uiColor: .mvmBlack) + disabledTextColor = Color(uiColor: .mvmCoolGray6) + disabledBorderColor = Color(uiColor: .mvmCoolGray6) + enabledTextColor_inverted = Color(uiColor: .mvmWhite) + enabledBorderColor_inverted = Color(uiColor: .mvmWhite) + disabledTextColor_inverted = Color(uiColor: .mvmCoolGray6) + disabledBorderColor_inverted = Color(uiColor: .mvmCoolGray6) + borderWidth = 1 + } //-------------------------------------------------- // MARK: - Keys @@ -187,11 +190,11 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW title = try typeContainer.decode(String.self, forKey: .title) action = try typeContainer.decodeModel(codingKey: .action) - if let style = try typeContainer.decodeIfPresent(ButtonStyle.self, forKey: .style) { + if let style = try typeContainer.decodeIfPresent(Styler.Button.Style.self, forKey: .style) { self.style = style } - if let size = try typeContainer.decodeIfPresent(ButtonSize.self, forKey: .size) { + if let size = try typeContainer.decodeIfPresent(Styler.Button.Size.self, forKey: .size) { self.size = size } @@ -213,6 +216,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) try container.encode(enabled, forKey: .enabled) + try container.encode(isInverted, forKey: .inverted) try container.encodeModel(action, forKey: .action) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(style, forKey: .style) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index e29af8b3..1cfa59f7 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -7,7 +7,7 @@ // import UIKit - + open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { //-------------------------------------------------- @@ -26,11 +26,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { didSet { style() } } - private enum ButtonHeight: CGFloat { - case tiny = 20 - case standard = 42 - } - //-------------------------------------------------- // MARK: - Computed Properties //-------------------------------------------------- @@ -60,20 +55,22 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - enabledTitleColor = buttonModel?.enabledElements.text ?? .mvmWhite - disabledTitleColor = buttonModel?.disabledElements.text ?? .mvmWhite + buttonModel?.style = .primary + enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmWhite + disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmWhite layer.borderWidth = buttonModel?.getBorderWidth() ?? 0 - backgroundColor = isEnabled ? buttonModel?.enabledElements.fill ?? .mvmBlack : buttonModel?.disabledElements.fill ?? .mvmCoolGray6 + backgroundColor = isEnabled ? buttonModel?.enabledColors.fill ?? .mvmBlack : buttonModel?.disabledColors.fill ?? .mvmCoolGray6 } /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - enabledTitleColor = buttonModel?.enabledElements.text ?? .mvmBlack - disabledTitleColor = buttonModel?.disabledElements.text ?? .mvmCoolGray6 + buttonModel?.style = .secondary + enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmBlack + disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmCoolGray6 backgroundColor = .clear layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 - borderColor = isEnabled ? buttonModel?.enabledElements.border ?? .mvmBlack : buttonModel?.disabledElements.border ?? .mvmCoolGray6 + borderColor = isEnabled ? buttonModel?.enabledColors.border ?? .mvmBlack : buttonModel?.disabledColors.border ?? .mvmCoolGray6 } /// Styles the button based on the model style @@ -87,29 +84,29 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { stylePrimary() } - if let titleColor = buttonModel?.enabledElements.text { + if let titleColor = buttonModel?.enabledColors.text { enabledTitleColor = titleColor } - if let disabledTitleColor = buttonModel?.disabledElements.text { + if let disabledTitleColor = buttonModel?.disabledColors.text { self.disabledTitleColor = disabledTitleColor } if isEnabled { - if let fillColor = buttonModel?.enabledElements.fill { + if let fillColor = buttonModel?.enabledColors.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.enabledElements.border { + if let borderColor = buttonModel?.enabledColors.border { layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 self.borderColor = borderColor } } else { - if let fillColor = buttonModel?.disabledElements.fill { + if let fillColor = buttonModel?.disabledColors.fill { backgroundColor = fillColor } - if let borderColor = buttonModel?.disabledElements.border { + if let borderColor = buttonModel?.disabledColors.border { layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 self.borderColor = borderColor } @@ -124,18 +121,20 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { PillButton.getHeight(for: buttonModel?.size, size: size) } - public static func getHeight(for buttonSize: ButtonSize?, size: CGFloat) -> CGFloat { + public static func getHeight(for buttonSize: Styler.Button.Size?, size: CGFloat) -> CGFloat { switch buttonSize { case .tiny: - return MFSizeObject(standardSize: ButtonHeight.tiny.rawValue, + let tinyHeight = Styler.Button.Size.tiny.getHeight() + return MFSizeObject(standardSize: tinyHeight, standardiPadPortraitSize: 34, - iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? ButtonHeight.tiny.rawValue + iPadProLandscapeSize: 38)?.getValueBased(onSize: size) ?? tinyHeight default: - return MFSizeObject(standardSize: ButtonHeight.standard.rawValue, + let standardHeight = Styler.Button.Size.standard.getHeight() + return MFSizeObject(standardSize: standardHeight, standardiPadPortraitSize: 46, - iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? ButtonHeight.standard.rawValue + iPadProLandscapeSize: 50)?.getValueBased(onSize: size) ?? standardHeight } } @@ -143,10 +142,11 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonModel?.size { case .tiny: - return MFSizeObject(standardSize: 49, standardiPadPortraitSize: 90, iPadProLandscapeSize: 135)?.getValueBased(onSize: size) ?? 49 + return MFSizeObject(standardSize: 49, + standardiPadPortraitSize: 90, + iPadProLandscapeSize: 135)?.getValueBased(onSize: size) ?? 49 - default: - return 151 + default: return 151 } } @@ -189,10 +189,10 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { switch buttonModel?.size { case .tiny: - titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / ButtonHeight.tiny.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(11 * (intrinsicContentSize.height / Styler.Button.Size.tiny.getHeight())) default: - titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / ButtonHeight.standard.rawValue)) + titleLabel?.font = MFFonts.mfFont75Bd(13 * (intrinsicContentSize.height / Styler.Button.Size.standard.getHeight())) } layer.cornerRadius = getInnerPadding() diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift index c8a97136..31420e56 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonView.swift @@ -43,15 +43,17 @@ import UIKit // MARK: - Lifecycle //-------------------------------------------------- - public func setDefault() { + public func setDefaultAppearance() { + primaryButton.stylePrimary() secondaryButton.styleSecondary() } open override func updateView(_ size: CGFloat) { super.updateView(size) - self.primaryButton.updateView(size) - self.secondaryButton.updateView(size) + + primaryButton.updateView(size) + secondaryButton.updateView(size) } open override func setupView() { @@ -71,7 +73,7 @@ import UIKit //-------------------------------------------------- // MARK: - Stack Manipulation //-------------------------------------------------- - + public func showPrimaryButton() { if !stack.arrangedSubviews.contains(primaryButton) { @@ -119,13 +121,15 @@ import UIKit //-------------------------------------------------- // MARK: - MoleculeViewProtocol //-------------------------------------------------- - + open override func reset() { super.reset() - setDefault() + + setDefaultAppearance() } public override class func estimatedHeight(with model: MoleculeModelProtocol, _ delegateObject: MVMCoreUIDelegateObject?) -> CGFloat? { + guard let model = model as? TwoButtonViewModel, let buttonModel = model.primaryButton ?? model.secondaryButton else { return 0 } @@ -140,7 +144,6 @@ import UIKit if let secondaryModel = model.secondaryButton { showSecondaryButton() - secondaryModel.style = .secondary secondaryButton.set(with: secondaryModel, delegateObject, additionalData) } else { hideSecondaryButton() @@ -148,7 +151,6 @@ import UIKit if let primaryModel = model.primaryButton { showPrimaryButton() - primaryModel.style = .primary primaryButton.set(with: primaryModel, delegateObject, additionalData) } else { hidePrimaryButton() @@ -157,7 +159,7 @@ import UIKit //-------------------------------------------------- // MARK: - MVMCoreUIViewConstrainingProtocol //-------------------------------------------------- - + open func horizontalAlignment() -> UIStackView.Alignment { return .center } diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index 4e0c8363..da7663c6 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -29,7 +29,7 @@ public class TwoButtonViewModel: MoleculeModelProtocol { case primaryButton case secondaryButton } - + //-------------------------------------------------- // MARK: - Initialzer //-------------------------------------------------- @@ -47,10 +47,11 @@ public class TwoButtonViewModel: MoleculeModelProtocol { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) primaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .primaryButton) + primaryButton?.style = .primary secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton) secondaryButton?.style = .secondary } - + public func encode(to encoder: Encoder) throws { var container = encoder.container(keyedBy: CodingKeys.self) try container.encode(moleculeName, forKey: .moleculeName) diff --git a/MVMCoreUI/Styles/Styler.swift b/MVMCoreUI/Styles/Styler.swift index 863d4703..d8d0a519 100644 --- a/MVMCoreUI/Styles/Styler.swift +++ b/MVMCoreUI/Styles/Styler.swift @@ -172,6 +172,29 @@ open class Styler { } } + public enum Button { + + public enum Style: String, Codable { + case primary + case secondary + } + + public enum Size: String, Codable { + case standard + case tiny + + func getHeight() -> CGFloat { + switch self { + case .standard: + return 42 + + case .tiny: + return 20 + } + } + } + } + //-------------------------------------------------- // MARK: - Functions //-------------------------------------------------- From 39f7c4c6f4f6b900ebab19fe68708ab17e2ad334 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 14:41:18 -0400 Subject: [PATCH 11/16] reverting border width --- MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift | 11 +---------- MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift | 8 ++++---- 2 files changed, 5 insertions(+), 14 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 49149026..714a343b 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -61,9 +61,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var disabledTextColor_inverted: Color? public var disabledBorderColor_inverted: Color? - public var borderWidth: CGFloat? - public var borderWidth_inverted: CGFloat? - //-------------------------------------------------- // MARK: - Default Button Facades //-------------------------------------------------- @@ -105,11 +102,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- - - public func getBorderWidth() -> CGFloat? { - return isInverted ? borderWidth_inverted : borderWidth - } - + public func enabled_fillColor() -> UIColor? { return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor } @@ -145,7 +138,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabledTextColor_inverted = Color(uiColor: .mvmBlack) disabledFillColor_inverted = Color(uiColor: .mvmCoolGray6) disabledTextColor_inverted = Color(uiColor: .mvmBlack) - borderWidth = 0 } /// Defines the default appearance for the Secondary style. @@ -159,7 +151,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW enabledBorderColor_inverted = Color(uiColor: .mvmWhite) disabledTextColor_inverted = Color(uiColor: .mvmCoolGray6) disabledBorderColor_inverted = Color(uiColor: .mvmCoolGray6) - borderWidth = 1 } //-------------------------------------------------- diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 1cfa59f7..5fe7a972 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -58,7 +58,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { buttonModel?.style = .primary enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmWhite disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmWhite - layer.borderWidth = buttonModel?.getBorderWidth() ?? 0 + layer.borderWidth = 0 backgroundColor = isEnabled ? buttonModel?.enabledColors.fill ?? .mvmBlack : buttonModel?.disabledColors.fill ?? .mvmCoolGray6 } @@ -69,7 +69,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmBlack disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmCoolGray6 backgroundColor = .clear - layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 + layer.borderWidth = 1 borderColor = isEnabled ? buttonModel?.enabledColors.border ?? .mvmBlack : buttonModel?.disabledColors.border ?? .mvmCoolGray6 } @@ -98,7 +98,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } if let borderColor = buttonModel?.enabledColors.border { - layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 + layer.borderWidth = 1 self.borderColor = borderColor } } else { @@ -107,7 +107,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } if let borderColor = buttonModel?.disabledColors.border { - layer.borderWidth = buttonModel?.getBorderWidth() ?? 1 + layer.borderWidth = 1 self.borderColor = borderColor } } From 876ec4597df64fc441953530a9033d8fe0d96efc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 14:56:13 -0400 Subject: [PATCH 12/16] for custom colors --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 50 ++++++++++++++----- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 714a343b..e697c045 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -61,11 +61,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW public var disabledTextColor_inverted: Color? public var disabledBorderColor_inverted: Color? - //-------------------------------------------------- - // MARK: - Default Button Facades - //-------------------------------------------------- - - //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- @@ -130,10 +125,15 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW /// Defines the default appearance for the primary style. func setPrimaryFacade() { - enabledFillColor = Color(uiColor: .mvmBlack) - enabledTextColor = Color(uiColor: .mvmWhite) - disabledFillColor = Color(uiColor: .mvmCoolGray6) - disabledTextColor = Color(uiColor: .mvmWhite) + if enabledFillColor == nil && enabledTextColor == nil { + enabledFillColor = Color(uiColor: .mvmBlack) + enabledTextColor = Color(uiColor: .mvmWhite) + } + + if disabledFillColor == nil && disabledTextColor == nil { + disabledFillColor = Color(uiColor: .mvmCoolGray6) + disabledTextColor = Color(uiColor: .mvmWhite) + } enabledFillColor_inverted = Color(uiColor: .mvmWhite) enabledTextColor_inverted = Color(uiColor: .mvmBlack) disabledFillColor_inverted = Color(uiColor: .mvmCoolGray6) @@ -143,10 +143,15 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW /// Defines the default appearance for the Secondary style. func setSecondaryFacade() { - enabledTextColor = Color(uiColor: .mvmBlack) - enabledBorderColor = Color(uiColor: .mvmBlack) - disabledTextColor = Color(uiColor: .mvmCoolGray6) - disabledBorderColor = Color(uiColor: .mvmCoolGray6) + if enabledTextColor == nil && enabledBorderColor == nil { + enabledTextColor = Color(uiColor: .mvmBlack) + enabledBorderColor = Color(uiColor: .mvmBlack) + } + + if disabledTextColor == nil && disabledBorderColor == nil { + disabledTextColor = Color(uiColor: .mvmCoolGray6) + disabledBorderColor = Color(uiColor: .mvmCoolGray6) + } enabledTextColor_inverted = Color(uiColor: .mvmWhite) enabledBorderColor_inverted = Color(uiColor: .mvmWhite) disabledTextColor_inverted = Color(uiColor: .mvmCoolGray6) @@ -168,6 +173,12 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case size case facade case groupName + case fillColor + case textColor + case borderColor + case disabledFillColor + case disabledTextColor + case disabledBorderColor } //-------------------------------------------------- @@ -200,6 +211,13 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } + + enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) + enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) + enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) + disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) + disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) + disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) } public func encode(to encoder: Encoder) throws { @@ -210,6 +228,12 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encode(isInverted, forKey: .inverted) try container.encodeModel(action, forKey: .action) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) + try container.encodeIfPresent(enabledFillColor, forKey: .fillColor) + try container.encodeIfPresent(enabledTextColor, forKey: .textColor) + try container.encodeIfPresent(enabledBorderColor, forKey: .borderColor) + try container.encodeIfPresent(disabledFillColor, forKey: .disabledFillColor) + try container.encodeIfPresent(disabledTextColor, forKey: .disabledTextColor) + try container.encodeIfPresent(disabledBorderColor, forKey: .disabledBorderColor) try container.encodeIfPresent(style, forKey: .style) try container.encodeIfPresent(size, forKey: .size) try container.encodeIfPresent(groupName, forKey: .groupName) From cdfd2942ff9f328236860869c9c887f26faac930 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 15:12:31 -0400 Subject: [PATCH 13/16] removeing --- MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift | 1 - .../Protocols/ModelProtocols/MoleculeModelProtocol.swift | 6 ------ 2 files changed, 7 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index e697c045..5567c540 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -171,7 +171,6 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW case enabled case style case size - case facade case groupName case fillColor case textColor diff --git a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift index f4d528f5..dda19b35 100644 --- a/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift +++ b/MVMCoreUI/Atomic/Protocols/ModelProtocols/MoleculeModelProtocol.swift @@ -9,7 +9,6 @@ public enum MolecularError: Swift.Error { public protocol MoleculeModelProtocol: ModelProtocol { var moleculeName: String { get } - var isInverted: Bool { get set } var backgroundColor: Color? { get set } } @@ -26,9 +25,4 @@ public extension MoleculeModelProtocol { static var categoryCodingKey: String { return "moleculeName" } - - var isInverted: Bool { - get { return false } - set { } - } } From 1f18436f58174decc2dedb5196a215c570cd4b73 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 15:19:57 -0400 Subject: [PATCH 14/16] reverting --- .../HorizontalCombinationViews/TwoButtonViewModel.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index da7663c6..f9e7bce8 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -49,7 +49,9 @@ public class TwoButtonViewModel: MoleculeModelProtocol { primaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .primaryButton) primaryButton?.style = .primary secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton) - secondaryButton?.style = .secondary + if secondaryButton?.style == nil { + secondaryButton?.style = .secondary + } } public func encode(to encoder: Encoder) throws { From 9e9984a8c5c6f51b3ed84e7c77db96126db688fc Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 15:25:32 -0400 Subject: [PATCH 15/16] adding check for primary --- .../HorizontalCombinationViews/TwoButtonViewModel.swift | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift index f9e7bce8..d4da0ba4 100644 --- a/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift +++ b/MVMCoreUI/Atomic/Molecules/HorizontalCombinationViews/TwoButtonViewModel.swift @@ -47,7 +47,9 @@ public class TwoButtonViewModel: MoleculeModelProtocol { let typeContainer = try decoder.container(keyedBy: CodingKeys.self) backgroundColor = try typeContainer.decodeIfPresent(Color.self, forKey: .backgroundColor) primaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .primaryButton) - primaryButton?.style = .primary + if primaryButton?.style == nil { + primaryButton?.style = .primary + } secondaryButton = try typeContainer.decodeIfPresent(ButtonModel.self, forKey: .secondaryButton) if secondaryButton?.style == nil { secondaryButton?.style = .secondary From e4911a8ccea4794f553fcec508857a91f84bb896 Mon Sep 17 00:00:00 2001 From: Kevin G Christiano Date: Wed, 6 May 2020 16:31:45 -0400 Subject: [PATCH 16/16] more changes for inverted --- .../Atomic/Atoms/Buttons/ButtonModel.swift | 53 +++++++++++++------ .../Atomic/Atoms/Buttons/PillButton.swift | 6 +-- 2 files changed, 38 insertions(+), 21 deletions(-) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift index 5567c540..601a8fb2 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/ButtonModel.swift @@ -35,7 +35,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW } public var size: Styler.Button.Size? = .standard public var groupName: String = "" - public var isInverted: Bool = false + public var inverted: Bool = false public lazy var enabledColors: FacadeElements = (fill: enabled_fillColor(), text: enabled_textColor(), @@ -97,29 +97,29 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW //-------------------------------------------------- // MARK: - Methods //-------------------------------------------------- - + public func enabled_fillColor() -> UIColor? { - return (isInverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor + return (inverted ? enabledFillColor_inverted : enabledFillColor)?.uiColor } public func enabled_textColor() -> UIColor? { - return (isInverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor + return (inverted ? enabledTextColor_inverted : enabledTextColor)?.uiColor } public func enabled_borderColor() -> UIColor? { - return (isInverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor + return (inverted ? enabledBorderColor_inverted : enabledBorderColor)?.uiColor } public func disabled_fillColor() -> UIColor? { - return (isInverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor + return (inverted ? disabledFillColor_inverted : disabledFillColor)?.uiColor } public func disabled_textColor() -> UIColor? { - return (isInverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor + return (inverted ? disabledTextColor_inverted : disabledTextColor)?.uiColor } public func disabled_borderColor() -> UIColor? { - return (isInverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor + return (inverted ? disabledBorderColor_inverted : disabledBorderColor)?.uiColor } /// Defines the default appearance for the primary style. @@ -134,6 +134,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW disabledFillColor = Color(uiColor: .mvmCoolGray6) disabledTextColor = Color(uiColor: .mvmWhite) } + enabledFillColor_inverted = Color(uiColor: .mvmWhite) enabledTextColor_inverted = Color(uiColor: .mvmBlack) disabledFillColor_inverted = Color(uiColor: .mvmCoolGray6) @@ -152,6 +153,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW disabledTextColor = Color(uiColor: .mvmCoolGray6) disabledBorderColor = Color(uiColor: .mvmCoolGray6) } + enabledTextColor_inverted = Color(uiColor: .mvmWhite) enabledBorderColor_inverted = Color(uiColor: .mvmWhite) disabledTextColor_inverted = Color(uiColor: .mvmCoolGray6) @@ -203,20 +205,37 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW self.enabled = enabled } - if let isInverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { - self.isInverted = isInverted + if let inverted = try typeContainer.decodeIfPresent(Bool.self, forKey: .inverted) { + self.inverted = inverted } if let groupName = try typeContainer.decodeIfPresent(String.self, forKey: .groupName) { self.groupName = groupName } - enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) - enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) - enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) - disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) - disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) - disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) + if let enabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .fillColor) { + self.enabledFillColor = enabledFillColor + } + + if let enabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .textColor) { + self.enabledTextColor = enabledTextColor + } + + if let enabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .borderColor) { + self.enabledBorderColor = enabledBorderColor + } + + if let disabledFillColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledFillColor) { + self.disabledFillColor = disabledFillColor + } + + if let disabledTextColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledTextColor) { + self.disabledTextColor = disabledTextColor + } + + if let disabledBorderColor = try typeContainer.decodeIfPresent(Color.self, forKey: .disabledBorderColor) { + self.disabledBorderColor = disabledBorderColor + } } public func encode(to encoder: Encoder) throws { @@ -224,7 +243,7 @@ public class ButtonModel: ButtonModelProtocol, MoleculeModelProtocol, FormGroupW try container.encode(moleculeName, forKey: .moleculeName) try container.encode(title, forKey: .title) try container.encode(enabled, forKey: .enabled) - try container.encode(isInverted, forKey: .inverted) + try container.encode(inverted, forKey: .inverted) try container.encodeModel(action, forKey: .action) try container.encodeIfPresent(backgroundColor, forKey: .backgroundColor) try container.encodeIfPresent(enabledFillColor, forKey: .fillColor) diff --git a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift index 5fe7a972..745a34f4 100644 --- a/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift +++ b/MVMCoreUI/Atomic/Atoms/Buttons/PillButton.swift @@ -45,7 +45,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { guard let currentColor = layer.borderColor else { return nil } return UIColor(cgColor: currentColor) } - set { layer.borderColor = newValue?.cgColor} + set { layer.borderColor = newValue?.cgColor } } //-------------------------------------------------- @@ -55,7 +55,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The primary styling for a button. Should be used for main buttons public func stylePrimary() { - buttonModel?.style = .primary enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmWhite disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmWhite layer.borderWidth = 0 @@ -65,7 +64,6 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { /// The secondary styling for a button. Should be used for secondary buttons public func styleSecondary() { - buttonModel?.style = .secondary enabledTitleColor = buttonModel?.enabledColors.text ?? .mvmBlack disabledTitleColor = buttonModel?.disabledColors.text ?? .mvmCoolGray6 backgroundColor = .clear @@ -114,7 +112,7 @@ open class PillButton: Button, MVMCoreUIViewConstrainingProtocol { } private func getInnerPadding() -> CGFloat { - return getHeight() / 2 + return getHeight() / 2.0 } private func getHeight() -> CGFloat {