# defmodule FloUI.Modal.ScrollLayout do
# @moduledoc """
# ## Usage in SnapFramework
# Scrolling layout modal component. Great for displaying content within a modal that needs to scroll.
# data is a tuple in the form of ` elixir {label, component, component_data, component_opts}`
# style opts
# `width: :integer`
# `height: :integer`
# `frame_width: :integer`
# `frame_height: :integer`
# `content_height: :integer`
# `content_width: :integer`
# `show_check: :boolean`
# `show_close: :boolean`
# ``` elixir
# <%= graph font_size: 20 %>
# <%= component FloUI.Modal.ScrollLayout,
# {"Label", FloUI.SelectionList, {@selection_list, @selected}, [id: :project_list]},
# id: :scroll_layout,
# width: 500,
# height: 520,
# frame_width: 480,
# frame_height: 500,
# content_width: 480,
# content_height: @content_height,
# show_check: true,
# show_close: true
# %>
# ```
# """
# use Scenic.Component
# alias Scenic.Graph
# import Scenic.Primitives
# alias FloUI.Theme
# alias FloUI.Modal.Body
# alias FloUI.Modal.Header
# import FloUI.Scrollable.Components
# @graph Graph.build(font_size: 16)
# def validate(nil), do: :invalid_data
# def validate(data), do: {:ok, data}
# def init(scene, {title, cmp, data, cmp_opts}, opts) do
# scene =
# assign(scene,
# graph: @graph,
# title: title,
# component: cmp,
# component_data: data,
# component_opts: cmp_opts,
# width: opts[:width] || 500,
# height: opts[:height] || 500,
# frame_width: opts[:frame_width] || 480,
# frame_height: opts[:frame_height] || 500,
# content_width: opts[:content_width] || 500,
# content_height: opts[:content_height] || 500,
# show_check: opts[:show_check] || false,
# show_close: opts[:show_close] || false
# )
# |> render_layout
# {:ok, scene}
# end
# def handle_event({:click, :btn_check}, _from, scene) do
# send_parent_event(scene, :modal_done)
# {:noreply, scene}
# end
# def handle_event({:click, :btn_close}, _from, scene) do
# send_parent_event(scene, :modal_close)
# {:noreply, scene}
# end
# def handle_event(event, _, scene) do
# {:cont, event, scene}
# end
# defp render_layout(
# %{
# assigns: %{
# graph: graph,
# title: title,
# component: cmp,
# component_data: cmp_data,
# component_opts: cmp_opts,
# width: width,
# height: height,
# frame_width: frame_width,
# frame_height: frame_height,
# content_width: content_width,
# content_height: content_height,
# show_check: show_check,
# show_close: show_close
# }
# } = scene
# ) do
# graph =
# graph
# |> Body.add_to_graph(nil, translate: {0, 50}, width: width, height: height)
# |> scrollable(
# %{
# frame: {frame_width, frame_height},
# content: %{x: 0, y: 10, width: content_width, height: content_height}
# },
# &cmp.add_to_graph(&1, cmp_data, cmp_opts),
# id: :scroll_box,
# translate: {0, 60},
# vertical_scroll_bar: [
# scroll_buttons: true,
# scroll_bar_theme: Scenic.Primitive.Style.Theme.preset(:dark),
# scroll_bar_thickness: 15
# ]
# )
# |> Header.add_to_graph(title, width: width, show_check: show_check, show_close: show_close)
# assign(scene, graph: graph)
# |> push_graph(graph)
# end
# end