I figured out the problem of why the nodes of my tree were appearing in reverse order. It has to do with how addleaf, insertleaf, addbranch, insertbranch work. If adding just leaves with one For loop, the fix is simple because you just need to add tree.value = i - 1 to the loop in order to have the previous node be selected instead of the current one before the next leaf is created:
require("iuplua") local tree = iup.flattree{rastersize="400x500"} tree["addbranch-1"] = "COLORS" local tlist = {"Black","Grey","White","Red","Orange","Yellow","Green","Blue","Purple","Pink","Brown"} for i,v in ipairs(tlist) do tree.value = i - 1 tree.addleaf = v end local testdlg = iup.dialog{iup.vbox{tree; ncmargin = "10 x 10"}; title = "Test Window"} testdlg:showxy(iup.CENTER, iup.CENTER) if (iup.MainLoopLevel()==0) then iup.MainLoop() end Things get more complicated with adding branches. I wanted my branches all at the same depth, but addbranch kept adding +1 depth. I couldn't make the "insert" commands work either with the nested loops in the actual code giving me problems. I had to ditch those commands and create a table of tables to use TreeAddNodes on. This is what the code looks like now, and what it does is take info about an app's modules and the category names that they're grouped under, alphabetizes the categories then module names, arranges them in a tree, and when the user clicks on a module name, it executes a function in that module's Lua file to make its dialog appear: -- MODULE TREE ------------------------------------------------------------- local modtree = iup.flattree{rastersize = "400x500"} modtree["addbranch-1"] = "MODULES" --unlike iup.tree, add root node for iup.flattree like this modtree:SetNodeAttributes(0,{titlefontstyle = "Bold"}) --make root node bold modtree.addexpanded = "YES" local ay_cats = {} --array to alphabetize categories for cat in pairs(cats) do --iterate thru all mod categories table.insert(ay_cats, cat) --assign each category to the array end table.sort(ay_cats, function(a, b) return a:lower() < b:lower() end) --alphabetize categories (which are strings) --Using add/insert branch/leaf commands in these nested loops will give the wrong depth/layout, --so a table of tables must be built (treebuild) and TreeAddNodes called after. local treebuild = {} local ay_modtree = {} --array to collect alphabetized categories/mods in same order as they should appear in tree for _,v in ipairs(ay_cats) do --iterate thru alphabetized category array local catmods = {branchname = v} --adds a branch with category name table.insert(ay_modtree, v) --a placeholder so leaves will have indices that match their node IDs local sorter = {} --temporary array for sorting mods for _,module in pairs(cats[v]) do --iterate thru each category, which is a key to a "module" table table.insert(sorter,module) --add module (a table) to temp table end table.sort(sorter, function(mod1, mod2) return mod1.label:lower() < mod2.label:lower() end) --alphabetize mods by module.label strings for _,val in ipairs(sorter) do --iterate thru alphabetized mods table.insert(catmods, val.label) --add leaf with mod's name table.insert(ay_modtree, val) --put alphabetized mods into tree table function modtree:executeleaf_cb(id) --callback for clicking on leaf. Gives the leaf's id. --Unlike the original button.action cb, attempting to assign a different function to each leaf didn't work since a node is part of --the tree, not an independent object. As a workaround, I had to list the categories/mods in an array mirroring their node order so --each leaf id (the default is a # corresponding to its order in the tree) matches an array index containing its mod's function. ay_modtree[id].bindsettings(t) --use leaf's id as index to call its module.bindsettings function from array end end table.insert(treebuild,catmods) end iup.TreeAddNodes(modtree, treebuild) _______________________________________________ Iup-users mailing list Iup-users@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/iup-users