From: <ror...@us...> - 2007-08-07 23:14:36
|
Revision: 159 http://roreditor.svn.sourceforge.net/roreditor/?rev=159&view=rev Author: rorthomas Date: 2007-08-07 16:14:17 -0700 (Tue, 07 Aug 2007) Log Message: ----------- * updated starter * merged all editors into one GUI * added nice terrain preview feature Modified Paths: -------------- trunk/lib/ror/starter.py trunk/lib/wxogre/OgreManager.py Added Paths: ----------- trunk/lib/roreditor/ trunk/lib/roreditor/GUIObjectTree.py trunk/lib/roreditor/GUIPreviewObject.py trunk/lib/roreditor/MainFrame.py trunk/lib/roreditor/MainFrame_Tools.py trunk/lib/roreditor/MainFrame_Tools_ODefEditor.py trunk/lib/roreditor/MainFrame_old.py trunk/lib/roreditor/MainFrame_org.py trunk/lib/roreditor/RoRObjectPreviewOgreWindow.py trunk/lib/roreditor/RoROdefEditorOgreWindow.py trunk/lib/roreditor/RoRTerrainOgreWindow.py trunk/lib/roreditor/RoRTerrainSelectedObjectOgreWindow.py trunk/lib/roreditor/RoRTerrainSelectedObjectTopOgreWindow.py trunk/lib/roreditor/RoRTruckOgreWindow.py trunk/lib/roreditor/RoRTruckUVOgreWindow.py trunk/lib/roreditor/__init__.py trunk/lib/roreditor/terrainhelp.html trunk/roreditors.py Removed Paths: ------------- trunk/lib/rorterraineditor/ trunk/lib/rortruckeditor/ trunk/terraineditor.py trunk/truckeditor.py Modified: trunk/lib/ror/starter.py =================================================================== --- trunk/lib/ror/starter.py 2007-08-07 15:14:01 UTC (rev 158) +++ trunk/lib/ror/starter.py 2007-08-07 23:14:17 UTC (rev 159) @@ -7,6 +7,7 @@ from ror.logger import log from ror.settingsManager import getSettingsManager +import roreditor.MainFrame import wx, os, os.path @@ -39,7 +40,7 @@ self.image = ImagePanel(self.panel, wx.ID_ANY, SPLASHIMAGE) - self.lblRoRDir = wx.StaticText(self.panel, wx.ID_ANY, "Please select Rigs of Rods Directory!", size = (20, 20), style = wx.ALIGN_CENTRE | wx.ST_NO_AUTORESIZE) + self.lblRoRDir = wx.StaticText(self.panel, wx.ID_ANY, "Please select Rigs of Rods Directory!", size = (20, 40), style = wx.ALIGN_CENTRE | wx.ST_NO_AUTORESIZE) self.btnSelectRoRDir = wx.Button(self.panel, wx.ID_ANY, "Select RoR Directory") self.Bind(wx.EVT_BUTTON, self.OnSelectRoRDir, self.btnSelectRoRDir) @@ -49,12 +50,9 @@ self.cbbRenderEngine = wx.ComboBox(self.panel, wx.ID_ANY, RENDERSYSTEMS[0], style=wx.CB_READONLY, choices=RENDERSYSTEMS) self.Bind(wx.EVT_COMBOBOX, self.OnSelectRenderer, self.cbbRenderEngine) - self.btnStartTerrainEditor = wx.Button(self.panel, wx.ID_ANY, "Start Terrain Editor") + self.btnStartTerrainEditor = wx.Button(self.panel, wx.ID_ANY, "Start Editor") self.Bind(wx.EVT_BUTTON, self.OnTerrainEditor, self.btnStartTerrainEditor) - self.btnStartTruckEditor = wx.Button(self.panel, wx.ID_ANY, "Start Truck Editor") - self.Bind(wx.EVT_BUTTON, self.OnTruckEditor, self.btnStartTruckEditor) - self.btnBugReport = wx.Button(self.panel, wx.ID_ANY, "Report a Bug") self.Bind(wx.EVT_BUTTON, self.OnBugReport, self.btnBugReport) @@ -90,13 +88,13 @@ def displayRoRDir(self): if self.rordir == "": self.btnStartRoR.Enable(False) - self.btnStartTruckEditor.Enable(False) + #self.btnStartTruckEditor.Enable(False) self.btnStartTerrainEditor.Enable(False) self.btnBugReport.Enable(False) self.lblRoRDir.SetLabel("Please select Rigs of Rods Directory!") else: self.btnStartRoR.Enable(True) - self.btnStartTruckEditor.Enable(True) + #self.btnStartTruckEditor.Enable(True) self.btnStartTerrainEditor.Enable(True) self.btnBugReport.Enable(True) self.lblRoRDir.SetLabel("Selected Rigs of Rods Directory: " + self.rordir) @@ -168,15 +166,15 @@ except Exception, e: log().exception(str(e)) - def OnTruckEditor(self, event=None): - try: - import rortruckeditor.MainFrame - self.Close() - log().info("starting Truckeditor") - app = rortruckeditor.MainFrame.startApp() - del app - except Exception, e: - log().exception(str(e)) + # def OnTruckEditor(self, event=None): + # try: + # import rortruckeditor.MainFrame + # self.Close() + # log().info("starting Truckeditor") + # app = rortruckeditor.MainFrame.startApp() + # del app + # except Exception, e: + # log().exception(str(e)) def OnBugReport(self, event=None): try: @@ -195,10 +193,9 @@ def OnTerrainEditor(self, event=None): try: - import rorterraineditor.MainFrame log().info("starting Terraineditor") self.Close() - app = rorterraineditor.MainFrame.startApp() + app = roreditor.MainFrame.startApp() del app except Exception, e: log().exception(str(e)) @@ -261,7 +258,7 @@ sizer_b.Add(self.btnStartRoR, 0, wx.EXPAND, 0) sizer_c = wx.BoxSizer(wx.VERTICAL) - sizer_c.Add(self.btnStartTruckEditor, 1, wx.EXPAND, 0) + #sizer_c.Add(self.btnStartTruckEditor, 1, wx.EXPAND, 0) sizer_c.Add(self.btnStartTerrainEditor, 1, wx.EXPAND, 0) sizer_b.Add(sizer_c, 1, wx.EXPAND, 0) Added: trunk/lib/roreditor/GUIObjectTree.py =================================================================== --- trunk/lib/roreditor/GUIObjectTree.py (rev 0) +++ trunk/lib/roreditor/GUIObjectTree.py 2007-08-07 23:14:17 UTC (rev 159) @@ -0,0 +1,190 @@ +import sys, os, os.path + +import wx +import wx.grid +import wx.html +import wx.aui +import ror.settingsManager + +import cStringIO + +RORPATH = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") +DATADIR = os.path.join(RORPATH, "data") +TRUCKDIR = os.path.join(DATADIR, "trucks") +TERRAINDIR = os.path.join(DATADIR, "terrains") +OBJECTDIR = os.path.join(DATADIR, "objects") + +class RoRObjectTreeCtrl(wx.Panel): + def __init__(self, parent, frame): + wx.Panel.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, + wx.DefaultSize) + + self.parent = parent + self._frame = frame + + + vert = wx.BoxSizer(wx.VERTICAL) + + + tree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.DefaultSize, wx.NO_BORDER | wx.TR_HIDE_ROOT) + + root = tree.AddRoot("Objects") + items = [] + + imglist = wx.ImageList(16, 16, True, 2) + imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16,16))) + imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16,16))) + tree.AssignImageList(imglist) + + terrains = self.getInstalledTerrains() + items.append(tree.AppendItem(root, "Terrains", 0)) + for terrain in terrains: + terrainname, extension = os.path.splitext(os.path.basename(terrain)) + data = wx.TreeItemData() + data.SetData(terrain) + tree.AppendItem(items[-1], terrainname, 1, data=data) + + trucks = self.getInstalledTrucks() + items.append(tree.AppendItem(root, "Trucks", 0)) + for truck in trucks: + truckname, extension = os.path.splitext(os.path.basename(truck)) + data = wx.TreeItemData() + data.SetData(truck) + tree.AppendItem(items[-1], truckname, 1, data=data) + + loads = self.getInstalledLoads() + items.append(tree.AppendItem(root, "Loads", 0)) + for load in loads: + loadname, extension = os.path.splitext(os.path.basename(load)) + data = wx.TreeItemData() + data.SetData(load) + tree.AppendItem(items[-1], loadname, 1, data=data) + + objects = self.getInstalledObjects() + items.append(tree.AppendItem(root, "Objects", 0)) + for object in objects: + objectname, extension = os.path.splitext(os.path.basename(object)) + data = wx.TreeItemData() + data.SetData(object) + tree.AppendItem(items[-1], objectname, 1, data=data) + + # root is hidden, no expand! + #tree.Expand(root) + vert.Add(tree, 1, wx.EXPAND, 5) + self.SetSizer(vert) + self.GetSizer().SetSizeHints(self) + + self.tree = tree + + # this dows not work :( + #self.Bind(wx.EVT_LEFT_DCLICK, self.OnLeftDClick, self.tree) + self.Bind(wx.EVT_TREE_SEL_CHANGED, self.onTreeSelectionChange, self.tree) + self.Bind(wx.EVT_TREE_ITEM_RIGHT_CLICK, self.OnRightClick, self.tree) + + #self.Bind(wx.EVT_TREE_BEGIN_DRAG, self.BeginDrag, self.tree) + def OnLeftDClick(self, event): + #this is just a shortcut! + self.selectedfn = self.tree.GetItemData(event.GetItem()).GetData() + if self.selectedfn[-4:].lower() == "odef": + self.editOdef() + if self.selectedfn[-5:].lower() == "terrn": + self.editTerrain() + if self.selectedfn[-5:].lower() == 'truck' or self.selectedfn[-4:].lower() == 'load': + self.editTruck() + + def OnRightClick(self, event): + self.selectedfn = self.tree.GetItemData(event.GetItem()).GetData() + if self.selectedfn is None: + event.Skip() + return + + menu = wx.Menu() + + #create various menu entries + if self.selectedfn[-4:].lower() == "odef": + item_edit_odef = menu.Append(wx.ID_ANY, "Edit in ODef Editor") + self.Bind(wx.EVT_MENU, self.editOdef, item_edit_odef) + if self.selectedfn[-5:].lower() == "terrn": + item_edit_terrain = menu.Append(wx.ID_ANY, "Edit in Terrain Editor") + self.Bind(wx.EVT_MENU, self.editTerrain, item_edit_terrain) + if self.selectedfn[-5:].lower() == 'truck' or self.selectedfn[-4:].lower() == 'load': + item_edit_truck = menu.Append(wx.ID_ANY, "Edit in Truck Editor") + self.Bind(wx.EVT_MENU, self.editTruck, item_edit_truck) + menu.AppendSeparator() + item_add = menu.Append(wx.ID_ANY, "add to Terrain") + self.Bind(wx.EVT_MENU, self.addObjectToTerrain, item_add) + + self.PopupMenu(menu) + menu.Destroy() + + def editTruck(self, event=None): + if self.selectedfn is None: + return + self.parent.editTruck(self.selectedfn) + + def editOdef(self, event=None): + if self.selectedfn is None: + return + self.parent.editODefFile(self.selectedfn) + + def editTerrain(self, event=None): + if self.selectedfn is None: + return + self.parent.openTerrain(self.selectedfn) + + def addObjectToTerrain(self, event=None): + if self.selectedfn is None: + return + self.parent.addObjectToTerrain(self.selectedfn) + #def BeginDrag(self, event): + # ''' + # EVT_TREE_BEGIN_DRAG handler. + # ''' + # self.dragItem = event.GetItem() + # fn = self.tree.GetItemData(event.GetItem()).GetData() + # if fn is None: + # return + # #event.Allow() + # wx.TreeEvent.Allow(event) + + def onTreeSelectionChange(self, event=None): + fn = self.tree.GetItemData(self.tree.GetSelection()).GetData() + if fn is None: + return + self.parent.previewObject(fn) + + def getInstalledTerrains(self): + files = [] + for filename in os.listdir(TERRAINDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".terrn": + files.append(os.path.join(TERRAINDIR, filename)) + files.sort() + return files + + def getInstalledTrucks(self): + files = [] + for filename in os.listdir(TRUCKDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".truck": + files.append(os.path.join(TRUCKDIR, filename)) + files.sort() + return files + + def getInstalledLoads(self): + files = [] + for filename in os.listdir(TRUCKDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".load": + files.append(os.path.join(TRUCKDIR, filename)) + files.sort() + return files + + def getInstalledObjects(self): + files = [] + for filename in os.listdir(OBJECTDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".odef": + files.append(os.path.join(OBJECTDIR, filename)) + files.sort() + return files \ No newline at end of file Added: trunk/lib/roreditor/GUIPreviewObject.py =================================================================== --- trunk/lib/roreditor/GUIPreviewObject.py (rev 0) +++ trunk/lib/roreditor/GUIPreviewObject.py 2007-08-07 23:14:17 UTC (rev 159) @@ -0,0 +1,70 @@ +import sys, os, os.path + +import wx +import wx.grid +import wx.html +import wx.aui +import ror.settingsManager + +import cStringIO + +RORPATH = ror.settingsManager.getSettingsManager().getSetting("RigsOfRods", "BasePath") +DATADIR = os.path.join(RORPATH, "data") +TRUCKDIR = os.path.join(DATADIR, "trucks") +TERRAINDIR = os.path.join(DATADIR, "terrains") +OBJECTDIR = os.path.join(DATADIR, "objects") + +class RoRObjectTreeCtrl(wx.Panel): + def __init__(self, parent, frame): + wx.Panel.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, + wx.DefaultSize) + + self._frame = frame + + + vert = wx.BoxSizer(wx.VERTICAL) + + + tree = wx.TreeCtrl(self, -1, wx.Point(0, 0), wx.DefaultSize, wx.NO_BORDER) + + root = tree.AddRoot("Objects") + items = [] + + imglist = wx.ImageList(16, 16, True, 2) + imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_FOLDER, wx.ART_OTHER, wx.Size(16,16))) + imglist.Add(wx.ArtProvider_GetBitmap(wx.ART_NORMAL_FILE, wx.ART_OTHER, wx.Size(16,16))) + tree.AssignImageList(imglist) + + trucks = self.getInstalledTrucks() + items.append(tree.AppendItem(root, "Trucks", 0)) + for truck in trucks: + truckname, extension = os.path.splitext(truck) + tree.AppendItem(items[-1], truckname, 1) + + objects = self.getInstalledObjects() + items.append(tree.AppendItem(root, "Objects", 0)) + for object in objects: + objectname, extension = os.path.splitext(object) + tree.AppendItem(items[-1], objectname, 1) + + + tree.Expand(root) + vert.Add(tree, 1, wx.EXPAND, 5) + self.SetSizer(vert) + self.GetSizer().SetSizeHints(self) + + def getInstalledTrucks(self): + files = [] + for filename in os.listdir(TRUCKDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".truck": + files.append(filename) + return files + + def getInstalledObjects(self): + files = [] + for filename in os.listdir(OBJECTDIR): + onlyfilename, extension = os.path.splitext(filename) + if extension.lower() == ".odef": + files.append(filename) + return files \ No newline at end of file Added: trunk/lib/roreditor/MainFrame.py =================================================================== --- trunk/lib/roreditor/MainFrame.py (rev 0) +++ trunk/lib/roreditor/MainFrame.py 2007-08-07 23:14:17 UTC (rev 159) @@ -0,0 +1,545 @@ +import sys, os, os.path + +from wxogre.OgreManager import * +from ror.RoROgreWindow import * + +from ror.logger import log +from ror.settingsManager import getSettingsManager + +from ror.rorcommon import * +from RoRTerrainOgreWindow import * +from RoRObjectPreviewOgreWindow import * +from RoRTerrainSelectedObjectOgreWindow import * +from RoRTerrainSelectedObjectTopOgreWindow import * +from RoROdefEditorOgreWindow import * +from RoRTruckOgreWindow import * +from RoRTruckUVOgreWindow import * + +# GUI Tools: +from GUIObjectTree import * +from MainFrame_Tools import * +from MainFrame_Tools_ODefEditor import * + +import wx +import wx.grid +import wx.html +import wx.aui + +import cStringIO + +ID_OpenTerrain = wx.NewId() +ID_SaveTerrain = wx.NewId() +ID_SaveTerrainAs = wx.NewId() +ID_AddObject = wx.NewId() +ID_DeleteSelection = wx.NewId() +ID_CopySelection = wx.NewId() +ID_PasteSelection = wx.NewId() +ID_UndoAction = wx.NewId() +ID_RedoAction = wx.NewId() +ID_FindObject = wx.NewId() +ID_Quit = wx.NewId() + +ID_ViewHelp = wx.NewId() + +ID_CreateOgre = wx.NewId() + +ID_CreatePerspective = wx.NewId() +ID_CopyPerspective = wx.NewId() + +ID_Settings = wx.NewId() +ID_About = wx.NewId() +ID_FirstPerspective = ID_CreatePerspective+1000 + +DATADIR = "data" +TRUCKDIR = os.path.join(DATADIR, "trucks") +TERRAINDIR = os.path.join(DATADIR, "terrains") +OBJECTDIR = os.path.join(DATADIR, "objects") + +class MainFrame(wx.Frame): + + def __init__(self, parent, id=-1, title="", pos=wx.DefaultPosition, + size=wx.DefaultSize, style=wx.DEFAULT_FRAME_STYLE | + wx.SUNKEN_BORDER | + wx.CLIP_CHILDREN): + + wx.Frame.__init__(self, parent, id, title, pos, size, style) + + # tell FrameManager to manage this frame + self._mgr = wx.aui.AuiManager() + self._mgr.SetManagedWindow(self) + + self._perspectives = [] + self.n = 0 + self.x = 0 + + self.SetIcon(wx.Icon('ror.ico',wx.BITMAP_TYPE_ICO)) + + # create menu + mb = wx.MenuBar() + + file_menu = wx.Menu() + file_menu.Append(ID_OpenTerrain, "Open Terrain") + #file_menu.Append(wx.ID_EXIT, "Exit") + + #view_menu = wx.Menu() + #view_menu.Append(ID_CreateOgre, "Create new 3D View") + + self.managerInit() + options_menu = wx.Menu() + options_menu.Append(ID_Settings, "GUI Settings Pane") + + self._perspectives_menu = wx.Menu() + self._perspectives_menu.Append(ID_CreatePerspective, "Create Perspective") + #self._perspectives_menu.Append(ID_CopyPerspective, "Copy Perspective Data To Clipboard") + self._perspectives_menu.AppendSeparator() + self._perspectives_menu.Append(ID_FirstPerspective+0, "Default Startup") + self._perspectives_menu.Append(ID_FirstPerspective+1, "Terrain") + self._perspectives_menu.Append(ID_FirstPerspective+2, "ODef Editor") + self._perspectives_menu.Append(ID_FirstPerspective+3, "Truck Editor") + + help_menu = wx.Menu() + help_menu.Append(ID_About, "About...") + help_menu.Append(ID_ViewHelp, "View Help") + + mb.Append(file_menu, "File") + #mb.Append(view_menu, "View") + mb.Append(self._perspectives_menu, "Perspectives") + mb.Append(options_menu, "Options") + mb.Append(help_menu, "Help") + + self.SetMenuBar(mb) + + self.statusbar = self.CreateStatusBar(5, 0, wx.ID_ANY, "mainstatusbar") + self.statusbar.SetStatusWidths([-1, 200, 130, 250, 80]) + + # min size for the frame itself isn't completely done. + # see the end up FrameManager::Update() for the test + # code. For now, just hard code a frame minimum size + self.SetMinSize(wx.Size(600, 400)) + try: + import ror.svn + self.SetTitle("Rigs of Rods Terrain Editor revision %d" % ror.svn.getRevision()) + except: + self.SetTitle("Rigs of Rods Terrain Editor") + + # create some toolbars + self.terraintoolbar = wx.ToolBar(self, wx.ID_ANY, wx.DefaultPosition, wx.DefaultSize, wx.TB_FLAT | wx.TB_NODIVIDER) + self.terraintoolbar.SetToolBitmapSize(wx.Size(16,16)) + self.terraintoolbar.AddLabelTool(ID_OpenTerrain, "Open Terrain", wx.ArtProvider_GetBitmap(wx.ART_FILE_OPEN)) + self.terraintoolbar.AddLabelTool(ID_SaveTerrain, "Save Terrain", wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE)) + self.terraintoolbar.EnableTool(ID_SaveTerrain, False) + self.terraintoolbar.AddLabelTool(ID_SaveTerrainAs, "Save Terrain as", wx.ArtProvider_GetBitmap(wx.ART_FILE_SAVE_AS)) + self.terraintoolbar.EnableTool(ID_SaveTerrainAs, False) + self.terraintoolbar.AddSeparator() + self.terraintoolbar.AddLabelTool(ID_AddObject, "Add Something", wx.ArtProvider_GetBitmap(wx.ART_NEW)) + self.terraintoolbar.EnableTool(ID_AddObject, False) + self.terraintoolbar.AddLabelTool(ID_DeleteSelection, "Delete Selection", wx.ArtProvider_GetBitmap(wx.ART_DELETE)) + self.terraintoolbar.EnableTool(ID_DeleteSelection, False) + self.terraintoolbar.AddSeparator() + self.terraintoolbar.AddLabelTool(ID_CopySelection, "Copy Selection", wx.ArtProvider_GetBitmap(wx.ART_COPY)) + self.terraintoolbar.EnableTool(ID_CopySelection, False) + self.terraintoolbar.AddLabelTool(ID_PasteSelection, "Paste Selection", wx.ArtProvider_GetBitmap(wx.ART_PASTE)) + self.terraintoolbar.EnableTool(ID_PasteSelection, False) + self.terraintoolbar.AddSeparator() + self.terraintoolbar.AddLabelTool(ID_UndoAction, "Undo last Action", wx.ArtProvider_GetBitmap(wx.ART_UNDO)) + self.terraintoolbar.EnableTool(ID_UndoAction, False) + self.terraintoolbar.AddLabelTool(ID_RedoAction, "Redo last Undo", wx.ArtProvider_GetBitmap(wx.ART_REDO)) + self.terraintoolbar.EnableTool(ID_RedoAction, False) + self.terraintoolbar.AddSeparator() + self.terraintoolbar.AddLabelTool(ID_FindObject, "Find Object", wx.ArtProvider_GetBitmap(wx.ART_FIND)) + self.terraintoolbar.EnableTool(ID_FindObject, False) + self.terraintoolbar.AddSeparator() + self.terraintoolbar.AddLabelTool(ID_Quit, "Quit", wx.ArtProvider_GetBitmap(wx.ART_QUIT)) + self.terraintoolbar.Realize() + + self.rordir = getSettingsManager().getSetting("RigsOfRods", "BasePath") + + + # add a bunch of panes + self.objectPreviewWindow = ObjectPreviewOgreWindow(self, wx.ID_ANY, rordir=self.rordir) + + self._mgr.AddPane(self.objectPreviewWindow, wx.aui.AuiPaneInfo(). + Name("object_preview"). + Caption("Object Preview"). + CenterPane(). + MinSize(wx.Size(200,200)). + CloseButton(True). + MaximizeButton(False)) + + self._mgr.AddPane(HelpPanel(self, self), wx.aui.AuiPaneInfo(). + Name("help"). + Caption("Help"). + Dockable(False). + Float(). + Fixed(). + Hide(). + CloseButton(True). + MaximizeButton(True)) + + self._mgr.AddPane(SettingsPanel(self, self), wx.aui.AuiPaneInfo(). + Name("settings"). + Caption("Dock Manager Settings"). + Dockable(False). + Float(). + Fixed(). + Hide(). + CloseButton(True). + MaximizeButton(True)) + + self._mgr.AddPane(RoRObjectTreeCtrl(self, self), wx.aui.AuiPaneInfo(). + Name("object_tree"). + Caption("Object Tree"). + MinSize(wx.Size(200,100)). + Left(). + CloseButton(True). + MaximizeButton(True)) + + + # odef editor panels + self.oddefEditorViewSettings = OdefViewPanel(self, self) + self._mgr.AddPane(self.oddefEditorViewSettings, wx.aui.AuiPaneInfo(). + Name("odef_editor_view_settings"). + Caption("ODef Editor View Settings"). + MinSize(wx.Size(200,100)). + Left(). + CloseButton(True). + MaximizeButton(False). + Hide()) + + + # create the center pane(s) + #Timer creation (for rendering) + self.ogreTimer = wx.Timer() + self.ogreTimer.SetOwner(self) + self.Bind(wx.EVT_TIMER, self.onUpdateRender, self.ogreTimer) + self.ogreTimer.Start(25) + + # create timer for gui update + self.guitimer = wx.Timer() + self.guitimer.SetOwner(self) #Sets the timer to notify self: binding the timer event is not enough + self.Bind(wx.EVT_TIMER, self.OnGUITimer, self.guitimer) + self.guitimer.Start(200) + + # the terrain editor ogre window + self.terrainOgreWin = RoRTerrainOgreWindow(self, wx.ID_ANY, rordir=self.rordir) + self._mgr.AddPane(self.terrainOgreWin, wx.aui.AuiPaneInfo().Name("ogre_terrain_content").CenterPane().Hide()) + + # the odef editor ogre window + self.odefEditorOgreWin = ODefEditorOgreWindow(self, wx.ID_ANY, rordir=self.rordir) + self._mgr.AddPane(self.odefEditorOgreWin, wx.aui.AuiPaneInfo().Name("ogre_odef_editor_content").CenterPane().Hide()) + + # the truck editor window + self.truckEditorOgreWin = RoRTruckOgreWindow(self, wx.ID_ANY) + self._mgr.AddPane(self.truckEditorOgreWin, wx.aui.AuiPaneInfo().Name("ogre_truck_editor_content").CenterPane().Hide()) + + # the truck editor UV window + self.truckEditorUVOgreWin = RoRTruckUVOgreWindow(self, wx.ID_ANY) + self._mgr.AddPane(self.truckEditorUVOgreWin, wx.aui.AuiPaneInfo().Name("ogre_truck_editor_uv_content").Float().Hide()) + + + # add the toolbars to the manager + self._mgr.AddPane(self.terraintoolbar, wx.aui.AuiPaneInfo(). + Name("terrain_toolbar"). + Caption("General Toolbar"). + ToolbarPane().Top(). + LeftDockable(False). + RightDockable(False). + Hide() + ) + + # make some default perspectives + self._perspectives.append(self._mgr.SavePerspective()) + + # hide all first + self.terraintoolbar.Hide() + all_panes = self._mgr.GetAllPanes() + for ii in xrange(len(all_panes)): + if not all_panes[ii].IsToolbar(): + all_panes[ii].Hide() + + # terrain perspective + self._mgr.GetPane("ogre_truck_editor_uv_content").Show(False) + self._mgr.GetPane("terrain_toolbar").Show(True) + self._mgr.GetPane("ogre_truck_editor_content").Show(False) + self._mgr.GetPane("ogre_odef_editor_content").Show(False) + self._mgr.GetPane("odef_editor_view_settings").Show(False) + self._mgr.GetPane("ogre_terrain_content").Show(True) + self._mgr.GetPane("object_preview").Show(True).Left() + self._mgr.GetPane("object_tree").Show(True) + self.objectPreviewWindow + self._perspectives.append(self._mgr.SavePerspective()) + + # odef editor perspective + self._mgr.GetPane("ogre_truck_editor_uv_content").Show(False) + self._mgr.GetPane("terrain_toolbar").Show(False) + self._mgr.GetPane("ogre_truck_editor_content").Show(False) + self._mgr.GetPane("object_preview").Show(False) + self._mgr.GetPane("ogre_terrain_content").Show(False) + self._mgr.GetPane("ogre_odef_editor_content").Show(True) + self._mgr.GetPane("odef_editor_view_settings").Show(True) + self._mgr.GetPane("object_tree").Show(True) + self._perspectives.append(self._mgr.SavePerspective()) + + # truck editor perspective + self._mgr.GetPane("ogre_truck_editor_uv_content").Show(True) + self._mgr.GetPane("terrain_toolbar").Show(False) + self._mgr.GetPane("ogre_truck_editor_content").Show(True) + self._mgr.GetPane("object_preview").Show(False) + self._mgr.GetPane("ogre_terrain_content").Show(False) + self._mgr.GetPane("ogre_odef_editor_content").Show(False) + self._mgr.GetPane("odef_editor_view_settings").Show(False) + self._mgr.GetPane("object_tree").Show(False) + self._perspectives.append(self._mgr.SavePerspective()) + + # load startup perspective + self._mgr.LoadPerspective(self._perspectives[0]) + + # "commit" all changes made to FrameManager + self._mgr.Update() + + self.Bind(wx.EVT_ERASE_BACKGROUND, self.OnEraseBackground) + self.Bind(wx.EVT_SIZE, self.OnSize) + self.Bind(wx.EVT_CLOSE, self.OnClose) + + self.Bind(wx.EVT_MENU, self.OnOpenTerrain, id=ID_OpenTerrain) + self.Bind(wx.EVT_MENU, self.OnSaveTerrain, id=ID_SaveTerrain) + self.Bind(wx.EVT_MENU, self.OnSaveTerrainAs, id=ID_SaveTerrainAs) + self.Bind(wx.EVT_MENU, self.OnViewHelp, id=ID_ViewHelp) + + self.Bind(wx.EVT_MENU, self.OnCreateOgre, id=ID_CreateOgre) + + self.Bind(wx.EVT_MENU, self.OnCreatePerspective, id=ID_CreatePerspective) + self.Bind(wx.EVT_MENU, self.OnCopyPerspective, id=ID_CopyPerspective) + + self.Bind(wx.EVT_MENU, self.OnSettings, id=ID_Settings) + + self.Bind(wx.EVT_MENU, self.OnExit, id=ID_Quit) + self.Bind(wx.EVT_MENU, self.OnExit, id=wx.ID_EXIT) + self.Bind(wx.EVT_MENU, self.OnAbout, id=ID_About) + + self.Bind(wx.EVT_MENU_RANGE, self.OnRestorePerspective, id=ID_FirstPerspective, + id2=ID_FirstPerspective+1000) + + def changeEditorMode(self, id): + self._mgr.LoadPerspective(self._perspectives[id]) + self._mgr.Update() + + def OnViewHelp(self, event=None): + # show the settings pane, and float it + floating_pane = self._mgr.GetPane("help").Float().Show() + + if floating_pane.floating_pos == wx.DefaultPosition: + floating_pane.FloatingPosition(self.GetStartPosition()) + + self._mgr.Update() + + + def addObjectToTerrain(self, filename): + try: + self.changeEditorMode(1) + onlyfilename, extension = os.path.splitext(os.path.basename(filename)) + if extension.lower() in ['.truck', '.load']: + if not self.terrainOgreWin.addTruckToTerrain(truckFilename=filename): + dlg = wx.MessageDialog(self, "You must select a position on the ground first!", "error", wx.OK | wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + elif extension.lower() in ['.odef']: + if not self.terrainOgreWin.addObjectToTerrain(odefFilename=filename): + dlg = wx.MessageDialog(self, "You must select a position on the ground first!", "error", wx.OK | wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + except: + pass + + def previewObject(self, filename): + #try: + self.objectPreviewWindow.loadFile(filename) + #except: + # pass + + def editODefFile(self, filename): + #try: + self.odefEditorOgreWin.loadFile(filename) + self.changeEditorMode(2) + self.oddefEditorViewSettings.resetControls() + #except Exception, err: + # print err + # pass + + def editTruck(self, filename): + #try: + tree = self.truckEditorOgreWin.LoadTruck(filename) + self.changeEditorMode(3) + self.truckEditorUVOgreWin.setTree(tree) + #except Exception, err: + # print err + # pass + + def updateObjPosRot(self, event=None): + self.statusbar.SetStatusText(self.terrainOgreWin.currentStatusMsg, 1) + if self.terrainOgreWin.terrain is None: + return + if self.terrainOgreWin.selectedEntry is None: + self.statusbar.SetStatusText("Nothing selected", 2) + return + entry = self.terrainOgreWin.selectedEntry + #comment = self.terrainOgreWin.getCommentsForObject(n.getName()).lstrip('/') + #if comment.strip() != "": + # txt = "%s / %s" % (n.getName(), comment) + #else: + txt = "%s %s" % (entry.data.name, " ".join(entry.data.additionaloptions)) + self.statusbar.SetStatusText(txt, 2) + + posx, posy, posz, rotx, roty, rotz = self.terrainOgreWin.getSelectionPositionRotation() + txt = "%0.2f, %0.2f, %0.2f / %0.2f, %0.2f, %0.2f" % (posx, posy, posz, rotx, roty, rotz) + self.statusbar.SetStatusText(txt, 3) + + def OnGUITimer(self, event): + #fill labels with some information, all windows have the same FPS! + txt = "%0.2f FPS" % (self.terrainOgreWin.renderWindow.getStatistics().lastFPS) + self.statusbar.SetStatusText(txt, 4) + self.updateObjPosRot() + + def onUpdateRender(self, event=None): + getOgreManager().RenderAll() + pass + + def openTerrain(self, filename): + self.changeEditorMode(1) + self.terrainOgreWin.LoadTerrain(filename) + self.terraintoolbar.EnableTool(ID_AddObject, True) + self.terraintoolbar.EnableTool(ID_DeleteSelection, True) + self.terraintoolbar.EnableTool(ID_CopySelection, True) + self.terraintoolbar.EnableTool(ID_PasteSelection, True) + self.terraintoolbar.EnableTool(ID_UndoAction, True) + self.terraintoolbar.EnableTool(ID_RedoAction, True) + self.terraintoolbar.EnableTool(ID_FindObject, True) + self.terraintoolbar.EnableTool(ID_SaveTerrain, True) + self.terraintoolbar.EnableTool(ID_SaveTerrainAs, True) + + def OnOpenTerrain(self, event=None): + default = "" + if self.rordir: + default = os.path.join(self.rordir, TERRAINDIR) + dialog = wx.FileDialog(self, "Open Terrain", default, "", "Terrain Files (*.terrn)|*.terrn", wx.FD_OPEN | wx.FD_FILE_MUST_EXIST) + res = dialog.ShowModal() + if res == wx.ID_OK: + self.openTerrain(dialog.GetPath()) + + def OnSaveTerrain(self, event=None): + if not self.terrainOgreWin.SaveTerrain(): + dlg = wx.MessageDialog(self, "error while saving, see console!\n","error", wx.OK | wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + + def OnSaveTerrainAs(self, event=None): + default = "" + if self.rordir: + default = os.path.join(self.rordir, TERRAINDIR) + dialog = wx.FileDialog(self, "Save Terrain as", default, "", "Terrain Files (*.terrn)|*.terrn", wx.FD_SAVE | wx.FD_OVERWRITE_PROMPT) + res = dialog.ShowModal() + if res == wx.ID_OK: + if not self.terrainOgreWin.SaveTerrain(dialog.GetPath()): + dlg = wx.MessageDialog(self, "error while saving as another file, see console!\n","error", wx.OK | wx.ICON_INFORMATION) + dlg.ShowModal() + dlg.Destroy() + + def OnClose(self, event): + self.OnExit(event) + + def OnExit(self, event): + all_panes = self._mgr.GetAllPanes() + for ii in xrange(len(all_panes)): + if not all_panes[ii].IsToolbar(): + all_panes[ii].Hide() + self._mgr.UnInit() + del self._mgr + self.Destroy() + self.Close() + + def OnAbout(self, event): + ShowOnAbout() + + def GetDockArt(self): + return self._mgr.GetArtProvider() + + def DoUpdate(self): + self._mgr.Update() + + def OnEraseBackground(self, event): + event.Skip() + + def OnSize(self, event): + event.Skip() + + def OnSettings(self, event): + # show the settings pane, and float it + floating_pane = self._mgr.GetPane("settings").Float().Show() + + if floating_pane.floating_pos == wx.DefaultPosition: + floating_pane.FloatingPosition(self.GetStartPosition()) + + self._mgr.Update() + + def managerInit(self): + flags = self._mgr.GetFlags() + # based on default settings! + flags |= wx.aui.AUI_MGR_ALLOW_ACTIVE_PANE + flags &= ~wx.aui.AUI_MGR_TRANSPARENT_DRAG + self._mgr.SetFlags(flags) + + def OnCreatePerspective(self, event): + dlg = wx.TextEntryDialog(self, "Enter a name for the new perspective:", "AUI Test") + + dlg.SetValue(("Perspective %d")%(len(self._perspectives)+1)) + if dlg.ShowModal() != wx.ID_OK: + return + + if len(self._perspectives) == 0: + self._perspectives_menu.AppendSeparator() + + self._perspectives_menu.Append(ID_FirstPerspective + len(self._perspectives), dlg.GetValue()) + self._perspectives.append(self._mgr.SavePerspective()) + + + def OnCopyPerspective(self, event): + s = self._mgr.SavePerspective() + + if wx.TheClipboard.Open(): + + wx.TheClipboard.SetData(wx.TextDataObject(s)) + wx.TheClipboard.Close() + + def OnRestorePerspective(self, event): + self._mgr.LoadPerspective(self._perspectives[event.GetId() - ID_FirstPerspective]) + + + def GetStartPosition(self): + self.x = self.x + 20 + x = self.x + pt = self.ClientToScreen(wx.Point(0, 0)) + + return wx.Point(pt.x + x, pt.y + x) + + def OnCreateOgre(self, event): + self._mgr.AddPane(self.CreateOgreCtrl(), wx.aui.AuiPaneInfo(). + Caption("Ogre Window"). + Float().FloatingPosition(self.GetStartPosition()). + CloseButton(True).MaximizeButton(False)) + self._mgr.Update() + + def CreateOgreCtrl(self): + return RoRTerrainOgreWindow(self, wx.ID_ANY, maininstance=self.terrainOgreWin) + +def startApp(): + MainApp = wx.PySimpleApp(0) + wx.InitAllImageHandlers() #you may or may not need this + myFrame = MainFrame(None, -1, "") + + MainApp.SetTopWindow(myFrame) + + myFrame.SetSize((800, 600)) + myFrame.SetFocus() + myFrame.Show() + + MainApp.MainLoop() \ No newline at end of file Added: trunk/lib/roreditor/MainFrame_Tools.py =================================================================== --- trunk/lib/roreditor/MainFrame_Tools.py (rev 0) +++ trunk/lib/roreditor/MainFrame_Tools.py 2007-08-07 23:14:17 UTC (rev 159) @@ -0,0 +1,342 @@ +import sys, os, os.path + +from ror.logger import log +from ror.settingsManager import getSettingsManager + +import wx +import wx.grid +import wx.html +import wx.aui + +import cStringIO +# -- wx.SizeReportCtrl -- +# (a utility control that always reports it's client size) + +HELPFILENAME = os.path.join(os.path.dirname(os.path.abspath(__file__)), "terrainhelp.html") + +class HelpPanel(wx.Panel): + def __init__(self, parent, frame): + wx.Panel.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, + wx.DefaultSize) + self._frame = frame + + vert = wx.BoxSizer(wx.VERTICAL) + self.htmlctrl = wx.html.HtmlWindow(self, wx.ID_ANY, wx.DefaultPosition, wx.Size(800, 600)) + if "gtk2" in wx.PlatformInfo: + ctrl.SetStandardFonts() + readme = self.loadReadme() + if readme is None: + self.Hide() + return + self.htmlctrl.SetPage(readme) + vert.Add(self.htmlctrl, 2, wx.EXPAND, 0) + self.SetSizer(vert) + self.GetSizer().SetSizeHints(self) + + def loadReadme(self): + if os.path.isfile(HELPFILENAME): + try: + f = open(HELPFILENAME,'r') + content = f.read() + f.close() + return content + except Exception, err: + log().error(str(err)) + return None + else: + log().error("TerrainEditor Readme not found: %s" % HELPFILENAME) + return None + +ID_PaneBorderSize = wx.ID_HIGHEST + 1 +ID_SashSize = ID_PaneBorderSize + 1 +ID_CaptionSize = ID_PaneBorderSize + 2 +ID_BackgroundColor = ID_PaneBorderSize + 3 +ID_SashColor = ID_PaneBorderSize + 4 +ID_InactiveCaptionColor = ID_PaneBorderSize + 5 +ID_InactiveCaptionGradientColor = ID_PaneBorderSize + 6 +ID_InactiveCaptionTextColor = ID_PaneBorderSize + 7 +ID_ActiveCaptionColor = ID_PaneBorderSize + 8 +ID_ActiveCaptionGradientColor = ID_PaneBorderSize + 9 +ID_ActiveCaptionTextColor = ID_PaneBorderSize + 10 +ID_BorderColor = ID_PaneBorderSize + 11 +ID_GripperColor = ID_PaneBorderSize + 12 + +class SettingsPanel(wx.Panel): + + def __init__(self, parent, frame): + + wx.Panel.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, + wx.DefaultSize) + + self._frame = frame + + vert = wx.BoxSizer(wx.VERTICAL) + + s1 = wx.BoxSizer(wx.HORIZONTAL) + self._border_size = wx.SpinCtrl(self, ID_PaneBorderSize, "", wx.DefaultPosition, wx.Size(50,20)) + s1.Add((1, 1), 1, wx.EXPAND) + s1.Add(wx.StaticText(self, -1, "Pane Border Size:")) + s1.Add(self._border_size) + s1.Add((1, 1), 1, wx.EXPAND) + s1.SetItemMinSize(1, (180, 20)) + #vert.Add(s1, 0, wx.EXPAND | wxLEFT | wxBOTTOM, 5) + + s2 = wx.BoxSizer(wx.HORIZONTAL) + self._sash_size = wx.SpinCtrl(self, ID_SashSize, "", wx.DefaultPosition, wx.Size(50,20)) + s2.Add((1, 1), 1, wx.EXPAND) + s2.Add(wx.StaticText(self, -1, "Sash Size:")) + s2.Add(self._sash_size) + s2.Add((1, 1), 1, wx.EXPAND) + s2.SetItemMinSize(1, (180, 20)) + #vert.Add(s2, 0, wx.EXPAND | wxLEFT | wxBOTTOM, 5) + + s3 = wx.BoxSizer(wx.HORIZONTAL) + self._caption_size = wx.SpinCtrl(self, ID_CaptionSize, "", wx.DefaultPosition, wx.Size(50,20)) + s3.Add((1, 1), 1, wx.EXPAND) + s3.Add(wx.StaticText(self, -1, "Caption Size:")) + s3.Add(self._caption_size) + s3.Add((1, 1), 1, wx.EXPAND) + s3.SetItemMinSize(1, (180, 20)) + #vert.Add(s3, 0, wx.EXPAND | wxLEFT | wxBOTTOM, 5) + + #vert.Add(1, 1, 1, wx.EXPAND) + + b = self.CreateColorBitmap(wx.BLACK) + + s4 = wx.BoxSizer(wx.HORIZONTAL) + self._background_color = wx.BitmapButton(self, ID_BackgroundColor, b, wx.DefaultPosition, wx.Size(50,25)) + s4.Add((1, 1), 1, wx.EXPAND) + s4.Add(wx.StaticText(self, -1, "Background Color:")) + s4.Add(self._background_color) + s4.Add((1, 1), 1, wx.EXPAND) + s4.SetItemMinSize(1, (180, 20)) + + s5 = wx.BoxSizer(wx.HORIZONTAL) + self._sash_color = wx.BitmapButton(self, ID_SashColor, b, wx.DefaultPosition, wx.Size(50,25)) + s5.Add((1, 1), 1, wx.EXPAND) + s5.Add(wx.StaticText(self, -1, "Sash Color:")) + s5.Add(self._sash_color) + s5.Add((1, 1), 1, wx.EXPAND) + s5.SetItemMinSize(1, (180, 20)) + + s6 = wx.BoxSizer(wx.HORIZONTAL) + self._inactive_caption_color = wx.BitmapButton(self, ID_InactiveCaptionColor, b, + wx.DefaultPosition, wx.Size(50,25)) + s6.Add((1, 1), 1, wx.EXPAND) + s6.Add(wx.StaticText(self, -1, "Normal Caption:")) + s6.Add(self._inactive_caption_color) + s6.Add((1, 1), 1, wx.EXPAND) + s6.SetItemMinSize(1, (180, 20)) + + s7 = wx.BoxSizer(wx.HORIZONTAL) + self._inactive_caption_gradient_color = wx.BitmapButton(self, ID_InactiveCaptionGradientColor, + b, wx.DefaultPosition, wx.Size(50,25)) + s7.Add((1, 1), 1, wx.EXPAND) + s7.Add(wx.StaticText(self, -1, "Normal Caption Gradient:")) + s7.Add(self._inactive_caption_gradient_color) + s7.Add((1, 1), 1, wx.EXPAND) + s7.SetItemMinSize(1, (180, 20)) + + s8 = wx.BoxSizer(wx.HORIZONTAL) + self._inactive_caption_text_color = wx.BitmapButton(self, ID_InactiveCaptionTextColor, b, + wx.DefaultPosition, wx.Size(50,25)) + s8.Add((1, 1), 1, wx.EXPAND) + s8.Add(wx.StaticText(self, -1, "Normal Caption Text:")) + s8.Add(self._inactive_caption_text_color) + s8.Add((1, 1), 1, wx.EXPAND) + s8.SetItemMinSize(1, (180, 20)) + + s9 = wx.BoxSizer(wx.HORIZONTAL) + self._active_caption_color = wx.BitmapButton(self, ID_ActiveCaptionColor, b, + wx.DefaultPosition, wx.Size(50,25)) + s9.Add((1, 1), 1, wx.EXPAND) + s9.Add(wx.StaticText(self, -1, "Active Caption:")) + s9.Add(self._active_caption_color) + s9.Add((1, 1), 1, wx.EXPAND) + s9.SetItemMinSize(1, (180, 20)) + + s10 = wx.BoxSizer(wx.HORIZONTAL) + self._active_caption_gradient_color = wx.BitmapButton(self, ID_ActiveCaptionGradientColor, + b, wx.DefaultPosition, wx.Size(50,25)) + s10.Add((1, 1), 1, wx.EXPAND) + s10.Add(wx.StaticText(self, -1, "Active Caption Gradient:")) + s10.Add(self._active_caption_gradient_color) + s10.Add((1, 1), 1, wx.EXPAND) + s10.SetItemMinSize(1, (180, 20)) + + s11 = wx.BoxSizer(wx.HORIZONTAL) + self._active_caption_text_color = wx.BitmapButton(self, ID_ActiveCaptionTextColor, + b, wx.DefaultPosition, wx.Size(50,25)) + s11.Add((1, 1), 1, wx.EXPAND) + s11.Add(wx.StaticText(self, -1, "Active Caption Text:")) + s11.Add(self._active_caption_text_color) + s11.Add((1, 1), 1, wx.EXPAND) + s11.SetItemMinSize(1, (180, 20)) + + s12 = wx.BoxSizer(wx.HORIZONTAL) + self._border_color = wx.BitmapButton(self, ID_BorderColor, b, wx.DefaultPosition, + wx.Size(50,25)) + s12.Add((1, 1), 1, wx.EXPAND) + s12.Add(wx.StaticText(self, -1, "Border Color:")) + s12.Add(self._border_color) + s12.Add((1, 1), 1, wx.EXPAND) + s12.SetItemMinSize(1, (180, 20)) + + s13 = wx.BoxSizer(wx.HORIZONTAL) + self._gripper_color = wx.BitmapButton(self, ID_GripperColor, b, wx.DefaultPosition, + wx.Size(50,25)) + s13.Add((1, 1), 1, wx.EXPAND) + s13.Add(wx.StaticText(self, -1, "Gripper Color:")) + s13.Add(self._gripper_color) + s13.Add((1, 1), 1, wx.EXPAND) + s13.SetItemMinSize(1, (180, 20)) + + grid_sizer = wx.GridSizer(0, 2) + grid_sizer.SetHGap(5) + grid_sizer.Add(s1) + grid_sizer.Add(s4) + grid_sizer.Add(s2) + grid_sizer.Add(s5) + grid_sizer.Add(s3) + grid_sizer.Add(s13) + grid_sizer.Add((1, 1)) + grid_sizer.Add(s12) + grid_sizer.Add(s6) + grid_sizer.Add(s9) + grid_sizer.Add(s7) + grid_sizer.Add(s10) + grid_sizer.Add(s8) + grid_sizer.Add(s11) + + cont_sizer = wx.BoxSizer(wx.VERTICAL) + cont_sizer.Add(grid_sizer, 1, wx.EXPAND | wx.ALL, 5) + self.SetSizer(cont_sizer) + self.GetSizer().SetSizeHints(self) + + self._border_size.SetValue(frame.GetDockArt().GetMetric(wx.aui.AUI_DOCKART_PANE_BORDER_SIZE)) + self._sash_size.SetValue(frame.GetDockArt().GetMetric(wx.aui.AUI_DOCKART_SASH_SIZE)) + self._caption_size.SetValue(frame.GetDockArt().GetMetric(wx.aui.AUI_DOCKART_CAPTION_SIZE)) + + self.UpdateColors() + + self.Bind(wx.EVT_SPINCTRL, self.OnPaneBorderSize, id=ID_PaneBorderSize) + self.Bind(wx.EVT_SPINCTRL, self.OnSashSize, id=ID_SashSize) + self.Bind(wx.EVT_SPINCTRL, self.OnCaptionSize, id=ID_CaptionSize) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_BackgroundColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_SashColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_InactiveCaptionColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_InactiveCaptionGradientColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_InactiveCaptionTextColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_ActiveCaptionColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_ActiveCaptionGradientColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_ActiveCaptionTextColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_BorderColor) + self.Bind(wx.EVT_BUTTON, self.OnSetColor, id=ID_GripperColor) + + + def CreateColorBitmap(self, c): + image = wx.EmptyImage(25, 14) + + for x in xrange(25): + for y in xrange(14): + pixcol = c + if x == 0 or x == 24 or y == 0 or y == 13: + pixcol = wx.BLACK + + image.SetRGB(x, y, pixcol.Red(), pixcol.Green(), pixcol.Blue()) + + return image.ConvertToBitmap() + + + def UpdateColors(self): + + bk = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_BACKGROUND_COLOUR) + self._background_color.SetBitmapLabel(self.CreateColorBitmap(bk)) + + cap = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_INACTIVE_CAPTION_COLOUR) + self._inactive_caption_color.SetBitmapLabel(self.CreateColorBitmap(cap)) + + capgrad = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR) + self._inactive_caption_gradient_color.SetBitmapLabel(self.CreateColorBitmap(capgrad)) + + captxt = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR) + self._inactive_caption_text_color.SetBitmapLabel(self.CreateColorBitmap(captxt)) + + acap = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_ACTIVE_CAPTION_COLOUR) + self._active_caption_color.SetBitmapLabel(self.CreateColorBitmap(acap)) + + acapgrad = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR) + self._active_caption_gradient_color.SetBitmapLabel(self.CreateColorBitmap(acapgrad)) + + acaptxt = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR) + self._active_caption_text_color.SetBitmapLabel(self.CreateColorBitmap(acaptxt)) + + sash = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_SASH_COLOUR) + self._sash_color.SetBitmapLabel(self.CreateColorBitmap(sash)) + + border = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_BORDER_COLOUR) + self._border_color.SetBitmapLabel(self.CreateColorBitmap(border)) + + gripper = self._frame.GetDockArt().GetColour(wx.aui.AUI_DOCKART_GRIPPER_COLOUR) + self._gripper_color.SetBitmapLabel(self.CreateColorBitmap(gripper)) + + + def OnPaneBorderSize(self, event): + + self._frame.GetDockArt().SetMetric(wx.aui.AUI_DOCKART_PANE_BORDER_SIZE, + event.GetInt()) + self._frame.DoUpdate() + + + def OnSashSize(self, event): + + self._frame.GetDockArt().SetMetric(wx.aui.AUI_DOCKART_SASH_SIZE, + event.GetInt()) + self._frame.DoUpdate() + + + def OnCaptionSize(self, event): + + self._frame.GetDockArt().SetMetric(wx.aui.AUI_DOCKART_CAPTION_SIZE, + event.GetInt()) + self._frame.DoUpdate() + + + def OnSetColor(self, event): + + dlg = wx.ColourDialog(self._frame) + + dlg.SetTitle("Color Picker") + + if dlg.ShowModal() != wx.ID_OK: + return + + var = 0 + if event.GetId() == ID_BackgroundColor: + var = wx.aui.AUI_DOCKART_BACKGROUND_COLOUR + elif event.GetId() == ID_SashColor: + var = wx.aui.AUI_DOCKART_SASH_COLOUR + elif event.GetId() == ID_InactiveCaptionColor: + var = wx.aui.AUI_DOCKART_INACTIVE_CAPTION_COLOUR + elif event.GetId() == ID_InactiveCaptionGradientColor: + var = wx.aui.AUI_DOCKART_INACTIVE_CAPTION_GRADIENT_COLOUR + elif event.GetId() == ID_InactiveCaptionTextColor: + var = wx.aui.AUI_DOCKART_INACTIVE_CAPTION_TEXT_COLOUR + elif event.GetId() == ID_ActiveCaptionColor: + var = wx.aui.AUI_DOCKART_ACTIVE_CAPTION_COLOUR + elif event.GetId() == ID_ActiveCaptionGradientColor: + var = wx.aui.AUI_DOCKART_ACTIVE_CAPTION_GRADIENT_COLOUR + elif event.GetId() == ID_ActiveCaptionTextColor: + var = wx.aui.AUI_DOCKART_ACTIVE_CAPTION_TEXT_COLOUR + elif event.GetId() == ID_BorderColor: + var = wx.aui.AUI_DOCKART_BORDER_COLOUR + elif event.GetId() == ID_GripperColor: + var = wx.aui.AUI_DOCKART_GRIPPER_COLOUR + else: + return + + self._frame.GetDockArt().SetColor(var, dlg.GetColourData().GetColour()) + self._frame.DoUpdate() + self.UpdateColors() + + Added: trunk/lib/roreditor/MainFrame_Tools_ODefEditor.py =================================================================== --- trunk/lib/roreditor/MainFrame_Tools_ODefEditor.py (rev 0) +++ trunk/lib/roreditor/MainFrame_Tools_ODefEditor.py 2007-08-07 23:14:17 UTC (rev 159) @@ -0,0 +1,83 @@ +import sys, os, os.path + +from ror.logger import log +from ror.settingsManager import getSettingsManager + +import wx +import wx.aui + +import cStringIO + +ID_ChangeMainMeshTrans = wx.NewId() +ID_ChangeMainMeshVisibility = wx.NewId() +ID_ChangeNormalBoxesVisibility = wx.NewId() +ID_ChangeVirtualBoxesVisibility = wx.NewId() + +class OdefViewPanel(wx.Panel): + def __init__(self, parent, frame): + wx.Panel.__init__(self, parent, wx.ID_ANY, wx.DefaultPosition, + wx.DefaultSize) + self._frame = frame + self.parent = parent + + vert = wx.BoxSizer(wx.VERTICAL) + + s1 = wx.BoxSizer(wx.HORIZONTAL) + self.ObjTransparencySlider = wx.SpinCtrl(self, ID_ChangeMainMeshTrans, "", wx.DefaultPosition, wx.Size(50,20), min=0, max=100, initial=60) + s1.Add((1, 1), 1, wx.EXPAND) + s1.Add(wx.StaticText(self, -1, "Object Transparency:")) + s1.Add(self.ObjTransparencySlider) + s1.Add((1, 1), 1, wx.EXPAND) + vert.Add(s1, 0, wx.EXPAND | wx.LEFT | wx.BOTTOM, 5) + + self.chkMeshVisible = wx.CheckBox(self, ID_ChangeMainMeshVisibility, "Display Object", wx.DefaultPosition, wx.Size(50,20)) + vert.Add(self.chkMeshVisible, 0, wx.EXPAND | wx.LEFT | wx.BOTTOM, 5) + + self.chkBoxNormalVisible = wx.CheckBox(self, ID_ChangeNormalBoxesVisibility, "Display Collision Boxes", wx.DefaultPosition, wx.Size(50,20)) + vert.Add(self.chkBoxNormalVisible, 0, wx.EXPAND | wx.LEFT | wx.BOTTOM, 5) + + self.chkBoxVirtualVisible = wx.CheckBox(self, ID_ChangeVirtualBoxesVisibility, "Display Virtual Boxes", wx.DefaultPosition, wx.Size(50,20)) + self.chkBoxVirtualVisible.SetValue(True) + vert.Add(self.chkBoxVirtualVisible, 0, wx.EXPAND | wx.LEFT | wx.BOTTOM, 5) + + + self.Bind(wx.EVT_SPINCTRL, self.OnMainMeshTransChange, id=ID_ChangeMainMeshTrans) + self.Bind(wx.EVT_CHECKBOX, self.OnMainMeshVisibilityChange, id=ID_ChangeMainMeshVisibility) + self.Bind(wx.EVT_CHECKBOX, self.OnNormalBoxesVisibilityChange, id=ID_ChangeNormalBoxesVisibility) + self.Bind(wx.EVT_CHECKBOX, self.OnVirtualBoxesVisibilityChange, id=ID_ChangeVirtualBoxesVisibility) + + self.SetSizer(vert) + self.GetSizer().SetSizeHints(self) + self.resetControls() + + def resetControls(self): + self.chkMeshVisible.SetValue(True) + self.chkBoxNormalVisible.SetValue(True) + self.ObjTransparencySlider.SetValue(60) + + + def OnMainMeshTransChange(self, event): + self.parent.odefEditorOgreWin.setMainMeshTrans(event.GetInt()) + + def OnMainMeshVisibilityChange(self, event): + self.parent.odefEditorOgreWin.setMainMeshVisible(event.IsChecked()) + + def OnNormalBoxesVisibilityChange(self, event): + self.parent.odefEditorOgreWin.setBoxesVisibility("normal", event.IsChecked()) + + def OnVirtualBoxesVisibilityChange(self, event): + self.parent.odefEditorOgreWin.setBoxesVisibility("virtual", event.IsChecked()) + + def loadReadme(self): + if os.path.isfile(HELPFILENAME): + try: + f = open(HELPFILENAME,'r') + content = f.read() + f.close() + return content + except Exception, err: + log().error(str(err)) + return None + else: + log().error("TerrainEditor Readme not found: %s" % HELPFILENAME) + return None Added: trunk/lib/roreditor/MainFrame_old.py =================================================================== --- trunk/lib/roreditor/MainFrame_old.py (rev 0) +++ trunk/lib/roreditor/MainFrame_old.py 2007-08-07 23:14:17 UTC (rev 159) @@ -0,0 +1,412 @@ +#Thomas Fischer 31/05/2007, th...@th... +from wxogre.OgreManager import * +from ror.RoROgreWindow import * + +from ror.logger import log +from ror.settingsManager import getSettingsManager + +from ror.rorcommon import * +from RoRTerrainOgreWindow import * +from RoRTerrainSelectedObjectOgreWindow import * +from RoRTerrainSelectedObjectTopOgreWindow import * + +ID_ABOUT = 101 +ID_OPENFILE = 102 +ID_SAVEFILE = 103 +ID_VIEWOBJ = 104 +ID_OGRESET = 105 +ID_SHOWHELP = 106 +ID_ADDTRUCK = 107 +ID_ADDMESH = 108 +ID_CHECKUPDATE = 109 +ID_SAVEFILEAS = 110 +ID_TERRAINCOLLISION = 111 +ID_EXIT = 199 + +DATADIR = "data" +TRUCKDIR = os.path.join(DATADIR, "trucks") +TERRAINDIR = os.path.join(DATADIR, "terrains") +OBJECTDIR = os.path.join(DATADIR, "objects") + + +class MainFrame(wx.Frame): + def __init__(self, *args, **kwds): + kwds["style"] = wx.MINIMIZE_BOX | wx.MAXIMIZE_BOX | wx.RESIZE_BORDER | wx.SYSTEM_MENU | wx.CAPTION | wx.CLIP_CHILDREN + + wx.Frame.__init__(self, *args, **kwds) + + + #main splitter + self.splitter = wx.SplitterWindow(self, wx.ID_ANY, style=wx.SP_PERMIT_UNSPLIT|wx.SP_3DSASH) + self.splitterleft = wx.Panel(self.splitter, wx.ID_ANY) + self.splitterright = wx.Panel(self.splitter, wx.ID_ANY) + self.splitter.SetSashGravity(1) + self.splitter.SetSashPosition(100) + self.splitter.SetMinimumPaneSize(200) + + #viewsplitter + self.viewsplitter = wx.SplitterWindow(self.splitterright, wx.ID_ANY) + self.viewsplitterup = wx.Panel(self.viewsplitter, wx.ID_ANY) + self.viewsplitterdown = wx.Panel(self.viewsplitter, wx.ID_ANY) + self.splitter.SetSashGravity(0.5) + self.splitter.SetSashPosition(100) + self.splitter.SetMinimumPaneSize(200) + + self.rordir = getSettingsManager().getSetting("RigsOfRods", "BasePath") + + #ogre windows + self.terrainOgreWin = RoRTerrainOgreWindow(self.splitterleft, wx.ID_ANY, rordir=self.rordir) + self.sharedOgreWin = RoRTerrainSelectedObjectOgreWindow(self.viewsplitterup, wx.ID_ANY, self.terrainOgreWin) + self.sharedOgreWin2 = RoRTerrainSelectedObjectTopOgreWindow(self.viewsplitterdown, wx.ID_ANY, self.terrainOgreWin) + + #some labels + #self.helptext = wx.StaticText(self.splitterleft, wx.ID_ANY, "short help: right click = ro... [truncated message content] |