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 }