1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151
|
import wx
import wx.combo
#----------------------------------------------------------------------
# This ComboBox class graphically displays the various pen styles that
# are available, making it easy for the user to choose the style they
# want.
class PenStyleComboBox(wx.combo.OwnerDrawnComboBox):
# Overridden from OwnerDrawnComboBox, called to draw each
# item in the list
def OnDrawItem(self, dc, rect, item, flags):
if item == wx.NOT_FOUND:
# painting the control, but there is no valid item selected yet
return
r = wx.Rect(*rect) # make a copy
r.Deflate(3, 5)
penStyle = wx.SOLID
if item == 1:
penStyle = wx.TRANSPARENT
elif item == 2:
penStyle = wx.DOT
elif item == 3:
penStyle = wx.LONG_DASH
elif item == 4:
penStyle = wx.SHORT_DASH
elif item == 5:
penStyle = wx.DOT_DASH
elif item == 6:
penStyle = wx.BDIAGONAL_HATCH
elif item == 7:
penStyle = wx.CROSSDIAG_HATCH
elif item == 8:
penStyle = wx.FDIAGONAL_HATCH
elif item == 9:
penStyle = wx.CROSS_HATCH
elif item == 10:
penStyle = wx.HORIZONTAL_HATCH
elif item == 11:
penStyle = wx.VERTICAL_HATCH
pen = wx.Pen(dc.GetTextForeground(), 3, penStyle)
dc.SetPen(pen)
if flags & wx.combo.ODCB_PAINTING_CONTROL:
# for painting the control itself
dc.DrawLine( r.x+5, r.y+r.height/2, r.x+r.width - 5, r.y+r.height/2 )
else:
# for painting the items in the popup
dc.DrawText(self.GetString( item ),
r.x + 3,
(r.y + 0) + ( (r.height/2) - dc.GetCharHeight() )/2
)
dc.DrawLine( r.x+5, r.y+((r.height/4)*3)+1, r.x+r.width - 5, r.y+((r.height/4)*3)+1 )
# Overridden from OwnerDrawnComboBox, called for drawing the
# background area of each item.
def OnDrawBackground(self, dc, rect, item, flags):
# If the item is selected, or its item # iseven, or we are painting the
# combo control itself, then use the default rendering.
if (item & 1 == 0 or flags & (wx.combo.ODCB_PAINTING_CONTROL |
wx.combo.ODCB_PAINTING_SELECTED)):
wx.combo.OwnerDrawnComboBox.OnDrawBackground(self, dc, rect, item, flags)
return
# Otherwise, draw every other background with different colour.
bgCol = wx.Colour(240,240,250)
dc.SetBrush(wx.Brush(bgCol))
dc.SetPen(wx.Pen(bgCol))
dc.DrawRectangleRect(rect);
# Overridden from OwnerDrawnComboBox, should return the height
# needed to display an item in the popup, or -1 for default
def OnMeasureItem(self, item):
# Simply demonstrate the ability to have variable-height items
if item & 1:
return 36
else:
return 24
# Overridden from OwnerDrawnComboBox. Callback for item width, or
# -1 for default/undetermined
def OnMeasureItemWidth(self, item):
return -1; # default - will be measured from text width
#----------------------------------------------------------------------
class TestPanel(wx.Panel):
def __init__(self, parent, log):
self.log = log
wx.Panel.__init__(self, parent, -1)
penStyles = [
"Solid",
"Transparent",
"Dot",
"Long Dash",
"Short Dash",
"Dot Dash",
"Backward Diagonal Hatch",
"Cross-diagonal Hatch",
"Forward Diagonal Hatch",
"Cross Hatch",
"Horizontal Hatch",
"Vertical Hatch",
]
wx.StaticText(self, -1, "Pen Styles:", (20, 20))
pscb = PenStyleComboBox(self, choices=penStyles, style=wx.CB_READONLY,
pos=(20,40), size=(250, -1))
self.pscb = pscb
#----------------------------------------------------------------------
def runTest(frame, nb, log):
win = TestPanel(nb, log)
return win
#----------------------------------------------------------------------
overview = """<html><body>
<h2><center>wx.combo.OwnerDrawnComboBox</center></h2>
wx.combo.OwnerDrawnComboBox is a combobox with owner-drawn list
items. In essence, it is a wx.combo.ComboCtrl with wx.VListBox popup and
wx.ControlWithItems interface.
</body></html>
"""
if __name__ == '__main__':
import sys,os
import run
run.main(['', os.path.basename(sys.argv[0])] + sys.argv[1:])
|