[ruby-gnome2-doc-cvs] [Ruby-GNOME2 Project Website] update - tut-gtk2-treev-etr

Back to archive index

ruby-****@sourc***** ruby-****@sourc*****
2009年 2月 17日 (火) 03:57:16 JST


-------------------------
REMOTE_ADDR = 74.15.84.244
REMOTE_HOST = 
        URL = http://ruby-gnome2.sourceforge.jp/hiki.cgi?tut-gtk2-treev-etr
-------------------------
@@ -1,10 +1,129 @@
 = The Tree View Widget
-{{link "tut-gtk2-treev-addrnhs", "tut-gtk2-treev", "tut-gtk", "tut-gtk2-treev-etr"}}
+{{link "tut-gtk2-treev-addrnhs", "tut-gtk2-treev", "tut-gtk", "tut-gtk2-treev-cdf"}}
 
-= Sorry this page is still under construction
-
 == Editable Text Renderers
 
+{{image_right("treev-etr-01.png")}}
 
-{{image_left("treev-etr-01.png")}}
+It would be very helpful to allow the user to edit the contents of the tree view. As it turns out, GTK+ provides a simple way to edit textual components of the tree view. To accomplish this you employ the Gtk::CellRendererText's ((*edited*)) signal. When a user clicks on a cell in the selected row that is marked  as editable, a Gtk::Entry will be placed in that cell. After the user presses the Enter key or removes the focus from the text entry, the ((*edited*)) signal will be emitted. Let's have a look at the following program listing of the application demonstrating this: 
+
 {{br}}
+
+{{*editable_cell.br*}}
+ #!/usr/bin/env ruby
+ require 'gtk2'
+ 
+ # Add three columns to the GtkTreeView. All three of the
+ # columns will be displayed as text, although one is a boolean
+ # value and another is an integer.
+ def setup_tree_view(treeview)
+   # Create a new GtkCellRendererText, add it to the tree
+   # view column and append the column to the tree view.
+   renderer = Gtk::CellRendererText.new
+   column = Gtk::TreeViewColumn.new("Buy", renderer, "text" => $buy_index)
+   treeview.append_column(column)
+   renderer = Gtk::CellRendererText.new
+   column = Gtk::TreeViewColumn.new("Count", renderer, "text" => $qty_index)
+   treeview.append_column(column)
+ 
+   #  Setup the third column in the tree view to be editable.
+   renderer = Gtk::CellRendererText.new
+   renderer.editable = true
+   renderer.signal_connect('edited') do |w, s1, s2 |
+     cell_edited(s1, s2, treeview)
+   end
+   column = Gtk::TreeViewColumn.new("Product", renderer, "text" => $prod_index)
+   treeview.append_column(column)
+ end
+ 
+ # Apply the changed text to the cell.
+ def cell_edited(path, str, trvu)
+   if str != ""
+     iter = trvu.model.get_iter(path)
+     iter[$prod_index] = str
+   end
+   puts "path=[#{path}] #{path.class}, str=[#{str}] #{str.class}]"
+ end
+ 
+ window = Gtk::Window.new(Gtk::Window::TOPLEVEL)
+ window.resizable = true
+ window.title = "Grocery List"
+ window.border_width = 10
+ window.signal_connect('delete_event') { Gtk.main_quit }
+ window.set_size_request(275, 300)
+ 
+ class GroceryItem
+   attr_accessor :product_type, :buy, :quantity, :product
+   def initialize(t,b,q,p)
+     @product_type, @buy, @quantity, @product = t, b, q, p
+   end
+ end
+ $buy_index = 0; $qty_index = 1; $prod_index = 2
+ $p_category = 0; $p_child = 1
+ 
+ list = Array.new
+ list[0] = GroceryItem.new($p_category, true,  0, "Cleaning Supplies")
+ list[1] = GroceryItem.new($p_child,    true,  1, "Paper Towels")
+ list[2] = GroceryItem.new($p_child,    true,  3, "Toilet Paper")
+ list[3] = GroceryItem.new($p_category, true,  0, "Food")
+ list[4] = GroceryItem.new($p_child,    true,  2, "Bread")
+ list[5] = GroceryItem.new($p_child,    false, 1, "Butter")
+ list[6] = GroceryItem.new($p_child,    true,  1, "Milk")
+ list[7] = GroceryItem.new($p_child,    false, 3, "Chips")
+ list[8] = GroceryItem.new($p_child,    true,  4, "Soda")
+ 
+ treeview = Gtk::TreeView.new
+ setup_tree_view(treeview)
+ 
+ # Create a new tree model with three columns, as Boolean, 
+ # integer and string.
+ store = Gtk::TreeStore.new(TrueClass, Integer, String)
+ 
+ # Avoid creation of iterators on every iteration, since they
+ # need to provide state information for all iterations. Hence:
+ # establish closure variables for iterators parent and child.
+ parent = child = nil
+ 
+ # Add all of the products to the GtkListStore.
+ list.each_with_index do |e, i|
+ 
+   # If the product type is a category, count the quantity
+   # of all of the products in the category that are going
+   # to be bought.
+   if (e.product_type == $p_category)
+     j = i + 1
+ 
+     # Calculate how many products will be bought in
+     # the category.
+     while j < list.size && list[j].product_type != $p_category
+       list[i].quantity += list[j].quantity if list[j].buy
+       j += 1
+     end
+     
+     # Add the category as a new root (parent) row (element).
+     parent = store.append(nil)
+     # store.set_value(parent, $buy_index, list[i].buy) # <= same as below
+     parent[$buy_index]  = list[i].buy
+     parent[$qty_index]  = list[i].quantity
+     parent[$prod_index] = list[i].product
+ 
+   # Otherwise, add the product as a child row of the category.
+   else
+     child = store.append(parent)
+     # store.set_value(child, $buy_index, list[i].buy) # <= same as below
+     child[$buy_index]  = list[i].buy
+     child[$qty_index]  = list[i].quantity
+     child[$prod_index] = list[i].product
+   end
+ end
+ 
+ # Add the tree model to the tree view
+ treeview.model = store
+ treeview.expand_all
+ 
+ scrolled_win = Gtk::ScrolledWindow.new
+ scrolled_win.add(treeview)
+ scrolled_win.set_policy(Gtk::POLICY_AUTOMATIC, Gtk::POLICY_AUTOMATIC)
+ window.add(scrolled_win)
+ window.show_all
+ Gtk.main




ruby-gnome2-cvs メーリングリストの案内
Back to archive index