From 21c0e3f447a5482253ff8e04d4e0b1f5886efd9d Mon Sep 17 00:00:00 2001 From: filifa Date: Mon, 2 Sep 2024 22:17:11 -0500 Subject: [PATCH] cycle through presets with right --- cmd/root.go | 14 +++++++++++++- cmd/window.go | 49 +++++++++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 60 insertions(+), 3 deletions(-) diff --git a/cmd/root.go b/cmd/root.go index de5350f..f742943 100644 --- a/cmd/root.go +++ b/cmd/root.go @@ -25,6 +25,7 @@ import ( ) var preset string +var scriptPath string func handleWindowEvent(event *sdl.WindowEvent, m *milkDropWindow) { switch event.Event { @@ -34,6 +35,13 @@ func handleWindowEvent(event *sdl.WindowEvent, m *milkDropWindow) { } } +func handleKeyboardEvent(event *sdl.KeyboardEvent, m *milkDropWindow) { + scancode := event.Keysym.Scancode + if event.Type == sdl.KEYDOWN && scancode == sdl.SCANCODE_RIGHT { + m.nextPreset() + } +} + func handleEvent(event sdl.Event, m *milkDropWindow) bool { switch event.(type) { case *sdl.QuitEvent: @@ -41,6 +49,9 @@ func handleEvent(event sdl.Event, m *milkDropWindow) bool { case *sdl.WindowEvent: event := event.(*sdl.WindowEvent) handleWindowEvent(event, m) + case *sdl.KeyboardEvent: + event := event.(*sdl.KeyboardEvent) + handleKeyboardEvent(event, m) } return true @@ -60,7 +71,7 @@ func milkbucket(cmd *cobra.Command, args []string) { } defer sdl.Quit() - m, err := newMilkDropWindow(800, 600) + m, err := newMilkDropWindow(800, 600, scriptPath) if err != nil { panic(err) } @@ -115,4 +126,5 @@ func init() { // Cobra also supports local flags, which will only run // when this action is called directly. rootCmd.Flags().StringVarP(&preset, "preset", "p", "", "Preset file to use") + rootCmd.Flags().StringVarP(&scriptPath, "script", "s", "", "Script file to use") } diff --git a/cmd/window.go b/cmd/window.go index 70df481..07e9990 100644 --- a/cmd/window.go +++ b/cmd/window.go @@ -24,7 +24,9 @@ package cmd import "C" import ( + "container/ring" "encoding/binary" + "encoding/json" "errors" "io" "os" @@ -39,12 +41,55 @@ type milkDropWindow struct { window *sdl.Window context sdl.GLContext handle C.projectm_handle + preset *ring.Ring } -func newMilkDropWindow(width, height int32) (*milkDropWindow, error) { +type script struct { + Presets []string + Times []float64 +} + +func readScript(scriptPath string) (*script, error) { + if scriptPath == "" { + return nil, errors.New("no script given") + } + + f, err := os.Open(scriptPath) + if err != nil { + return nil, err + } + defer f.Close() + + data, err := io.ReadAll(f) + if err != nil { + return nil, err + } + + var s script + err = json.Unmarshal(data, &s) + return &s, err +} + +func (m *milkDropWindow) nextPreset() { + m.preset = m.preset.Next() + m.loadPreset(m.preset.Value.(string)) +} + +func newMilkDropWindow(width, height int32, scriptPath string) (*milkDropWindow, error) { var m milkDropWindow var err error + s, err := readScript(scriptPath) + if err != nil { + return nil, err + } + + m.preset = ring.New(len(s.Presets)) + for _, preset := range s.Presets { + m.preset.Value = preset + m.preset = m.preset.Next() + } + m.window, err = sdl.CreateWindow("milkbucket", sdl.WINDOWPOS_UNDEFINED, sdl.WINDOWPOS_UNDEFINED, width, height, sdl.WINDOW_OPENGL|sdl.WINDOW_RESIZABLE) if err != nil { return &m, err @@ -74,7 +119,7 @@ func (m *milkDropWindow) destroy() { func (m *milkDropWindow) loadPreset(preset string) { cPreset := C.CString(preset) defer C.free(unsafe.Pointer(cPreset)) - C.projectm_load_preset_file(m.handle, cPreset, false) + C.projectm_load_preset_file(m.handle, cPreset, true) } func (m *milkDropWindow) render() (bool, error) {