diff --git a/src/InteractBase.jl b/src/InteractBase.jl index ed2aa52..162b7aa 100644 --- a/src/InteractBase.jl +++ b/src/InteractBase.jl @@ -78,7 +78,7 @@ export latex, alert, confirm, highlight, notifications, accordion, tabulator, ma export onchange -export settheme!, resettheme!, gettheme, NativeHTML +export settheme!, resettheme!, gettheme, availablethemes, NativeHTML export slap_design! diff --git a/src/backends.jl b/src/backends.jl index 31a36b7..ec81885 100644 --- a/src/backends.jl +++ b/src/backends.jl @@ -2,6 +2,23 @@ libraries(::WidgetTheme) = [style_css] Base.@deprecate_binding backend Widgets.backends +const themes = OrderedDict{Symbol, WidgetTheme}(:nativehtml => NativeHTML()) + +registertheme!(key::Union{Symbol, AbstractString}, val::WidgetTheme) = setindex!(themes, val, Symbol(key)) + +""" +`settheme!(s::Union{Symbol, AbstractString})` + +Set theme of Interact globally. See `availablethemes()` to know what themes are currently available. +""" +function settheme!(s::Union{Symbol, AbstractString}) + theme = get(themes, Symbol(s)) do + error("Theme $s is not available.") + end + settheme!(theme) +end + settheme!(b::WidgetTheme) = isa(Widgets.get_backend(), WidgetTheme) && Widgets.set_backend!(b) gettheme() = isa(Widgets.get_backend(), WidgetTheme) ? Widgets.get_backend() : nothing +availablethemes() = sort(collect(keys(themes))) resettheme!() = isa(Widgets.get_backend(), WidgetTheme) && Widgets.reset_backend!() diff --git a/test/test_theme.jl b/test/test_theme.jl index e416b4b..cc125f6 100644 --- a/test/test_theme.jl +++ b/test/test_theme.jl @@ -1,4 +1,5 @@ struct MyTheme<:InteractBase.WidgetTheme; end +InteractBase.registertheme!(:mytheme, MyTheme()) @testset "theme" begin @test gettheme() == NativeHTML() @@ -6,4 +7,10 @@ struct MyTheme<:InteractBase.WidgetTheme; end @test gettheme() == MyTheme() resettheme!() @test gettheme() == NativeHTML() + settheme!("mytheme") + @test gettheme() == MyTheme() + settheme!(:nativehtml) + @test gettheme() == NativeHTML() + @test availablethemes() == [:mytheme, :nativehtml] + @test_throws ErrorException settheme!("not a theme") end