mirror of
https://github.com/panda3d/panda3d.git
synced 2025-10-03 10:22:45 -04:00
Added support for dynamic combo UI
This commit is contained in:
parent
b03ce0ca94
commit
6f905b2834
@ -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
|
||||||
|
@ -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
|
||||||
|
@ -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:
|
||||||
"""
|
"""
|
||||||
|
@ -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)
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user