import wx
import images
import random
import os, sys
try:
dirName = os.path.dirname(os.path.abspath(__file__))
except:
dirName = os.path.dirname(os.path.abspath(sys.argv[0]))
sys.path.append(os.path.split(dirName)[0])
try:
from agw import ultimatelistctrl
except ImportError: # if it's not there locally, try the wxPython lib.
from wx.lib.agw import ultimatelistctrl
def GenerateRandomList(imgList):
rList = []
chance = random.randint(0, 2)
if chance < 2:
return rList
numImages = random.randint(1, 3)
listSize = imgList.GetImageCount()
for i in xrange(numImages):
rList.append(random.randint(0, listSize-1))
return rList
class TestUltimateListCtrl(ULC.UltimateListCtrl):
def __init__(self, parent, log):
ULC.UltimateListCtrl.__init__(self, parent, -1,
agwStyle=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES)
self.log = log
self.il = wx.ImageList(16, 16)
self.il.Add(images.Smiles.GetBitmap())
self.il.Add(images.core.GetBitmap())
self.il.Add(images.custom.GetBitmap())
self.il.Add(images.exit.GetBitmap())
self.il.Add(images.expansion.GetBitmap())
self.SetImageList(self.il, wx.IMAGE_LIST_SMALL)
self.InsertColumn(0, "First")
self.InsertColumn(1, "Second")
self.InsertColumn(2, "Third")
self.SetColumnWidth(0, 175)
self.SetColumnWidth(1, 175)
self.SetColumnWidth(2, 175)
# After setting the column width you can specify that
# this column expands to fill the window. Only one
# column may be specified.
self.SetColumnWidth(2, ULC.ULC_AUTOSIZE_FILL)
self.SetItemCount(1000000)
self.attr1 = ULC.UltimateListItemAttr()
self.attr1.SetBackgroundColour(wx.NamedColour("yellow"))
self.attr2 = ULC.UltimateListItemAttr()
self.attr2.SetBackgroundColour(wx.NamedColour("light blue"))
self.Bind(wx.EVT_LIST_ITEM_SELECTED, self.OnItemSelected)
self.Bind(wx.EVT_LIST_ITEM_ACTIVATED, self.OnItemActivated)
self.Bind(wx.EVT_LIST_ITEM_DESELECTED, self.OnItemDeselected)
self.randomLists = [GenerateRandomList(self.il) for i in xrange(5)]
def OnItemSelected(self, event):
self.currentItem = event.m_itemIndex
self.log.write("OnItemSelected: %s, %s, %s, %s\n" %(self.currentItem,
self.GetItemText(self.currentItem),
self.getColumnText(self.currentItem, 1),
self.getColumnText(self.currentItem, 2)))
def OnItemActivated(self, event):
self.currentItem = event.m_itemIndex
self.log.write("OnItemActivated: %s\nTopItem: %s\n" %(self.GetItemText(self.currentItem), self.GetTopItem()))
def getColumnText(self, index, col):
item = self.GetItem(index, col)
return item.GetText()
def OnItemDeselected(self, evt):
self.log.write("OnItemDeselected: %s\n" % evt.m_itemIndex)
#---------------------------------------------------
# These methods are callbacks for implementing the
# "virtualness" of the list... Normally you would
# determine the text, attributes and/or image based
# on values from some external data source, but for
# this demo we'll just calculate them
def OnGetItemText(self, item, col):
return "Item %d, column %d" % (item, col)
def OnGetItemColumnImage(self, item, column):
return self.randomLists[item%5]
def OnGetItemImage(self, item):
return self.randomLists[item%5]
def OnGetItemAttr(self, item):
if item % 3 == 1:
return self.attr1
elif item % 3 == 2:
return self.attr2
else:
return None
def OnGetItemColumnCheck(self, item, column):
if item%3 == 0:
return True
return False
def OnGetItemCheck(self, item):
if item%3 == 1:
return True
return False
def OnGetItemColumnKind(self, item, column):
if item%3 == 0:
return 2
elif item%3 == 1:
return 1
return 0
#---------------------------------------------------------------------------
class TestFrame(wx.Frame):
def __init__(self, parent, log):
wx.Frame.__init__(self, parent, -1, "UltimateListCtrl in wx.LC_VIRTUAL mode", size=(700, 600))
panel = wx.Panel(self, -1)
sizer = wx.BoxSizer(wx.VERTICAL)
listCtrl = TestUltimateListCtrl(panel, log)
sizer.Add(listCtrl, 1, wx.EXPAND)
panel.SetSizer(sizer)
sizer.Layout()
self.SetIcon(images.Mondrian.GetIcon())
self.CenterOnScreen()
self.Show()
#---------------------------------------------------------------------------
if __name__ == '__main__':
import sys
app = wx.PySimpleApp()
frame = TestFrame(None, sys.stdout)
frame.Show(True)
app.MainLoop()
|