2014/09/19

[Mikutter] UserConfig に連想配列を格納して、設定画面から変更できるようにしたい

UserConfig に連想配列を格納して、設定画面から変更できるようにしたかったので挑戦してみた。

実現方針は下記。

  • 設定画面の設定値を連想配列に紐付ける
  • 連想配列に変更があったら UserConfig を更新する

設定画面の設定値を連想配列に紐付ける

Settings の各関数にリスナを渡せるので、リスナ内で連想配列に出し入れするよう頑張ってもらう。

select は、 3.0.5 の時点ではリスナを渡せない。 3.0.6 くらいでフィックスされるのではないだろうか。

# -*- 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 処理の最後に、連想配列をごっそり入れ替える処理を入れる感じ。

コードと、その結果の設定は下記の通り。

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'
view raw setting.yml hosted with ❤ by GitHub
# -*- 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 件のコメント: