diff --git a/direct/src/leveleditor/ObjectGlobals.py b/direct/src/leveleditor/ObjectGlobals.py index c889ee5659..2e68be5004 100755 --- a/direct/src/leveleditor/ObjectGlobals.py +++ b/direct/src/leveleditor/ObjectGlobals.py @@ -19,6 +19,7 @@ PROP_UI_CHECK = '_PropUICheckBox' PROP_UI_SLIDE = '_PropUISlider' PROP_UI_SPIN = '_PropUISpinner' PROP_UI_BLIND = '_PropUIBlind' +PROP_UI_COMBO_DYNAMIC = '_PropUIComboBoxDynamic' # index for property definition PROP_TYPE = 0 @@ -26,6 +27,10 @@ PROP_DATATYPE = 1 PROP_FUNC = 2 PROP_DEFAULT = 3 PROP_RANGE = 4 +PROP_DYNAMIC_KEY = 5 + +# key value constant for dynamic props +PROP_MODEL = '_PropModel' # index for slider UI RANGE_MIN = 0 diff --git a/direct/src/leveleditor/ObjectMgrBase.py b/direct/src/leveleditor/ObjectMgrBase.py index d7472a77d9..ea1a2df7b1 100755 --- a/direct/src/leveleditor/ObjectMgrBase.py +++ b/direct/src/leveleditor/ObjectMgrBase.py @@ -482,6 +482,9 @@ class ObjectMgrBase: elif propType == OG.PROP_UI_COMBO: val = event.GetString() + elif propType == OG.PROP_UI_COMBO_DYNAMIC: + val = event.GetString() + else: # unsupported property type return diff --git a/direct/src/leveleditor/ObjectPaletteBase.py b/direct/src/leveleditor/ObjectPaletteBase.py index 6c7d3bc73c..a2d31259bc 100755 --- a/direct/src/leveleditor/ObjectPaletteBase.py +++ b/direct/src/leveleditor/ObjectPaletteBase.py @@ -9,7 +9,7 @@ class ObjectGen: class ObjectBase(ObjectGen): """ Base class for obj definitions """ 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) self.createFunction = createFunction self.model = model @@ -20,6 +20,7 @@ class ObjectBase(ObjectGen): self.movable = movable self.actor = actor self.named = named + self.orderedProperties = orderedProperties[:] class ObjectPaletteBase: """ diff --git a/direct/src/leveleditor/ObjectPropertyUI.py b/direct/src/leveleditor/ObjectPropertyUI.py index 4c9e6243ce..b2e8d51251 100755 --- a/direct/src/leveleditor/ObjectPropertyUI.py +++ b/direct/src/leveleditor/ObjectPropertyUI.py @@ -170,6 +170,7 @@ class ObjectPropertyUI(ScrolledPanel): self.editor = editor self.colorPicker = None self.lastColorPickerPos = None + self.lastPropTab = None ScrolledPanel.__init__(self, parent) parentSizer = wx.BoxSizer(wx.VERTICAL) @@ -181,6 +182,7 @@ class ObjectPropertyUI(ScrolledPanel): def clearPropUI(self): sizer = self.GetSizer() if sizer is not None: + self.lastPropTab = self.nb.GetCurrentPage().GetName() sizer.Remove(self.propPane) self.propPane.Destroy() self.SetSizer(None) @@ -255,7 +257,7 @@ class ObjectPropertyUI(ScrolledPanel): sizer.Add(self.nb, 1, wx.EXPAND) 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.propX = ObjectPropUIEntry(self.transformPane, 'X') @@ -285,7 +287,7 @@ class ObjectPropertyUI(ScrolledPanel): for transformProp in transformProps: 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') objNP = obj[OG.OBJ_NP] @@ -331,11 +333,16 @@ class ObjectPropertyUI(ScrolledPanel): 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') sizer = wx.BoxSizer(wx.VERTICAL) - + + propNames = objDef.orderedProperties[:] for key in objDef.properties.keys(): + if key not in propNames: + propNames.append(key) + + for key in propNames: propDef = objDef.properties[key] propType = propDef[OG.PROP_TYPE] propDataType = propDef[OG.PROP_DATATYPE] @@ -409,6 +416,42 @@ class ObjectPropertyUI(ScrolledPanel): propUI = ObjectPropUICombo(self.propsPane, key, value, propRange) 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: # unspported property type continue @@ -421,3 +464,10 @@ class ObjectPropertyUI(ScrolledPanel): self.propsPane.SetSizer(sizer); self.Layout() 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) +