57 lines
1.7 KiB
Swift
57 lines
1.7 KiB
Swift
//
|
|
// Overlay.swift
|
|
// Adwaita
|
|
//
|
|
// Created by david-swift on 03.01.24.
|
|
//
|
|
|
|
import Libadwaita
|
|
|
|
/// A wrapper around a view for adding other views on top.
|
|
struct Overlay: Widget {
|
|
|
|
/// The child view.
|
|
var child: View
|
|
/// The overlay view.
|
|
var overlay: Body
|
|
|
|
/// The identifier for the overlay content.
|
|
let overlayID = "overlay"
|
|
|
|
/// Get the overlay's view storage.
|
|
/// - Parameter modifiers: The view modifiers.
|
|
/// - Returns: The view storage.
|
|
func container(modifiers: [(View) -> View]) -> ViewStorage {
|
|
let contentStorage = child.storage(modifiers: modifiers)
|
|
let overlayStorage = overlay.widget(modifiers: modifiers).storage(modifiers: modifiers)
|
|
let overlay = Libadwaita.Overlay().child(contentStorage.view).addOverlay(overlayStorage.view)
|
|
return .init(overlay, content: [.mainContent: [contentStorage], overlayID: [overlayStorage]])
|
|
}
|
|
|
|
/// Update the overlay's view storage.
|
|
/// - Parameters:
|
|
/// - storage: The view storage.
|
|
/// - modifiers: The view modifiers.
|
|
func update(_ storage: ViewStorage, modifiers: [(View) -> View]) {
|
|
if let storage = storage.content[.mainContent]?.first {
|
|
child.updateStorage(storage, modifiers: modifiers)
|
|
}
|
|
if let storage = storage.content[overlayID]?.first {
|
|
overlay.widget(modifiers: modifiers).update(storage, modifiers: modifiers)
|
|
}
|
|
}
|
|
|
|
}
|
|
|
|
extension View {
|
|
|
|
/// Add an overlay view.
|
|
/// - Parameters:
|
|
/// - overlay: The overlay view.
|
|
/// - Returns: A view.
|
|
public func overlay(@ViewBuilder _ overlay: @escaping () -> Body) -> View {
|
|
Overlay(child: self, overlay: overlay())
|
|
}
|
|
|
|
}
|