File: extract_tab_list.rb

package info (click to toggle)
mikutter 5.1.0%2Bdfsg-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid, trixie
  • size: 9,780 kB
  • sloc: ruby: 22,912; sh: 186; makefile: 21
file content (148 lines) | stat: -rw-r--r-- 3,821 bytes parent folder | download
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
# -*- coding: utf-8 -*-

module Plugin::ExtractGtk
end

=begin rdoc
  抽出タブの一覧
=end

class Plugin::ExtractGtk::ExtractTabList < Gtk::TreeView
  ICON_SIZE = 16

  COL_ICON  = 0
  COL_NAME  = 1
  COL_SLUG  = 2
  COL_SOUND = 3
  COL_POPUP = 4

  def initialize(plugin)
    super(Gtk::ListStore.new(
      GdkPixbuf::Pixbuf, # icon
      String,            # name
      Symbol,            # slug
      GdkPixbuf::Pixbuf, # sound
      GdkPixbuf::Pixbuf  # popup
    ))

    append_column Gtk::TreeViewColumn.new(
      '',
      Gtk::CellRendererPixbuf.new,
      pixbuf: COL_ICON
    )
    append_column(Gtk::TreeViewColumn.new(
      plugin._('名前'),
      Gtk::CellRendererText.new,
      text: COL_NAME
    ).tap { |col| col.expand = true })
    append_column Gtk::TreeViewColumn.new(
      '',
      Gtk::CellRendererPixbuf.new,
      pixbuf: COL_SOUND
    )
    append_column Gtk::TreeViewColumn.new(
      '',
      Gtk::CellRendererPixbuf.new,
      pixbuf: COL_POPUP
    )

    extract_tabs.each(&method(:add_record))
    register_signal_handlers
  end

  # 現在選択されている抽出タブのslugを返す
  # ==== Return
  # 選択されている項目のslug。何も選択されていない場合はnil
  def selected_slug
    selected_iter = selection.selected
    selected_iter[COL_SLUG].to_sym if selected_iter
  end

  # レコードを追加する
  # ==== Args
  # [record] 追加するレコード(Plugin::Extract::Setting)
  # ==== Return
  # self
  def add_record(record)
    iter = model.append
    setup_iter iter, record
    self
  end

  # レコードをもとにリストビューを更新する
  # ==== Args
  # [record] 更新されたレコード(Plugin::Extract::Setting)
  def update_record(record)
    update_iter = model.to_enum(:each)
                    .map { |_, _, iter| iter }
                    .find { |iter| record[:slug].to_sym == iter[COL_SLUG].to_sym }
    setup_iter update_iter, record if update_iter
  end

  # 抽出タブをリストから削除する
  # ==== Args
  # [record_slug] 削除する抽出タブのslug
  # ==== Return
  # self
  def remove_record(record_slug)
    record_slug = record_slug.to_sym
    remove_iter = model.to_enum(:each).map { |_, _, iter| iter }.find { |iter| record_slug == iter[COL_SLUG].to_sym }
    model.remove(remove_iter) if remove_iter
    self
  end

  private

  def register_signal_handlers
    # 項目をダブルクリックして設定を開く
    ssc(:button_press_event) do |_, ev|
      next if ev.event_type != Gdk::EventType::BUTTON2_PRESS
      slug = selected_slug
      if slug
        Plugin.call(:extract_open_edit_dialog, slug)
        true
      end
    end
  end

  # ==== utility

  # レコードの配列を返す
  # ==== Return
  # レコードの配列
  def extract_tabs
    Plugin.filtering(:extract_tabs_get, []).first
  end

  # イテレータにレコードの内容をコピーする
  # ==== Args
  # [iter] TreeIter
  # [record] 参照するレコード (Plugin::Extract::Setting)
  def setup_iter(iter, record)
    size = { width: Gdk.scale(ICON_SIZE), height: Gdk.scale(ICON_SIZE) }
    set_icon = ->(col, photo) do
      iter[col] = photo.load_pixbuf(**size) do |pb|
        iter[col] = pb unless destroyed?
      end
    end

    iter[COL_NAME] = record[:name]
    iter[COL_SLUG] = record[:slug]
    if record[:icon]
      photo = Enumerator.new { |y|
        Plugin.filtering :photo_filter, record[:icon], y
      }.first
      set_icon.(COL_ICON, photo)
    end
    if record[:sound].to_s.empty?
      set_icon.(COL_SOUND, Skin[:notify_sound_off])
    else
      set_icon.(COL_SOUND, Skin[:notify_sound_on])
    end
    if record[:popup]
      set_icon.(COL_POPUP, Skin[:notify_popup_on])
    else
      set_icon.(COL_POPUP, Skin[:notify_popup_off])
    end
  end
end