diff --git a/VDS.xcodeproj/project.pbxproj b/VDS.xcodeproj/project.pbxproj index aea11af8..d188b4eb 100644 --- a/VDS.xcodeproj/project.pbxproj +++ b/VDS.xcodeproj/project.pbxproj @@ -62,6 +62,8 @@ EA5F86C82A1BD99100BC83E4 /* TabModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5F86C72A1BD99100BC83E4 /* TabModel.swift */; }; EA5F86CC2A1D28B500BC83E4 /* ReleaseNotes.txt in Resources */ = {isa = PBXBuildFile; fileRef = EA5F86CB2A1D28B500BC83E4 /* ReleaseNotes.txt */; }; EA5F86D02A1F936100BC83E4 /* TabsContainer.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA5F86CF2A1F936100BC83E4 /* TabsContainer.swift */; }; + EA7B311D2A7018B600329654 /* TooltipModel.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA7B311C2A7018B600329654 /* TooltipModel.swift */; }; + EA7B311F2A701AE400329654 /* Children.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA7B311E2A701AE400329654 /* Children.swift */; }; EA81410B2A0E8E3C004F60D2 /* ButtonIcon.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */; }; EA8141102A127066004F60D2 /* UIColor+VDSColor.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA81410F2A127066004F60D2 /* UIColor+VDSColor.swift */; }; EA89200428AECF4B006B9984 /* UITextField+Publisher.swift in Sources */ = {isa = PBXBuildFile; fileRef = EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */; }; @@ -207,6 +209,8 @@ EA5F86C72A1BD99100BC83E4 /* TabModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabModel.swift; sourceTree = ""; }; EA5F86CB2A1D28B500BC83E4 /* ReleaseNotes.txt */ = {isa = PBXFileReference; lastKnownFileType = text; path = ReleaseNotes.txt; sourceTree = ""; }; EA5F86CF2A1F936100BC83E4 /* TabsContainer.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TabsContainer.swift; sourceTree = ""; }; + EA7B311C2A7018B600329654 /* TooltipModel.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = TooltipModel.swift; sourceTree = ""; }; + EA7B311E2A701AE400329654 /* Children.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = Children.swift; sourceTree = ""; }; EA81410A2A0E8E3C004F60D2 /* ButtonIcon.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = ButtonIcon.swift; sourceTree = ""; }; EA81410F2A127066004F60D2 /* UIColor+VDSColor.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UIColor+VDSColor.swift"; sourceTree = ""; }; EA89200328AECF4B006B9984 /* UITextField+Publisher.swift */ = {isa = PBXFileReference; lastKnownFileType = sourcecode.swift; path = "UITextField+Publisher.swift"; sourceTree = ""; }; @@ -503,6 +507,7 @@ isa = PBXGroup; children = ( EA985C1C296CD13600F2FF2E /* BundleManager.swift */, + EA7B311E2A701AE400329654 /* Children.swift */, EAF7F0B8289C139800B287F5 /* ColorConfiguration.swift */, EA3361B5288B2A410071C351 /* Control.swift */, EAF7F09F289AB7EC00B287F5 /* View.swift */, @@ -679,6 +684,7 @@ EAB2375C29E8789100AABE9A /* Tooltip.swift */, EAB2376729E9992800AABE9A /* TooltipAlertViewController.swift */, EAB2376929E9E59100AABE9A /* TooltipLaunchable.swift */, + EA7B311C2A7018B600329654 /* TooltipModel.swift */, EAB2376129E9880400AABE9A /* TrailingTooltipLabel.swift */, ); path = Tooltip; @@ -923,6 +929,7 @@ EA5E305A29510F8B0082B959 /* EnumSubset.swift in Sources */, EA985BF7296C665E00F2FF2E /* IconName.swift in Sources */, EA8141102A127066004F60D2 /* UIColor+VDSColor.swift in Sources */, + EA7B311D2A7018B600329654 /* TooltipModel.swift in Sources */, EAF7F0AF289B144C00B287F5 /* UnderlineLabelAttribute.swift in Sources */, EA0D1C412A6AD61C00E5C127 /* Typography+Additional.swift in Sources */, EAC925842911C63100091998 /* Colorable.swift in Sources */, @@ -938,6 +945,7 @@ EAC846F3294B95CE00F685BA /* ButtonGroupCollectionViewCell.swift in Sources */, EAF7F0952899861000B287F5 /* CheckboxItem.swift in Sources */, EA985BE82968951C00F2FF2E /* TileletTitleModel.swift in Sources */, + EA7B311F2A701AE400329654 /* Children.swift in Sources */, EA297A5529FB07760031ED56 /* TooltipLabelAttribute.swift in Sources */, EA985BEA29689B6D00F2FF2E /* TileletSubTitleModel.swift in Sources */, EA3361C9289054C50071C351 /* Surfaceable.swift in Sources */, diff --git a/VDS/Classes/Children.swift b/VDS/Classes/Children.swift new file mode 100644 index 00000000..19f64453 --- /dev/null +++ b/VDS/Classes/Children.swift @@ -0,0 +1,106 @@ +// +// Children.swift +// VDS +// +// Created by Matt Bruce on 7/25/23. +// + +import Foundation +import UIKit + +open class Children: View { + + public enum Mode { + case textOnly + case viewOnly + case textViewOnly + + public var errorMessage: String { + switch self { + case .textOnly: + return "Invalid type passed. Expected String." + case .viewOnly: + return "Invalid type passed. Expected a UIView." + case .textViewOnly: + return "Invalid type passed. Expected a UIView or String." + } + } + } + + open var mode: Mode = .textViewOnly + + open var child: Any? { + didSet { + updateChildView() + } + } + + open var textStyle: TextStyle? { + didSet { + updateChildView() + } + } + + open lazy var label: Label = { + let lbl = Label() + lbl.lineBreakMode = .byWordWrapping + lbl.numberOfLines = 0 + lbl.layer.masksToBounds = true + lbl.textAlignment = .left + return lbl + }() + + open var customSubview: UIView? + + private func updateChildView() { + // Remove previous views if any + label.removeFromSuperview() + customSubview?.removeFromSuperview() + + guard let child else { return } + + var view: UIView? = nil + + switch mode { + + case .textOnly: + if let string = child as? String { + label.text = string + if let textStyle = textStyle { + label.textStyle = textStyle + } + view = label + } + case .viewOnly: + if let customView = child as? View { + customSubview = customView + view = customView + } + case .textViewOnly: + if let customView = child as? View { + customSubview = customView + view = customView + } else if let string = child as? String { + label.text = string + if let textStyle = textStyle { + label.textStyle = textStyle + } + view = label + } + } + + guard let unwrappedView = view else { + print(mode.errorMessage) + return + } + + addSubview(unwrappedView) + unwrappedView.translatesAutoresizingMaskIntoConstraints = false + NSLayoutConstraint.activate([ + unwrappedView.topAnchor.constraint(equalTo: self.topAnchor), + unwrappedView.bottomAnchor.constraint(equalTo: self.bottomAnchor), + unwrappedView.leadingAnchor.constraint(equalTo: self.leadingAnchor), + unwrappedView.trailingAnchor.constraint(equalTo: self.trailingAnchor) + ]) + } +} diff --git a/VDS/Components/Tooltip/TooltipModel.swift b/VDS/Components/Tooltip/TooltipModel.swift new file mode 100644 index 00000000..1b34e63b --- /dev/null +++ b/VDS/Components/Tooltip/TooltipModel.swift @@ -0,0 +1,21 @@ +// +// TooltipModel.swift +// VDS +// +// Created by Matt Bruce on 7/25/23. +// + +import Foundation + +public struct TooltipModel { + public var surface: Surface + public var closeButtonText: String + public var title: String? + public var child: Any? + public init(surface: Surface = .light, closeButtonText: String = "Close", title: String?, child: Any? = nil) { + self.surface = surface + self.closeButtonText = closeButtonText + self.title = title + self.child = child + } +}