From 0425d055454b53f61a8989385ff7ef155d084ad9 Mon Sep 17 00:00:00 2001 From: Fons van der Plas Date: Sun, 31 Oct 2021 01:06:49 +0200 Subject: [PATCH 1/7] AbstractPlutoDingetjes integration --- Project.toml | 2 + src/Builtins.jl | 119 ++++++++++++++++++++++++++++++++++++++++--- src/Clock.jl | 31 ++++++++++- src/MultiCheckBox.jl | 12 +++++ src/Scrubbable.jl | 38 ++++++++++++-- 5 files changed, 189 insertions(+), 13 deletions(-) diff --git a/Project.toml b/Project.toml index 8e244c83..e9532736 100644 --- a/Project.toml +++ b/Project.toml @@ -4,6 +4,7 @@ authors = ["Fons van der Plas "] version = "0.7.17" [deps] +AbstractPlutoDingetjes = "6e696c72-6542-2067-7265-42206c756150" Base64 = "2a0f44e3-6c83-55bd-87e4-b1978d98bd5f" Dates = "ade2ca70-3891-5945-98fb-dc099432e06a" Hyperscript = "47d2ed2b-36de-50cf-bf87-49c2cf4b8b91" @@ -18,6 +19,7 @@ Reexport = "189a3867-3050-52da-a836-e630ba90ab69" UUIDs = "cf7118a7-6976-5b1a-9a39-7adc72f591a4" [compat] +AbstractPlutoDingetjes = "1" Hyperscript = "0.0.4" HypertextLiteral = "0.8, 0.9" IOCapture = "0.2" diff --git a/src/Builtins.jl b/src/Builtins.jl index 168f7f29..f89969d4 100644 --- a/src/Builtins.jl +++ b/src/Builtins.jl @@ -1,5 +1,5 @@ ### A Pluto.jl notebook ### -# v0.16.1 +# v0.17.0 using Markdown using InteractiveUtils @@ -55,11 +55,14 @@ import Random: randstring # ╔═╡ 6da84fb9-a629-4e4c-819e-dd87a3e267ce import Dates +# ╔═╡ dc3b6628-f453-46d9-b6a1-957608a20764 +import AbstractPlutoDingetjes + # ╔═╡ d088bcdb-d851-4ad7-b5a0-751c1f348995 begin struct Slider range::AbstractRange - default::Number + default::Real show_value::Bool end @@ -95,6 +98,11 @@ begin end Base.get(slider::Slider) = slider.default + AbstractPlutoDingetjes.Bonds.initial_value(slider::Slider) = slider.default + AbstractPlutoDingetjes.Bonds.possible_values(slider::Slider) = slider.range + function AbstractPlutoDingetjes.Bonds.validate_value(slider::Slider, val) + val isa Real && (minimum(slider) - 0.0001 <= val <= maximum(slider) + 0.0001) + end end # ╔═╡ f59eef32-4732-46db-87b0-3564433ce43e @@ -121,7 +129,11 @@ begin end Base.get(numberfield::NumberField) = numberfield.default - + AbstractPlutoDingetjes.Bonds.initial_value(nf::NumberField) = nf.default + AbstractPlutoDingetjes.Bonds.possible_values(nf::NumberField) = nf.range + function AbstractPlutoDingetjes.Bonds.validate_value(nf::NumberField, val) + val isa Real && (minimum(nf) - 0.0001 <= val <= maximum(nf) + 0.0001) + end end # ╔═╡ b7c21c22-17f5-44b8-98de-a261d5c7192b @@ -161,6 +173,11 @@ begin end Base.get(button::LabelButton) = button.label + AbstractPlutoDingetjes.Bonds.initial_value(b::LabelButton) = b.label + AbstractPlutoDingetjes.Bonds.possible_values(b::LabelButton) = [b.label] + function AbstractPlutoDingetjes.Bonds.validate_value(b::LabelButton, val) + val == b.label + end end # ╔═╡ 7f8e4abf-e7e7-47bc-b1cc-514fa1af106c @@ -223,6 +240,11 @@ begin end Base.get(button::CounterButton) = button.label + AbstractPlutoDingetjes.Bonds.initial_value(b::CounterButton) = 0 + AbstractPlutoDingetjes.Bonds.possible_values(b::CounterButton) = AbstractPlutoDingetjes.Bonds.InfinitePossibilities() + function AbstractPlutoDingetjes.Bonds.validate_value(b::CounterButton, val) + val isa Integer && val >= 0 + end end # ╔═╡ 76c3b77b-08aa-4899-bbdd-4f8faa8d1486 @@ -248,6 +270,11 @@ begin end Base.get(checkbox::CheckBox) = checkbox.default + AbstractPlutoDingetjes.Bonds.initial_value(b::CheckBox) = b.default + AbstractPlutoDingetjes.Bonds.possible_values(b::CheckBox) = [false, true] + function AbstractPlutoDingetjes.Bonds.validate_value(b::CheckBox, val) + val isa Bool + end end # ╔═╡ f81bb386-203b-4392-b974-a1e2146b1a08 @@ -282,6 +309,11 @@ begin end Base.get(textfield::TextField) = textfield.default + AbstractPlutoDingetjes.Bonds.initial_value(t::TextField) = t.default + AbstractPlutoDingetjes.Bonds.possible_values(t::TextField) = AbstractPlutoDingetjes.Bonds.InfinitePossibilities() + function AbstractPlutoDingetjes.Bonds.validate_value(t::TextField, val) + t isa AbstractString + end end # ╔═╡ 4363f31e-1d71-4ad8-bfe8-04403d2d3621 @@ -310,7 +342,11 @@ begin end Base.get(passwordfield::PasswordField) = passwordfield.default - + AbstractPlutoDingetjes.Bonds.initial_value(t::PasswordField) = t.default + AbstractPlutoDingetjes.Bonds.possible_values(t::PasswordField) = AbstractPlutoDingetjes.Bonds.InfinitePossibilities() + function AbstractPlutoDingetjes.Bonds.validate_value(t::PasswordField, val) + t isa AbstractString + end end # ╔═╡ eb4e17fd-07ba-4031-a39f-0d9fccd3d886 @@ -350,8 +386,15 @@ begin )""")) end - Base.get(select::Select) = ismissing(select.default) ? first(select.options).first : select.default - + Base.get(select::Select) = + ismissing(select.default) ? first(select.options).first : select.default + AbstractPlutoDingetjes.Bonds.initial_value(select::Select) = + ismissing(select.default) ? first(select.options).first : select.default + AbstractPlutoDingetjes.Bonds.possible_values(select::Select) = + first.(select.options) + function AbstractPlutoDingetjes.Bonds.validate_value(select::Select, val) + val ∈ (first(p) for p in select.options) + end end # ╔═╡ d64bb805-b700-4fd6-8894-2980152ce250 @@ -360,6 +403,18 @@ Select(["a" => "✅", "b" => "🆘", "c" => "🆘"]) # ╔═╡ 4f3ba840-28ce-4790-b929-ce6af8920189 Select(["a" => "🆘", "b" => "✅", "c" => "🆘"]; default="b") +# ╔═╡ f21db694-2acb-417d-9f4d-0d2400aa067e +function subarrays(x) + + + [ + x[collect(I)] + for I in Iterators.product(Iterators.repeated([true,false],length(x))...) |> collect |> vec + ] + + +end + # ╔═╡ 5bacf96d-f24b-4e8b-81c7-47140f286e27 begin """A multi-selector (`❌ You need to update Pluto to use this PlutoUI element.") + end + return show(io, m, compat_slider) + end + + start_index = findfirst(isequal(slider.default), slider.values) + + show(io, m, @htl(""" + + $(slider.show_value ? @htl( + """ + $(string(slider.default))""" + ) : nothing) + + """)) + end + + Base.get(slider::Slider) = slider.default + Bonds.initial_value(slider::Slider) = slider.default + + Bonds.possible_values(slider::Slider) = slider.range + + function Bonds.transform_value(slider::Slider, val_from_js) + slider.values[val_from_js] + end + + function Bonds.validate_value(slider::Slider, val) + val isa Integer && 1 <= val <= length(slider.values) + end + + result +end + +# ╔═╡ e440a357-1656-4cc4-8191-146fe82fbc8c +@bind os3 HTML(repr(MIME"text/html"(), Slider(0:.1:1, default=.5, show_value=true))) + +# ╔═╡ 629e5d68-580f-4d6b-be14-5a109091e6b7 +HTML(repr(MIME"text/html"(), Slider([sin, cos]))) + # ╔═╡ f59eef32-4732-46db-87b0-3564433ce43e begin + local result = begin """A box where you can type in a number, within a specific range. ## Examples @@ -121,6 +216,7 @@ begin range::AbstractRange default::Number end + end NumberField(range::AbstractRange; default=missing) = NumberField(range, (default === missing) ? first(range) : default) @@ -129,15 +225,18 @@ begin end Base.get(numberfield::NumberField) = numberfield.default - AbstractPlutoDingetjes.Bonds.initial_value(nf::NumberField) = nf.default - AbstractPlutoDingetjes.Bonds.possible_values(nf::NumberField) = nf.range - function AbstractPlutoDingetjes.Bonds.validate_value(nf::NumberField, val) + Bonds.initial_value(nf::NumberField) = nf.default + Bonds.possible_values(nf::NumberField) = nf.range + function Bonds.validate_value(nf::NumberField, val) val isa Real && (minimum(nf) - 0.0001 <= val <= maximum(nf) + 0.0001) end + + result end # ╔═╡ b7c21c22-17f5-44b8-98de-a261d5c7192b begin + local result = begin """A button that sends back the same value every time that it is clicked. You can use it to _trigger reactive cells_. @@ -166,6 +265,7 @@ begin struct LabelButton label::AbstractString end + end LabelButton() = LabelButton("Click") function Base.show(io::IO, m::MIME"text/html", button::LabelButton) @@ -173,11 +273,13 @@ begin end Base.get(button::LabelButton) = button.label - AbstractPlutoDingetjes.Bonds.initial_value(b::LabelButton) = b.label - AbstractPlutoDingetjes.Bonds.possible_values(b::LabelButton) = [b.label] - function AbstractPlutoDingetjes.Bonds.validate_value(b::LabelButton, val) + Bonds.initial_value(b::LabelButton) = b.label + Bonds.possible_values(b::LabelButton) = [b.label] + function Bonds.validate_value(b::LabelButton, val) val == b.label end + + result end # ╔═╡ 7f8e4abf-e7e7-47bc-b1cc-514fa1af106c @@ -188,6 +290,7 @@ Button() # ╔═╡ 548bda96-2461-48a3-a3ad-6d113337826e begin + local result = begin """A button that sends back the number of times that it was clicked. You can use it to _trigger reactive cells_. @@ -214,6 +317,7 @@ begin struct CounterButton label::AbstractString end + end CounterButton() = CounterButton("Click") function Base.show(io::IO, m::MIME"text/html", button::CounterButton) @@ -240,15 +344,18 @@ begin end Base.get(button::CounterButton) = button.label - AbstractPlutoDingetjes.Bonds.initial_value(b::CounterButton) = 0 - AbstractPlutoDingetjes.Bonds.possible_values(b::CounterButton) = AbstractPlutoDingetjes.Bonds.InfinitePossibilities() - function AbstractPlutoDingetjes.Bonds.validate_value(b::CounterButton, val) + Bonds.initial_value(b::CounterButton) = 0 + Bonds.possible_values(b::CounterButton) = Bonds.InfinitePossibilities() + function Bonds.validate_value(b::CounterButton, val) val isa Integer && val >= 0 end + + result end # ╔═╡ 76c3b77b-08aa-4899-bbdd-4f8faa8d1486 begin + local result = begin """A checkbox to choose a Boolean value `true`/`false`. ## Examples @@ -262,6 +369,7 @@ begin struct CheckBox default::Bool end + end CheckBox(;default::Bool=false) = CheckBox(default) @@ -270,15 +378,18 @@ begin end Base.get(checkbox::CheckBox) = checkbox.default - AbstractPlutoDingetjes.Bonds.initial_value(b::CheckBox) = b.default - AbstractPlutoDingetjes.Bonds.possible_values(b::CheckBox) = [false, true] - function AbstractPlutoDingetjes.Bonds.validate_value(b::CheckBox, val) + Bonds.initial_value(b::CheckBox) = b.default + Bonds.possible_values(b::CheckBox) = [false, true] + function Bonds.validate_value(b::CheckBox, val) val isa Bool end + + result end # ╔═╡ f81bb386-203b-4392-b974-a1e2146b1a08 begin + local result = begin """A text input (``) - the user can type text, the text is returned as `String` via `@bind`. If `dims` is a tuple `(cols::Integer, row::Integer)`, a `