aboutsummaryrefslogtreecommitdiffstats
path: root/core/addon/settings/multiselect.rb
diff options
context:
space:
mode:
Diffstat (limited to 'core/addon/settings/multiselect.rb')
-rw-r--r--core/addon/settings/multiselect.rb67
1 files changed, 67 insertions, 0 deletions
diff --git a/core/addon/settings/multiselect.rb b/core/addon/settings/multiselect.rb
new file mode 100644
index 00000000..c17b3355
--- /dev/null
+++ b/core/addon/settings/multiselect.rb
@@ -0,0 +1,67 @@
+# -*- coding: utf-8 -*-
+require File.expand_path File.join(File.dirname(__FILE__), 'builder')
+require File.expand_path File.join(File.dirname(__FILE__), 'select')
+
+class Plugin::Setting::MultiSelect < Plugin::Setting::Select
+
+ # optionメソッドで追加された項目をウィジェットに組み立てる
+ # ==== Args
+ # [label] ラベル。文字列。
+ # [config] 設定のキー
+ # ==== Return
+ # ウィジェット
+ def build(label, config)
+ if has_widget?
+ group = Gtk::Frame.new.set_border_width(8)
+ group.set_label(label)
+ group.add(build_box(Plugin::Setting::Listener[config]))
+ group
+ else
+ group = Gtk::Frame.new.set_border_width(8).
+ set_label(label)
+ box = Plugin::Setting.new.set_border_width(4).
+ closeup(build_combobox(Plugin::Setting::Listener[config]))
+ group.add(box)
+ end end
+
+ private
+
+ def build_box(listener)
+ box = Gtk::VBox.new
+
+ options = @options
+ box.instance_eval{
+ options.each{ |value, face|
+ if face.is_a? String
+ closeup check = Gtk::CheckButton.new(face)
+ elsif face.is_a? Plugin::Setting
+ container = Gtk::HBox.new
+ check = Gtk::CheckButton.new
+ closeup container.closeup(check).add(face)
+ end
+ check.signal_connect('toggled'){ |widget|
+ if widget.active?
+ listener.set((listener.get || []) + [value])
+ else
+ listener.set((listener.get || []) - [value]) end
+ face.sensitive = widget.active? if face.is_a? Gtk::Widget }
+ check.active = (listener.get || []).include? value
+ face.sensitive = check.active? if face.is_a? Gtk::Widget } }
+ box end
+
+ # すべてテキストなら、コンボボックスで要素を描画する
+ def build_combobox(listener)
+ container = Gtk::VBox.new
+ sorted = @options.map{ |o| o.first }.sort_by(&:to_s).freeze
+ state = listener.get || []
+ sorted.each{ |node|
+ check = Gtk::CheckButton.new(@options.assoc(node).last)
+ check.active = state.include?(node)
+ check.signal_connect('toggled'){ |widget|
+ if widget.active?
+ listener.set((listener.get || []) + [node])
+ else
+ listener.set((listener.get || []) - [node]) end }
+ container.closeup check }
+ container end
+end