UserConfig に連想配列を格納して、設定画面から変更できるようにしたかったので挑戦してみた。
実現方針は下記。
- 設定画面の設定値を連想配列に紐付ける
- 連想配列に変更があったら UserConfig を更新する
設定画面の設定値を連想配列に紐付ける
Settings の各関数にリスナを渡せるので、リスナ内で連想配列に出し入れするよう頑張ってもらう。
select は、 3.0.5 の時点ではリスナを渡せない。 3.0.6 くらいでフィックスされるのではないだろうか。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
Plugin.create(:setting_listener) do | |
on_boot { | |
@config = {} | |
} | |
settings("setting_listener") { | |
settings("基本設定") { | |
multitext("複数行テキスト", listener(:setting_listener_multitext)) | |
adjustment("特定範囲の数値入力", listener(:setting_listener_adjustment), 1, 600) | |
boolean("真偽値入力", listener(:setting_listener_boolean)) | |
fileselect("ファイルを選択する", listener(:setting_listener_fileselect)) | |
input("一行テキストボックス", listener(:setting_listener_input)) | |
inputpass("一行テキストボックス(非表示)", listener(:setting_listener_inputpass)) | |
multi("複数テキストボックス", listener(:setting_listener_multi)) | |
font("フォント", listener(:setting_listener_font)) | |
color("カラー", listener(:setting_listener_color)) | |
fontcolor("フォントカラー", listener(:setting_listener_fontcolor_font), listener(:setting_listener_fontcolor_color)) | |
## 落ちる | |
#select("アイコンの色", listener(:setting_listener_select), { | |
# "1" => "1", | |
# "2" => "2", | |
# "3" => "3", | |
# "4" => "4", | |
# "5" => "5"}) | |
multiselect("要素を複数個選択させる", listener(:setting_listener_multiselect), { | |
"1" => "1", | |
"2" => "2", | |
"3" => "3", | |
"4" => "4", | |
"5" => "5"}) | |
} | |
} | |
# リスナ作成 | |
def listener(key) | |
Plugin::Settings::Listener.new( | |
:set => lambda { |new| | |
@config[key] = new | |
}, | |
:get => lambda { | |
@config[key] | |
} | |
) | |
end | |
end |
連想配列に変更があったら UserConfig を更新する
UserConfig[key] で取得できる値はコピーなので、 格納した連想配列に変更があった場合には連想配列自体を入れ替える。
上述のリスナの set 処理の最後に、連想配列をごっそり入れ替える処理を入れる感じ。
コードと、その結果の設定は下記の通り。
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
UserConfig::setting_listener: | |
:setting_listener_multitext: aaa | |
:setting_listener_adjustment: 5 | |
:setting_listener_fileselect: "PATH/TO/SELECTED/FILE" | |
:setting_listener_input: eee | |
:setting_listener_inputpass: ccc | |
:setting_listener_multi: | |
- aaa | |
- bvbb | |
- ccc | |
:setting_listener_multiselect: | |
- '2' | |
- '3' | |
- '4' |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# -*- coding: utf-8 -*- | |
Plugin.create(:setting_listener) do | |
on_boot { | |
UserConfig[:setting_listener] ||= {} | |
} | |
settings("setting_listener") { | |
settings("基本設定") { | |
multitext("複数行テキスト", listener(:setting_listener_multitext)) | |
adjustment("特定範囲の数値入力", listener(:setting_listener_adjustment), 1, 600) | |
boolean("真偽値入力", listener(:setting_listener_boolean)) | |
fileselect("ファイルを選択する", listener(:setting_listener_fileselect)) | |
input("一行テキストボックス", listener(:setting_listener_input)) | |
inputpass("一行テキストボックス(非表示)", listener(:setting_listener_inputpass)) | |
multi("複数テキストボックス", listener(:setting_listener_multi)) | |
font("フォント", listener(:setting_listener_font)) | |
color("カラー", listener(:setting_listener_color)) | |
fontcolor("フォントカラー", listener(:setting_listener_fontcolor_font), listener(:setting_listener_fontcolor_color)) | |
## 落ちる | |
#select("アイコンの色", listener(:setting_listener_select), { | |
# "1" => "1", | |
# "2" => "2", | |
# "3" => "3", | |
# "4" => "4", | |
# "5" => "5"}) | |
multiselect("要素を複数個選択させる", listener(:setting_listener_multiselect), { | |
"1" => "1", | |
"2" => "2", | |
"3" => "3", | |
"4" => "4", | |
"5" => "5"}) | |
} | |
} | |
# リスナ作成 | |
def listener(key) | |
Plugin::Settings::Listener.new( | |
:set => lambda { |new| | |
config = UserConfig[:setting_listener].melt | |
config[key] = new | |
UserConfig[:setting_listener] = config | |
}, | |
:get => lambda { | |
UserConfig[:setting_listener][key] | |
} | |
) | |
end | |
end |
設定項目がゴチャッとしてきたらそれなりにわかりよくなるのではないでしょうか。
書きながら思ったけど、何かやるたびに連想配列全体のコピーが走るんだな、これ。 性能が気になる場合は、更新・取得にさらなる工夫が必要ですね。
0 件のコメント:
コメントを投稿