open_toontown_panda3d/direct/src/leveleditor/LevelEditorUI.py

166 lines
5.9 KiB
Python
Executable File

import wx
import os
from wx.lib.agw import fourwaysplitter as FWS
from pandac.PandaModules import *
from direct.wxwidgets.WxAppShell import *
from ViewPort import *
from ObjectPaletteUI import *
from ObjectPropertyUI import *
class PandaTextDropTarget(wx.TextDropTarget):
def __init__(self, editor):
wx.TextDropTarget.__init__(self)
self.editor = editor
def OnDropText(self, x, y, text):
self.editor.objectMgr.addNewObject(text)
class LevelEditorUI(WxAppShell):
""" Class for Panda3D LevelEditor """
frameWidth = 800
frameHeight = 600
appversion = '0.1'
appname = 'Panda3D Level Editor'
def __init__(self, editor, *args, **kw):
# Create the Wx app
self.wxApp = wx.App(redirect = False)
self.wxApp.SetAppName("Panda3D LevelEditor")
self.wxApp.SetClassName("P3DLevelEditor")
self.editor = editor
if not kw.get('size'):
kw['size'] = wx.Size(self.frameWidth, self.frameHeight)
WxAppShell.__init__(self, *args, **kw)
self.initialize()
self.Bind(wx.EVT_SET_FOCUS, self.onSetFocus)
self.Bind(wx.EVT_KEY_DOWN, self.onSetFocus)
def createMenu(self):
menuItem = self.menuFile.Insert(0, -1 , "&New")
self.Bind(wx.EVT_MENU, self.onNew, menuItem)
menuItem = self.menuFile.Insert(1, -1 , "&Load")
self.Bind(wx.EVT_MENU, self.onLoad, menuItem)
menuItem = self.menuFile.Insert(2, -1 , "&Save")
self.Bind(wx.EVT_MENU, self.onSave, menuItem)
menuItem = self.menuFile.Insert(3, -1 , "Save &As")
self.Bind(wx.EVT_MENU, self.onSaveAs, menuItem)
self.menuEdit = wx.Menu()
self.menuBar.Insert(1, self.menuEdit, "&Edit")
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)
def createInterface(self):
self.createMenu()
self.mainFrame = wx.SplitterWindow(self, style = wx.SP_3D | wx.SP_BORDER)
self.leftFrame = wx.SplitterWindow(self.mainFrame, style = wx.SP_3D | wx.SP_BORDER)
self.baseFrame = wx.SplitterWindow(self.mainFrame, style = wx.SP_3D | wx.SP_BORDER)
self.viewFrame = FWS.FourWaySplitter(self.baseFrame, style=wx.SP_LIVE_UPDATE)
self.rightFrame = wx.SplitterWindow(self.baseFrame, style = wx.SP_3D | wx.SP_BORDER)
self.topView = Viewport.makeTop(self.viewFrame)
self.viewFrame.AppendWindow(self.topView)
self.frontView = Viewport.makeFront(self.viewFrame)
self.viewFrame.AppendWindow(self.frontView)
self.leftView = Viewport.makeLeft(self.viewFrame)
self.viewFrame.AppendWindow(self.leftView)
self.perspView = Viewport.makePerspective(self.viewFrame)
self.viewFrame.AppendWindow(self.perspView)
self.leftBarUpPane = wx.Panel(self.leftFrame)
self.leftBarDownPane = wx.Panel(self.leftFrame)
self.rightBarUpPane = wx.Panel(self.rightFrame)
self.rightBarDownPane = wx.Panel(self.rightFrame)
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)
self.viewFrame.SetDropTarget(PandaTextDropTarget(self.editor))
self.leftFrame.SetSashGravity(0.5)
self.rightFrame.SetSashGravity(0.5)
self.baseFrame.SetSashGravity(1.0)
sizer = wx.BoxSizer(wx.VERTICAL)
sizer.Add(self.mainFrame, 1, wx.EXPAND, 0)
self.SetSizer(sizer); self.Layout()
self.objectPaletteUI = ObjectPaletteUI(self.leftBarUpPane, self.editor)
self.objectPropertyUI = ObjectPropertyUI(self.rightBarUpPane, self.editor)
def onSetFocus(self):
print 'wx got focus'
def appInit(self):
"""Overridden from WxAppShell.py."""
# Create a new event loop (to overide default wxEventLoop)
self.evtLoop = wx.EventLoop()
self.oldLoop = wx.EventLoop.GetActive()
wx.EventLoop.SetActive(self.evtLoop)
taskMgr.add(self.wxStep, "evtLoopTask")
def initialize(self):
"""Initializes the viewports and editor."""
self.Update()
ViewportManager.updateAll()
self.wxStep()
ViewportManager.initializeAll()
# Position the camera
if base.trackball != None:
base.trackball.node().setPos(0, 30, 0)
base.trackball.node().setHpr(0, 15, 0)
def wxStep(self, task = None):
"""A step in the WX event loop. You can either call this yourself or use as task."""
while self.evtLoop.Pending():
self.evtLoop.Dispatch()
self.wxApp.ProcessIdle()
if task != None: return task.cont
def onNew(self, evt):
self.editor.reset()
def onLoad(self, evt):
dialog = wx.FileDialog(None, "Choose a file", os.getcwd(), "", "*.py", wx.OPEN)
if dialog.ShowModal() == wx.ID_OK:
self.editor.load(dialog.GetPath())
dialog.Destroy()
def onSave(self, evt):
if self.editor.currentFile is None:
self.onSaveAs(evt)
else:
self.editor.save()
def onSaveAs(self, evt):
dialog = wx.FileDialog(None, "Choose a file", os.getcwd(), "", "*.py", wx.SAVE)
if dialog.ShowModal() == wx.ID_OK:
self.editor.saveAs(dialog.GetPath())
dialog.Destroy()
def onDuplicate(self, evt):
self.editor.objectMgr.duplicateSelected()
def toggleGridSnap(self, evt):
if self.gridSnapMenuItem.IsChecked():
base.direct.manipulationControl.fGridSnap = 1
else:
base.direct.manipulationControl.fGridSnap = 0