2023-06-22 18:18:58 +03:00
|
|
|
interface GuiFormatter
|
|
|
|
exposes [
|
|
|
|
GuiFormatter,
|
|
|
|
toGui,
|
|
|
|
]
|
|
|
|
imports [
|
|
|
|
Inspect.{
|
|
|
|
Formatter,
|
|
|
|
Inspector,
|
|
|
|
},
|
|
|
|
]
|
|
|
|
|
|
|
|
## This can't depend on the platform, so I just copied all of this.
|
|
|
|
|
|
|
|
Rgba : { r : F32, g : F32, b : F32, a : F32 }
|
|
|
|
ButtonStyles : { bgColor : Rgba, borderColor : Rgba, borderWidth : F32, textColor : Rgba }
|
|
|
|
Elem : [Button Elem ButtonStyles, Col (List Elem), Row (List Elem), Text Str]
|
|
|
|
|
|
|
|
GuiFormatter := { nodes : List Elem }
|
|
|
|
has [
|
|
|
|
Formatter {
|
|
|
|
init: init,
|
|
|
|
list: list,
|
2023-06-23 04:29:02 +03:00
|
|
|
set: set,
|
2023-06-22 18:18:58 +03:00
|
|
|
dict: dict,
|
|
|
|
tag: tag,
|
|
|
|
tuple: tuple,
|
|
|
|
record: record,
|
|
|
|
bool: bool,
|
|
|
|
str: str,
|
|
|
|
u8: u8,
|
|
|
|
i8: i8,
|
|
|
|
u16: u16,
|
|
|
|
i16: i16,
|
|
|
|
u32: u32,
|
|
|
|
i32: i32,
|
|
|
|
u64: u64,
|
|
|
|
i64: i64,
|
|
|
|
u128: u128,
|
|
|
|
i128: i128,
|
|
|
|
f32: f32,
|
|
|
|
f64: f64,
|
|
|
|
dec: dec,
|
|
|
|
|
|
|
|
},
|
|
|
|
]
|
|
|
|
|
|
|
|
init : {} -> GuiFormatter
|
|
|
|
init = \{} -> @GuiFormatter { nodes: [] }
|
|
|
|
|
2023-06-23 04:29:02 +03:00
|
|
|
list : list, Inspect.ElemWalkFn GuiFormatter list elem, (elem -> Inspector GuiFormatter) -> Inspector GuiFormatter
|
|
|
|
list = \content, walkFn, toInspector ->
|
2023-06-22 18:18:58 +03:00
|
|
|
f0 <- Inspect.custom
|
|
|
|
# Use a temporary buffer for the children nodes
|
|
|
|
(@GuiFormatter { nodes }) =
|
|
|
|
init {}
|
|
|
|
|> \f1 ->
|
2023-06-23 04:29:02 +03:00
|
|
|
f2, elem <- walkFn content f1
|
2023-06-22 18:18:58 +03:00
|
|
|
elem
|
|
|
|
|> toInspector
|
|
|
|
|> Inspect.apply f2
|
|
|
|
|
|
|
|
addNode f0 (Col nodes)
|
|
|
|
|
2023-06-23 04:29:02 +03:00
|
|
|
set : set, Inspect.ElemWalkFn GuiFormatter set elem, (elem -> Inspector GuiFormatter) -> Inspector GuiFormatter
|
|
|
|
set = \content, walkFn, toInspector ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
# Use a temporary buffer for the children nodes
|
|
|
|
(@GuiFormatter { nodes }) =
|
|
|
|
init {}
|
|
|
|
|> \f1 ->
|
|
|
|
f2, elem <- walkFn content f1
|
|
|
|
elem
|
|
|
|
|> toInspector
|
|
|
|
|> Inspect.apply f2
|
|
|
|
|
|
|
|
addNode f0 (Col nodes)
|
|
|
|
|
|
|
|
dict : dict, Inspect.KeyValWalkFn GuiFormatter dict key value, (key -> Inspector GuiFormatter), (value -> Inspector GuiFormatter) -> Inspector GuiFormatter
|
|
|
|
dict = \d, walkFn, keyToInspector, valueToInspector ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
# Use a temporary buffer for the children nodes
|
|
|
|
(@GuiFormatter { nodes }) =
|
|
|
|
init {}
|
|
|
|
|> \f1 ->
|
|
|
|
f2, key, value <- walkFn d f1
|
|
|
|
(@GuiFormatter { nodes: innerNodes }) =
|
|
|
|
init {}
|
|
|
|
|> \x -> Inspect.apply (keyToInspector key) x
|
|
|
|
|> addNode (Text ":")
|
|
|
|
|> \x -> Inspect.apply (valueToInspector value) x
|
|
|
|
|
|
|
|
addNode f2 (Row innerNodes)
|
|
|
|
|
|
|
|
addNode f0 (Col nodes)
|
|
|
|
|
2023-06-22 18:18:58 +03:00
|
|
|
tag : Str, List (Inspector GuiFormatter) -> Inspector GuiFormatter
|
|
|
|
tag = \name, fields ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
# Use a temporary buffer for the children nodes
|
|
|
|
(@GuiFormatter { nodes }) =
|
|
|
|
init {}
|
|
|
|
|> addNode (Text name)
|
|
|
|
|> \f1 ->
|
|
|
|
f2, fieldInspector <- List.walk fields f1
|
|
|
|
Inspect.apply fieldInspector f2
|
|
|
|
|
|
|
|
addNode f0 (Row nodes)
|
|
|
|
|
|
|
|
tuple : List (Inspector GuiFormatter) -> Inspector GuiFormatter
|
|
|
|
tuple = \fields ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
# Use a temporary buffer for the children nodes
|
|
|
|
(@GuiFormatter { nodes }) =
|
|
|
|
init {}
|
|
|
|
|> \f1 ->
|
|
|
|
f2, fieldInspector <- List.walk fields f1
|
|
|
|
Inspect.apply fieldInspector f2
|
|
|
|
|
|
|
|
addNode f0 (Row nodes)
|
|
|
|
|
|
|
|
record : List { key : Str, value : Inspector GuiFormatter } -> Inspector GuiFormatter
|
|
|
|
record = \fields ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
# Use a temporary buffer for the children nodes
|
|
|
|
(@GuiFormatter { nodes }) =
|
|
|
|
init {}
|
|
|
|
|> \f1 ->
|
|
|
|
f2, { key, value } <- List.walk fields f1
|
|
|
|
(@GuiFormatter { nodes: innerNodes }) =
|
|
|
|
init {}
|
|
|
|
|> addNode (Text key)
|
|
|
|
|> addNode (Text ":")
|
|
|
|
|> \x -> Inspect.apply value x
|
|
|
|
|
|
|
|
addNode f2 (Row innerNodes)
|
|
|
|
|
|
|
|
addNode f0 (Col nodes)
|
|
|
|
|
|
|
|
bool : Bool -> Inspector GuiFormatter
|
|
|
|
bool = \b ->
|
|
|
|
if b then
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (Text "true")
|
|
|
|
else
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (Text "false")
|
|
|
|
|
|
|
|
str : Str -> Inspector GuiFormatter
|
|
|
|
str = \s ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (Text "\"\(s)\"")
|
|
|
|
|
|
|
|
u8 : U8 -> Inspector GuiFormatter
|
|
|
|
u8 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
i8 : I8 -> Inspector GuiFormatter
|
|
|
|
i8 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
u16 : U16 -> Inspector GuiFormatter
|
|
|
|
u16 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
i16 : I16 -> Inspector GuiFormatter
|
|
|
|
i16 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
u32 : U32 -> Inspector GuiFormatter
|
|
|
|
u32 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
i32 : I32 -> Inspector GuiFormatter
|
|
|
|
i32 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
u64 : U64 -> Inspector GuiFormatter
|
|
|
|
u64 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
i64 : I64 -> Inspector GuiFormatter
|
|
|
|
i64 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
u128 : U128 -> Inspector GuiFormatter
|
|
|
|
u128 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
i128 : I128 -> Inspector GuiFormatter
|
|
|
|
i128 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
f32 : F32 -> Inspector GuiFormatter
|
|
|
|
f32 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
f64 : F64 -> Inspector GuiFormatter
|
|
|
|
f64 = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
dec : Dec -> Inspector GuiFormatter
|
|
|
|
dec = \num ->
|
|
|
|
f0 <- Inspect.custom
|
|
|
|
addNode f0 (num |> Num.toStr |> Text)
|
|
|
|
|
|
|
|
addNode : GuiFormatter, Elem -> GuiFormatter
|
|
|
|
addNode = \@GuiFormatter { nodes }, node ->
|
|
|
|
@GuiFormatter { nodes: List.append nodes node }
|
|
|
|
|
|
|
|
toGui : GuiFormatter -> Elem
|
|
|
|
toGui = \@GuiFormatter { nodes } -> Col nodes
|
|
|
|
|