JuliaでインタラクティブなUIを実現するInteract.jl
パッケージに縦方向で範囲を示すスライダがないか調べていて,次のようなコードを書くと縦向きになることを確認しました。
julia
1using Interact, Blink 2 3win = Window(); 4ui = rangeslider(0:100; value=[30, 80], orientation="vertical"); 5body!(win, ui)
しかし,表示された画面では次のように上が小さい値,下が大きい値でかなり不自然な感じになってしまいます。
「上が大きい値,下が小さい値」のスライダにするにはどうすればよいでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。

回答1件
0
自己解決
Interact.jlの実装はInteractBase.jl
でされているようで,rangeslider
の実装部分を確認するとnoUiSliderというライブラリを使っているようです。
そちらのライブラリにはdirection
オプションがあるのですが,どうやらInteractBase.jl
の
実装ではそのオプションが使えない状態になっているようです。
julia
1using Pkg 2Pkg.develop("InteractBase")
を実行すると,$HOME/.julia/dev/InteractBase
にソースがダウンロードされて,ソースを変更するとその変更をお試しで反映できるようになるので,色々調べた内容を反映させて,次のように変更します。
基本的にdirection
のオプションを追加するのみです。
direction
は ltr
とrtl
の値を取ることができ,省略するとltr
とみなされるようです。
省略とか面倒なので,json
にdirection
を追加し,引数が省略されたらltr
を設定する
ようにします。orientation
もエラーチェックしていないようなので,その流儀に従います。
diff
1diff --git a/src/slider.jl b/src/slider.jl 2index dbc44c2..778a476 100644 3--- a/src/slider.jl 4+++ b/src/slider.jl 5@@ -82,13 +82,14 @@ Pass a vector to `value` with two values if you want to select a range. 6 """ 7 function rangeslider(theme::WidgetTheme, vals::AbstractUnitRange{<:Integer}, formatted_vals = format.(vals); 8 style = Dict(), label = nothing, value = medianelement(vals), orientation = "horizontal", readout = true, 9- className = "is-primary") 10+ className = "is-primary", direction = "ltr") 11 12 T = Observables.to_value(value) isa Vector ? Vector{eltype(vals)} : eltype(vals) 13 value isa AbstractObservable || (value = Observable{T}(value)) 14 15 index = value 16 orientation = string(orientation) 17+ direction = string(direction) 18 preprocess = T<:Vector ? js"unencoded.map(Math.round)" : js"Math.round(unencoded[0])" 19 20 scp = Scope(imports = vcat([nouislider_min_js, nouislider_min_css], libraries(theme))) 21@@ -122,6 +123,7 @@ function rangeslider(theme::WidgetTheme, vals::AbstractUnitRange{<:Integer}, for 22 tooltips: $tooltips, 23 connect: $connect, 24 orientation: $orientation, 25+ direction: $direction, 26 format: { 27 to: function ( value ) { 28 var ind = Math.round(value-($min));
上の修正をして次のようにdirection="rtl"
オプションをつけて実行してみました。
julia
1using Interact, Blink 2 3win = Window(); 4ui = rangeslider(0:100; value=[30, 80], orientation="vertical", direction="rtl"); 5body!(win, ui)
実行結果は次の画面です。
想定通りの結果になったようです。
プルリクすべきなのかもしれませんが,色々苦手なのでissueでお茶をにごすかもしれません。
2023/03/23追記
InteractBaseのプルリクが受理されました。
InteractBaseのバージョン番号が更新されるとdev InteractBase
の手順は不要でパッケージをアップデートするだけで使えるようになると思います。
2023/07/03追記
回答で提示した修正内容が反映されたInteractBase v0.10.10がリリースされました。
もし,この回答が質問に対する回答となっていないのであれば,ライブラリに修正内容が取り込まれることもないと思うのですが,指摘された方は回答内容がよく理解できていなかったのでしょうか?疑問に残るところです。
投稿2023/02/24 13:46
編集2023/07/02 15:44総合スコア2179
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。