From dc7af935ecee646365df1c546290f981ee3da8ff Mon Sep 17 00:00:00 2001 From: Alexander Heldt Date: Fri, 26 Dec 2025 11:53:08 +0100 Subject: [PATCH] Replaced `Node.content` with `Node.heading` --- src/musicplayer/musicplayer.gleam | 6 +-- src/musicplayer/ui/control.gleam | 2 +- src/musicplayer/ui/layout.gleam | 43 ++++++++++++------- .../ui/layout_examples/layout_examples.gleam | 10 +++-- src/musicplayer/ui/plot.gleam | 12 ++++++ src/musicplayer/ui/ui.gleam | 15 ++++--- test/musicplayer/ui/layout_test.gleam | 9 ++-- 7 files changed, 62 insertions(+), 35 deletions(-) diff --git a/src/musicplayer/musicplayer.gleam b/src/musicplayer/musicplayer.gleam index a3dc53d..7e0f399 100644 --- a/src/musicplayer/musicplayer.gleam +++ b/src/musicplayer/musicplayer.gleam @@ -134,7 +134,7 @@ fn update_playback_time( Error(err) -> process.send( ui, - ui_control.UpdateState( + ui_control.UpdateHeading( layout.PlaybackTime, "playback time: N/A (err: " <> err.details <> ")", ), @@ -143,7 +143,7 @@ fn update_playback_time( Ok(mpv_control.PlaybackTime(data: playback_time)) -> process.send( ui, - ui_control.UpdateState( + ui_control.UpdateHeading( layout.PlaybackTime, "playback time: " <> time.to_duration_string(playback_time), ), @@ -152,7 +152,7 @@ fn update_playback_time( } fn update_search(ui: Subject(ui_control.Control), content: String) -> Nil { - process.send(ui, ui_control.UpdateState(layout.Search, content)) + process.send(ui, ui_control.UpdateHeading(layout.Search, content)) } fn update_current_view( diff --git a/src/musicplayer/ui/control.gleam b/src/musicplayer/ui/control.gleam index a800761..c97c09b 100644 --- a/src/musicplayer/ui/control.gleam +++ b/src/musicplayer/ui/control.gleam @@ -4,7 +4,7 @@ import musicplayer/ui/layout.{type Section, type ViewIdx} pub type Control { UpdateDimensions(columns: Int, rows: Int) - UpdateState(section: Section, content: String) + UpdateHeading(section: Section, heading: String) SetView(view_idx: ViewIdx) Exit(reply_to: Subject(Nil)) diff --git a/src/musicplayer/ui/layout.gleam b/src/musicplayer/ui/layout.gleam index ff845f6..c09496e 100644 --- a/src/musicplayer/ui/layout.gleam +++ b/src/musicplayer/ui/layout.gleam @@ -1,6 +1,7 @@ import gleam/dict import gleam/int import gleam/list +import gleam/option.{type Option, None, Some} import gleam/pair import gleam/set import gleam/string @@ -28,8 +29,8 @@ pub type Style { } pub type Node { - Row(content: String, style: Style, children: List(Section)) - Cell(content: String, style: Style) + Row(heading: Option(String), style: Style, children: List(Section)) + Cell(heading: Option(String), style: Style) } pub type ViewIdx = @@ -86,7 +87,7 @@ fn view_loop(i: ViewIdx, view_nodes: List(#(Section, Node))) -> View { |> dict.insert( view_index_section(i), Row( - content: "", + heading: None, style: Style(dimensions: Percent(width: 100, height: 100)), children: orphans, ), @@ -98,10 +99,10 @@ fn view_index_section(view_idx: ViewIdx) -> Section { Section(string.append("view_", int.to_string(view_idx))) } -pub fn update_section( +pub fn update_section_heading( layout: Layout, section: Section, - content: String, + heading: String, ) -> Layout { case dict.get(layout.views, layout.current_view) { Error(_) -> layout @@ -110,8 +111,8 @@ pub fn update_section( Error(_) -> layout Ok(node) -> { let updated_node = case node { - Cell(..) -> Cell(..node, content: content) - Row(..) -> Row(..node, content: content) + Cell(..) -> Cell(..node, heading: Some(heading)) + Row(..) -> Row(..node, heading: Some(heading)) } let updated_view = dict.insert(view, section, updated_node) @@ -203,15 +204,25 @@ pub fn render_loop( ) } - let parent = - plot.box( - buffer, - node_top_left_x, - node_top_left_y, - node_width, - node_height, - ) - |> plot.text(node.content, node_top_left_x, node_top_left_y) + let parent = case node.heading { + None -> + plot.box( + buffer, + node_top_left_x, + node_top_left_y, + node_width, + node_height, + ) + option.Some(heading) -> + plot.box_with_heading( + buffer, + node_top_left_x, + node_top_left_y, + node_width, + node_height, + heading, + ) + } case node { Cell(..) -> parent diff --git a/src/musicplayer/ui/layout_examples/layout_examples.gleam b/src/musicplayer/ui/layout_examples/layout_examples.gleam index 55e127c..1cbc8ed 100644 --- a/src/musicplayer/ui/layout_examples/layout_examples.gleam +++ b/src/musicplayer/ui/layout_examples/layout_examples.gleam @@ -1,3 +1,5 @@ +import gleam/option.{Some} + import musicplayer/ui/internal import musicplayer/ui/layout.{Percent, Section, Style} import musicplayer/ui/layout_examples/wait_for_input.{wait_for_input} @@ -21,7 +23,7 @@ fn two_rows_with_cells(columns: Int, rows: Int) -> layout.Layout { #( Section("Row1"), layout.Row( - content: "row 1", + heading: Some("row 1"), style: Style(dimensions: Percent(width: 100, height: 50)), children: [ Section("A"), @@ -32,21 +34,21 @@ fn two_rows_with_cells(columns: Int, rows: Int) -> layout.Layout { #( Section("A"), layout.Cell( - content: "cell 1", + heading: Some("cell 1"), style: Style(dimensions: Percent(width: 50, height: 50)), ), ), #( Section("B"), layout.Cell( - content: "cell 2", + heading: Some("cell 2"), style: Style(dimensions: Percent(width: 50, height: 50)), ), ), #( Section("Row2"), layout.Row( - content: "row 2", + heading: Some("row 2"), style: Style(dimensions: Percent(width: 50, height: 50)), children: [], ), diff --git a/src/musicplayer/ui/plot.gleam b/src/musicplayer/ui/plot.gleam index 4868bf3..32bd5be 100644 --- a/src/musicplayer/ui/plot.gleam +++ b/src/musicplayer/ui/plot.gleam @@ -49,6 +49,18 @@ pub fn box(buffer: Buffer, x: Int, y: Int, width: Int, height: Int) -> Buffer { } } +pub fn box_with_heading( + buffer: Buffer, + x: Int, + y: Int, + width: Int, + height: Int, + heading: String, +) -> Buffer { + box(buffer, x, y, width, height) + |> text(heading, x, y) +} + fn horizontal_line( buffer: Buffer, x: Int, diff --git a/src/musicplayer/ui/ui.gleam b/src/musicplayer/ui/ui.gleam index a12fede..d271f1a 100644 --- a/src/musicplayer/ui/ui.gleam +++ b/src/musicplayer/ui/ui.gleam @@ -1,6 +1,7 @@ import gleam/erlang/process.{type Subject} import gleam/int import gleam/list +import gleam/option.{None, Some} import gleam/otp/actor import gleam/string @@ -23,7 +24,7 @@ pub fn new() -> Result(Subject(Control), String) { #( layout.Header, layout.Row( - content: "Foo <1> | Bar (2)", + heading: Some("Foo <1> | Bar (2)"), style: layout.Style(dimensions: layout.Percent( width: 100, height: 50, @@ -34,7 +35,7 @@ pub fn new() -> Result(Subject(Control), String) { #( layout.PlaybackTime, layout.Row( - content: "00:00", + heading: None, style: layout.Style(dimensions: layout.Percent( width: 100, height: 50, @@ -47,7 +48,7 @@ pub fn new() -> Result(Subject(Control), String) { #( layout.Header, layout.Row( - content: "Foo (1) | Bar <2>", + heading: Some("Foo (1) | Bar <2>"), style: layout.Style(dimensions: layout.Percent( width: 100, height: 33, @@ -58,7 +59,7 @@ pub fn new() -> Result(Subject(Control), String) { #( layout.Search, layout.Row( - content: "", + heading: None, style: layout.Style(dimensions: layout.Percent( width: 100, height: 33, @@ -69,7 +70,7 @@ pub fn new() -> Result(Subject(Control), String) { #( layout.PlaybackTime, layout.Row( - content: "00:00", + heading: None, style: layout.Style(dimensions: layout.Percent( width: 100, height: 33, @@ -132,8 +133,8 @@ fn handle_message( } } } - control.UpdateState(section, content) -> { - let layout = layout.update_section(state.layout, section, content) + control.UpdateHeading(section, heading) -> { + let layout = layout.update_section_heading(state.layout, section, heading) actor.send(state.redraw, layout) actor.continue(State(..state, layout:)) diff --git a/test/musicplayer/ui/layout_test.gleam b/test/musicplayer/ui/layout_test.gleam index 871889e..dfe1cd4 100644 --- a/test/musicplayer/ui/layout_test.gleam +++ b/test/musicplayer/ui/layout_test.gleam @@ -1,5 +1,6 @@ import gleam/dict import gleam/io +import gleam/option.{Some} import gleam/string import gleeunit import gleeunit/should @@ -17,7 +18,7 @@ pub fn percent_layout_test() { #( Section("Row1"), layout.Row( - content: "row 1", + heading: Some("row 1"), style: Style(dimensions: Percent(width: 100, height: 50)), children: [ Section("A"), @@ -28,21 +29,21 @@ pub fn percent_layout_test() { #( Section("A"), layout.Cell( - content: "cell 1", + heading: Some("cell 1"), style: Style(dimensions: Percent(width: 50, height: 100)), ), ), #( Section("B"), layout.Cell( - content: "cell 2", + heading: Some("cell 2"), style: Style(dimensions: Percent(width: 50, height: 100)), ), ), #( Section("Row2"), layout.Row( - content: "row 1", + heading: Some("row 1"), style: Style(dimensions: Percent(width: 100, height: 50)), children: [], ),