92 lines
3.0 KiB
Go
92 lines
3.0 KiB
Go
package undoable
|
|
|
|
import (
|
|
"github.com/inkyblackness/hacked/ss1/content/audio"
|
|
"github.com/inkyblackness/hacked/ss1/edit"
|
|
"github.com/inkyblackness/hacked/ss1/edit/undoable/cmd"
|
|
"github.com/inkyblackness/hacked/ss1/resource"
|
|
"github.com/inkyblackness/hacked/ss1/world"
|
|
)
|
|
|
|
// AugmentedTextService provides read/write functionality with undo capability.
|
|
type AugmentedTextService struct {
|
|
wrapped edit.AugmentedTextService
|
|
commander cmd.Commander
|
|
}
|
|
|
|
// NewAugmentedTextService returns a new instance of a service.
|
|
func NewAugmentedTextService(wrapped edit.AugmentedTextService, commander cmd.Commander) AugmentedTextService {
|
|
return AugmentedTextService{
|
|
wrapped: wrapped,
|
|
commander: commander,
|
|
}
|
|
}
|
|
|
|
// WithAudio returns true if the identified resource is one with an audio component.
|
|
func (service AugmentedTextService) WithAudio(key resource.Key) bool {
|
|
return service.wrapped.WithAudio(key)
|
|
}
|
|
|
|
// Text returns the textual value of the identified text resource.
|
|
func (service AugmentedTextService) Text(key resource.Key) string {
|
|
return service.wrapped.Text(key)
|
|
}
|
|
|
|
// RequestSetText queues the change to update the text.
|
|
func (service AugmentedTextService) RequestSetText(key resource.Key, value string, restoreFunc func()) {
|
|
service.requestCommand(
|
|
func(setter edit.AugmentedTextBlockSetter) {
|
|
service.wrapped.SetText(setter, key, value)
|
|
},
|
|
service.wrapped.RestoreTextFunc(key),
|
|
restoreFunc)
|
|
}
|
|
|
|
// Sound returns the audio value of the identified text resource.
|
|
// In case the text resource has no audio, an empty sound will be returned.
|
|
func (service AugmentedTextService) Sound(key resource.Key) audio.L8 {
|
|
return service.wrapped.Sound(key)
|
|
}
|
|
|
|
// RequestSetSound queues the change to update the sound.
|
|
func (service AugmentedTextService) RequestSetSound(key resource.Key, sound audio.L8, restoreFunc func()) {
|
|
service.requestCommand(
|
|
func(setter edit.AugmentedTextBlockSetter) {
|
|
service.wrapped.SetSound(setter, key, sound)
|
|
},
|
|
service.wrapped.RestoreSoundFunc(key),
|
|
restoreFunc)
|
|
}
|
|
|
|
// RequestClear queues the change to set both the text and the sound empty.
|
|
func (service AugmentedTextService) RequestClear(key resource.Key, restoreFunc func()) {
|
|
service.requestCommand(
|
|
func(setter edit.AugmentedTextBlockSetter) {
|
|
service.wrapped.Clear(setter, key)
|
|
},
|
|
service.wrapped.RestoreFunc(key),
|
|
restoreFunc)
|
|
}
|
|
|
|
// RequestRemove queues the change to remove both the text and the sound from the storage.
|
|
func (service AugmentedTextService) RequestRemove(key resource.Key, restoreFunc func()) {
|
|
service.requestCommand(
|
|
func(setter edit.AugmentedTextBlockSetter) {
|
|
service.wrapped.Remove(setter, key)
|
|
},
|
|
service.wrapped.RestoreFunc(key),
|
|
restoreFunc)
|
|
}
|
|
|
|
func (service AugmentedTextService) requestCommand(
|
|
forward func(modder edit.AugmentedTextBlockSetter),
|
|
reverse func(modder edit.AugmentedTextBlockSetter),
|
|
restore func()) {
|
|
c := command{
|
|
forward: func(modder world.Modder) { forward(modder) },
|
|
reverse: func(modder world.Modder) { reverse(modder) },
|
|
restore: restore,
|
|
}
|
|
service.commander.Queue(c)
|
|
}
|