From a22bbbc2b3efdd44adec7175d8c3f8f5b5195c17 Mon Sep 17 00:00:00 2001 From: Jarrod Courtney Date: Fri, 23 Sep 2022 13:42:42 -0500 Subject: [PATCH] added buttonSize selector Signed-off-by: Jarrod Courtney --- VDS/Components/Button/Button.swift | 51 ++++++++++++++++++++++--- VDS/Components/Button/ButtonModel.swift | 5 +++ VDS/Protocols/Useable.swift | 22 +++++++++++ 3 files changed, 72 insertions(+), 6 deletions(-) diff --git a/VDS/Components/Button/Button.swift b/VDS/Components/Button/Button.swift index 622c5b2b..85b7a7d5 100644 --- a/VDS/Components/Button/Button.swift +++ b/VDS/Components/Button/Button.swift @@ -39,13 +39,29 @@ open class ButtonBase: UIButton, ModelHandlerable, ViewP //-------------------------------------------------- // MARK: - Properties //-------------------------------------------------- - + private let PaddingOneHalf: CGFloat = 2 + private let PaddingOne: CGFloat = 4 + private let PaddingTwo: CGFloat = 8 + private let PaddingThree: CGFloat = 12 + private let PaddingFour: CGFloat = 16 + private let PaddingFive: CGFloat = 24 + private let PaddingEight: CGFloat = 32 + private let PaddingTen: CGFloat = 40 + private let PaddingTwelve: CGFloat = 48 + private let PaddingEighteen: CGFloat = 72 + @Proxy(\.model.surface) open var surface: Surface @Proxy(\.model.use) open var use: Use + open var buttonSize: Use.Size = .large { + didSet { + model.buttonSize = buttonSize + } + } + @Proxy(\.model.disabled) open var disabled: Bool { didSet { @@ -181,19 +197,20 @@ open class ButtonBase: UIButton, ModelHandlerable, ViewP let borderColor = buttonBorderColorConfiguration.getColor(viewModel) let borderWidth = viewModel.use == .secondary ? 1.0 : 0.0 let titleColor = buttonTitleColorConfiguration.getColor(viewModel) + let buttonHeight = viewModel.buttonSize.getHeight() + let minWidth = buttonWidth >= viewModel.buttonSize.minimumWidth() ? buttonWidth : viewModel.buttonSize.minimumWidth() - self.titleLabel?.font = TypographicalStyle.BoldBodyLarge.font + self.titleLabel?.font = viewModel.buttonSize == .large ? TypographicalStyle.BoldBodyLarge.font : TypographicalStyle.BoldBodySmall.font self.backgroundColor = backgroundColor self.setTitleColor(titleColor, for: .normal) self.layer.borderColor = borderColor.cgColor - self.layer.cornerRadius = self.frame.size.height / 2 + self.layer.cornerRadius = buttonHeight / 2 self.layer.borderWidth = borderWidth - let buttonHeight : CGFloat = 44.0 if buttonWidthConstraint == nil { - buttonWidthConstraint = self.widthAnchor.constraint(equalToConstant: buttonWidth) + buttonWidthConstraint = self.widthAnchor.constraint(equalToConstant: minWidth) } else { - buttonWidthConstraint?.constant = buttonWidth + buttonWidthConstraint?.constant = minWidth } buttonWidthConstraint?.isActive = true @@ -204,8 +221,13 @@ open class ButtonBase: UIButton, ModelHandlerable, ViewP } buttonHeightConstraint?.isActive = true + contentEdgeInsets = getContentEdgeInsets(viewModel: viewModel) } + //-------------------------------------------------- + // MARK: - PRIVATE + //-------------------------------------------------- + private class UseableColorConfiguration : Colorable { public var primary = DisabledSurfaceColorConfiguration() public var secondary = DisabledSurfaceColorConfiguration() @@ -216,4 +238,21 @@ open class ButtonBase: UIButton, ModelHandlerable, ViewP return viewModel.use == .primary ? primary.getColor(viewModel) : secondary.getColor(viewModel) } } + + private func getContentEdgeInsets(viewModel: ModelType) -> UIEdgeInsets { + var verticalPadding = 0.0 + var horizontalPadding = 0.0 + switch viewModel.buttonSize { + case .large: + verticalPadding = PaddingThree + horizontalPadding = PaddingFive + break + case .small: + verticalPadding = PaddingTwo + horizontalPadding = PaddingFour + break + } + return UIEdgeInsets(top: verticalPadding, left: horizontalPadding, bottom: verticalPadding, right: horizontalPadding) + } + } diff --git a/VDS/Components/Button/ButtonModel.swift b/VDS/Components/Button/ButtonModel.swift index 3a766043..c7eee689 100644 --- a/VDS/Components/Button/ButtonModel.swift +++ b/VDS/Components/Button/ButtonModel.swift @@ -11,6 +11,9 @@ import UIKit public protocol ButtonModel: Modelable, Useable, Equatable, AnyEquatable { var text: String? { get set } var attributes: [any LabelAttributeModel]? { get set } + var buttonWidth: CGFloat? { get set } + var buttonSize: Use.Size { get set } + var use: Use { get set } } public struct DefaultButtonModel: ButtonModel { @@ -28,6 +31,7 @@ public struct DefaultButtonModel: ButtonModel { && typograpicalStyle == equatable.typograpicalStyle && disabled == equatable.disabled && buttonWidth == equatable.buttonWidth + && buttonSize == equatable.buttonSize } public var id = UUID() @@ -38,5 +42,6 @@ public struct DefaultButtonModel: ButtonModel { public var use: Use = .primary public var disabled: Bool = false public var buttonWidth: CGFloat? + public var buttonSize: Use.Size = .large public init(){} } diff --git a/VDS/Protocols/Useable.swift b/VDS/Protocols/Useable.swift index 077ceb02..62215ca8 100644 --- a/VDS/Protocols/Useable.swift +++ b/VDS/Protocols/Useable.swift @@ -14,6 +14,28 @@ public enum Use: String, Codable, Equatable { public var color: UIColor { return self == .primary ? VDSColor.backgroundPrimaryDark : .clear } + public enum Size: String, Codable { + case large + case small + + func getHeight() -> CGFloat { + switch self { + case .large: + return 44 + case .small: + return 32 + } + } + + func minimumWidth() -> CGFloat { + switch self { + case .large: + return 76 + case .small: + return 60 + } + } + } } public protocol Useable {