Added support for dynamic combo UI

This commit is contained in:
Gyedo Jeon 2010-04-16 05:14:04 +00:00
parent b03ce0ca94
commit 6f905b2834
4 changed files with 64 additions and 5 deletions

View File

@ -19,6 +19,7 @@ PROP_UI_CHECK = '_PropUICheckBox'
PROP_UI_SLIDE = '_PropUISlider' PROP_UI_SLIDE = '_PropUISlider'
PROP_UI_SPIN = '_PropUISpinner' PROP_UI_SPIN = '_PropUISpinner'
PROP_UI_BLIND = '_PropUIBlind' PROP_UI_BLIND = '_PropUIBlind'
PROP_UI_COMBO_DYNAMIC = '_PropUIComboBoxDynamic'
# index for property definition # index for property definition
PROP_TYPE = 0 PROP_TYPE = 0
@ -26,6 +27,10 @@ PROP_DATATYPE = 1
PROP_FUNC = 2 PROP_FUNC = 2
PROP_DEFAULT = 3 PROP_DEFAULT = 3
PROP_RANGE = 4 PROP_RANGE = 4
PROP_DYNAMIC_KEY = 5
# key value constant for dynamic props
PROP_MODEL = '_PropModel'
# index for slider UI # index for slider UI
RANGE_MIN = 0 RANGE_MIN = 0

View File

@ -482,6 +482,9 @@ class ObjectMgrBase:
elif propType == OG.PROP_UI_COMBO: elif propType == OG.PROP_UI_COMBO:
val = event.GetString() val = event.GetString()
elif propType == OG.PROP_UI_COMBO_DYNAMIC:
val = event.GetString()
else: else:
# unsupported property type # unsupported property type
return return

View File

@ -9,7 +9,7 @@ class ObjectGen:
class ObjectBase(ObjectGen): class ObjectBase(ObjectGen):
""" Base class for obj definitions """ """ Base class for obj definitions """
def __init__(self, name='', createFunction = None, model = None, models= [], anims = [], animNames = [], properties={}, def __init__(self, name='', createFunction = None, model = None, models= [], anims = [], animNames = [], properties={},
movable = True, actor = False, named=False): movable = True, actor = False, named=False, orderedProperties=[]):
ObjectGen.__init__(self, name) ObjectGen.__init__(self, name)
self.createFunction = createFunction self.createFunction = createFunction
self.model = model self.model = model
@ -20,6 +20,7 @@ class ObjectBase(ObjectGen):
self.movable = movable self.movable = movable
self.actor = actor self.actor = actor
self.named = named self.named = named
self.orderedProperties = orderedProperties[:]
class ObjectPaletteBase: class ObjectPaletteBase:
""" """

View File

