Here is a workaround for HitTest() to return the correct
column number, also after column widths have been changed.
But, this workaround requires the width of each column to be
set by an explicit call to SetColumnWidth(). Failing to do
so will result in a crash (segementation fault) on Linux. Not
sure about Windows.
The complete, updated example is attached.
/Jean Brouwers
def HitTest(self, point):
w = self.GetMainWindow()
p = self.ScreenToClient(w.ClientToScreen(point))
#XXX find column since HitTest() doesn't work correctly,
# but this workaround fails unless the column width is
# set explicitly for every column with SetColumnWidth()
w, c = p.x, -1
for i in range(self.GetColumnCount()):
w -= self.GetColumnWidth(i)
if w < 0:
c = i
break
#XXX ignore column returned by HitTest() thru w
i, f, w = gzmc.wxTreeListCtrl_HitTest(self, p)
return (i, f, c)
Jean Brouwers wrote:
One more piece of data, after adding more columns. The column
number return by HitTest() is always zero, except for 'Column 1'
where it is one.
/Jean
PS) The TreeListCtrl does everything we need, except returning
the correct column number. It would really nice to have that
part work as well. I tried working around the problem using
the GetColumnWidth(), but that causes a crash (on RH 8 Linux)
Jean Brouwers wrote:
Roger,
Using your HitTest() still fails. The column number returned
in the 3rd element is (and was) correct for the first two columns.
But it is 0 (zero) when right-clicked on the third column, the one
labeled 'Column 2'.
Also, the right-click still returns 'invalid tree item' occasionally.
/Jean
Roger Binns wrote:
def bias(self, root):
self._bias = 0, self.GetBoundingRect(root).GetHeight() + self.GetSpacing()
def HitTest(self, point):
p = wxPoint(point.x + self._bias[0], point.y + self._bias[1])
i, f, c = gzmc.wxTreeListCtrl_HitTest(self, p)
i = wxTreeItemIdPtr(i)
i.thisown = 1
return (i, f, c)
Get rid of the bias and that version of hittest. This one works:
def HitTest(self, point):
w = self.GetMainWindow()
return gizmosc.wxTreeListCtrl_HitTest(self, self.ScreenToClient(w.ClientToScreen(point)))
Roger
---------------------------------------------------------------------
To unsubscribe, e-mail: wxPython-users-unsubscribe@lists.wxwindows.org
For additional commands, e-mail: wxPython-users-help@lists.wxwindows.org
---------------------------------------------------------------------
To unsubscribe, e-mail: wxPython-users-unsubscribe@lists.wxwindows.org
For additional commands, e-mail: wxPython-users-help@lists.wxwindows.org
---------------------------------------------------------------------
To unsubscribe, e-mail: wxPython-users-unsubscribe@lists.wxwindows.org
For additional commands, e-mail: wxPython-users-help@lists.wxwindows.org
------------------------------------------------------------------------
from wxPython.wx import *
#from wxPython.gizmos import wxTreeListCtrl
import wxPython.gizmos as gzm
import wxPython.gizmosc as gzmc
import images
class wxTreeListCtrl2(gzm.wxTreeListCtrl):
_bias = 0, 0
'''From ActiveState Community - Boosting coder and team productivity with ready-to-use open source languages and tools.
'''
def GetFirstChild(self, *args, **kwds):
return gzmc.wxTreeListCtrl_GetFirstChild(self, *args, **kwds)
def GetNextChild(self, *args, **kwds):
return gzmc.wxTreeListCtrl_GetNextChild(self, *args, **kwds)
def bias(self, root):
self._bias = 0, self.GetBoundingRect(root).GetHeight() + self.GetSpacing()
def HitTest(self, point):
w = self.GetMainWindow()
p = self.ScreenToClient(w.ClientToScreen(point))
#XXX find column since HitTest() doesn't work correctly,
# but this workaround fails unless the column width is
# set explicitly for every column with SetColumnWidth()
w, c = p.x, -1
for i in range(self.GetColumnCount()):
w -= self.GetColumnWidth(i)
if w < 0:
c = i
break
#XXX ignore column returned by HitTest() thru w
i, f, w = gzmc.wxTreeListCtrl_HitTest(self, p)
return (i, f, c)
#----------------------------------------------------------------------
class TestPanel(wxPanel):
def __init__(self, parent, log):
self.log = log
wxPanel.__init__(self, parent, -1)
EVT_SIZE(self, self.OnSize)
tID = wxNewId()
self.tree = wxTreeListCtrl2(self, tID, style = wxTR_DEFAULT_STYLE
#| wxTR_ROW_LINES
#| wxTR_NO_LINES | wxTR_TWIST_BUTTONS
)
isz = (16,16)
il = wxImageList(isz[0], isz[1])
fldridx = il.Add(wxArtProvider_GetBitmap(wxART_FOLDER, wxART_OTHER, isz))
fldropenidx = il.Add(wxArtProvider_GetBitmap(wxART_FILE_OPEN, wxART_OTHER, isz))
fileidx = il.Add(wxArtProvider_GetBitmap(wxART_REPORT_VIEW, wxART_OTHER, isz))
smileidx = il.Add(images.getSmilesBitmap())
self.tree.SetImageList(il)
self.il = il
# create some columns
self.tree.AddColumn("Main column")
self.tree.AddColumn("Column 1")
self.tree.AddColumn("Column 2")
self.tree.AddColumn("Column 3")
self.tree.SetMainColumn(0) # the one with the tree in it...
self.tree.SetColumnWidth(0, 175)
# XXX set width for eveyr column, see HitTest() above
self.tree.SetColumnWidth(1, 125)
self.tree.SetColumnWidth(2, 100)
self.tree.SetColumnWidth(3, 75)
self.root = self.tree.AddRoot("The Root Item")
self.tree.SetItemText(self.root, "col 1 root", 1)
self.tree.SetItemText(self.root, "col 2 root", 2)
self.tree.SetItemText(self.root, "col 3 root", 3)
self.tree.SetItemImage(self.root, fldridx, which = wxTreeItemIcon_Normal)
self.tree.SetItemImage(self.root, fldropenidx, which = wxTreeItemIcon_Expanded)
self.tree.bias(self.root)
for x in range(15):
txt = "Item %d " % x
child = self.tree.AppendItem(self.root, txt)
self.tree.SetItemText(child, txt + "(c1)", 1)
self.tree.SetItemText(child, txt + "(c2)", 2)
self.tree.SetItemText(child, txt + "(c3)", 3)
self.tree.SetItemImage(child, fldridx, which = wxTreeItemIcon_Normal)
self.tree.SetItemImage(child, fldropenidx, which = wxTreeItemIcon_Expanded)
for y in range(5):
txt = "item %d-%s " % (x, chr(ord("a")+y))
last = self.tree.AppendItem(child, txt)
self.tree.SetItemText(last, txt + "(c1)", 1)
self.tree.SetItemText(last, txt + "(c2)", 2)
self.tree.SetItemText(last, txt + "(c3)", 3)
self.tree.SetItemImage(last, fldridx, which = wxTreeItemIcon_Normal)
self.tree.SetItemImage(last, fldropenidx, which = wxTreeItemIcon_Expanded)
for z in range(3):
txt = "item %d-%s-%d" % (x, chr(ord("a")+y), z)
item = self.tree.AppendItem(last, txt)
self.tree.SetItemText(item, txt + "(c1)", 1)
self.tree.SetItemText(item, txt + "(c2)", 2)
self.tree.SetItemText(item, txt + "(c3)", 3)
self.tree.SetItemImage(item, fileidx, which = wxTreeItemIcon_Normal)
self.tree.SetItemImage(item, smileidx, which = wxTreeItemIcon_Selected)
self.tree.Expand(self.root)
EVT_TREE_ITEM_EXPANDED (self, tID, self.OnItemExpanded)
EVT_TREE_ITEM_COLLAPSED (self, tID, self.OnItemCollapsed)
EVT_TREE_SEL_CHANGED (self, tID, self.OnSelChanged)
EVT_TREE_BEGIN_LABEL_EDIT(self, tID, self.OnBeginEdit)
EVT_TREE_END_LABEL_EDIT (self, tID, self.OnEndEdit)
EVT_TREE_ITEM_ACTIVATED (self, tID, self.OnActivate)
w = self.tree.GetMainWindow()
EVT_LEFT_DCLICK(w, self.OnLeftDClick)
EVT_RIGHT_DOWN(w, self.OnRightDown)
def OnLeftDClick(self, event):
## pt = event.GetPosition();
## item, flags, col = self.tree.HitTest(pt)
## self.log.WriteText("OnLeftDClick: %s\n" % self.tree.GetItemText(item))
## parent = self.tree.GetItemParent(item)
## self.tree.SortChildren(parent)
event.Skip()
def OnRightDown(self, event):
pt = event.GetPosition();
item, flags, col = self.tree.HitTest(pt)
self.log.WriteText("OnRightDown: %s, %s, col %s\n" %
(self.tree.GetItemText(item), item.__class__, col))
self.tree.SelectItem(item)
def OnBeginEdit(self, event):
self.log.WriteText("OnBeginEdit\n")
# show how to prevent edit...
if self.tree.GetItemText(event.GetItem()) == "The Root Item":
wxBell()
self.log.WriteText("You can't edit this one...\n")
# Lets just see what's visible of its children
cookie = 0
root = event.GetItem()
(child, cookie) = self.tree.GetFirstChild(root, cookie)
while child.IsOk():
self.log.WriteText("Child [%s] visible = %d" %
(self.tree.GetItemText(child),
self.tree.IsVisible(child)))
(child, cookie) = self.tree.GetNextChild(root, cookie)
event.Veto()
def OnEndEdit(self, event):
self.log.WriteText("OnEndEdit\n")
# show how to reject edit, we'll not allow any digits
for x in event.GetLabel():
if x in string.digits:
self.log.WriteText("You can't enter digits...\n")
event.Veto()
return
def OnSize(self, event):
w,h = self.GetClientSizeTuple()
self.tree.SetDimensions(0, 0, w, h)
def OnItemExpanded(self, event):
item = event.GetItem()
self.log.WriteText("OnItemExpanded: %s\n" % self.tree.GetItemText(item))
def OnItemCollapsed(self, event):
item = event.GetItem()
self.log.WriteText("OnItemCollapsed: %s\n" % self.tree.GetItemText(item))
def OnSelChanged(self, event):
self.item = event.GetItem()
self.log.WriteText("OnSelChanged: %s\n" % self.tree.GetItemText(self.item))
if wxPlatform == '__WXMSW__':
self.log.WriteText("BoundingRect: %s\n" %
self.tree.GetBoundingRect(self.item, True))
#items = self.tree.GetSelections()
#print map(self.tree.GetItemText, items)
event.Skip()
def OnActivate(self, event):
self.log.WriteText("OnActivate: %s\n" % self.tree.GetItemText(self.item))
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = """<html><body>
<h2><center>wxTreeListCtrl2</center></h2>
The wxTreeListCtrl is essentially a wxTreeCtrl
with extra columns, such that the look is similar
to a wxListCtrl.
</body></html>
"""
if __name__ == '__main__':
#raw_input("Press enter...")
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])])
------------------------------------------------------------------------
---------------------------------------------------------------------
To unsubscribe, e-mail: wxPython-users-unsubscribe@lists.wxwindows.org
For additional commands, e-mail: wxPython-users-help@lists.wxwindows.org