Compare commits
1 Commits
layout
...
section-co
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
3df1a50e51 |
@@ -8,6 +8,7 @@ import musicplayer/control.{type Control}
|
|||||||
import musicplayer/input/key.{type Key}
|
import musicplayer/input/key.{type Key}
|
||||||
import musicplayer/mpv/control as mpv_control
|
import musicplayer/mpv/control as mpv_control
|
||||||
import musicplayer/ui/control as ui_control
|
import musicplayer/ui/control as ui_control
|
||||||
|
import musicplayer/ui/section
|
||||||
|
|
||||||
type State(ui, mpv, input_inject, exit) {
|
type State(ui, mpv, input_inject, exit) {
|
||||||
State(
|
State(
|
||||||
@@ -77,6 +78,7 @@ fn handle_message(
|
|||||||
process.send(
|
process.send(
|
||||||
state.ui,
|
state.ui,
|
||||||
ui_control.UpdateState(
|
ui_control.UpdateState(
|
||||||
|
section.PlaybackTime,
|
||||||
"playback time: N/A (err: " <> err.details <> ")",
|
"playback time: N/A (err: " <> err.details <> ")",
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
@@ -85,6 +87,7 @@ fn handle_message(
|
|||||||
process.send(
|
process.send(
|
||||||
state.ui,
|
state.ui,
|
||||||
ui_control.UpdateState(
|
ui_control.UpdateState(
|
||||||
|
section.PlaybackTime,
|
||||||
"playback time: " <> float.to_string(playback_time),
|
"playback time: " <> float.to_string(playback_time),
|
||||||
),
|
),
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -1,7 +1,9 @@
|
|||||||
import gleam/erlang/process.{type Subject}
|
import gleam/erlang/process.{type Subject}
|
||||||
|
|
||||||
|
import musicplayer/ui/section.{type Section}
|
||||||
|
|
||||||
pub type Control {
|
pub type Control {
|
||||||
UpdateState(content: String)
|
UpdateState(section: Section, content: String)
|
||||||
|
|
||||||
Exit(reply_to: Subject(Nil))
|
Exit(reply_to: Subject(Nil))
|
||||||
}
|
}
|
||||||
|
|||||||
13
src/musicplayer/ui/section.gleam
Normal file
13
src/musicplayer/ui/section.gleam
Normal file
@@ -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)
|
||||||
@@ -1,19 +1,28 @@
|
|||||||
|
import gleam/dict
|
||||||
import gleam/erlang/process.{type Subject}
|
import gleam/erlang/process.{type Subject}
|
||||||
import gleam/otp/actor
|
import gleam/otp/actor
|
||||||
import gleam/string
|
import gleam/string
|
||||||
|
|
||||||
import musicplayer/ui/control.{type Control}
|
import musicplayer/ui/control.{type Control}
|
||||||
import musicplayer/ui/internal as ui_internal
|
import musicplayer/ui/internal as ui_internal
|
||||||
|
import musicplayer/ui/section.{type Section, type SectionContent, Content}
|
||||||
|
|
||||||
pub type State(redraw, 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) {
|
pub fn new() -> Result(Subject(Control), String) {
|
||||||
let redraw_name = process.new_name("redraw")
|
let redraw_name = process.new_name("redraw")
|
||||||
let redraw: Subject(String) = process.named_subject(redraw_name)
|
let redraw: Subject(String) = process.named_subject(redraw_name)
|
||||||
|
|
||||||
|
let sections =
|
||||||
|
dict.from_list([
|
||||||
|
#(section.Header, Content("musicplayer:")),
|
||||||
|
#(section.PlaybackTime, Content("")),
|
||||||
|
])
|
||||||
|
|
||||||
case
|
case
|
||||||
actor.new(State(redraw, ""))
|
actor.new(State(redraw, sections))
|
||||||
|> actor.on_message(handle_message)
|
|> actor.on_message(handle_message)
|
||||||
|> actor.start
|
|> actor.start
|
||||||
{
|
{
|
||||||
@@ -39,11 +48,14 @@ fn handle_message(
|
|||||||
control: Control,
|
control: Control,
|
||||||
) -> actor.Next(State(redraw, content), Control) {
|
) -> actor.Next(State(redraw, content), Control) {
|
||||||
case control {
|
case control {
|
||||||
control.UpdateState(content) -> {
|
control.UpdateState(section, content) -> {
|
||||||
|
let content = dict.insert(state.content, section, content)
|
||||||
let state = State(..state, content:)
|
let state = State(..state, content:)
|
||||||
|
|
||||||
actor.send(state.redraw, content)
|
actor.send(state.redraw, content)
|
||||||
actor.continue(state)
|
actor.continue(state)
|
||||||
}
|
}
|
||||||
|
|
||||||
control.Exit(reply_to) -> {
|
control.Exit(reply_to) -> {
|
||||||
ui_internal.show_cursor()
|
ui_internal.show_cursor()
|
||||||
process.send(reply_to, Nil)
|
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)
|
let content = process.receive_forever(redraw)
|
||||||
|
|
||||||
ui_internal.clear_screen()
|
ui_internal.clear_screen()
|
||||||
|
|||||||
Reference in New Issue
Block a user