1 module unecht.core.components.editor.menuItems; 2 3 version(UEIncludeEditor): 4 5 import unecht.ue; 6 import unecht.core.fibers; 7 import unecht.core.entity; 8 import unecht.core.component; 9 import unecht.core.components._editor; 10 import unecht.core.components.sceneNode; 11 import unecht.core.components.editor.commands; 12 13 /// 14 final class UEEditorMenus : UEComponent 15 { 16 mixin(UERegisterObject!()); 17 18 private static void saveToFile(string filename, string content) 19 { 20 import std.file; 21 write(filename, content); 22 } 23 static string loadFromFile(string filename) 24 { 25 import std.file; 26 return cast(string)read(filename); 27 } 28 29 /// 30 private static bool entitySelected() 31 { 32 return EditorRootComponent.currentEntity !is null; 33 } 34 35 /// 36 @MenuItem("assets/refresh") 37 private static void assetsRefresh() 38 { 39 import unecht.core.assetDatabase:UEAssetDatabase; 40 41 UEAssetDatabase.refresh(); 42 } 43 44 /// 45 @MenuItem("main/new scene") 46 private static void newScene() 47 { 48 UEFibers.startFiber({ 49 import unecht.core.hideFlags; 50 51 EditorRootComponent.selectEntity(null); 52 53 foreach(rootChild; ue.scene.root.children) 54 { 55 if(!rootChild.hideFlags.isSet(HideFlags.hideInHirarchie)) 56 UEEntity.destroy(rootChild.entity); 57 } 58 }); 59 } 60 61 /// 62 @MenuItem("main/load scene") 63 private static void loadScene() 64 { 65 import unecht.core.hideFlags; 66 import unecht.core.serialization.sceneSerialization; 67 import unecht.core.components.editor.ui.fileDialog:UEFileDialog; 68 import unecht.core.assetDatabase:UEAssetDatabase; 69 import std..string:format; 70 71 UEFibers.startFiber({ 72 73 UEFileDialog.open("*.scene", ".scene"); 74 75 while(UEFileDialog.isOpen) 76 Fiber.yield; 77 78 if(!UEFileDialog.wasOk) 79 return; 80 81 UEEditorMenus.newScene(); 82 Fiber.yield(); 83 84 assert(ue.scene.root.children.length == 3, format("rootchildren: %s",ue.scene.root.children.length)); 85 86 UESceneDeserializer d = UESceneDeserializer(UEEditorMenus.loadFromFile(UEFileDialog.path)); 87 88 foreach(asset; UEAssetDatabase.assets) 89 { 90 d.addExternalObj(asset.obj); 91 } 92 93 d.deserialize(ue.scene.root); 94 }); 95 } 96 97 /// 98 @MenuItem("main/save scene") 99 private static void saveScene() 100 { 101 UEFibers.startFiber({ 102 import unecht.core.hideFlags; 103 import unecht.core.serialization.sceneSerialization; 104 import unecht.core.components.editor.ui.fileDialog; 105 import unecht.core.assetDatabase:UEAssetDatabase; 106 107 UESceneSerializer s; 108 109 s.serialize(ue.scene.root, UEAssetDatabase.getAllIds()); 110 111 UEFileDialog.open("*.scene", "scene"); 112 113 while(UEFileDialog.isOpen) 114 Fiber.yield; 115 116 if(!UEFileDialog.wasOk) 117 return; 118 119 saveToFile(UEFileDialog.path, s.toString()); 120 }); 121 } 122 123 /// 124 @MenuItem("main/quit") 125 private static void quit() 126 { 127 ue.application.terminate(); 128 } 129 130 /// 131 @MenuItem("edit/undo") 132 public static void undo() 133 { 134 UECommands.undo(); 135 } 136 137 /// 138 version(UEProfiling) 139 @MenuItem("view/profiler") 140 private static void viewProfiler() 141 { 142 ue.application.openProfiler(); 143 } 144 145 /// 146 @MenuItem("view/hirarchie") 147 private static void viewHirarchie() 148 { 149 import unecht.core.components.editor.editorGui; 150 UEEditorGUI.showHirarchie = !UEEditorGUI.showHirarchie; 151 } 152 153 /// 154 @MenuItem("view/debug") 155 private static void viewDebug() 156 { 157 import unecht.core.components.editor.editorGui; 158 UEEditorGUI.showDebug = !UEEditorGUI.showDebug; 159 } 160 161 /// 162 @MenuItem("entity/add entity") 163 private static void addEmptyEntity() 164 { 165 UEEntity.create("new entity",EditorRootComponent.currentEntity?EditorRootComponent.currentEntity.sceneNode:null); 166 } 167 168 /// 169 @MenuItem("entity/clone entity", &entitySelected) 170 private static void cloneEntity() 171 { 172 import unecht.core.assetDatabase:UEAssetDatabase; 173 174 assert(EditorRootComponent.currentEntity); 175 176 UESerializer s; 177 s.externals = UEAssetDatabase.getAllIds(); 178 EditorRootComponent.currentEntity.sceneNode.serialize(s); 179 180 UEDeserializer d = UEDeserializer(s.toString); 181 foreach(asset; UEAssetDatabase.assets) 182 { 183 d.addExternalObj(asset.obj); 184 } 185 186 auto node = d.deserializeFirst!UESceneNode; 187 d.createNewIds(); 188 189 node.parent = EditorRootComponent.currentEntity.sceneNode.parent; 190 node.entity.name = node.entity.name~'_'; 191 node.onCreate(); 192 193 EditorRootComponent.selectEntity(node.entity); 194 } 195 196 /// 197 @MenuItem("entity/save entity", &entitySelected) 198 private static void saveEntity() 199 { 200 assert(EditorRootComponent.currentEntity); 201 202 UESerializer s; 203 EditorRootComponent.currentEntity.sceneNode.serialize(s); 204 saveToFile("assets/dummy.entity", s.toString()); 205 } 206 207 /// 208 @MenuItem("entity/delete Entity", &entitySelected) 209 public static void removeCurrentEntity() 210 { 211 UECommands.execute(new UECmdDelete()); 212 } 213 }