From fe4e9b7a2bd99f31370cc03e98f30abdaffa32a2 Mon Sep 17 00:00:00 2001 From: Matt Bruce Date: Fri, 12 May 2023 15:27:50 -0500 Subject: [PATCH] initial cut for ButtonICon Signed-off-by: Matt Bruce --- VDS.xcodeproj/project.pbxproj | 12 ++ .../Icon/ButtonIcon/ButtonIcon.swift | 116 ++++++++++++++++++ 2 files changed, 128 insertions(+) create mode 100644 VDS/Components/Icon/ButtonIcon/ButtonIcon.swift diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index 615218d1..c5673da2 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -47,6 +47,7 @@ EA5E30532950DDA60082B959 /* TitleLockup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E30522950DDA60082B959 /* TitleLockup.swift */; }; EA5E3058295105A40082B959 /* Tilelet.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E3057295105A40082B959 /* Tilelet.swift */; }; EA5E305A29510F8B0082B959 /* EnumSubset.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5E305929510F8B0082B959 /* EnumSubset.swift */; }; + EA81410B2A0E8E3C004F60D2 /* ButtonIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */; }; EA89200428AECF4B006B9984 /* UITextField+Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */; }; EA89200628B526D6006B9984 /* CheckboxGroup.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200528B526D6006B9984 /* CheckboxGroup.swift */; }; EA89201328B568D8006B9984 /* RadioBox.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89201228B568D8006B9984 /* RadioBox.swift */; }; @@ -167,6 +168,7 @@ EA5E30522950DDA60082B959 /* TitleLockup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TitleLockup.swift; sourceTree = ""; }; EA5E3057295105A40082B959 /* Tilelet.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Tilelet.swift; sourceTree = ""; }; EA5E305929510F8B0082B959 /* EnumSubset.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = EnumSubset.swift; sourceTree = ""; }; + EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonIcon.swift; sourceTree = ""; }; EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Publisher.swift"; sourceTree = ""; }; EA89200528B526D6006B9984 /* CheckboxGroup.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = CheckboxGroup.swift; sourceTree = ""; }; EA89201228B568D8006B9984 /* RadioBox.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = RadioBox.swift; sourceTree = ""; }; @@ -540,6 +542,14 @@ path = Tilelet; sourceTree = ""; }; + EA81410C2A0E8E52004F60D2 /* ButtonIcon */ = { + isa = PBXGroup; + children = ( + EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */, + ); + path = ButtonIcon; + sourceTree = ""; + }; EA89200B28B530F0006B9984 /* RadioBox */ = { isa = PBXGroup; children = ( @@ -552,6 +562,7 @@ EA985BF3296C609E00F2FF2E /* Icon */ = { isa = PBXGroup; children = ( + EA81410C2A0E8E52004F60D2 /* ButtonIcon */, EA985BF4296C60C000F2FF2E /* Icon.swift */, EA985BF8296C710100F2FF2E /* IconColor.swift */, EA985BF6296C665E00F2FF2E /* IconName.swift */, @@ -855,6 +866,7 @@ EA4DB18528CA967F00103EE3 /* SelectorGroupHandlerBase.swift in Sources */, EAF7F0AB289B13FD00B287F5 /* TextStyleLabelAttribute.swift in Sources */, EAB1D29C28A5618900DAE764 /* RadioButtonGroup.swift in Sources */, + EA81410B2A0E8E3C004F60D2 /* ButtonIcon.swift in Sources */, EA985BE629688F6A00F2FF2E /* TileletBadgeModel.swift in Sources */, EA336171288B19200071C351 /* VDS.docc in Sources */, EA985BF02968A93600F2FF2E /* TitleLockupEyebrowModel.swift in Sources */, diff --git a/VDS/Components/Icon/ButtonIcon/ButtonIcon.swift b/VDS/Components/Icon/ButtonIcon/ButtonIcon.swift new file mode 100644 index 00000000..1d381df6 --- /dev/null +++ b/VDS/Components/Icon/ButtonIcon/ButtonIcon.swift @@ -0,0 +1,116 @@ +// +// ButtonIcon.swift +// VDS +// +// Created by Matt Bruce on 5/12/23. +// + +import Foundation +import UIKit + +@objc(VDSButtonIcon) +open class ButtonIcon: Control { + //-------------------------------------------------- + // MARK: - Models + //-------------------------------------------------- + //-------------------------------------------------- + // MARK: - Enums + //-------------------------------------------------- + public enum Kind: String, CaseIterable { + case ghost, lowContrast, highContrast + } + + public enum SurfaceType: String, CaseIterable { + case colorFill, media + } + + public enum Size: String, EnumSubset { + case large + case small + + public var defaultValue: Icon.Size { .large } + } + + //-------------------------------------------------- + // MARK: - Private Properties + //-------------------------------------------------- + private var widthConstraint: NSLayoutConstraint? + private var heightConstraint: NSLayoutConstraint? + + //-------------------------------------------------- + // MARK: - Public Properties + //-------------------------------------------------- + open var icon = Icon() + + open var iconName: Icon.Name? { didSet { setNeedsUpdate() } } + + open var kind: Kind = .ghost { didSet { setNeedsUpdate() } } + + open var surfaceType: SurfaceType = .colorFill { didSet { setNeedsUpdate() } } + + open var size: Size = .large { didSet { setNeedsUpdate() } } + + open var floating: Bool = false { didSet { setNeedsUpdate() } } + + open var hideBorder: Bool = true { didSet { setNeedsUpdate() } } + + open var iconOffset: CGPoint? { didSet { setNeedsUpdate() } } + + //-------------------------------------------------- + // MARK: - Configuration + //-------------------------------------------------- + + + //-------------------------------------------------- + // MARK: - Initializers + //-------------------------------------------------- + required public init() { + super.init(frame: .zero) + } + + public override init(frame: CGRect) { + super.init(frame: .zero) + } + + public required init?(coder: NSCoder) { + super.init(coder: coder) + } + + //-------------------------------------------------- + // MARK: - Lifecycle + //-------------------------------------------------- + + open override func setup() { + super.setup() + + } + + open override func reset() { + super.reset() + shouldUpdateView = false + kind = .ghost + surfaceType = .colorFill + size = .large + floating = false + hideBorder = true + iconOffset = nil + iconName = nil + shouldUpdateView = true + setNeedsUpdate() + } + + open override func updateView() { + super.updateView() + + if let iconName { + icon.name = iconName + icon.size = size.value + icon.surface = surface + icon.disabled = disabled + } else { + icon.reset() + } + + } + +}