7 |
7 |
=end
|
8 |
8 |
|
9 |
9 |
class Plugin::Extract::ExtractTabList < ::Gtk::TreeView
|
10 |
|
ITER_NAME = 0
|
11 |
|
ITER_ID = 1
|
|
10 |
ICON_SIZE = 16
|
|
11 |
|
|
12 |
COL_ICON = 0
|
|
13 |
COL_NAME = 1
|
|
14 |
COL_ID = 2
|
|
15 |
COL_SOUND = 3
|
|
16 |
COL_POPUP = 4
|
12 |
17 |
|
13 |
18 |
def initialize(plugin)
|
14 |
19 |
type_strict plugin => Plugin
|
15 |
20 |
@plugin = plugin
|
16 |
|
super(Gtk::ListStore.new(String, Numeric))
|
17 |
|
|
18 |
|
append_column Gtk::TreeViewColumn.new(plugin._("名前"), Gtk::CellRendererText.new, text: ITER_NAME)
|
19 |
|
|
20 |
|
extract_tabs.each(&method(:add_record)) end
|
|
21 |
super(Gtk::ListStore.new(
|
|
22 |
GdkPixbuf::Pixbuf, # icon
|
|
23 |
String, # name
|
|
24 |
Numeric, # id
|
|
25 |
GdkPixbuf::Pixbuf, # sound
|
|
26 |
GdkPixbuf::Pixbuf # popup
|
|
27 |
))
|
|
28 |
|
|
29 |
append_column Gtk::TreeViewColumn.new(
|
|
30 |
'',
|
|
31 |
Gtk::CellRendererPixbuf.new,
|
|
32 |
pixbuf: COL_ICON
|
|
33 |
)
|
|
34 |
append_column Gtk::TreeViewColumn.new(
|
|
35 |
plugin._('名前'),
|
|
36 |
Gtk::CellRendererText.new,
|
|
37 |
text: COL_NAME
|
|
38 |
).tap { |col| col.expand = true }
|
|
39 |
append_column Gtk::TreeViewColumn.new(
|
|
40 |
'',
|
|
41 |
Gtk::CellRendererPixbuf.new,
|
|
42 |
pixbuf: COL_SOUND
|
|
43 |
)
|
|
44 |
append_column Gtk::TreeViewColumn.new(
|
|
45 |
'',
|
|
46 |
Gtk::CellRendererPixbuf.new,
|
|
47 |
pixbuf: COL_POPUP
|
|
48 |
)
|
|
49 |
|
|
50 |
extract_tabs.each(&method(:add_record))
|
|
51 |
register_signal_handlers
|
|
52 |
end
|
21 |
53 |
|
22 |
54 |
# 現在選択されている抽出タブのIDを返す
|
23 |
55 |
# ==== Return
|
24 |
56 |
# 選択されている項目のID。何も選択されていない場合はnil
|
25 |
57 |
def selected_id
|
26 |
58 |
selected_iter = selection.selected
|
27 |
|
selected_iter[ITER_ID] if selected_iter end
|
|
59 |
selected_iter[COL_ID] if selected_iter end
|
28 |
60 |
|
29 |
61 |
# レコードを追加する
|
30 |
62 |
# ==== Args
|
31 |
63 |
# [record] 追加するレコード(Hash)
|
32 |
|
# ==== Return
|
33 |
|
# self
|
34 |
64 |
def add_record(record)
|
35 |
65 |
iter = model.append
|
36 |
|
iter[Plugin::Extract::ExtractTabList::ITER_NAME] = record[:name]
|
37 |
|
iter[Plugin::Extract::ExtractTabList::ITER_ID] = record[:id]
|
38 |
|
self end
|
|
66 |
setup_iter iter, record
|
|
67 |
end
|
|
68 |
|
|
69 |
# レコードをもとにリストビューを更新する
|
|
70 |
# ==== Args
|
|
71 |
# [record] 更新されたレコード(Hash)
|
|
72 |
def update_record(record)
|
|
73 |
update_iter = model.to_enum
|
|
74 |
.map { |_, _, iter| iter }
|
|
75 |
.find { |iter| iter[COL_ID] == record[:id] }
|
|
76 |
setup_iter update_iter, record if update_iter
|
|
77 |
end
|
39 |
78 |
|
40 |
79 |
# 抽出タブをリストから削除する
|
41 |
80 |
# ==== Args
|
... | ... | |
43 |
82 |
# ==== Return
|
44 |
83 |
# self
|
45 |
84 |
def remove_record(record_id)
|
46 |
|
remove_iter = model.to_enum(:each).map{|_,_,iter|iter}.find{|iter| record_id == iter[ITER_ID] }
|
|
85 |
remove_iter = model.to_enum(:each).map{|_,_,iter|iter}.find{|iter| record_id == iter[COL_ID] }
|
47 |
86 |
model.remove(remove_iter) if remove_iter
|
48 |
87 |
self end
|
49 |
88 |
|
50 |
89 |
private
|
51 |
90 |
|
|
91 |
def register_signal_handlers
|
|
92 |
# 項目をダブルクリックして設定を開く
|
|
93 |
ssc(:button_press_event) do |_, ev|
|
|
94 |
next if ev.event_type != Gdk::Event::BUTTON2_PRESS
|
|
95 |
id = selected_id
|
|
96 |
if id
|
|
97 |
Plugin.call(:extract_open_edit_dialog, id)
|
|
98 |
true
|
|
99 |
end
|
|
100 |
end
|
|
101 |
end
|
|
102 |
|
52 |
103 |
# ==== utility
|
53 |
104 |
|
54 |
105 |
# レコードの配列を返す
|
... | ... | |
57 |
108 |
def extract_tabs
|
58 |
109 |
UserConfig[:extract_tabs] || [] end
|
59 |
110 |
|
|
111 |
# イテレータにレコードの内容をコピーする
|
|
112 |
# ==== Args
|
|
113 |
# [iter] TreeIter
|
|
114 |
# [record] 参照するレコード (Hash)
|
|
115 |
def setup_iter(iter, record)
|
|
116 |
size = { width: ICON_SIZE, height: ICON_SIZE }
|
|
117 |
set_icon = lambda { |col, photo|
|
|
118 |
iter[col] = photo.load_pixbuf(**size) do |pb|
|
|
119 |
iter[col] = pb unless destroyed?
|
|
120 |
end
|
|
121 |
}
|
|
122 |
|
|
123 |
iter[COL_NAME] = record[:name]
|
|
124 |
iter[COL_ID] = record[:id]
|
|
125 |
if record[:icon]
|
|
126 |
photo = Enumerator.new do |y|
|
|
127 |
Plugin.filtering :photo_filter, record[:icon], y
|
|
128 |
end.first
|
|
129 |
set_icon.call COL_ICON, photo
|
|
130 |
end
|
|
131 |
if record[:sound].to_s.empty?
|
|
132 |
# FIXME: 適当なアイコンを標準スキンに入れる
|
|
133 |
set_icon.call COL_SOUND, Skin['speaker-x.png']
|
|
134 |
else
|
|
135 |
set_icon.call COL_SOUND, Skin['speaker-l.png']
|
|
136 |
end
|
|
137 |
if record[:popup]
|
|
138 |
# FIXME: 適当なアイコンを標準スキンに入れる
|
|
139 |
set_icon.call COL_POPUP, Skin['popup.png']
|
|
140 |
else
|
|
141 |
set_icon.call COL_POPUP, Skin['no-popup.png']
|
|
142 |
end
|
|
143 |
end
|
|
144 |
|
60 |
145 |
# def on_created(iter)
|
61 |
146 |
# Plugin.call(:extract_tab_create,
|
62 |
|
# name: iter[ITER_NAME],
|
|
147 |
# name: iter[COL_NAME],
|
63 |
148 |
# sexp: iter[ITER_SEXP],
|
64 |
149 |
# sources: iter[ITER_SOURCE],
|
65 |
|
# id: iter[ITER_ID] = gen_uniq_id) end
|
|
150 |
# id: iter[COL_ID] = gen_uniq_id) end
|
66 |
151 |
|
67 |
152 |
# def on_updated(iter)
|
68 |
153 |
# Plugin.call(:extract_tab_update,
|
69 |
|
# name: iter[ITER_NAME],
|
|
154 |
# name: iter[COL_NAME],
|
70 |
155 |
# sexp: iter[ITER_SEXP],
|
71 |
156 |
# sources: iter[ITER_SOURCE],
|
72 |
|
# id: iter[ITER_ID]) end
|
|
157 |
# id: iter[COL_ID]) end
|
73 |
158 |
|
74 |
159 |
def gen_uniq_id(uniq_id = Time.now.to_i)
|
75 |
160 |
if extract_tabs.any?{ |x| x[:id] == uniq_id }
|