mirror of
https://github.com/wxWidgets/Phoenix.git
synced 2025-09-06 01:40:23 +02:00
Update existing dataview and variant classes and MappedTypes to add missing features and such needed for Classic compatibility and full coverage of the API. Add some samples ported from the Classic demo so the DVC and related classes can be seen in action. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxPython/Phoenix/trunk@72974 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
457 lines
15 KiB
Python
457 lines
15 KiB
Python
import imp_unittest, unittest
|
|
import wtc
|
|
import wx
|
|
import wx.dataview as dv
|
|
import os
|
|
|
|
pngFile = os.path.join(os.path.dirname(__file__), 'smile.png')
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
|
|
class dataview_Tests(wtc.WidgetTestCase):
|
|
|
|
def test_dataviewItem1(self):
|
|
dvi = dv.DataViewItem()
|
|
self.assertFalse(dvi)
|
|
|
|
def test_dataviewItem2(self):
|
|
dvi = dv.DataViewItem(12345)
|
|
self.assertTrue(dvi)
|
|
|
|
def test_dataviewItem3(self):
|
|
dvi1 = dv.DataViewItem(111)
|
|
dvi2 = dv.DataViewItem(222)
|
|
self.assertTrue(dvi1 != dvi2)
|
|
self.assertFalse(dvi1 == dvi2)
|
|
|
|
def test_dataviewItem4(self):
|
|
dvi1 = dv.DataViewItem(111)
|
|
dvi2 = dv.DataViewItem(111)
|
|
self.assertTrue(dvi1 == dvi2)
|
|
self.assertFalse(dvi1 != dvi2)
|
|
|
|
def test_dataviewItem5(self):
|
|
self.assertFalse(dv.NullDataViewItem)
|
|
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewItemAttr1(self):
|
|
a = dv.DataViewItemAttr()
|
|
self.assertTrue(a.IsDefault())
|
|
self.assertFalse(a.HasColour())
|
|
self.assertFalse(a.HasFont())
|
|
self.assertFalse(a.HasBackgroundColour())
|
|
|
|
|
|
def test_dataviewItemAttr2(self):
|
|
a = dv.DataViewItemAttr()
|
|
a.Colour = wx.BLACK
|
|
a.BackgroundColour = wx.WHITE
|
|
a.Bold = True
|
|
a.Italic = True
|
|
self.assertFalse(a.IsDefault())
|
|
self.assertTrue(a.HasColour())
|
|
self.assertTrue(a.HasBackgroundColour())
|
|
self.assertTrue(a.GetBold())
|
|
self.assertTrue(a.GetItalic())
|
|
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewIconText1(self):
|
|
dit = dv.DataViewIconText()
|
|
icon = wx.Icon(pngFile)
|
|
dit.SetIcon(icon)
|
|
dit.SetText('Smile!')
|
|
|
|
|
|
def test_dataviewIconText2(self):
|
|
icon = wx.Icon(pngFile)
|
|
dit = dv.DataViewIconText('Smile!', icon)
|
|
dit.Icon
|
|
dit.Text
|
|
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewModelNotifier1(self):
|
|
with self.assertRaises(TypeError):
|
|
n = dv.DataViewModelNotifier()
|
|
|
|
|
|
def test_dataviewModelNotifier2(self):
|
|
class MyNotifier(dv.DataViewModelNotifier):
|
|
def Cleared(self): return True
|
|
|
|
def ItemAdded(self, parent, item): return True
|
|
def ItemChanged(self, item): return True
|
|
def ItemDeleted(self, parent, item): return True
|
|
def ItemsAdded(self, parent, items): return True
|
|
def ItemsChanged(self, items): return True
|
|
def ItemsDeleted(self, parent, items): return True
|
|
|
|
def Resort(self): pass
|
|
def ValueChanged(self, item, col): return True
|
|
|
|
n = MyNotifier()
|
|
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewRenderer01(self):
|
|
with self.assertRaises(TypeError):
|
|
r = dv.DataViewRenderer()
|
|
|
|
|
|
def test_dataviewRenderer02(self):
|
|
# This one can't be subclassed (that's what dv.DataViewCustomRenderer
|
|
# is for) so make sure it raises an exception too.
|
|
with self.assertRaises(TypeError):
|
|
class MyRenderer(dv.DataViewRenderer):
|
|
def GetValue(self): return "value"
|
|
def SetValue(self, value): return True
|
|
|
|
r = MyRenderer()
|
|
|
|
|
|
def test_dataviewRenderer03(self):
|
|
r = dv.DataViewTextRenderer()
|
|
|
|
def test_dataviewRenderer04(self):
|
|
r = dv.DataViewIconTextRenderer()
|
|
|
|
def test_dataviewRenderer05(self):
|
|
r = dv.DataViewProgressRenderer()
|
|
|
|
def test_dataviewRenderer06(self):
|
|
r = dv.DataViewSpinRenderer(0, 100)
|
|
|
|
def test_dataviewRenderer07(self):
|
|
r = dv.DataViewToggleRenderer()
|
|
|
|
def test_dataviewRenderer08(self):
|
|
r = dv.DataViewDateRenderer()
|
|
|
|
def test_dataviewRenderer09(self):
|
|
r = dv.DataViewBitmapRenderer()
|
|
|
|
|
|
def test_dataviewRenderer10(self):
|
|
with self.assertRaises(TypeError):
|
|
r = dv.DataViewCustomRenderer()
|
|
|
|
def test_dataviewRenderer11(self):
|
|
class MyCustomRenderer(dv.DataViewCustomRenderer):
|
|
def GetValue(self): return "value"
|
|
def SetValue(self, value): return True
|
|
def GetSize(self): return wx.Size(100, 25)
|
|
def Render(self, cell, dc, state): return True
|
|
|
|
r = MyCustomRenderer()
|
|
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewColumn(self):
|
|
r = dv.DataViewIconTextRenderer()
|
|
# create
|
|
c = dv.DataViewColumn('title', r, 0)
|
|
# test that properties exist
|
|
c.Title
|
|
c.Bitmap
|
|
c.Width
|
|
c.MinWidth
|
|
c.Alignment
|
|
c.Flags
|
|
c.SortOrder
|
|
|
|
self.myYield()
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewModel1(self):
|
|
with self.assertRaises(TypeError):
|
|
m = dv.DataViewModel()
|
|
|
|
|
|
def test_dataviewModel2(self):
|
|
class MyModel(dv.DataViewModel):
|
|
def GetChildren(self, item, children): return 0
|
|
def GetColumnCount(self): return 0
|
|
def GetColumnType(self, col): return 'string'
|
|
def GetParent(self, item): return dv.NullDataViewItem
|
|
def GetValue(self, item, col): return 'value'
|
|
def IsContainer(self, item) : return False
|
|
def SetValue(self, value, item, col): return True
|
|
|
|
m = MyModel()
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewIndexListModel1(self):
|
|
with self.assertRaises(TypeError):
|
|
m = dv.DataViewIndexListModel()
|
|
|
|
def test_dataviewIndexListModel2(self):
|
|
class MyModel(dv.DataViewIndexListModel):
|
|
def GetCount(self): return 0
|
|
def GetRow(self, item): return 0
|
|
def GetValueByRow(self, row, col): return 'value'
|
|
def SetValueByRow(self, value, row, col): return True
|
|
|
|
m = MyModel()
|
|
|
|
|
|
def test_dataviewVirtualListModel1(self):
|
|
with self.assertRaises(TypeError):
|
|
m = dv.DataViewVirtualListModel()
|
|
|
|
def test_dataviewVirtualModel2(self):
|
|
class MyModel(dv.DataViewVirtualListModel):
|
|
def GetCount(self): return 0
|
|
def GetRow(self, item): return 0
|
|
def GetValueByRow(self, row, col): return 'value'
|
|
def SetValueByRow(self, value, row, col): return True
|
|
|
|
m = MyModel()
|
|
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewCtrl1(self):
|
|
|
|
class MyModel(dv.DataViewIndexListModel):
|
|
def GetCount(self):
|
|
return 50
|
|
|
|
def GetColumnCount(self):
|
|
return 10
|
|
|
|
def GetValueByRow(self, row, col):
|
|
return 'value(%d, %d)' (row, col)
|
|
|
|
def SetValueByRow(self, value, row, col):
|
|
return True
|
|
|
|
def GetColumnType(self, col):
|
|
return 'string'
|
|
|
|
|
|
|
|
dvc = dv.DataViewCtrl(self.frame, style=dv.DV_ROW_LINES|dv.DV_VERT_RULES|dv.DV_MULTIPLE)
|
|
model = MyModel()
|
|
count1 = model.GetRefCount()
|
|
dvc.AssociateModel(model)
|
|
count2 = model.GetRefCount()
|
|
|
|
# The reference count should still be 1 because the model was
|
|
# DecRef'ed when it's ownership transfered to C++ in the
|
|
# AssociateModel call
|
|
self.assertEqual(count2, 1)
|
|
self.assertTrue(count2 == count1)
|
|
|
|
# Now try associating it with another view and check counts again
|
|
dvc2 = dv.DataViewCtrl(self.frame, style=dv.DV_ROW_LINES|dv.DV_VERT_RULES|dv.DV_MULTIPLE)
|
|
dvc2.AssociateModel(model)
|
|
self.assertEqual(model.GetRefCount(), 2)
|
|
|
|
# Destroying the 2nd view should drop the refcount again
|
|
dvc2.Destroy()
|
|
self.assertEqual(model.GetRefCount(), 1)
|
|
|
|
# And since ownership has been transferred, deleting this reference
|
|
# to the model should not cause any problems.
|
|
del model
|
|
|
|
dvc.AppendTextColumn("one", 1, width=80, mode=dv.DATAVIEW_CELL_EDITABLE)
|
|
dvc.AppendTextColumn("two", 2, width=80, mode=dv.DATAVIEW_CELL_EDITABLE)
|
|
dvc.AppendTextColumn("three", 3, width=80, mode=dv.DATAVIEW_CELL_EDITABLE)
|
|
dvc.AppendTextColumn("four", 4, width=80, mode=dv.DATAVIEW_CELL_EDITABLE)
|
|
dvc.AppendTextColumn("five", 5, width=80, mode=dv.DATAVIEW_CELL_EDITABLE)
|
|
|
|
self.frame.SendSizeEvent()
|
|
dvc.Refresh()
|
|
self.myYield()
|
|
|
|
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewListCtrl1(self):
|
|
dlc = dv.DataViewListCtrl()
|
|
dlc.Create(self.frame)
|
|
self.doListCtrlTest(dlc)
|
|
|
|
|
|
def test_dataviewListCtrl2(self):
|
|
dlc = dv.DataViewListCtrl(self.frame)
|
|
self.doListCtrlTest(dlc)
|
|
|
|
def doListCtrlTest(self, dlc):
|
|
assert isinstance(dlc, dv.DataViewListCtrl)
|
|
for label in "one two three four".split():
|
|
dlc.AppendTextColumn(label)
|
|
col = dv.DataViewColumn('five', dv.DataViewBitmapRenderer(), 4)
|
|
dlc.AppendColumn(col)
|
|
|
|
bmp = wx.Bitmap(pngFile)
|
|
for n in range(50):
|
|
rowdata = ['%s-%02d' % (s, n) for s in "one two three four".split()]
|
|
rowdata.append(bmp)
|
|
dlc.AppendItem(rowdata)
|
|
|
|
self.frame.SendSizeEvent()
|
|
dlc.Refresh()
|
|
self.myYield()
|
|
|
|
|
|
#-------------------------------------------------------
|
|
# DataViewTreeCtrl
|
|
|
|
|
|
def test_dataviewTreeCtrl1(self):
|
|
dtc = dv.DataViewTreeCtrl()
|
|
dtc.Create(self.frame)
|
|
self.doTreeCtrlTest(dtc)
|
|
|
|
|
|
def test_dataviewTreeCtrl2(self):
|
|
dtc = dv.DataViewTreeCtrl(self.frame)
|
|
self.doTreeCtrlTest(dtc)
|
|
|
|
|
|
def doTreeCtrlTest(self, dvtc):
|
|
isz = (16,16)
|
|
il = wx.ImageList(*isz)
|
|
fldridx = il.Add(wx.ArtProvider.GetIcon(wx.ART_FOLDER, wx.ART_OTHER, isz))
|
|
fldropenidx = il.Add(wx.ArtProvider.GetIcon(wx.ART_FOLDER_OPEN, wx.ART_OTHER, isz))
|
|
fileidx = il.Add(wx.ArtProvider.GetIcon(wx.ART_NORMAL_FILE, wx.ART_OTHER, isz))
|
|
dvtc.SetImageList(il)
|
|
|
|
self.root = dvtc.AppendContainer(dv.NullDataViewItem,
|
|
"The Root Item",
|
|
fldridx, fldropenidx)
|
|
for x in range(15):
|
|
child = dvtc.AppendContainer(self.root, "Item %d" % x,
|
|
fldridx, fldropenidx)
|
|
for y in range(5):
|
|
last = dvtc.AppendContainer(
|
|
child, "item %d-%s" % (x, chr(ord("a")+y)),
|
|
fldridx, fldropenidx)
|
|
for z in range(5):
|
|
item = dvtc.AppendItem(
|
|
last, "item %d-%s-%d" % (x, chr(ord("a")+y), z),
|
|
fileidx)
|
|
dvtc.ExpandAncestors(item)
|
|
|
|
self.frame.SendSizeEvent()
|
|
dvtc.Refresh()
|
|
self.myYield()
|
|
|
|
|
|
#-------------------------------------------------------
|
|
def test_dataviewConst(self):
|
|
dv.DVC_DEFAULT_RENDERER_SIZE
|
|
dv.DVC_DEFAULT_WIDTH
|
|
dv.DVC_TOGGLE_DEFAULT_WIDTH
|
|
dv.DVC_DEFAULT_MINWIDTH
|
|
dv.DVR_DEFAULT_ALIGNMENT
|
|
|
|
dv.DATAVIEW_CELL_INERT
|
|
dv.DATAVIEW_CELL_ACTIVATABLE
|
|
dv.DATAVIEW_CELL_EDITABLE
|
|
dv.DATAVIEW_CELL_SELECTED
|
|
dv.DATAVIEW_CELL_PRELIT
|
|
dv.DATAVIEW_CELL_INSENSITIVE
|
|
dv.DATAVIEW_CELL_FOCUSED
|
|
|
|
dv.DATAVIEW_COL_RESIZABLE
|
|
dv.DATAVIEW_COL_SORTABLE
|
|
dv.DATAVIEW_COL_REORDERABLE
|
|
dv.DATAVIEW_COL_HIDDEN
|
|
|
|
dv.DV_SINGLE
|
|
dv.DV_MULTIPLE
|
|
dv.DV_NO_HEADER
|
|
dv.DV_HORIZ_RULES
|
|
dv.DV_VERT_RULES
|
|
dv.DV_ROW_LINES
|
|
dv.DV_VARIABLE_LINE_HEIGHT
|
|
|
|
|
|
def test_dataviewEvt1(self):
|
|
evt = dv.DataViewEvent()
|
|
|
|
evt.GetItem
|
|
evt.SetItem
|
|
evt.GetColumn
|
|
evt.SetColumn
|
|
evt.GetModel
|
|
evt.SetModel
|
|
evt.GetValue
|
|
evt.SetValue
|
|
evt.IsEditCancelled
|
|
evt.SetEditCanceled
|
|
evt.SetDataViewColumn
|
|
evt.GetDataViewColumn
|
|
evt.GetPosition
|
|
evt.SetPosition
|
|
evt.GetCacheFrom
|
|
evt.GetCacheTo
|
|
evt.SetCache
|
|
evt.SetDataObject
|
|
evt.GetDataObject
|
|
evt.SetDataFormat
|
|
evt.GetDataFormat
|
|
evt.SetDataSize
|
|
evt.GetDataSize
|
|
evt.SetDataBuffer
|
|
evt.GetDataBuffer
|
|
evt.SetDragFlags
|
|
evt.GetDragFlags
|
|
evt.SetDropEffect
|
|
evt.GetDropEffect
|
|
|
|
|
|
def test_dataviewEvt2(self):
|
|
dv.wxEVT_COMMAND_DATAVIEW_SELECTION_CHANGED;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_ACTIVATED;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSED;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDED;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_COLLAPSING;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_EXPANDING;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_START_EDITING;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_STARTED;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_EDITING_DONE;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_VALUE_CHANGED;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_CONTEXT_MENU;
|
|
dv.wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_CLICK;
|
|
dv.wxEVT_COMMAND_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK;
|
|
dv.wxEVT_COMMAND_DATAVIEW_COLUMN_SORTED;
|
|
dv.wxEVT_COMMAND_DATAVIEW_COLUMN_REORDERED;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_BEGIN_DRAG;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_DROP_POSSIBLE;
|
|
dv.wxEVT_COMMAND_DATAVIEW_ITEM_DROP;
|
|
dv.wxEVT_COMMAND_DATAVIEW_CACHE_HINT;
|
|
|
|
dv.EVT_DATAVIEW_SELECTION_CHANGED
|
|
dv.EVT_DATAVIEW_ITEM_ACTIVATED
|
|
dv.EVT_DATAVIEW_ITEM_COLLAPSED
|
|
dv.EVT_DATAVIEW_ITEM_EXPANDED
|
|
dv.EVT_DATAVIEW_ITEM_COLLAPSING
|
|
dv.EVT_DATAVIEW_ITEM_EXPANDING
|
|
dv.EVT_DATAVIEW_ITEM_START_EDITING
|
|
dv.EVT_DATAVIEW_ITEM_EDITING_STARTED
|
|
dv.EVT_DATAVIEW_ITEM_EDITING_DONE
|
|
dv.EVT_DATAVIEW_ITEM_VALUE_CHANGED
|
|
dv.EVT_DATAVIEW_ITEM_CONTEXT_MENU
|
|
dv.EVT_DATAVIEW_COLUMN_HEADER_CLICK
|
|
dv.EVT_DATAVIEW_COLUMN_HEADER_RIGHT_CLICK
|
|
dv.EVT_DATAVIEW_COLUMN_SORTED
|
|
dv.EVT_DATAVIEW_COLUMN_REORDERED
|
|
dv.EVT_DATAVIEW_ITEM_BEGIN_DRAG
|
|
dv.EVT_DATAVIEW_ITEM_DROP_POSSIBLE
|
|
dv.EVT_DATAVIEW_ITEM_DROP
|
|
dv.EVT_DATAVIEW_CACHE_HINT
|
|
|
|
|
|
|
|
|
|
#---------------------------------------------------------------------------
|
|
|
|
if __name__ == '__main__':
|
|
unittest.main()
|