Selaa lähdekoodia

Added support for dynamic combo UI

Gyedo Jeon 15 vuotta sitten
vanhempi
sitoutus
6f905b2834

+ 5 - 0
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

+ 3 - 0
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

+ 2 - 1
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:
     """

+ 54 - 4
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)
+