Browse Source

fixed saving and loading stuff

meemknight 2 years ago
parent
commit
d38834d131

+ 27 - 10
Pika/pluggins/pluggins/sushiViewer/sushiViewer.cpp

@@ -120,7 +120,10 @@ void SushiViewer::displaySushiParentElementImgui(::sushi::SushiParent &e, glm::v
 		{
 		{
 			if (pika::pikaImgui::greenButton("Add parent"))
 			if (pika::pikaImgui::greenButton("Add parent"))
 			{
 			{
-				img.elementId = sushiContext.addParent(e, "New Item", transform,
+				//img.elementId = sushiContext.addParent(e, "New Item", transform,
+				//	sushi::Background({0.5,0.2,0.2,1.f}));
+
+				sushiContext.addParent(e, "New Item", transform,
 					sushi::Background({0.5,0.2,0.2,1.f}));
 					sushi::Background({0.5,0.2,0.2,1.f}));
 			}
 			}
 
 
@@ -233,7 +236,6 @@ bool SushiViewer::update(pika::Input input, pika::WindowState windowState, Reque
 		sushiContext.deleteById(id);
 		sushiContext.deleteById(id);
 	}
 	}
 
 
-
 	sushi::SushiParent *selectedParent = 0;
 	sushi::SushiParent *selectedParent = 0;
 	sushi::SushiParent *parentOfParent = 0;
 	sushi::SushiParent *parentOfParent = 0;
 
 
@@ -261,8 +263,8 @@ bool SushiViewer::update(pika::Input input, pika::WindowState windowState, Reque
 				requestedInfo.consoleWrite("Couldn't open file");
 				requestedInfo.consoleWrite("Couldn't open file");
 			}
 			}
 		}
 		}
-
-		else if (ImGui::Button("Save"))
+		
+		if (ImGui::Button("Save"))
 		{
 		{
 
 
 			if (img.fileSelector.file[0] != 0)
 			if (img.fileSelector.file[0] != 0)
@@ -275,18 +277,15 @@ bool SushiViewer::update(pika::Input input, pika::WindowState windowState, Reque
 
 
 		}
 		}
 
 
-		ImGui::Text("Current selected id: %u", img.elementId);
-
+	#pragma region get selected parent
 		auto &c = sushiContext;
 		auto &c = sushiContext;
-		
-
 		if (img.elementId == 0)
 		if (img.elementId == 0)
 		{
 		{
 			img.elementId = c.root.id;
 			img.elementId = c.root.id;
 		}
 		}
-		
+
 		if (input.lMouse.held() && !img.dragging)
 		if (input.lMouse.held() && !img.dragging)
-		{		
+		{
 			visitSelect(sushiContext.root, img.elementId, selectedParent,
 			visitSelect(sushiContext.root, img.elementId, selectedParent,
 				{input.mouseX, input.mouseY});
 				{input.mouseX, input.mouseY});
 		}
 		}
@@ -294,7 +293,25 @@ bool SushiViewer::update(pika::Input input, pika::WindowState windowState, Reque
 		{
 		{
 			visit(sushiContext.root, img.elementId, selectedParent);
 			visit(sushiContext.root, img.elementId, selectedParent);
 		}
 		}
+	#pragma endregion
+
 
 
+		if (selectedParent != 0 && selectedParent != &sushiContext.root
+			&& ImGui::Button("Save from current children"))
+		{
+			if (img.fileSelector.file[0] != 0)
+			{
+				auto rez = sushiContext.saveFromParent(selectedParent);
+
+				requestedInfo.writeEntireFileBinary(img.fileSelector.file, rez.data.data(),
+					rez.data.size() * sizeof(rez.data[0]));
+			}
+		}
+
+
+		ImGui::Text("Current selected id: %u", img.elementId);
+
+	
 		//ImGui::InputInt("Element: ", &img.elementSelected);
 		//ImGui::InputInt("Element: ", &img.elementSelected);
 		//
 		//
 		//size_t elementsSize = c.root.allUiElements.size();
 		//size_t elementsSize = c.root.allUiElements.size();

+ 2 - 2
Pika/resources/logs.txt

@@ -1,2 +1,2 @@
-#2023-09-08 15:16:11: Created container: SushiViewer
-#2023-09-08 15:17:40: Destroyed continer: SushiViewer #1
+#2023-09-09 20:24:19: Created container: SushiViewer
+#2023-09-09 20:24:37: Destroyed continer: SushiViewer #1

BIN
Pika/resources/sushi/menuItem.sushi


BIN
Pika/resources/sushi/test2.sushi


+ 21 - 4
Pika/thirdparty/sushi/include/sushi/sushi.h

@@ -53,7 +53,10 @@ namespace sushi
 			const char *name,
 			const char *name,
 			Transform &transform,
 			Transform &transform,
 			Background &background,
 			Background &background,
-			unsigned int id);
+			unsigned int id,
+			SushiParent **outNewElement);
+
+		SushiParent *getParentByIdInternal(unsigned int id);
 	};
 	};
 
 
 	struct SushyBinaryFormat
 	struct SushyBinaryFormat
