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
|
# frozen_string_literal: true
# CRUDなリストビューを簡単に実現するためのクラス
class Gtk::CompatListView < Gtk::TreeView
extend Memoist
attr_accessor :dialog_title
type_register
def initialize
super()
initialize_model
set_columns
end
private
def initialize_model
set_model(Gtk::ListStore.new(*column_schemer.flatten.map{|x| x[:type]}))
end
def set_columns
column_schemer.inject(0){ |index, scheme|
if scheme.is_a? Array
col = Gtk::TreeViewColumn.new(scheme.first[:label])
col.resizable = scheme.first[:resizable]
scheme.each{ |cell|
if cell[:kind]
cell_renderer = get_render_by(cell, index)
col.pack_start(cell_renderer, expand: cell[:expand])
col.add_attribute(cell_renderer, cell[:kind], index) end
index += 1 }
append_column(col)
else
if(scheme[:label] and scheme[:kind])
col = Gtk::TreeViewColumn.new(scheme[:label], get_render_by(scheme, index), scheme[:kind] => index)
col.resizable = scheme[:resizable]
append_column(col) end
index += 1 end
index }
end
def get_render_by(scheme, index)
kind = scheme[:kind]
renderer = scheme[:renderer]
case
when renderer
if renderer.is_a?(Proc)
renderer.call(scheme, index)
else
renderer.new end
when kind == :text
Gtk::CellRendererText.new
when kind == :pixbuf
Gtk::CellRendererPixbuf.new
end
end
def column_schemer
raise 'Override this method!'
end
end
|