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
|