@@ -86,9 +89,9 @@ namespace sushi
 	//this is a sushi context. Holds all the windows and manages stuff
 	//this is a sushi context. Holds all the windows and manages stuff
 	struct SushyContext
 	struct SushyContext
 	{
 	{
-		void createBasicSchene(int baseId = 1, const char *name = "Main Parent");
+		void createBasicSchene(int baseId = 1, const char *name = "Root");
 
 
-		SushiParent root = SushiParent{"Main Parent", 1, sushi::Background(glm::vec4{0,0,0,1}, 
+		SushiParent root = SushiParent{"Root", 1, sushi::Background(glm::vec4{0,0,0,1}, 
 			gl2d::Texture{})};
 			gl2d::Texture{})};
 		unsigned int currentIdCounter = 2;
 		unsigned int currentIdCounter = 2;
 
 
@@ -100,7 +103,19 @@ namespace sushi
 			SushiParent &parent,
 			SushiParent &parent,
 			const char *name,
 			const char *name,
 			Transform &transform,
 			Transform &transform,
-			Background &background);
+			Background &background,
+			SushiParent **outNewElement = nullptr
+			);
+
+		unsigned int addParent(
+			unsigned int parent,
+			const char *name,
+			Transform &transform,
+			Background &background,
+			SushiParent **outNewElement = nullptr
+		);
+
+		SushiParent *getParentByid(unsigned int id);
 
 
 		bool deleteById(unsigned int id);
 		bool deleteById(unsigned int id);
 
 
@@ -122,6 +137,8 @@ namespace sushi
 
 
 		SushyBinaryFormat save();
 		SushyBinaryFormat save();
 
 
+		SushyBinaryFormat saveFromParent(SushiParent *parent);
+
 		bool load(SushyBinaryFormat &data);
 		bool load(SushyBinaryFormat &data);
 
 
 		void regenerateCache();
 		void regenerateCache();

+ 55 - 10
Pika/thirdparty/sushi/src/sushi.cpp

@@ -174,7 +174,8 @@ namespace sushi
 		SushiParent &parent,
 		SushiParent &parent,
 		const char *name,
 		const char *name,
 		Transform &transform,
 		Transform &transform,
-		Background &background)
+		Background &background,
+		SushiParent **outNewElement)
 	{
 	{
 
 
 		for (auto &p : parent.parents)
 		for (auto &p : parent.parents)
@@ -183,7 +184,7 @@ namespace sushi
 		}
 		}
 
 
 		unsigned int id = currentIdCounter++;
 		unsigned int id = currentIdCounter++;
-		parent.addParentInternal(name, transform, background, id);
+		parent.addParentInternal(name, transform, background, id, outNewElement);
 
 
 		for (auto &p : parent.parents)
 		for (auto &p : parent.parents)
 		{
 		{
@@ -193,6 +194,35 @@ namespace sushi
 		return id;
 		return id;
 	}
 	}
 
 
