lib/knj/gtk2_tv.rb in knjrbfw-0.0.46 vs lib/knj/gtk2_tv.rb in knjrbfw-0.0.47
- old
+ new
@@ -46,10 +46,11 @@
col = Gtk::TreeViewColumn.new(args[:title])
col.pack_start(renderer, false)
col.add_attribute(renderer, :text, count)
renderer.model = args[:model] if args.key?(:model)
+ renderer.has_entry = args[:has_entry] if args.key?(:has_entry)
tv.append_column(col)
else
raise "Invalid type: '#{args[:type]}'."
end
@@ -101,9 +102,120 @@
returnval[count] = iter[count]
count += 1
end
return returnval
+ end
+
+ @@editable_text_callbacks = {
+ :datetime => {
+ :value => proc{ |data|
+ begin
+ Knj::Datet.in(data[:value]).dbstr
+ rescue Knj::Errors::InvalidData
+ raise "Invalid timestamp entered."
+ end
+ },
+ :value_set => proc{ |data|
+ Knj::Datet.in(data[:value]).out
+ }
+ },
+ :time_as_sec => {
+ :value => proc{ |data| Knj::Strings.human_time_str_to_secs(data[:value]) },
+ :value_set => proc{ |data| Knj::Strings.secs_to_human_time_str(data[:value]) }
+ },
+ :int => {
+ :value => proc{ |data| data[:value].to_i.to_s }
+ },
+ :human_number => {
+ :value => proc{ |data| Knj::Locales.number_in(data[:value]) },
+ :value_set => proc{ |data| Knj::Locales.number_out(data[:value], data[:col_data][:decimals]) }
+ }
+ }
+
+ def self.editable_text_renderers_to_model(args)
+ args[:id_col] = 0 if !args.key?(:id_col)
+
+ args[:cols].each do |col_no, col_data|
+ col_data = {:col => col_data} if col_data.is_a?(Symbol)
+
+ if col_data.key?(:type)
+ if callbacks = @@editable_text_callbacks[col_data[:type]]
+ col_data[:value_callback] = callbacks[:value] if callbacks.key?(:value)
+ col_data[:value_set_callback] = callbacks[:value_set] if callbacks.key?(:value_set)
+ else
+ raise "Invalid type: '#{col_data[:type]}'."
+ end
+ end
+
+ renderer = args[:renderers][col_no]
+
+ if renderer.is_a?(Gtk::CellRendererText)
+ renderer.editable = true
+ renderer.signal_connect("edited") do |renderer, row_no, value|
+ iter = args[:tv].model.get_iter(row_no)
+ id = args[:tv].model.get_value(iter, args[:id_col])
+ model_obj = args[:ob].get(args[:model_class], id)
+ cancel = false
+
+ if col_data[:value_callback]
+ begin
+ value = col_data[:value_callback].call(:args => args, :value => value, :model => model_obj, :col_no => col_no, :col_data => col_data)
+ rescue => e
+ Knj::Gtk2.msgbox(e.message, "warning")
+ cancel = true
+ end
+ end
+
+ if !cancel
+ args[:change_before].call if args[:change_before]
+
+ begin
+ model_obj[col_data[:col]] = value
+ value = col_data[:value_set_callback].call(:args => args, :value => value, :model => model_obj, :col_no => col_no, :col_data => col_data) if col_data.key?(:value_set_callback)
+ iter[col_no] = value
+ rescue => e
+ Knj::Gtk2.msgbox(e.message, "warning")
+ ensure
+ args[:change_after].call(:args => args) if args[:change_after]
+ end
+ end
+ end
+ elsif renderer.is_a?(Gtk::CellRendererToggle)
+ renderer.activatable = true
+ renderer.signal_connect("toggled") do |renderer, path, val|
+ iter = args[:tv].model.get_iter(path)
+ id = args[:tv].model.get_value(iter, 0)
+ model_obj = args[:ob].get(args[:model_class], id)
+
+ if col_data[:value_callback]
+ begin
+ value = col_data[:value_callback].call(:args => args, :value => value, :model => model_obj, :col_no => col_no, :col_data => col_data)
+ rescue => e
+ Knj::Gtk2.msgbox(e.message, "warning")
+ cancel = true
+ end
+ end
+
+ if !cancel
+ args[:change_before].call if args[:change_before]
+ begin
+ if model_obj[col_data[:col]].to_i == 1
+ model_obj[col_data[:col]] = 0
+ iter[col_no] = 0
+ else
+ model_obj[col_data[:col]] = 1
+ iter[col_no] = 1
+ end
+ ensure
+ args[:change_after].call(:args => args) if args[:change_after]
+ end
+ end
+ end
+ else
+ raise "Invalid cellrenderer: '#{renderer.class.name}'."
+ end
+ end
end
end
class Gtk::TreeView
def sel
\ No newline at end of file