adwaita-swift/Sources/Adwaita/View/Modifiers/AppearObserver.swift

68 lines
2.2 KiB
Swift

//
// AppearObserver.swift
// Adwaita
//
// Created by david-swift on 29.11.23.
//
import CAdw
/// A widget which executes a custom code when being rendered for the first time.
struct AppearObserver: Widget {
/// The function.
var onAppear: (ViewStorage) -> Void
/// The content.
var content: View
/// Get the content's container.
/// - Parameter modifiers: Modify views before being updated.
/// - Returns: The content's container.
func container(modifiers: [(View) -> View]) -> ViewStorage {
let storage = content.storage(modifiers: modifiers)
onAppear(storage)
return storage
}
/// Update the content.
/// - Parameters:
/// - storage: The content's storage.
/// - modifiers: Modify views before being updated.
/// - updateProperties: Whether to update properties.
func update(_ storage: ViewStorage, modifiers: [(View) -> View], updateProperties: Bool) {
content.updateStorage(storage, modifiers: modifiers, updateProperties: updateProperties)
}
}
extension View {
/// Run a function on the widget when it appears for the first time.
/// - Parameter closure: The function.
/// - Returns: A view.
public func inspectOnAppear(_ closure: @escaping (ViewStorage) -> Void) -> View {
AppearObserver(onAppear: closure, content: self)
}
/// Run a function when the view appears for the first time.
/// - Parameter closure: The function.
/// - Returns: A view.
public func onAppear(_ closure: @escaping () -> Void) -> View {
inspectOnAppear { _ in closure() }
}
/// Run a function when the widget gets clicked.
/// - Parameter handler: The function.
/// - Returns: A view.
public func onClick(handler: @escaping () -> Void) -> View {
inspectOnAppear { storage in
let controller = ViewStorage(gtk_gesture_click_new())
gtk_widget_add_controller(storage.pointer?.cast(), controller.pointer)
storage.fields["controller"] = controller
let argCount = 3
controller.connectSignal(name: "released", argCount: argCount, handler: handler)
}
}
}