+	unsigned int SushyContext::addParent(
+		unsigned int parent,
+		const char *name,
+		Transform &transform,
+		Background &background,
+		SushiParent **outNewElement
+	)
+	{
+		return addParent(*getParentByid(parent), name, transform, background, outNewElement);
+	}
+
+	SushiParent *SushyContext::getParentByid(unsigned int id)
+	{
+		return root.getParentByIdInternal(id);
+	}
+
+	SushiParent *SushiParent::getParentByIdInternal(unsigned int id)
+	{
+		if (id == this->id) { return this; }
+
+		for (auto &p : parents)
+		{
+			auto rez = p.getParentByIdInternal(id);
+			if (rez) { return rez; }
+		}
+
+		return nullptr;
+	}
+
 	bool SushyContext::deleteById(unsigned int id)
 	bool SushyContext::deleteById(unsigned int id)
 	{
 	{
 		if (root.deleteByIdInternal(id))
 		if (root.deleteByIdInternal(id))
@@ -343,7 +373,8 @@ namespace sushi
 		const char *name,
 		const char *name,
 		Transform &transform,
 		Transform &transform,
 		Background &background,
 		Background &background,
-		unsigned int id)
+		unsigned int id,
+		SushiParent **outNewElement)
 	{
 	{
 		sushi::SushiParent newParent;
 		sushi::SushiParent newParent;
 		newParent.id = id;
 		newParent.id = id;
@@ -353,6 +384,11 @@ namespace sushi
 
 
 		parents.push_back(newParent);
 		parents.push_back(newParent);
 		orderedElementsIds.push_back(id);
 		orderedElementsIds.push_back(id);
+
+		if (outNewElement)
+		{
+			*outNewElement = &parents.back();
+		}
 	}
 	}
 
 
 	void traverseToAddToCache(SushyContext &c, SushiParent &p)
 	void traverseToAddToCache(SushyContext &c, SushiParent &p)
@@ -385,6 +421,15 @@ namespace sushi
 		return rez;
 		return rez;
 	}
 	}
 
 
+	SushyBinaryFormat SushyContext::saveFromParent(SushiParent *parent)
+	{
+		SushyBinaryFormat rez;
+
+		//todo print errors or something?
+		rez.traverseAddInternal(*parent);
+		return rez;
+	}
+
 	struct LoadeData
 	struct LoadeData
 	{
 	{
 		std::vector<SushiParent> parents;
 		std::vector<SushiParent> parents;
@@ -499,15 +544,13 @@ namespace sushi
 			root.orderedElementsIds = {};
 			root.orderedElementsIds = {};
 		}
 		}
 
 
-		SushiParent *parentToAddTo = &root;
-		
 
 
 		if (!loaded.parents.empty())
 		if (!loaded.parents.empty())
 		{
 		{
 			struct ParentPair
 			struct ParentPair
 			{
 			{
 				SushiParent *element = 0;
 				SushiParent *element = 0;
-				SushiParent *parentToAddTo = 0;
+				unsigned int parentToAddToId = 0;
 			};
 			};
 
 
 			std::vector<ParentPair> parentsToAdd;
 			std::vector<ParentPair> parentsToAdd;
@@ -523,12 +566,13 @@ namespace sushi
 					{
 					{
 						if (e.id == id)
 						if (e.id == id)
 						{
 						{
-							parentsToAdd.push_back({&e,&this->root});
+							parentsToAdd.push_back({&e,this->root.id});
 							found = true;
 							found = true;
 							break;
 							break;
 						}
 						}
 					}
 					}
 
 
+					//we need to find a match for all ids here or else the data is corrupted
 					if (!found) { *this = {}; return 0; }
 					if (!found) { *this = {}; return 0; }
 				}
 				}
 			}
 			}
@@ -570,6 +614,7 @@ namespace sushi
 						if (p.id == id)
 						if (p.id == id)
 						{
 						{
 							firstParent = &p;
 							firstParent = &p;
+							break;
 						}
 						}
 					}
 					}
 				}
 				}
@@ -579,7 +624,7 @@ namespace sushi
 					return 0;
 					return 0;
 				}
 				}
 
 
-				parentsToAdd.push_back({firstParent, parentToAddTo});
+				parentsToAdd.push_back({firstParent, root.id});
 			}
 			}
 		#pragma endregion
 		#pragma endregion
 
 
@@ -589,7 +634,7 @@ namespace sushi
 				auto currentP = *parentsToAdd.begin();
 				auto currentP = *parentsToAdd.begin();
 				parentsToAdd.erase(parentsToAdd.begin());
 				parentsToAdd.erase(parentsToAdd.begin());
 
 
-				addParent(*currentP.parentToAddTo, currentP.element->name, currentP.element->transform,
+				auto newParentAddedId = addParent(currentP.parentToAddToId, currentP.element->name, currentP.element->transform,
 					currentP.element->background);
 					currentP.element->background);
 
 
 				for (auto &id : currentP.element->orderedElementsIds)
 				for (auto &id : currentP.element->orderedElementsIds)
@@ -600,7 +645,7 @@ namespace sushi
 					{
 					{
 						if (e.id == id)
 						if (e.id == id)
 						{
 						{
-							parentsToAdd.push_back({&e,currentP.element});
+							parentsToAdd.push_back({&e, newParentAddedId});
 							found = true;
 							found = true;
 							break;
 							break;
 						}
 						}