@ -170,6 +170,7 @@ class ObjectPropertyUI(ScrolledPanel):
self.editor = editor self.editor = editor
self.colorPicker = None self.colorPicker = None
self.lastColorPickerPos = None self.lastColorPickerPos = None
self.lastPropTab = None
ScrolledPanel.__init__(self, parent) ScrolledPanel.__init__(self, parent)
parentSizer = wx.BoxSizer(wx.VERTICAL) parentSizer = wx.BoxSizer(wx.VERTICAL)
@ -181,6 +182,7 @@ class ObjectPropertyUI(ScrolledPanel):
def clearPropUI(self): def clearPropUI(self):
sizer = self.GetSizer() sizer = self.GetSizer()
if sizer is not None: if sizer is not None:
self.lastPropTab = self.nb.GetCurrentPage().GetName()
sizer.Remove(self.propPane) sizer.Remove(self.propPane)
self.propPane.Destroy() self.propPane.Destroy()
self.SetSizer(None) self.SetSizer(None)
@ -255,7 +257,7 @@ class ObjectPropertyUI(ScrolledPanel):
sizer.Add(self.nb, 1, wx.EXPAND) sizer.Add(self.nb, 1, wx.EXPAND)
self.propPane.SetSizer(sizer) self.propPane.SetSizer(sizer)
self.transformPane = wx.Panel(self.nb, -1) self.transformPane = wx.Panel(self.nb, -1, name='Transform')
self.nb.AddPage(self.transformPane, 'Transform') self.nb.AddPage(self.transformPane, 'Transform')
self.propX = ObjectPropUIEntry(self.transformPane, 'X') self.propX = ObjectPropUIEntry(self.transformPane, 'X')
@ -285,7 +287,7 @@ class ObjectPropertyUI(ScrolledPanel):
for transformProp in transformProps: for transformProp in transformProps:
transformProp.ui.Disable() transformProp.ui.Disable()
self.lookPane = wx.Panel(self.nb, -1) self.lookPane = wx.Panel(self.nb, -1, name='Look')
self.nb.AddPage(self.lookPane, 'Look') self.nb.AddPage(self.lookPane, 'Look')
objNP = obj[OG.OBJ_NP] objNP = obj[OG.OBJ_NP]
@ -331,11 +333,16 @@ class ObjectPropertyUI(ScrolledPanel):
self.lookPane.SetSizer(sizer) self.lookPane.SetSizer(sizer)
self.propsPane = wx.Panel(self.nb, -1) self.propsPane = wx.Panel(self.nb, -1, name='Properties')
self.nb.AddPage(self.propsPane, 'Properties') self.nb.AddPage(self.propsPane, 'Properties')
sizer = wx.BoxSizer(wx.VERTICAL) sizer = wx.BoxSizer(wx.VERTICAL)
propNames = objDef.orderedProperties[:]
for key in objDef.properties.keys(): for key in objDef.properties.keys():
if key not in propNames:
propNames.append(key)
for key in propNames:
propDef = objDef.properties[key] propDef = objDef.properties[key]
propType = propDef[OG.PROP_TYPE] propType = propDef[OG.PROP_TYPE]
propDataType = propDef[OG.PROP_DATATYPE] propDataType = propDef[OG.PROP_DATATYPE]
@ -409,6 +416,42 @@ class ObjectPropertyUI(ScrolledPanel):
propUI = ObjectPropUICombo(self.propsPane, key, value, propRange) propUI = ObjectPropUICombo(self.propsPane, key, value, propRange)
sizer.Add(propUI) sizer.Add(propUI)
elif propType == OG.PROP_UI_COMBO_DYNAMIC:
if len(propDef) <= OG.PROP_DYNAMIC_KEY:
continue
propDynamicKey = propDef[OG.PROP_DYNAMIC_KEY]
if propDynamicKey == OG.PROP_MODEL:
dynamicRangeKey = obj[OG.OBJ_MODEL]
else:
dynamicRangeKey = obj[OG.OBJ_PROP].get(propDynamicKey)
if dynamicRangeKey is None:
obj[OG.OBJ_PROP][key] = propDef[OG.PROP_DEFAULT]
continue
propRange = propDef[OG.PROP_RANGE].get(dynamicRangeKey)
if propRange is None:
obj[OG.OBJ_PROP][key] = propDef[OG.PROP_DEFAULT]
continue
if value is None:
continue
if propDataType != OG.PROP_STR:
for i in range(len(propRange)):
propRange[i] = str(propRange[i])
value = str(value)
if value not in propRange:
value = propRange[0]
obj[OG.OBJ_PROP][key] = value
propUI = ObjectPropUICombo(self.propsPane, key, value, propRange)
sizer.Add(propUI)
else: else:
# unspported property type # unspported property type
continue continue
@ -421,3 +464,10 @@ class ObjectPropertyUI(ScrolledPanel):
self.propsPane.SetSizer(sizer); self.propsPane.SetSizer(sizer);
self.Layout() self.Layout()
self.SetupScrolling(self, scroll_y = True, rate_y = 20) self.SetupScrolling(self, scroll_y = True, rate_y = 20)
if self.lastPropTab == 'Transform':
self.nb.SetSelection(0)
elif self.lastPropTab == 'Look':
self.nb.SetSelection(1)
elif self.lastPropTab == 'Properties':
self.nb.SetSelection(2)