Skip to content

Commit 9f617c2

Browse files
authored
Add toggle to present and dismiss tooltip on demand (#21)
* feat: add isEnabled to toggle tooltip visibility * refactor: remove implicit animation and add transition modifier * refactor: remove scale in transition and use opacity only. * fix: move transition modifier to tooltipBody instead of content * feat: add transition configuration * refactor: rename isEnabled to enabled. Shift enabled argument as first argument to remove label requirement. * refactor: add default true value to enabled argument * refactor: remove Binding property wrapper on enabled * feat: add function definitions for tooltip for backwards compatibility * refactor: remove unnecessary enabled argument
1 parent b1f0d41 commit 9f617c2

File tree

5 files changed

+32
-11
lines changed

5 files changed

+32
-11
lines changed

Sources/SwiftUITooltip/TooltipConfigurations/ArrowOnlyTooltipConfig.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public struct ArrowOnlyTooltipConfig: TooltipConfig {
4040
public var animationOffset: CGFloat = 10
4141
public var animationTime: Double = 1
4242

43+
public var transition: AnyTransition = .opacity
44+
4345
public init() {}
4446

4547
public init(side: TooltipSide) {

Sources/SwiftUITooltip/TooltipConfigurations/DefaultTooltipConfig.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@ public struct DefaultTooltipConfig: TooltipConfig {
4040
public var animationOffset: CGFloat = 10
4141
public var animationTime: Double = 1
4242

43+
public var transition: AnyTransition = .opacity
44+
4345
public init() {}
4446

4547
public init(side: TooltipSide) {

Sources/SwiftUITooltip/TooltipConfigurations/TooltipConfig.swift

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,4 +39,6 @@ public protocol TooltipConfig {
3939
var enableAnimation: Bool { get set }
4040
var animationOffset: CGFloat { get set }
4141
var animationTime: Double { get set }
42+
43+
var transition: AnyTransition { get set }
4244
}

Sources/SwiftUITooltip/TooltipModifier.swift

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,13 +9,15 @@ import SwiftUI
99

1010
struct TooltipModifier<TooltipContent: View>: ViewModifier {
1111
// MARK: - Uninitialised properties
12-
12+
var enabled: Bool
1313
var config: TooltipConfig
1414
var content: TooltipContent
1515

16+
1617
// MARK: - Initialisers
1718

18-
init(config: TooltipConfig, @ViewBuilder content: @escaping () -> TooltipContent) {
19+
init(enabled: Bool, config: TooltipConfig, @ViewBuilder content: @escaping () -> TooltipContent) {
20+
self.enabled = enabled
1921
self.config = config
2022
self.content = content()
2123
}
@@ -179,7 +181,6 @@ struct TooltipModifier<TooltipContent: View>: ViewModifier {
179181
.overlay(self.arrowView)
180182
}
181183
.offset(x: self.offsetHorizontal(g), y: self.offsetVertical(g))
182-
.animation(.easeInOut)
183184
.onAppear {
184185
self.dispatchAnimation()
185186
}
@@ -190,7 +191,7 @@ struct TooltipModifier<TooltipContent: View>: ViewModifier {
190191

191192
func body(content: Content) -> some View {
192193
content
193-
.overlay(tooltipBody)
194+
.overlay(enabled ? tooltipBody.transition(config.transition) : nil)
194195
}
195196
}
196197

Sources/SwiftUITooltip/TooltipViewExtension.swift

Lines changed: 21 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -8,27 +8,41 @@
88
import SwiftUI
99

1010
public extension View {
11-
func tooltip<TooltipContent: View>(@ViewBuilder content: @escaping () -> TooltipContent) -> some View {
11+
func tooltip<TooltipContent: View>(_ enabled: Bool = true, @ViewBuilder content: @escaping () -> TooltipContent) -> some View {
1212
let config: TooltipConfig = DefaultTooltipConfig.shared
1313

14-
return modifier(TooltipModifier(config: config, content: content))
14+
return modifier(TooltipModifier(enabled: enabled, config: config, content: content))
1515
}
1616

17-
func tooltip<TooltipContent: View>(config: TooltipConfig, @ViewBuilder content: @escaping () -> TooltipContent) -> some View {
18-
modifier(TooltipModifier(config: config, content: content))
17+
func tooltip<TooltipContent: View>(_ enabled: Bool = true, config: TooltipConfig, @ViewBuilder content: @escaping () -> TooltipContent) -> some View {
18+
modifier(TooltipModifier(enabled: enabled, config: config, content: content))
1919
}
2020

21-
func tooltip<TooltipContent: View>(_ side: TooltipSide, @ViewBuilder content: @escaping () -> TooltipContent) -> some View {
21+
func tooltip<TooltipContent: View>(_ enabled: Bool = true, side: TooltipSide, @ViewBuilder content: @escaping () -> TooltipContent) -> some View {
2222
var config = DefaultTooltipConfig.shared
2323
config.side = side
2424

25-
return modifier(TooltipModifier(config: config, content: content))
25+
return modifier(TooltipModifier(enabled: enabled, config: config, content: content))
2626
}
2727

28+
func tooltip<TooltipContent: View>(_ enabled: Bool = true, side: TooltipSide, config: TooltipConfig, @ViewBuilder content: @escaping () -> TooltipContent) -> some View {
29+
var config = config
30+
config.side = side
31+
32+
return modifier(TooltipModifier(enabled: enabled, config: config, content: content))
33+
}
34+
35+
func tooltip<TooltipContent: View>(_ side: TooltipSide, @ViewBuilder content: @escaping () -> TooltipContent) -> some View {
36+
var config = DefaultTooltipConfig.shared
37+
config.side = side
38+
39+
return modifier(TooltipModifier(enabled: true, config: config, content: content))
40+
}
41+
2842
func tooltip<TooltipContent: View>(_ side: TooltipSide, config: TooltipConfig, @ViewBuilder content: @escaping () -> TooltipContent) -> some View {
2943
var config = config
3044
config.side = side
3145

32-
return modifier(TooltipModifier(config: config, content: content))
46+
return modifier(TooltipModifier(enabled: true, config: config, content: content))
3347
}
3448
}

0 commit comments

Comments
 (0)