diff --git a/VDS/BaseClasses/Control.swift b/VDS/BaseClasses/Control.swift index b2f3d4ae..6ebb9a63 100644 --- a/VDS/BaseClasses/Control.swift +++ b/VDS/BaseClasses/Control.swift @@ -55,10 +55,10 @@ open class Control: UIControl, ViewProtocol, UserInfoable, Clickable { open var userInfo = [String: Primitive]() - open var surface: Surface = .light { didSet { setNeedsUpdate() } } + open var surface: Surface = .light { didSet { if oldValue != surface { setNeedsUpdate() } } } /// Whether the Control is selected or not. - open override var isSelected: Bool { didSet { setNeedsUpdate() } } + open override var isSelected: Bool { didSet { if oldValue != isSelected { setNeedsUpdate() } } } /// Whether the Control can handle the isHighlighted state. open var canHighlight: Bool = true @@ -86,12 +86,7 @@ open class Control: UIControl, ViewProtocol, UserInfoable, Clickable { } /// Whether the Control is enabled or not. - open override var isEnabled: Bool { - didSet { - setNeedsUpdate() - //isUserInteractionEnabled = isEnabled - } - } + open override var isEnabled: Bool { didSet { if oldValue != isEnabled { setNeedsUpdate() } } } //-------------------------------------------------- // MARK: - Lifecycle diff --git a/VDS/BaseClasses/Selector/SelectorBase.swift b/VDS/BaseClasses/Selector/SelectorBase.swift index 8d0bfea1..1cbc659d 100644 --- a/VDS/BaseClasses/Selector/SelectorBase.swift +++ b/VDS/BaseClasses/Selector/SelectorBase.swift @@ -55,8 +55,8 @@ open class SelectorBase: Control, SelectorControlable { } } - open var size = CGSize(width: 20, height: 20) { didSet { setNeedsUpdate() } } - + open var size = CGSize(width: 20, height: 20) { didSet { if oldValue != size { setNeedsUpdate() } } } + var _showError: Bool = false /// Whether not to show the error. open var showError: Bool { diff --git a/VDS/BaseClasses/Selector/SelectorItemBase.swift b/VDS/BaseClasses/Selector/SelectorItemBase.swift index 1745ae65..471e9b99 100644 --- a/VDS/BaseClasses/Selector/SelectorItemBase.swift +++ b/VDS/BaseClasses/Selector/SelectorItemBase.swift @@ -91,13 +91,13 @@ open class SelectorItemBase: Control, Errorable, /// Generic Object used to allow the user to 'Select'. open var selectorView = Selector() - open override var isSelected: Bool { didSet { setNeedsUpdate() } } + open override var isSelected: Bool { didSet { if oldValue != isSelected { setNeedsUpdate() } } } /// Text shown in the label. - open var labelText: String? { didSet { setNeedsUpdate() } } + open var labelText: String? { didSet { if oldValue != labelText { setNeedsUpdate() } } } /// Array of LabelAttributeModel objects used in rendering the labelText. - open var labelTextAttributes: [any LabelAttributeModel]? { didSet { setNeedsUpdate() } } + open var labelTextAttributes: [any LabelAttributeModel]? { didSet { if oldValue != labelTextAttributes { setNeedsUpdate() } } } /// Instead of use labelText and labelTextAttirbutes, this is a fully baked NSAttributedString with both text and attributes. open var labelAttributedText: NSAttributedString? { @@ -109,10 +109,10 @@ open class SelectorItemBase: Control, Errorable, } /// Text shown in the childLabel. - open var childText: String? { didSet { setNeedsUpdate() } } + open var childText: String? { didSet { if oldValue != childText { setNeedsUpdate() } } } /// Array of LabelAttributeModel objects used in rendering the childText. - open var childTextAttributes: [any LabelAttributeModel]? { didSet { setNeedsUpdate() } } + open var childTextAttributes: [any LabelAttributeModel]? { didSet { if oldValue != childTextAttributes { setNeedsUpdate() } } } /// Instead of use childText and childTextAttirbutes, this is a fully baked NSAttributedString with both text and attributes. open var childAttributedText: NSAttributedString? { @@ -146,11 +146,11 @@ open class SelectorItemBase: Control, Errorable, } } - open var errorText: String? { didSet { setNeedsUpdate() } } + open var errorText: String? { didSet { if oldValue != errorText { setNeedsUpdate() } } } - open var inputId: String? { didSet { setNeedsUpdate() } } + open var inputId: String? { didSet { if oldValue != inputId { setNeedsUpdate() } } } - open var value: AnyHashable? { didSet { setNeedsUpdate() } } + open var value: AnyHashable? { didSet { if oldValue != value { setNeedsUpdate() } } } //-------------------------------------------------- // MARK: - Overrides diff --git a/VDS/BaseClasses/View.swift b/VDS/BaseClasses/View.swift index 89e5ce4b..0e6c8e6e 100644 --- a/VDS/BaseClasses/View.swift +++ b/VDS/BaseClasses/View.swift @@ -49,9 +49,9 @@ open class View: UIView, ViewProtocol, UserInfoable { /// Dictionary for keeping information for this Control use only Primitives. open var userInfo = [String: Primitive]() - open var surface: Surface = .light { didSet { setNeedsUpdate() } } + open var surface: Surface = .light { didSet { if oldValue != surface { setNeedsUpdate() } } } - open var isEnabled: Bool = true { didSet { setNeedsUpdate() } } + open var isEnabled: Bool = true { didSet { if oldValue != isEnabled { setNeedsUpdate() } } } //-------------------------------------------------- // MARK: - Lifecycle diff --git a/VDS/Components/BadgeIndicator/BadgeIndicator.swift b/VDS/Components/BadgeIndicator/BadgeIndicator.swift index 4ab72bb7..3eaa5baf 100644 --- a/VDS/Components/BadgeIndicator/BadgeIndicator.swift +++ b/VDS/Components/BadgeIndicator/BadgeIndicator.swift @@ -169,46 +169,46 @@ open class BadgeIndicator: View { /// This will render the badges fill color based on the available options. /// When used in conjunction with the surface prop, this fill color will change its tint automatically based on a light or dark surface. - open var fillColor: FillColor = .red { didSet { setNeedsUpdate() } } + open var fillColor: FillColor = .red { didSet { if oldValue != fillColor { setNeedsUpdate() } } } /// Badge Number that will be shown if you are using Kind.numbered. - open var number: Int? { didSet { setNeedsUpdate() } } + open var number: Int? { didSet { if oldValue != number { setNeedsUpdate() } } } /// Type of Badge Indicator, simple is a dot, whereas numbered shows a number. - open var kind: Kind = .simple { didSet { setNeedsUpdate() } } + open var kind: Kind = .simple { didSet { if oldValue != kind { setNeedsUpdate() } } } /// Character that is always at the begging. Accepts any character and if unaffected by maximumDigits. - open var leadingCharacter: String? { didSet { setNeedsUpdate() } } + open var leadingCharacter: String? { didSet { if oldValue != leadingCharacter { setNeedsUpdate() } } } /// Accepts any text or character. It is unaffected by maximumDigits. - open var trailingText: String? { didSet { setNeedsUpdate() } } + open var trailingText: String? { didSet { if oldValue != trailingText { setNeedsUpdate() } } } /// Determines the size of the Badge Indicator as well as the textStyle and padding used. - open var size: Size = .xxlarge { didSet { setNeedsUpdate() } } + open var size: Size = .xxlarge { didSet { if oldValue != size { setNeedsUpdate() } } } /// Pixel size of the dot when the kind is set to simple. - open var dotSize: CGFloat? { didSet { setNeedsUpdate() } } + open var dotSize: CGFloat? { didSet { if oldValue != dotSize { setNeedsUpdate() } } } /// Sets the padding at the top/bottom of the label. - open var verticalPadding: CGFloat? { didSet { setNeedsUpdate() } } + open var verticalPadding: CGFloat? { didSet { if oldValue != verticalPadding { setNeedsUpdate() } } } /// Sets the padding at the left/right of the label. - open var horitonalPadding: CGFloat? { didSet { setNeedsUpdate() } } + open var horitonalPadding: CGFloat? { didSet { if oldValue != horitonalPadding { setNeedsUpdate() } } } /// Hides the dot when you are in Kind.simple mode. - open var hideDot: Bool = false { didSet { setNeedsUpdate() } } + open var hideDot: Bool = false { didSet { if oldValue != hideDot { setNeedsUpdate() } } } /// Will not show the border. - open var hideBorder: Bool = false { didSet { setNeedsUpdate() } } + open var hideBorder: Bool = false { didSet { if oldValue != hideBorder { setNeedsUpdate() } } } /// When in Kind.numbered this is the amount of digits that will show up when the user adds a number. - open var maximumDigits: MaximumDigits = .two { didSet { setNeedsUpdate() } } + open var maximumDigits: MaximumDigits = .two { didSet { if oldValue != maximumDigits { setNeedsUpdate() } } } /// The Container's width. - open var width: CGFloat? { didSet { setNeedsUpdate() } } + open var width: CGFloat? { didSet { if oldValue != width { setNeedsUpdate() } } } /// The Container's height. - open var height: CGFloat? { didSet { setNeedsUpdate() } } + open var height: CGFloat? { didSet { if oldValue != height { setNeedsUpdate() } } } //-------------------------------------------------- // MARK: - Private Properties diff --git a/VDS/Components/Buttons/Button/Button.swift b/VDS/Components/Buttons/Button/Button.swift index 81f10b6e..c9324158 100644 --- a/VDS/Components/Buttons/Button/Button.swift +++ b/VDS/Components/Buttons/Button/Button.swift @@ -52,10 +52,10 @@ open class Button: ButtonBase, Useable, Buttonable { open override var availableSizes: [ButtonSize] { [.large, .small] } /// The ButtonSize for ths Button. - open var size: ButtonSize = .large { didSet { setNeedsUpdate() } } + open var size: ButtonSize = .large { didSet { if oldValue != size { setNeedsUpdate() } } } /// The Use for this Button. - open var use: Use = .primary { didSet { setNeedsUpdate() } } + open var use: Use = .primary { didSet { if oldValue != use { setNeedsUpdate() } } } private var _width: CGFloat? = nil diff --git a/VDS/Components/Buttons/ButtonBase.swift b/VDS/Components/Buttons/ButtonBase.swift index e505b7f8..6ab631b7 100644 --- a/VDS/Components/Buttons/ButtonBase.swift +++ b/VDS/Components/Buttons/ButtonBase.swift @@ -78,10 +78,10 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable { /// The ButtonSize available to this type of Buttonable. open var availableSizes: [ButtonSize] { [] } - open var surface: Surface = .light { didSet { setNeedsUpdate() } } + open var surface: Surface = .light { didSet { if oldValue != surface { setNeedsUpdate() } } } /// Text that will be used in the titleLabel. - open var text: String? { didSet { setNeedsUpdate() } } + open var text: String? { didSet { if oldValue != text { setNeedsUpdate() } } } /// Array of LabelAttributeModel objects used in rendering the text. open var textAttributes: [any LabelAttributeModel]? { nil } @@ -93,7 +93,7 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable { open var textColor: UIColor { .black } /// Will determine if a scaled font should be used for the titleLabel font. - open var useScaledFont: Bool = false { didSet { setNeedsUpdate() } } + open var useScaledFont: Bool = false { didSet { if oldValue != useScaledFont { setNeedsUpdate() } } } open var userInfo = [String: Primitive]() @@ -120,7 +120,7 @@ open class ButtonBase: UIButton, ViewProtocol, UserInfoable, Clickable { } /// Whether the Control is enabled or not. - open override var isEnabled: Bool { didSet { setNeedsUpdate() } } + open override var isEnabled: Bool { didSet { if oldValue != isEnabled { setNeedsUpdate() } } } //-------------------------------------------------- // MARK: - Lifecycle diff --git a/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift b/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift index 5f764754..3365ef2e 100644 --- a/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift +++ b/VDS/Components/Buttons/ButtonGroup/ButtonGroup.swift @@ -48,16 +48,16 @@ open class ButtonGroup: View { // MARK: - Public Properties //-------------------------------------------------- /// An object containing number of Button components per row for iPhones - open var rowQuantityPhone: Int = 0 { didSet { setNeedsUpdate() } } + open var rowQuantityPhone: Int = 0 { didSet { if oldValue != rowQuantityPhone { setNeedsUpdate() } } } /// An object containing number of Button components per row for iPads - open var rowQuantityTablet: Int = 0 { didSet { setNeedsUpdate() } } + open var rowQuantityTablet: Int = 0 { didSet { if oldValue != rowQuantityTablet { setNeedsUpdate() } } } /// An object containing number of Button components per row open var rowQuantity: Int { UIDevice.isIPad ? rowQuantityTablet : rowQuantityPhone } /// If provided, aligns TextLink/TextLinkCaret alignment when rowQuantity is set one. - open var alignment: Alignment = .center { didSet { setNeedsUpdate() } } + open var alignment: Alignment = .center { didSet { if oldValue != alignment { setNeedsUpdate() } } } /// Array of Buttonable Views that are shown in the group. open var buttons: [Buttonable] = [] { didSet { setNeedsUpdate() } } @@ -89,16 +89,22 @@ open class ButtonGroup: View { /// Whether this object is enabled or not override open var isEnabled: Bool { didSet { - buttons.forEach { $0.isEnabled = isEnabled } + if oldValue != isEnabled { + buttons.forEach { $0.isEnabled = isEnabled } + setNeedsUpdate() + } } } /// Current Surface and this is used to pass down to child objects that implement Surfacable override open var surface: Surface { didSet { - buttons.forEach { button in - var b = button - b.surface = surface + if oldValue != surface { + buttons.forEach { button in + var b = button + b.surface = surface + } + setNeedsUpdate() } } }