EmergeTools / Pow

Delightful SwiftUI effects for your app
https://movingparts.io/pow
MIT License
3.63k stars 153 forks source link

Idea: Composed Pow Effects Syntax #31

Open mergesort opened 1 year ago

mergesort commented 1 year ago

I've recently found myself combining multiple effects, for example haptics and sounds or more complex effects like spinning and jumping an element at the same time.

I do this by adding two changeEffect calls, like so.

.changeEffect([.feedback(hapticImpact: .medium)], value: self.hasAnimated)
.changeEffect([.feedback(SoundEffect(url: SoundEffect.plinkSound))], value: self.hasAnimated)

The more effects I wish to chain together the longer the code grows, and the more call-sites I need to change grow the more I tweak the animation.

Instead I'd like to propose a few options that could work, as syntax that takes two modifiers and chains them together.

The simplest is an array:

.changeEffect([.feedback(hapticImpact: .medium), .feedback(SoundEffect(url: SoundEffect.plinkSound))], value: self.hasAnimated)

Which could even become variadics, now that they've become more powerful:

.changeEffect(.feedback(hapticImpact: .medium), .feedback(SoundEffect(url: SoundEffect.plinkSound)), value: self.hasAnimated)

Alternatively a function like composed(with: ) or adding(_ effect:) could be added to compose:

.changeEffect(.feedback(hapticImpact: .medium).composed(with: .feedback(SoundEffect(url: SoundEffect.plinkSound))), value: self.hasAnimated)

And lastly, perhaps using + operator:

.changeEffect(.feedback(hapticImpact: .medium) + .feedback(SoundEffect(url: SoundEffect.plinkSound)), value: self.hasAnimated)

Thank you as always! Would love to hear what you think, and if any of those seem like a good idea.

robb commented 1 year ago

Sounds like a good idea. I'm leaning towards matching AnyTransition and going with something like

myView
  .changeEffect(
    .feedback(hapticImpact: .medium).combined(with: .feedback(SoundEffect(url: SoundEffect.plinkSound))),
    value: self.hasAnimated
  )

WDYT?

mergesort commented 1 year ago

I think matching the behavior is a great idea. I’ll admit that I’m not particularly picky about the name, so I’ll happily say that .combined sounds like a great choice for the API.