export let terminal_target_list = value => value != "" ? filter(split(",", value), target => trim(target) != "") : []
export let terminal_remove_events = (targets, trigger) => map(targets, target => {
trigger = trigger,
target = trim(target),
state = "shown",
mode = "remove"
})
export let terminal_leave_events = (targets, guard_targets) => map(targets, target => {
trigger = "mouse_leave",
target = trim(target),
state = "shown",
mode = "remove",
guard_targets = guard_targets
})
export let terminal_menu_item_data = item => {
label = attr_or(item, "label", "Item"),
target = attr_or(item, "target", ""),
close_targets = attr_or(item, "close_targets", ""),
disabled = attr_or(item, "disabled", "false") == "true"
}
export let terminal_menu_item_events = (item, sibling_targets, default_close_targets, click_close_targets) => {
let target = item.target
let item_close_targets = item.close_targets != "" ? wdoc::terminal_target_list(item.close_targets) : (len(default_close_targets) > 0 ? default_close_targets : sibling_targets)
let hover_close_targets = filter(item_close_targets, close_target => trim(close_target) != target)
let open_event = target != "" ? [{ trigger = "hover", target = target, state = "shown", mode = "add" }] : []
let click_targets = distinct(concat(click_close_targets, target != "" ? [target] : []))
item.disabled ? [] : concat(concat(concat(
[{ trigger = "hover", state = "hovered", mode = "while" }],
wdoc::terminal_remove_events(hover_close_targets, "hover")
), open_event), wdoc::terminal_remove_events(click_targets, "click"))
}
export let terminal_menu_item_shape = (b, item, i, row, col, cols, foreground_fill, background_fill, hover_foreground_fill, hover_background_fill, sibling_targets, default_close_targets, click_close_targets) => {
let target = item.target
let item_id = to_string(b.id) + "_item_" + to_string(i)
let item_class = item.disabled ? "wdoc-terminal-menu-item wdoc-terminal-menu-item-disabled" : "wdoc-terminal-menu-item"
let label_cols = target != "" ? cols - 3 : cols - 1
let label = substr(item.label, 0, label_cols)
let normal_text = " " + label
let arrow = target != "" ? [
{ kind = "terminal_text", id = item_id + "_arrow", row = row + i, col = col + cols - 1, content = ">", foreground_fill = foreground_fill, _wdoc_runtime = "true", pointer_events = "none" },
{ kind = "terminal_text", id = item_id + "_arrow_hover", row = row + i, col = col + cols - 1, content = ">", foreground_fill = hover_foreground_fill, class = "wdoc-terminal-menu-item-label-hover", _wdoc_runtime = "true", pointer_events = "none" }
] : []
{
kind = "group",
id = item_id,
row = row + i,
col = col,
rows = 1,
cols = cols,
class = item_class,
cursor = item.disabled ? "default" : "pointer",
pointer_events = item.disabled ? "none" : "all",
_wdoc_runtime = "true",
_wdoc_terminal_grid_group = "true",
events = wdoc::terminal_menu_item_events(item, sibling_targets, default_close_targets, click_close_targets),
children = concat([
{ kind = "terminal_surface", id = item_id + "_bg", row = row + i, col = col, cols = cols, background_fill = background_fill, _wdoc_runtime = "true" },
{ kind = "terminal_surface", id = item_id + "_hover_bg", row = row + i, col = col, cols = cols, background_fill = hover_background_fill, class = "wdoc-terminal-menu-item-bg", _wdoc_runtime = "true" },
{ kind = "terminal_text", id = item_id + "_label", row = row + i, col = col, cols = cols, content = normal_text, foreground_fill = foreground_fill, _wdoc_runtime = "true", pointer_events = "none" },
{ kind = "terminal_text", id = item_id + "_label_hover", row = row + i, col = col, cols = cols, content = normal_text, foreground_fill = hover_foreground_fill, class = "wdoc-terminal-menu-item-label-hover", _wdoc_runtime = "true", pointer_events = "none" }
], arrow)
}
}
export let terminal_menu_body = (b, context_menu) => {
let row = attr_or(b, "row", 0)
let col = attr_or(b, "col", 0)
let item_blocks = children(b, "wdoc::draw::menu_item")
let items = map(item_blocks, item => wdoc::terminal_menu_item_data(item))
let rows = attr_or(b, "rows", len(items) > 0 ? len(items) : 1)
let cols = attr_or(b, "cols", 18)
let foreground_fill = attr_or(b, "foreground_fill", attr_or(b, "fill", "#d7e0ff"))
let background_fill = attr_or(b, "background_fill", "#08111f")
let hover_foreground_fill = attr_or(b, "hover_foreground_fill", attr_or(b, "selected_foreground_fill", "#08111f"))
let hover_background_fill = attr_or(b, "hover_background_fill", attr_or(b, "selected_background_fill", "#d7e0ff"))
let default_close_targets = wdoc::terminal_target_list(attr_or(b, "close_targets", ""))
let sibling_targets = filter(map(items, item => item.target), target => target != "")
let leave_targets = wdoc::terminal_target_list(attr_or(b, "leave_close_targets", ""))
let leave_guard_targets = attr_or(b, "leave_guard_targets", join(",", leave_targets))
let click_close_targets = distinct(concat(concat([to_string(b.id)], leave_targets), concat(default_close_targets, sibling_targets)))
let base_class = attr_or(b, "class", "")
let menu_class = trim(base_class + " wdoc-terminal-menu")
let leave_events = wdoc::terminal_leave_events(leave_targets, leave_guard_targets)
let visible_items = map(range(0, min(rows, len(items))), i => wdoc::terminal_menu_item_shape(b, items[i], i, row, col, cols, foreground_fill, background_fill, hover_foreground_fill, hover_background_fill, sibling_targets, default_close_targets, click_close_targets))
[
{
kind = "group",
id = to_string(b.id),
row = row,
col = col,
rows = rows,
cols = cols,
class = menu_class,
_wdoc_runtime = "true",
_wdoc_terminal_grid_group = "true",
events = leave_events,
children = concat([
{ kind = "terminal_surface", id = to_string(b.id) + "_surface", row = row, col = col, rows = rows, cols = cols, background_fill = background_fill, _wdoc_runtime = "true" }
], visible_items)
}
]
}
export let terminal_widget_menu = b => wdoc::terminal_menu_body(b, false)
export let terminal_widget_context_menu = b => wdoc::terminal_menu_body(b, true)