]> git.saurik.com Git - wxWidgets.git/blame - wxPython/demo/VListBox.py
Have SetSizerProps internally handle the assignment of growable rows and cols.
[wxWidgets.git] / wxPython / demo / VListBox.py
CommitLineData
3628e088 1
8fa876ca 2import wx
3628e088
RD
3
4#----------------------------------------------------------------------
5
95bfd958 6# The wx.VListBox is much like a regular wx.ListBox except you draw the
3628e088 7# items yourself and the items can vary in height.
8fa876ca 8class MyVListBox(wx.VListBox):
3628e088
RD
9
10 # This method must be overridden. When called it should draw the
11 # n'th item on the dc within the rect. How it is drawn, and what
12 # is drawn is entirely up to you.
13 def OnDrawItem(self, dc, rect, n):
fb67a0b1
RD
14 if self.GetSelection() == n:
15 c = wx.SystemSettings.GetColour(wx.SYS_COLOUR_HIGHLIGHTTEXT)
16 else:
35ee3288 17 c = self.GetForegroundColour()
8eca4fef 18 dc.SetFont(self.GetFont())
fb67a0b1 19 dc.SetTextForeground(c)
3628e088 20 dc.DrawLabel(self._getItemText(n), rect,
8fa876ca 21 wx.ALIGN_LEFT | wx.ALIGN_CENTER_VERTICAL)
3628e088
RD
22
23 # This method must be overridden. It should return the height
24 # required to draw the n'th item.
25 def OnMeasureItem(self, n):
26 height = 0
27 for line in self._getItemText(n).split('\n'):
28 w, h = self.GetTextExtent(line)
29 height += h
30 return height + 5
31
32
33 # These are also overridable:
34 #
35 # OnDrawSeparator(dc, rect, n)
36 # Draw a separator between items. Note that rect may be reduced
37 # in size if desired so OnDrawItem gets a smaller rect.
38 #
39 # OnDrawBackground(dc, rect, n)
40 # Draw the background and maybe a border if desired.
41
42
43 def _getItemText(self, item):
44 if item % 2 == 0:
45 return "This is item# %d" % item
46 else:
47 return "This is item# %d\n with an extra line" % item
48
49#----------------------------------------------------------------------
50
8fa876ca
RD
51# The wx.HtmlListBox derives from wx.VListBox, but draws each item
52# itself as a wx.HtmlCell.
53class MyHtmlListBox(wx.HtmlListBox):
3628e088
RD
54
55 def OnGetItem(self, n):
56 if n % 2 == 0:
57 return "This is item# <b>%d</b>" % n
58 else:
59 return "This is item# <b>%d</b> <br>Any <font color='RED'>HTML</font> is okay." % n
60
61#----------------------------------------------------------------------
62
8fa876ca 63class TestPanel(wx.Panel):
3628e088
RD
64 def __init__(self, parent, log):
65 self.log = log
8fa876ca 66 wx.Panel.__init__(self, parent, -1)
3628e088
RD
67 spacer = 50
68
8fa876ca 69 vlb = MyVListBox(self, -1, size=(150, 250), style=wx.BORDER_SUNKEN)
3628e088
RD
70 vlb.SetItemCount(50)
71 vlb.SetSelection(0)
72 vlb.SetFocus()
8fa876ca 73 vlbSizer = wx.BoxSizer(wx.VERTICAL)
3628e088 74 vlbSizer.Add((spacer, spacer))
8fa876ca 75 vlbSizer.Add(wx.StaticText(self, -1, "wx.VListBox"), 0, 5, wx.ALL)
3628e088
RD
76 vlbSizer.Add(vlb)
77
8fa876ca 78 hlb = MyHtmlListBox(self, -1, size=(150, 250), style=wx.BORDER_SUNKEN)
3628e088
RD
79 hlb.SetItemCount(50)
80 hlb.SetSelection(0)
8fa876ca 81 hlbSizer = wx.BoxSizer(wx.VERTICAL)
3628e088 82 hlbSizer.Add((spacer, spacer))
8fa876ca 83 hlbSizer.Add(wx.StaticText(self, -1, "wx.HtmlListBox"), 0, 5, wx.ALL)
3628e088
RD
84 hlbSizer.Add(hlb)
85
8fa876ca 86 sizer = wx.BoxSizer(wx.HORIZONTAL)
3628e088
RD
87 sizer.Add((spacer, spacer))
88 sizer.Add(vlbSizer)
89 sizer.Add((spacer, spacer))
90 sizer.Add((spacer, spacer))
91 sizer.Add(hlbSizer)
92
93 self.SetSizer(sizer)
94
95
96#----------------------------------------------------------------------
97
98def runTest(frame, nb, log):
99 win = TestPanel(nb, log)
100 return win
101
102#----------------------------------------------------------------------
103
104
105
106overview = """<html><body>
95bfd958 107<h2><center>wx.VListBox and wx.HtmlListBox</center></h2>
3628e088
RD
108<hr>
109
110The "V" in wxVListBox stands for both "virtual" because it can have an
111unlimited number of items since it doesn't store them itself, and
112"variable" since items can vary in height. It has much the same
113interface as wxListBox and also emits the same events so you can use
114the same EVT_LISTBOX function to connect a handler.
115<p>
116
95bfd958
RD
117The wx.HtmlListBox derives from wx.VListBox, but draws each item itself
118as a wx.HtmlCell. This means that you just need to provide a snippet
3628e088
RD
119of HTML for each item when requested.
120
121</body></html>
122"""
123
124
125
126if __name__ == '__main__':
127 import sys,os
128 import run
8eca4fef 129 run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
3628e088 130