質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

Q&A

解決済

1回答

685閲覧

Interact.jlでWidgets.rangeslider()の縦方向のスライダーを自然な向きにしたい

ujimushi_sradjp

総合スコア2096

Julia

Juliaとは、科学技術計算に特化した、高水準・高性能な動的プログラミング言語です。オープンソースとして公表されており、書き易く動きが早いことが特徴です。

0グッド

0クリップ

投稿2023/02/24 13:44

JuliaでインタラクティブなUIを実現するInteract.jlパッケージに縦方向で範囲を示すスライダがないか調べていて,次のようなコードを書くと縦向きになることを確認しました。

julia

1using Interact, Blink 2 3win = Window(); 4ui = rangeslider(0:100; value=[30, 80], orientation="vertical"); 5body!(win, ui)

しかし,表示された画面では次のように上が小さい値,下が大きい値でかなり不自然な感じになってしまいます。

イメージ説明

「上が大きい値,下が小さい値」のスライダにするにはどうすればよいでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

自己解決

Interact.jlの実装はInteractBase.jlでされているようで,rangesliderの実装部分を確認するとnoUiSliderというライブラリを使っているようです。

そちらのライブラリにはdirectionオプションがあるのですが,どうやらInteractBase.jl
実装ではそのオプションが使えない状態になっているようです。

julia

1using Pkg 2Pkg.develop("InteractBase")

を実行すると,$HOME/.julia/dev/InteractBaseにソースがダウンロードされて,ソースを変更するとその変更をお試しで反映できるようになるので,色々調べた内容を反映させて,次のように変更します。

基本的にdirectionのオプションを追加するのみです。
directionltrrtlの値を取ることができ,省略するとltrとみなされるようです。

省略とか面倒なので,jsondirectionを追加し,引数が省略されたら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
ujimushi_sradjp

総合スコア2096

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問