Current section
Files
Jump to
Current section
Files
examples/gallery.ex
defmodule Gallery do
@moduledoc """
Widget gallery for the Plushie Pad.
Demonstrates common widget types with static initial values. Interact
with each widget and watch the event log in the pad to see the events
they produce.
mix plushie.gui Gallery
"""
use Plushie.App
alias Plushie.Event.WidgetEvent
import Plushie.UI
def init(_opts) do
%{
input_value: "",
submit_value: "",
checked: false,
toggled: false,
slider_value: 50,
selected: "Apple",
radio: "A"
}
end
def update(model, %WidgetEvent{type: :input, id: "input", value: v}) do
%{model | input_value: v}
end
def update(model, %WidgetEvent{type: :input, id: "submit-input", value: v}) do
%{model | submit_value: v}
end
def update(model, %WidgetEvent{type: :submit, id: "submit-input"}) do
%{model | submit_value: ""}
end
def update(model, %WidgetEvent{type: :toggle, id: "check", value: v}) do
%{model | checked: v}
end
def update(model, %WidgetEvent{type: :toggle, id: "toggler", value: v}) do
%{model | toggled: v}
end
def update(model, %WidgetEvent{type: :slide, id: "slide", value: v}) do
%{model | slider_value: v}
end
def update(model, %WidgetEvent{type: :select, id: "pick", value: v}) do
%{model | selected: v}
end
def update(model, %WidgetEvent{type: :select, id: "radio-" <> _, value: v}) do
%{model | radio: v}
end
def update(model, _event), do: model
def view(model) do
window "main", title: "Widget Gallery" do
scrollable "gallery", height: :fill do
column padding: 16, spacing: 16 do
text("title", "Widget Gallery", size: 20)
text("h-buttons", "Buttons", size: 14, color: "#888")
row spacing: 8 do
button("btn-default", "Default")
button("btn-primary", "Primary", style: :primary)
button("btn-danger", "Danger", style: :danger)
button("btn-text", "Text", style: :text)
end
text("h-input", "Text Input", size: 14, color: "#888")
text_input("input", model.input_value, placeholder: "Type here...")
text_input("submit-input", model.submit_value,
placeholder: "Press Enter (on_submit)",
on_submit: true
)
text("h-toggles", "Toggles", size: 14, color: "#888")
row spacing: 16 do
checkbox("check", model.checked)
toggler("toggler", model.toggled)
end
text("h-slider", "Slider", size: 14, color: "#888")
slider("slide", {0, 100}, model.slider_value)
text("slide-value", "Value: #{model.slider_value}", size: 12)
text("h-select", "Selection", size: 14, color: "#888")
pick_list("pick", ["Apple", "Banana", "Cherry"], model.selected)
row spacing: 8 do
radio("radio-a", "A", model.radio)
radio("radio-b", "B", model.radio)
radio("radio-c", "C", model.radio)
end
text("h-display", "Display", size: 14, color: "#888")
progress_bar("progress", {0, 100}, 65)
rule()
text("styled", "Styled text", size: 18, color: "#3b82f6")
end
end
end
end
end