File: multiselect.rb

package info (click to toggle)
mikutter 3.0.7%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: jessie, jessie-kfreebsd
  • size: 9,396 kB
  • ctags: 1,916
  • sloc: ruby: 16,619; sh: 117; makefile: 27
file content (69 lines) | stat: -rw-r--r-- 2,435 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
# -*- 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::Settings::MultiSelect < Plugin::Settings::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::Settings::Listener[config]))
      group
    else
      group = Gtk::Frame.new.set_border_width(8).
        set_label(label)
      box = Plugin::Settings.new(@plugin).set_border_width(4).
        closeup(build_combobox(Plugin::Settings::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::Settings
          container = Gtk::HBox.new
          check = Gtk::CheckButton.new
          closeup container.closeup(check).add(face)
        else
          raise ArgumentError, "multiselect option value should be instance of String or Plugin::Settings. but #{face.class} given (#{face.inspect})"
        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
    state = listener.get || []
    @options.each{ |pair|
      node, value = *pair
      check = Gtk::CheckButton.new(value)
      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