From 3df1a50e51b4430509ff6c93273ef22ec6b62660 Mon Sep 17 00:00:00 2001 From: Alexander Heldt Date: Sun, 23 Nov 2025 10:41:55 +0100 Subject: [PATCH] wip --- src/musicplayer/musicplayer.gleam | 3 +++ src/musicplayer/ui/control.gleam | 4 +++- src/musicplayer/ui/section.gleam | 13 +++++++++++++ src/musicplayer/ui/ui.gleam | 20 ++++++++++++++++---- 4 files changed, 35 insertions(+), 5 deletions(-) create mode 100644 src/musicplayer/ui/section.gleam diff --git a/src/musicplayer/musicplayer.gleam b/src/musicplayer/musicplayer.gleam index 6abcc34..3ca4f14 100644 --- a/src/musicplayer/musicplayer.gleam +++ b/src/musicplayer/musicplayer.gleam @@ -8,6 +8,7 @@ import musicplayer/control.{type Control} import musicplayer/input/key.{type Key} import musicplayer/mpv/control as mpv_control import musicplayer/ui/control as ui_control +import musicplayer/ui/section type State(ui, mpv, input_inject, exit) { State( @@ -77,6 +78,7 @@ fn handle_message( process.send( state.ui, ui_control.UpdateState( + section.PlaybackTime, "playback time: N/A (err: " <> err.details <> ")", ), ) @@ -85,6 +87,7 @@ fn handle_message( process.send( state.ui, ui_control.UpdateState( + section.PlaybackTime, "playback time: " <> float.to_string(playback_time), ), ) diff --git a/src/musicplayer/ui/control.gleam b/src/musicplayer/ui/control.gleam index d8fc892..570def1 100644 --- a/src/musicplayer/ui/control.gleam +++ b/src/musicplayer/ui/control.gleam @@ -1,7 +1,9 @@ import gleam/erlang/process.{type Subject} +import musicplayer/ui/section.{type Section} + pub type Control { - UpdateState(content: String) + UpdateState(section: Section, content: String) Exit(reply_to: Subject(Nil)) } diff --git a/src/musicplayer/ui/section.gleam b/src/musicplayer/ui/section.gleam new file mode 100644 index 0000000..ba6ff5d --- /dev/null +++ b/src/musicplayer/ui/section.gleam @@ -0,0 +1,13 @@ +import gleam/dict + +pub type Section { + Header + PlaybackTime +} + +pub type Content { + Content(content: String) +} + +pub type SectionContent = + dict.Dict(Section, Content) diff --git a/src/musicplayer/ui/ui.gleam b/src/musicplayer/ui/ui.gleam index 3496926..4a0b8ad 100644 --- a/src/musicplayer/ui/ui.gleam +++ b/src/musicplayer/ui/ui.gleam @@ -1,19 +1,28 @@ +import gleam/dict import gleam/erlang/process.{type Subject} import gleam/otp/actor import gleam/string import musicplayer/ui/control.{type Control} import musicplayer/ui/internal as ui_internal +import musicplayer/ui/section.{type Section, type SectionContent, Content} pub type State(redraw, content) { - State(redraw: Subject(String), content: String) + State(redraw: Subject(SectionContent), sections: SectionContent) } pub fn new() -> Result(Subject(Control), String) { let redraw_name = process.new_name("redraw") let redraw: Subject(String) = process.named_subject(redraw_name) + + let sections = + dict.from_list([ + #(section.Header, Content("musicplayer:")), + #(section.PlaybackTime, Content("")), + ]) + case - actor.new(State(redraw, "")) + actor.new(State(redraw, sections)) |> actor.on_message(handle_message) |> actor.start { @@ -39,11 +48,14 @@ fn handle_message( control: Control, ) -> actor.Next(State(redraw, content), Control) { case control { - control.UpdateState(content) -> { + control.UpdateState(section, content) -> { + let content = dict.insert(state.content, section, content) let state = State(..state, content:) + actor.send(state.redraw, content) actor.continue(state) } + control.Exit(reply_to) -> { ui_internal.show_cursor() process.send(reply_to, Nil) @@ -52,7 +64,7 @@ fn handle_message( } } -fn redraw_loop(redraw: Subject(String)) -> Nil { +fn redraw_loop(redraw: Subject(SectionContent)) -> Nil { let content = process.receive_forever(redraw) ui_internal.clear_screen()