diff --git a/direct/src/leveleditor/LevelEditorUI.py b/direct/src/leveleditor/LevelEditorUI.py index 5e1a9df10c..a2a4757c20 100755 --- a/direct/src/leveleditor/LevelEditorUI.py +++ b/direct/src/leveleditor/LevelEditorUI.py @@ -96,16 +96,24 @@ class LevelEditorUI(WxAppShell): menuItem = self.menuEdit.Append(-1, "&Duplicate") self.Bind(wx.EVT_MENU, self.onDuplicate, menuItem) - self.gridSnapMenuItem = self.menuEdit.Append(-1, "&Grid Snap", kind = wx.ITEM_CHECK) - self.Bind(wx.EVT_MENU, self.toggleGridSnap, self.gridSnapMenuItem) + menuItem = self.menuEdit.Append(-1, "&Undo") + self.Bind(wx.EVT_MENU, self.editor.actionMgr.undo, menuItem) + + menuItem = self.menuEdit.Append(-1, "&Rndo") + self.Bind(wx.EVT_MENU, self.editor.actionMgr.redo, menuItem) self.menuOptions = wx.Menu() self.menuBar.Insert(2, self.menuOptions, "&Options") self.gridSizeMenuItem = self.menuOptions.Append(-1, "&Grid Size") self.Bind(wx.EVT_MENU, self.onGridSize, self.gridSizeMenuItem) - self.showPandaObjectsMenuItem = self.menuOptions.Append(-1, "&Show Panda Objects", kind = wx.ITEM_CHECK) + + self.gridSnapMenuItem = self.menuOptions.Append(-1, "Grid &Snap", kind = wx.ITEM_CHECK) + self.Bind(wx.EVT_MENU, self.toggleGridSnap, self.gridSnapMenuItem) + + self.showPandaObjectsMenuItem = self.menuOptions.Append(-1, "Show &Panda Objects", kind = wx.ITEM_CHECK) self.Bind(wx.EVT_MENU, self.onShowPandaObjects, self.showPandaObjectsMenuItem) + self.hotKeysMenuItem = self.menuOptions.Append(-1, "&Hot Keys") self.Bind(wx.EVT_MENU, self.onHotKeys, self.hotKeysMenuItem) @@ -130,15 +138,32 @@ class LevelEditorUI(WxAppShell): self.perspView = Viewport.makePerspective(self.viewFrame) self.viewFrame.AppendWindow(self.perspView) - self.leftBarUpFrame = wx.SplitterWindow(self.leftFrame, wx.SP_3D | wx.SP_BORDER) - self.leftBarUpPane = wx.Panel(self.leftBarUpFrame) - self.leftBarMidPane = wx.Panel(self.leftBarUpFrame) + self.leftBarUpPane = wx.Panel(self.leftFrame) + self.leftBarUpNB = wx.Notebook(self.leftBarUpPane, style=wx.NB_BOTTOM) + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(self.leftBarUpNB, 1, wx.EXPAND) + self.leftBarUpPane.SetSizer(sizer) + self.leftBarUpPane0 = wx.Panel(self.leftBarUpNB, -1) + self.leftBarUpNB.AddPage(self.leftBarUpPane0, 'Object Palette') + self.leftBarUpPane1 = wx.Panel(self.leftBarUpNB, -1) + self.leftBarUpNB.AddPage(self.leftBarUpPane1, 'Proto Palette') self.leftBarDownPane = wx.Panel(self.leftFrame) + self.leftBarDownNB = wx.Notebook(self.leftBarDownPane) + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(self.leftBarDownNB, 1, wx.EXPAND) + self.leftBarDownPane.SetSizer(sizer) + self.leftBarDownPane0 = wx.Panel(self.leftBarDownNB, -1) + self.leftBarDownNB.AddPage(self.leftBarDownPane0, 'Scene Graph') self.rightBarUpPane = wx.Panel(self.rightFrame) self.rightBarDownPane = wx.Panel(self.rightFrame) + self.rightBarDownNB = wx.Notebook(self.rightBarDownPane) + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(self.rightBarDownNB, 1, wx.EXPAND) + self.rightBarDownPane.SetSizer(sizer) + self.rightBarDownPane0 = wx.Panel(self.rightBarDownNB, -1) + self.rightBarDownNB.AddPage(self.rightBarDownPane0, 'Layers') - self.leftFrame.SplitHorizontally(self.leftBarUpFrame, self.leftBarDownPane) - self.leftBarUpFrame.SplitHorizontally(self.leftBarUpPane, self.leftBarMidPane) + self.leftFrame.SplitHorizontally(self.leftBarUpPane, self.leftBarDownPane) self.rightFrame.SplitHorizontally(self.rightBarUpPane, self.rightBarDownPane) self.mainFrame.SplitVertically(self.leftFrame, self.baseFrame, 200) self.baseFrame.SplitVertically(self.viewFrame, self.rightFrame, 600) @@ -149,7 +174,6 @@ class LevelEditorUI(WxAppShell): self.perspView.SetDropTarget(PandaTextDropTarget(self.editor, self.perspView)) self.leftFrame.SetSashGravity(0.5) - self.leftBarUpFrame.SetSashGravity(0.5) self.rightFrame.SetSashGravity(0.5) self.baseFrame.SetSashGravity(1.0) @@ -157,11 +181,11 @@ class LevelEditorUI(WxAppShell): sizer.Add(self.mainFrame, 1, wx.EXPAND, 0) self.SetSizer(sizer); self.Layout() - self.objectPaletteUI = ObjectPaletteUI(self.leftBarUpPane, self.editor) - self.protoPaletteUI = ProtoPaletteUI(self.leftBarMidPane, self.editor) + self.objectPaletteUI = ObjectPaletteUI(self.leftBarUpPane0, self.editor) + self.protoPaletteUI = ProtoPaletteUI(self.leftBarUpPane1, self.editor) self.objectPropertyUI = ObjectPropertyUI(self.rightBarUpPane, self.editor) - self.sceneGraphUI = SceneGraphUI(self.leftBarDownPane, self.editor) - self.layerEditorUI = LayerEditorUI(self.rightBarDownPane, self.editor) + self.sceneGraphUI = SceneGraphUI(self.leftBarDownPane0, self.editor) + self.layerEditorUI = LayerEditorUI(self.rightBarDownPane0, self.editor) def onSetFocus(self): print 'wx got focus' diff --git a/direct/src/leveleditor/ObjectPropertyUI.py b/direct/src/leveleditor/ObjectPropertyUI.py index 776621db16..09301fc390 100755 --- a/direct/src/leveleditor/ObjectPropertyUI.py +++ b/direct/src/leveleditor/ObjectPropertyUI.py @@ -250,42 +250,54 @@ class ObjectPropertyUI(ScrolledPanel): mainSizer.Add(self.propPane, 1, wx.EXPAND, 0) self.SetSizer(mainSizer) - self.propX = ObjectPropUIEntry(self.propPane, 'X') - self.propY = ObjectPropUIEntry(self.propPane, 'Y') - self.propZ = ObjectPropUIEntry(self.propPane, 'Z') + self.nb = wx.Notebook(self.propPane, style=wx.NB_BOTTOM) + sizer = wx.BoxSizer(wx.VERTICAL) + sizer.Add(self.nb, 1, wx.EXPAND) + self.propPane.SetSizer(sizer) - self.propH = ObjectPropUISlider(self.propPane, 'H', 0, 0, 360) - self.propP = ObjectPropUISlider(self.propPane, 'P', 0, 0, 360) - self.propR = ObjectPropUISlider(self.propPane, 'R', 0, 0, 360) + self.transformPane = wx.Panel(self.nb, -1) + self.nb.AddPage(self.transformPane, 'Transform') - self.propSX = ObjectPropUIEntry(self.propPane, 'SX') - self.propSY = ObjectPropUIEntry(self.propPane, 'SY') - self.propSZ = ObjectPropUIEntry(self.propPane, 'SZ') + self.propX = ObjectPropUIEntry(self.transformPane, 'X') + self.propY = ObjectPropUIEntry(self.transformPane, 'Y') + self.propZ = ObjectPropUIEntry(self.transformPane, 'Z') + + self.propH = ObjectPropUISlider(self.transformPane, 'H', 0, 0, 360) + self.propP = ObjectPropUISlider(self.transformPane, 'P', 0, 0, 360) + self.propR = ObjectPropUISlider(self.transformPane, 'R', 0, 0, 360) + + self.propSX = ObjectPropUIEntry(self.transformPane, 'SX') + self.propSY = ObjectPropUIEntry(self.transformPane, 'SY') + self.propSZ = ObjectPropUIEntry(self.transformPane, 'SZ') transformProps = [self.propX, self.propY, self.propZ, self.propH, self.propP, self.propR, self.propSX, self.propSY, self.propSZ] sizer = wx.BoxSizer(wx.VERTICAL) sizer.AddMany(transformProps) - + self.transformPane.SetSizer(sizer) for transformProp in transformProps: transformProp.bindFunc(self.editor.objectMgr.onEnterObjectPropUI, self.editor.objectMgr.onLeaveObjectPropUI, self.editor.objectMgr.updateObjectTransform) + self.lookPane = wx.Panel(self.nb, -1) + self.nb.AddPage(self.lookPane, 'Look') + objNP = obj[OG.OBJ_NP] objRGBA = obj[OG.OBJ_RGBA] - self.propCR = ObjectPropUISlider(self.propPane, 'CR', objRGBA[0], 0, 1) - self.propCG = ObjectPropUISlider(self.propPane, 'CG', objRGBA[1], 0, 1) - self.propCB = ObjectPropUISlider(self.propPane, 'CB', objRGBA[2], 0, 1) - self.propCA = ObjectPropUISlider(self.propPane, 'CA', objRGBA[3], 0, 1) + self.propCR = ObjectPropUISlider(self.lookPane, 'CR', objRGBA[0], 0, 1) + self.propCG = ObjectPropUISlider(self.lookPane, 'CG', objRGBA[1], 0, 1) + self.propCB = ObjectPropUISlider(self.lookPane, 'CB', objRGBA[2], 0, 1) + self.propCA = ObjectPropUISlider(self.lookPane, 'CA', objRGBA[3], 0, 1) colorProps = [self.propCR, self.propCG, self.propCB, self.propCA] for colorProp in colorProps: colorProp.ui.bindFunc(self.onColorSlider) + sizer = wx.BoxSizer(wx.VERTICAL) sizer.AddMany(colorProps) - button = wx.Button(self.propPane, -1, 'Color Picker', (0,0), (140, 20)) + button = wx.Button(self.lookPane, -1, 'Color Picker', (0,0), (140, 20)) _colourData = wx.ColourData() _colourData.SetColour(wx.Colour(objRGBA[0] * 255, objRGBA[1] * 255, objRGBA[2] * 255)) button.Bind(wx.EVT_BUTTON, lambda p0=None, p1=_colourData, p2=objRGBA[3] * 255: self.openColorPicker(p0, p1, p2)) @@ -298,7 +310,7 @@ class ObjectPropertyUI(ScrolledPanel): objDef = obj[OG.OBJ_DEF] if objDef.model is not None: - propUI = ObjectPropUICombo(self.propPane, 'model', obj[OG.OBJ_MODEL], objDef.models) + propUI = ObjectPropUICombo(self.lookPane, 'model', obj[OG.OBJ_MODEL], objDef.models) sizer.Add(propUI) propUI.bindFunc(self.editor.objectMgr.onEnterObjectPropUI, @@ -306,13 +318,19 @@ class ObjectPropertyUI(ScrolledPanel): lambda p0=None, p1=obj: self.editor.objectMgr.updateObjectModelFromUI(p0, p1)) if len(objDef.anims) > 0: - propUI = ObjectPropUICombo(self.propPane, 'anim', obj[OG.OBJ_ANIM], objDef.anims) + propUI = ObjectPropUICombo(self.lookPane, 'anim', obj[OG.OBJ_ANIM], objDef.anims) sizer.Add(propUI) propUI.bindFunc(self.editor.objectMgr.onEnterObjectPropUI, self.editor.objectMgr.onLeaveObjectPropUI, lambda p0=None, p1=obj: self.editor.objectMgr.updateObjectAnimFromUI(p0, p1)) + self.lookPane.SetSizer(sizer) + + self.propsPane = wx.Panel(self.nb, -1) + self.nb.AddPage(self.propsPane, 'Props') + sizer = wx.BoxSizer(wx.VERTICAL) + for key in objDef.properties.keys(): propDef = objDef.properties[key] propType = propDef[OG.PROP_TYPE] @@ -320,7 +338,7 @@ class ObjectPropertyUI(ScrolledPanel): value = obj[OG.OBJ_PROP].get(key) if propType == OG.PROP_UI_ENTRY: - propUI = ObjectPropUIEntry(self.propPane, key) + propUI = ObjectPropUIEntry(self.propsPane, key) propUI.setValue(value) sizer.Add(propUI) @@ -332,7 +350,7 @@ class ObjectPropertyUI(ScrolledPanel): if value is None: continue - propUI = ObjectPropUISlider(self.propPane, key, value, propRange[OG.RANGE_MIN], propRange[OG.RANGE_MAX]) + propUI = ObjectPropUISlider(self.propsPane, key, value, propRange[OG.RANGE_MIN], propRange[OG.RANGE_MAX]) sizer.Add(propUI) elif propType == OG.PROP_UI_SPIN: @@ -343,14 +361,14 @@ class ObjectPropertyUI(ScrolledPanel): if value is None: continue - propUI = ObjectPropUISpinner(self.propPane, key, value, propRange[OG.RANGE_MIN], propRange[OG.RANGE_MAX]) + propUI = ObjectPropUISpinner(self.propsPane, key, value, propRange[OG.RANGE_MIN], propRange[OG.RANGE_MAX]) sizer.Add(propUI) elif propType == OG.PROP_UI_CHECK: if value is None: continue - propUI = ObjectPropUICheck(self.propPane, key, value) + propUI = ObjectPropUICheck(self.propsPane, key, value) sizer.Add(propUI) elif propType == OG.PROP_UI_RADIO: @@ -367,7 +385,7 @@ class ObjectPropertyUI(ScrolledPanel): value = str(value) - propUI = ObjectPropUIRadio(self.propPane, key, value, propRange) + propUI = ObjectPropUIRadio(self.propsPane, key, value, propRange) sizer.Add(propUI) elif propType == OG.PROP_UI_COMBO: @@ -384,7 +402,7 @@ class ObjectPropertyUI(ScrolledPanel): value = str(value) - propUI = ObjectPropUICombo(self.propPane, key, value, propRange) + propUI = ObjectPropUICombo(self.propsPane, key, value, propRange) sizer.Add(propUI) else: @@ -396,6 +414,6 @@ class ObjectPropertyUI(ScrolledPanel): lambda p0=None, p1=obj, p2=key: self.editor.objectMgr.updateObjectProperty(p0, p1, p2)) - self.propPane.SetSizer(sizer); + self.propsPane.SetSizer(sizer); self.Layout() self.SetupScrolling(self, scroll_y = True, rate_y = 20)