Given the following hash: #... @project_list = { ''Contract0'' => nil, ''Contract1'' => { ''Project1'' => nil, ''Project2'' => nil, ''Project3'' => { ''task1'' => nil, ''task2'' => nil, ''task3'' => nil } }, ''Contract3'' => { ''Project1'' => nil }, ''Contract4'' => nil, ''Contract5'' => nil, ''Contract6long contract with Characters ~!!@#$!@$%#$&$^&(^&()'' => nil, ''Contract7'' => nil, ''Contract8'' => nil, ''Contract9'' => nil } #... #And Given the following code: #... @tc_project_list = Wx::TreeCtrl.new(self, :size => Wx::Size.new(175, 150), :style => Wx::TR_HIDE_ROOT | Wx::TR_EDIT_LABELS | Wx::TR_HAS_BUTTONS | Wx::TR_LINES_AT_ROOT) tcr_project_root = @tc_project_list.add_root("Project List") populate_project_tree(@project_list, tcr_project_root) #... #... def populate_project_tree(h_project_list, parent_node) h_project_list.each {|key, value| tree_node = @tc_project_list.append_item(parent_node, key.to_s) if value.class.to_s == "Hash" populate_project_tree(value, tree_node) end } end #... #=================================The big picture is to be able to populate the tree control and then re-order (NOT sorting) the items in the tree control. Is this possible? I have looked in the examples and haven''t found anything like this. I suspect it is possible with the get sibling functions, but I haven''t been able to piece together a way to accomplish this yet. Anyone have any ideas? Also I am noticing an odd thing (and I''m sure this must be something I''m doing) - When looking at my TreeCtrl - Contract0/Contract1 show up at the _bottom_ of the list, not at the top. Contract3 is at the top.
Hi EchoB wrote:> The big picture is to be able to populate the tree control and then > re-order (NOT sorting) the items in the tree control. Is this possible? > >There''s two ways to sort a TreeCtrl. Either 1) Subclass TreeCtrl and create an on_compare_items method in your subclass. This will be called whenever the ''sort_items'' is called. The method will be passed pairs of TreeItem ids to compare, and should return -1, 0 or 1 to indicate whether the first item comes before, equal to or after the second item. http://wxruby.rubyforge.org/doc/treectrl.html#TreeCtrl_oncompareitems 2) Maintain the order of the items as they are inserted. TreeCtrl#append_item is commonly used in the samples and adds the new item as the last child of the specified parent. But you can also add items to the tree using TreeCtrl#insert_item and #insert_item_before. With these you pass an additional argument to specify where the new item should be placed relative to the existing children of the parent item: http://wxruby.rubyforge.org/doc/treectrl.html#TreeCtrl_insertitem The second way is probably better (simpler, more efficient) if the project/task children in your example should always be shown in the same order. 1) is really useful if you want the user to be able to vary the order in which children are shown, for example, if you want them to be able to order by start date OR end date OR name. As a side hint in case you hadn''t seen this feature, if the items in a TreeCtrl are closely linked to program or database objects like a "Project" or "Task", look into using item_data (which can be passed as an argument to insert/append) to maintain that link. It means the TreeCtrl can work like a Ruby hash using get_item_data. This will make sorting the items easier. Note that there is no method in Wx to _move_ a TreeItem. It must be deleted and re-inserted/re-appended somewhere else.> Also I am noticing an odd thing (and I''m sure this must be something I''m > doing) - When looking at my TreeCtrl - Contract0/Contract1 show up at > the _bottom_ of the list, not at the top. Contract3 is at the top.This is because in ruby 1.8 the order in which key/value pairs are added to a hash isn''t guaranteed to be the order in which calling "each" and similar will yield the pairs. Hashes, unlike Arrays, aren''t ordered. Testing your example with ruby 1.8, Contract3 _is_ the first key yielded by each. This changes in Ruby 1.9, in which hash is ordered and "each" will return the items in your example in order they''re declared. cheers alex