gh-EmergeTools-Pow/Example/Pow Example/Examples/Change Effects/SoundEffectsExample.swift
Joe Fabisevich 781d455727
Moving Pow to @emergetools
Co-authored-by: Robert Böhnke <robb@robb.is>
Co-authored-by: Kasper Lahti <kasper@lahti.email>
2023-11-29 09:38:34 -05:00

182 lines
6.8 KiB
Swift

import Pow
import SwiftUI
struct SoundEffectExample: View, Example {
var body: some View {
// All `SoundEffects` used here can be found in the
// `Pow Example/Sounds/` folder and are free to use with any licensed
// copy of Pow.
ScrollView {
VStack {
GroupBox("Alerts") {
HStack {
SoundEffectPad("Not Found", SoundEffect("notfound"))
SoundEffectPad("Pluck", SoundEffect("pluck"))
SoundEffectPad("Pong", SoundEffect("pong"))
SoundEffectPad("Ping", SoundEffect("ping"))
}
}
GroupBox("Blips") {
HStack {
SoundEffectPad("Boop", SoundEffect("boop"))
SoundEffectPad("Beep", SoundEffect("beep"))
SoundEffectPad("Biip", SoundEffect("biip"))
SoundEffectPad("Biip", SoundEffect("biip")).hidden()
}
}
GroupBox("Clicks & Plops") {
HStack {
SoundEffectPad("Dial", SoundEffect("dial"))
SoundEffectPad("Tock", SoundEffect("tock"))
SoundEffectPad("Plop", SoundEffect("plop"))
SoundEffectPad("Pop", SoundEffect("pop1", "pop2", "pop3", "pop4", "pop5"))
}
}
GroupBox("Drips") {
HStack {
SoundEffectPad("Drip", SoundEffect("drip"))
SoundEffectPad("Drip\nFlat", SoundEffect("drip.flat"))
SoundEffectPad("Drip\nRising", SoundEffect("drip.rising"))
SoundEffectPad("Drip\nFalling", SoundEffect("drip.falling"))
}
}
GroupBox("Glas") {
HStack {
SoundEffectPad("Tink", SoundEffect("tink"))
SoundEffectPad("Zing", SoundEffect("zing"))
SoundEffectPad("Glass", SoundEffect("glass"))
SoundEffectPad("Tick", SoundEffect("tick"))
}
}
GroupBox("Metal") {
HStack {
SoundEffectPad("Latch", SoundEffect("latch1", "latch2", "latch3", "latch4"))
SoundEffectPad("Lock", SoundEffect("lock1", "lock2", "lock3", "lock4"))
SoundEffectPad("Snap", SoundEffect("snap"))
SoundEffectPad("Snap", SoundEffect("snap")).hidden()
}
}
GroupBox("Notifications") {
HStack {
SoundEffectPad("Chime", SoundEffect("chime"))
SoundEffectPad("Chime\nFlat", SoundEffect("chime.flat"))
SoundEffectPad("Chime\nRising", SoundEffect("chime.rising"))
SoundEffectPad("Chime\nFalling", SoundEffect("chime.falling"))
}
HStack {
SoundEffectPad("Pick", SoundEffect("pick"))
SoundEffectPad("Pick\nFlat", SoundEffect("pick.flat"))
SoundEffectPad("Pick\nRising", SoundEffect("pick.rising"))
SoundEffectPad("Pick\nFalling", SoundEffect("pick.falling"))
}
}
GroupBox("Results") {
HStack {
SoundEffectPad("Sparkle", SoundEffect("sparkle"))
SoundEffectPad("Sparkle\nFlat", SoundEffect("sparkle.flat"))
SoundEffectPad("Sparkle\nRising", SoundEffect("sparkle.rising"))
SoundEffectPad("Sparkle\nFalling", SoundEffect("sparkle.falling"))
}
}
GroupBox("Tension/Release") {
HStack {
SoundEffectPad("Reel", SoundEffect("reel"))
SoundEffectPad("Reel\nFlat", SoundEffect("reel.flat"))
SoundEffectPad("Reel\nRising", SoundEffect("reel.rising"))
SoundEffectPad("Reel\nFalling", SoundEffect("reel.falling"))
}
}
GroupBox("Undo/Redo") {
HStack {
SoundEffectPad("Brush", SoundEffect("brush"))
SoundEffectPad("Shake", SoundEffect("shake"))
SoundEffectPad("Swipe", SoundEffect("swipe"))
SoundEffectPad("Swish", SoundEffect("swish"))
}
HStack {
SoundEffectPad("Wip", SoundEffect("wip"))
SoundEffectPad("Whooop", SoundEffect("whop"))
SoundEffectPad("Detach", SoundEffect("detach"))
SoundEffectPad("Detach", SoundEffect("detach")).hidden()
}
}
}
.padding()
}
.buttonStyle(SoundEffectButtonStyle())
.buttonStyle(.bordered)
}
static var description: some View {
Text("""
Triggers the playback of a sound.
- Parameters:
- `effect`: The `SoundEffect` to play back.
""")
}
static let localPath = LocalPath()
static var icon: Image? {
Image(systemName: "speaker.wave.2")
}
static let newIn0_2_0: Bool = true
}
private struct SoundEffectPad: View {
var name: String
var effect: SoundEffect
init(_ name: String, _ effect: SoundEffect) {
self.name = name
self.effect = effect
}
@State
private var triggers = 0
var body: some View {
Button(name) {
triggers += 1
}
.changeEffect(.feedback(effect), value: triggers)
}
}
private struct SoundEffectButtonStyle: ButtonStyle {
func makeBody(configuration: Configuration) -> some View {
configuration.label
.frame(maxWidth: .infinity, maxHeight: .infinity, alignment: .topLeading)
.font(.caption2)
.padding(4)
.foregroundStyle(.secondary)
.background(.tertiary, in: RoundedRectangle(cornerRadius: 3, style: .continuous))
.overlay {
if configuration.isPressed {
Circle()
.fill(RadialGradient(colors: [.white, .white.opacity(0.0)], center: .center, startRadius: 0, endRadius: 30))
.opacity(0.5)
}
}
.frame(height: 64)
}
}
struct SoundEffectExample_Previews: PreviewProvider {
static var previews: some View {
SoundEffectExample()
}
}