#!/usr/bin/env python import wx import images #---------------------------------------------------------------------- class TestVirtualList(wx.ListCtrl): def __init__(self, parent, log): wx.ListCtrl.__init__( self, parent, -1, style=wx.LC_REPORT|wx.LC_VIRTUAL|wx.LC_HRULES|wx.LC_VRULES ) self.log = log self.il = wx.ImageList(16, 16) self.idx1 = self.il.Add(images.Smiles.GetBitmap()) empty = self.makeBlank() self.idx2 = self.il.Add(empty) 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) self.SetItemCount(1000000) self.attr1 = wx.ItemAttr() self.attr1.SetBackgroundColour("yellow") self.attr2 = wx.ItemAttr() self.attr2.SetBackgroundColour("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) def makeBlank(self): empty = wx.Bitmap(16,16,32) dc = wx.MemoryDC(empty) dc.SetBackground(wx.Brush((0,0,0,0))) dc.Clear() del dc empty.SetMaskColour((0,0,0)) return empty def OnItemSelected(self, event): self.currentItem = event.Index self.log.WriteText('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.Index self.log.WriteText("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.WriteText("OnItemDeselected: %s" % evt.Index) #----------------------------------------------------------------- # 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 OnGetItemImage(self, item): if item % 3 == 0: return self.idx1 else: return self.idx2 def OnGetItemAttr(self, item): if item % 3 == 1: return self.attr1 elif item % 3 == 2: return self.attr2 else: return None class TestVirtualListPanel(wx.Panel): def __init__(self, parent, log): wx.Panel.__init__(self, parent, -1, style=wx.WANTS_CHARS) self.log = log sizer = wx.BoxSizer(wx.VERTICAL) if wx.Platform == "__WXMAC__" and \ hasattr(wx.GetApp().GetTopWindow(), "LoadDemo"): self.useNative = wx.CheckBox(self, -1, "Use native listctrl") self.useNative.SetValue( not wx.SystemOptions.GetOptionInt("mac.listctrl.always_use_generic") ) self.Bind(wx.EVT_CHECKBOX, self.OnUseNative, self.useNative) sizer.Add(self.useNative, 0, wx.ALL | wx.ALIGN_RIGHT, 4) self.list = TestVirtualList(self, self.log) sizer.Add(self.list, 1, wx.EXPAND) self.SetSizer(sizer) self.SetAutoLayout(True) def OnUseNative(self, event): wx.SystemOptions.SetOptionInt("mac.listctrl.always_use_generic", not event.IsChecked()) wx.GetApp().GetTopWindow().LoadDemo("ListCtrl_virtual") #---------------------------------------------------------------------- def runTest(frame, nb, log): win = TestVirtualListPanel(nb, log) return win #---------------------------------------------------------------------- overview = """\ This example demonstrates the ListCtrl's Virtual List features. A Virtual list can contain any number of cells, but data is not loaded into the control itself. It is loaded on demand via virtual methods OnGetItemText(), OnGetItemImage(), and OnGetItemAttr(). This greatly reduces the amount of memory required without limiting what can be done with the list control itself. """ if __name__ == '__main__': import sys,os import run run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])