Skip to content

Commit

Permalink
IPyWidget stays in JolinPluto for use on the Julia side
Browse files Browse the repository at this point in the history
  • Loading branch information
schlichtanders committed Sep 11, 2024
1 parent 29327d4 commit 4ec8c99
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 16 deletions.
2 changes: 1 addition & 1 deletion Project.toml
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
name = "JolinPluto"
uuid = "5b0b4ef8-f4e6-4363-b674-3f031f7b9530"
authors = ["Stephan Sahm <[email protected]> and contributors"]
version = "0.1.86"
version = "0.1.87"

[deps]
AbstractPlutoDingetjes = "6e696c72-6542-2067-7265-42206c756150"
Expand Down
25 changes: 10 additions & 15 deletions ext/PythonCallExt.jl
Original file line number Diff line number Diff line change
Expand Up @@ -116,14 +116,9 @@ IPyWidget_init() = @htl """

# Python specific stuff

""" Wrap an ipywidget to be used in Pluto """
struct IPyWidget
wi
end

function Base.show(io::IO, m::MIME"text/html", w::IPyWidget)
function Base.show(io::IO, m::MIME"text/html", w::JolinPluto.IPyWidget)
e = PythonCall.pyimport("ipywidgets.embed")
data = e.embed_data(views=[w.wi], state=e.dependency_state([w.wi]))
data = e.embed_data(views=[w.widget], state=e.dependency_state([w.widget]))
show(io, m, @htl """
<div type="application/vnd.jupyter.widget-view+div">
<script>
Expand All @@ -132,7 +127,7 @@ function Base.show(io::IO, m::MIME"text/html", w::IPyWidget)
const div = currentScript.parentElement;
// this is key so that the initial value won't be set to nothing immediately
// this value property will be read out for the client-site initial value
div.value = $(pyconvert(Any, w.wi.value))
div.value = $(pyconvert(Any, w.widget.value))
if((window.require == null) || window.specified){
div.innerHTML = '<p>Couldn't find ipywidgets javascript dependencies. This should not happen, please contact <a href="mailto:[email protected]">[email protected]</a>. </p>'
Expand Down Expand Up @@ -171,15 +166,15 @@ function Base.show(io::IO, m::MIME"text/html", w::IPyWidget)
""")
end

function AbstractPlutoDingetjes.Bonds.initial_value(w::IPyWidget)
return pyconvert(Any, w.wi.value)
function AbstractPlutoDingetjes.Bonds.initial_value(w::JolinPluto.IPyWidget)
return pyconvert(Any, w.widget.value)
end

function pyshow_rule_ipywidgets(io::IO, mime::String, x::Py)
mime == "text/html" || return false
pyissubclass(pytype(x), @pyconst(pyimport("ipywidgets").widgets.ValueWidget)) || return false
try
show(io, mime, IPyWidget(x))
show(io, mime, JolinPluto.IPyWidget(x))
return true
catch exc
if exc isa PyException
Expand All @@ -194,7 +189,7 @@ end
JolinPluto.viewof(def::AbstractString, ui::Py) = JolinPluto.viewof(Symbol(def), ui)
function JolinPluto.viewof(def::Symbol, ui::Py)
if pyissubclass(pytype(ui), @pyconst(pyimport("ipywidgets").widgets.ValueWidget))
JolinPluto.viewof(def, IPyWidget(ui))
JolinPluto.viewof(def, JolinPluto.IPyWidget(ui))
else
@invoke JolinPluto.viewof(def::Symbol, ui::Any)
end
Expand All @@ -213,9 +208,9 @@ end

# Here an alternative implementation which unfortunately does not really work because if the same is used multiple times, on the first load it will actually
# interfere with one another so that all widgets are duplicated 3 to 10 times, depending on how many widgets load the common dependency in parallel.
# function Base.show(io::IO, m::MIME"text/html", w::IPyWidget)
# function Base.show(io::IO, m::MIME"text/html", w::JolinPluto.IPyWidget)
# e = PythonCall.pyimport("ipywidgets.embed")
# data = e.embed_data(views=[w.wi], state=e.dependency_state([w.wi]))
# data = e.embed_data(views=[w.widget], state=e.dependency_state([w.widget]))
# show(io, m, @htl """
# <div type="application/vnd.jupyter.widget-view+div">
# <script>
Expand Down Expand Up @@ -247,7 +242,7 @@ end
# const div = currentScript.parentElement;
# // this is key so that the initial value won't be set to nothing immediately
# // this value property will be read out for the client-site initial value
# div.value = $(pyconvert(Any, w.wi.value))
# div.value = $(pyconvert(Any, w.widget.value))

# // TODO renderWidgets(div) has the advantage that no duplicates appear
# // however if the same ui is used multiple times on the website, they also won't be combined any longer into one synced state (which actually happens automatically without the div restriction)
Expand Down
1 change: 1 addition & 0 deletions src/JolinPluto.jl
Original file line number Diff line number Diff line change
Expand Up @@ -7,6 +7,7 @@ export Setter, @get, @cell_ids_create_wrapper, @cell_ids_push!
export cell_ids_create_wrapper, cell_ids_push!, cell_ids_push
export MD, format_html, _HTML
export viewof
export IPyWidget

using Dates, HTTP, JSON3, Git, JWTs, UUIDs, Base64
using HypertextLiteral, Continuables
Expand Down
15 changes: 15 additions & 0 deletions src/languages.jl
Original file line number Diff line number Diff line change
Expand Up @@ -20,3 +20,18 @@ function lang_set_global end
Gets the given variable from the respective language side.
"""
function lang_get_global end



# Python specific stuff


# this is defined here so that it can also be used in standard Pluto and Julia notebooks which may use ipywidgets
"""
IPyWidget(ipywidget)
Wrap an ipywidget to be used inside Pluto
"""
struct IPyWidget
widget
end

0 comments on commit 4ec8c99

Please sign in to comment.