I think the problem is with

treeCtrl:SetImageList(wx.wxImageList(16, 16))

you need to have something like this

-- DO NOT DELETE this until the treeCtrl is deleted
-- i.e. make it a global var and let wxLua delete it when the program ends
imgList = wx.wxImageList(16, 16)
treeCtrl:SetImageList(imgList)

The issue is that the wxTreeCtrl does not take ownership or copy the
pointer to the wxImageList
so all wxLua can do is pass in it's copy and so you must keep it
around at least as long
as the wxTreeCtrl exists or you call wxTreeCtrl::SetImageList(wx.NULL).

http://docs.wxwidgets.org/stable/wx_wxtreectrl.html#wxtreectrlsetimagelist

Hope this works,
    John


On Sun, May 23, 2010 at 2:13 AM, Henk Boom <h...@henk.ca> wrote:
> Hi, I'm just getting started using wxLua, and have hit a couple of problems.
>
> I tried writing a small file-tree view with Icons in wxLua but had a
> few issues. I've included the code at the end of this email.
>
> If I run it as-is (with 'lua fileview.lua') I get a segmentation fault
> after a few icons have loaded. If I disable garbage collection (with
> collectgarbage('stop')) then the segfault goes away, but I get error
> messages saying that the icons couldn't be loaded (the filenames seem
> to be strings such as "gnome-compressed" and not actual filenames). If
> I hardcode a path to an icon, then it loads properly, though all the
> files obviously have that one icon. Either way, if I turn garbage
> collection back on I get a segmentation fault.
>
> I'm using the GTK port of wxWidgets, compiled from the 2.8.11 source
> tarball with --enable-debug. My version of wxLua was also compiled
> from the source tarball. I'm using a 64-bit installation of Ubuntu
> 10.4, and running in the Gnome desktop environment.
>
> Also, in case it's important, the wxIcon(wxIconLocation) constructor
> seems not to be bound, so I'm using wxIcon(iconLoc:GetFileName(),
> wx.wxBITMAP_TYPE_ANY) instead.
>
> Is there a bug, or am I doing something very wrong? :x
>
>    henk
>
>
> PS. This is the code I'm trying to run. I added a
> collectgarbage('collect') call in a place which seems to cause it to
> consistently crash every time.
> ---
>
> require 'wx'
> require 'lfs'
>
> --collectgarbage('stop')
>
> frame = wx.wxFrame(wx.NULL, wx.wxID_ANY, 'wxLua Minimal Demo',
>                   wx.wxDefaultPosition, wx.wxSize(450, 450),
>                   wx.wxDEFAULT_FRAME_STYLE)
>
> ---- file tree 
> ----------------------------------------------------------------
>
> treeCtrl = wx.wxTreeCtrl(frame, wx.wxID_ANY)
> treeCtrl:SetImageList(wx.wxImageList(16, 16))
> root = treeCtrl:AddRoot('files')
>
> do
>  local icons = {}
>  local function getIcon(filename)
>    local ext = string.match(filename, '.+%.([^.]*)$')
>
>    if ext and not icons[ext] then
>      local ft = wx.wxTheMimeTypesManager:GetFileTypeFromExtension(ext)
>      if ft then
>        local iconLoc = wx.wxIconLocation()
>        if ft:GetIcon(iconLoc) then
>          print('found for ' .. ext .. ': "' .. iconLoc:GetFileName() .. '"')
>          local icon = wx.wxIcon(iconLoc:GetFileName(), wx.wxBITMAP_TYPE_ANY)
>          --local icon =
> wx.wxIcon("/usr/share/icons/gnome/16x16/mimetypes/unknown.png",
> wx.wxBITMAP_TYPE_ANY)
>          collectgarbage('collect')
>          if icon:Ok() then
>            icons[ext] = treeCtrl:GetImageList():Add(icon)
>          end
>          print('there are now ' ..
> treeCtrl:GetImageList():GetImageCount() .. ' icons')
>        end
>      end
>    end
>    return icons[ext]
>  end
>  local function recurse (dir, parentNode)
>    for f in lfs.dir(dir) do
>      if f ~= '.' and f ~= '..' then
>        local node = treeCtrl:AppendItem(parentNode, f)
>
>        local icon = getIcon(f)
>        if icon then
>          treeCtrl:SetItemImage(node, icon)
>        end
>
>        if lfs.attributes(dir .. '/' .. f).mode == 'directory' then
>          recurse(dir .. '/' .. f, node)
>        end
>      end
>    end
>    treeCtrl:SortChildren(parentNode)
>  end
>  recurse('.', root)
> end
>
> ---- init 
> ---------------------------------------------------------------------
>
> frame:Show(true)
> wx.wxGetApp():MainLoop()
>
> ---
>
> ------------------------------------------------------------------------------
>
> _______________________________________________
> wxlua-users mailing list
> wxlua-users@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/wxlua-users
>

------------------------------------------------------------------------------

_______________________________________________
wxlua-users mailing list
wxlua-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/wxlua-users

Reply via email to