diff --git a/Documentation/Reference/extensions/View.md b/Documentation/Reference/extensions/View.md index 7d47a3b..92e487f 100644 --- a/Documentation/Reference/extensions/View.md +++ b/Documentation/Reference/extensions/View.md @@ -147,6 +147,12 @@ Make the view insensitive (useful e.g. in overlays). - Parameter insensitive: Whether the view is insensitive. - Returns: A view. +### `visible(_:)` + +Set the view's visibility. +- Parameter visible: Whether the view is visible. +- Returns: A view. + ### `stopModifiers()` Remove all of the content modifiers for the wrapped views. diff --git a/Sources/Adwaita/Model/User Interface/View/ViewBuilder.swift b/Sources/Adwaita/Model/User Interface/View/ViewBuilder.swift index 1378719..ed8270f 100644 --- a/Sources/Adwaita/Model/User Interface/View/ViewBuilder.swift +++ b/Sources/Adwaita/Model/User Interface/View/ViewBuilder.swift @@ -57,11 +57,16 @@ public enum ViewBuilder { /// - Parameter component: An optional component. /// - Returns: A nonoptional component. public static func buildOptional(_ component: Component?) -> Component { - if let component { - return .element(ViewStack(id: true) { _ in buildFinalResult(component) }) - } else { - return .element(ViewStack(id: false) { _ in [] }) - } + .element( + VStack { + if let component { + buildFinalResult(component) + } else { + [] + } + } + .visible(component != nil) + ) } /// Enables support for `if`-`else` and `switch` statements. diff --git a/Sources/Adwaita/View/Modifiers/InspectorWrapper.swift b/Sources/Adwaita/View/Modifiers/InspectorWrapper.swift index ab15af6..41a15d8 100644 --- a/Sources/Adwaita/View/Modifiers/InspectorWrapper.swift +++ b/Sources/Adwaita/View/Modifiers/InspectorWrapper.swift @@ -131,4 +131,11 @@ extension View { inspect { gtk_widget_set_sensitive($0.pointer?.cast(), insensitive ? 0 : 1) } } + /// Set the view's visibility. + /// - Parameter visible: Whether the view is visible. + /// - Returns: A view. + public func visible(_ visible: Bool = true) -> View { + inspect { gtk_widget_set_visible($0.pointer?.cast(), visible.cBool) } + } + }