Started to expose DOM to C# API with support for custom nodes. Currently crash when doing FindNodeByID<T>
This commit is contained in:
123
Nuake/src/Scripting/NetModules/UINetAPI.cpp
Normal file
123
Nuake/src/Scripting/NetModules/UINetAPI.cpp
Normal file
@@ -0,0 +1,123 @@
|
||||
#include "UINetAPI.h"
|
||||
#include "src/Core/Core.h"
|
||||
#include <src/Resource/ResourceManager.h>
|
||||
#include <src/Resource/UI.h>
|
||||
#include "src/Resource/UUID.h"
|
||||
#include "src/UI/Nodes/Canvas.h"
|
||||
#include "src/UI/Nodes/Text.h"
|
||||
|
||||
#include <Coral/String.hpp>
|
||||
|
||||
#include <iostream>
|
||||
|
||||
|
||||
using namespace Nuake;
|
||||
|
||||
UUID UUIDFromString(const std::string& input)
|
||||
{
|
||||
return std::stoull(input);
|
||||
}
|
||||
|
||||
uint64_t FindChildByIDIcall(const Coral::String& canvasUUID, const Coral::String& id, const Coral::String& id2)
|
||||
{
|
||||
if (!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID)))
|
||||
{
|
||||
Logger::Log("Error finding child, canvas is not loaded.", ".net/ui", CRITICAL);
|
||||
return UUID(0);
|
||||
}
|
||||
|
||||
Ref<UIResource> uiResource = ResourceManager::GetResource<UIResource>(UUIDFromString(canvasUUID));
|
||||
Ref<Canvas> canvas = uiResource->GetCanvas();
|
||||
if(Ref<Node> searchNode = canvas->GetNodeByUUID(UUIDFromString(id));
|
||||
searchNode != nullptr)
|
||||
{
|
||||
Ref<Node> foundNode;
|
||||
if (foundNode->FindChildByID(id2, foundNode))
|
||||
{
|
||||
return foundNode->GetScriptingID();
|
||||
}
|
||||
}
|
||||
|
||||
return UUID(0);
|
||||
}
|
||||
|
||||
bool HasNativeInstanceICall(const Coral::String& canvasUUID, const Coral::String& nodeUUID, const Coral::String& nodeUUID2)
|
||||
{
|
||||
if (!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID)))
|
||||
{
|
||||
Logger::Log("Error finding child, canvas is not loaded." + std::string(canvasUUID), ".net/ui", CRITICAL);
|
||||
return UUID(0);
|
||||
}
|
||||
|
||||
Ref<UIResource> uiResource = ResourceManager::GetResource<UIResource>(UUIDFromString(canvasUUID));
|
||||
Ref<Canvas> canvas = uiResource->GetCanvas();
|
||||
if (Ref<Node> node = canvas->GetNodeByUUID(UUIDFromString(nodeUUID));
|
||||
node != nullptr)
|
||||
{
|
||||
if (ScriptingEngineNet::Get().HasCustomWidgetInstance(UUIDFromString(canvasUUID), UUIDFromString(nodeUUID)))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
Coral::ManagedObject GetNativeInstanceNodeICall(const Coral::String& canvasUUID, const Coral::String& nodeUUID)
|
||||
{
|
||||
if (!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID)))
|
||||
{
|
||||
Logger::Log("Error getting native instance of UI node, canvas is not loaded.", ".net/ui", CRITICAL);
|
||||
return Coral::ManagedObject();
|
||||
}
|
||||
|
||||
Ref<UIResource> uiResource = ResourceManager::GetResource<UIResource>(UUIDFromString(canvasUUID));
|
||||
Ref<Canvas> canvas = uiResource->GetCanvas();
|
||||
if(ScriptingEngineNet::Get().HasCustomWidgetInstance(UUIDFromString(canvasUUID), UUIDFromString(nodeUUID)))
|
||||
{
|
||||
return ScriptingEngineNet::Get().GetCustomWidgetInstance(UUIDFromString(canvasUUID), UUIDFromString(nodeUUID));
|
||||
}
|
||||
|
||||
Logger::Log("Error getting native instance of UI node, custom widget doesnt have an instance", ".net/ui", CRITICAL);
|
||||
return Coral::ManagedObject();
|
||||
}
|
||||
|
||||
Coral::String GetTextNodeTextICall(const Coral::String& canvasUUID, const Coral::String& nodeUUID)
|
||||
{
|
||||
if(!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID)))
|
||||
{
|
||||
Logger::Log("Error getting native instance of UI node, canvas is not loaded.", ".net/ui", CRITICAL);
|
||||
return Coral::String::New("");
|
||||
}
|
||||
|
||||
Ref<UIResource> uiResource = ResourceManager::GetResource<UIResource>(UUIDFromString(canvasUUID));
|
||||
Ref<Canvas> canvas = uiResource->GetCanvas();
|
||||
Ref<Text> textNode = std::static_pointer_cast<NuakeUI::Text>(canvas->GetNodeByUUID(UUIDFromString(nodeUUID)));
|
||||
return Coral::String::New(textNode->GetText());
|
||||
}
|
||||
|
||||
void SetTextNodeTextICall(const Coral::String& canvasUUID, const Coral::String& nodeUUID, Coral::String newText)
|
||||
{
|
||||
if (!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID)))
|
||||
{
|
||||
Logger::Log("Error getting native instance of UI node, canvas is not loaded.", ".net/ui", CRITICAL);
|
||||
return;
|
||||
}
|
||||
|
||||
Ref<UIResource> uiResource = ResourceManager::GetResource<UIResource>(UUIDFromString(canvasUUID));
|
||||
Ref<Canvas> canvas = uiResource->GetCanvas();
|
||||
Ref<Text> textNode = std::static_pointer_cast<NuakeUI::Text>(canvas->GetNodeByUUID(UUIDFromString(nodeUUID)));
|
||||
textNode->SetText(newText);
|
||||
}
|
||||
|
||||
void UINetAPI::RegisterMethods()
|
||||
{
|
||||
RegisterMethod("Node.FindChildByIDICall", &FindChildByIDIcall);
|
||||
RegisterMethod("Node.HasNativeInstanceICall", &HasNativeInstanceICall);
|
||||
RegisterMethod("Node.GetNativeInstanceNodeICall", &GetNativeInstanceNodeICall);
|
||||
|
||||
RegisterMethod("TextNode.GetTextNodeTextICall", &GetTextNodeTextICall);
|
||||
RegisterMethod("TextNode.SetTextNodeTextICall", &SetTextNodeTextICall);
|
||||
}
|
||||
15
Nuake/src/Scripting/NetModules/UINetAPI.h
Normal file
15
Nuake/src/Scripting/NetModules/UINetAPI.h
Normal file
@@ -0,0 +1,15 @@
|
||||
#pragma once
|
||||
#include "NetAPIModule.h"
|
||||
|
||||
namespace Nuake
|
||||
{
|
||||
|
||||
class UINetAPI : public NetAPIModule
|
||||
{
|
||||
public:
|
||||
virtual const std::string GetModuleName() const override { return "UI"; }
|
||||
|
||||
virtual void RegisterMethods() override;
|
||||
|
||||
};
|
||||
}
|
||||
@@ -10,6 +10,7 @@
|
||||
#include "NetModules/EngineNetAPI.h"
|
||||
#include "NetModules/InputNetAPI.h"
|
||||
#include "NetModules/SceneNetAPI.h"
|
||||
#include "NetModules/UINetAPI.h"
|
||||
|
||||
#include <src/Scene/Components/BSPBrushComponent.h>
|
||||
|
||||
@@ -53,7 +54,8 @@ namespace Nuake
|
||||
{
|
||||
CreateRef<EngineNetAPI>(),
|
||||
CreateRef<InputNetAPI>(),
|
||||
CreateRef<SceneNetAPI>()
|
||||
CreateRef<SceneNetAPI>(),
|
||||
CreateRef<UINetAPI>()
|
||||
};
|
||||
|
||||
for (auto& m : modules)
|
||||
@@ -289,7 +291,7 @@ namespace Nuake
|
||||
return uiWidgets[widgetName];
|
||||
}
|
||||
|
||||
void ScriptingEngineNet::RegisterCustomWidgetInstance(const UUID& uuid, const std::string& widgetTypeName)
|
||||
void ScriptingEngineNet::RegisterCustomWidgetInstance(const UUID& canvasUUID, const UUID& nodeUUID, const std::string& widgetTypeName)
|
||||
{
|
||||
if (uiWidgets.find(widgetTypeName) == uiWidgets.end())
|
||||
{
|
||||
@@ -301,24 +303,25 @@ namespace Nuake
|
||||
}
|
||||
|
||||
auto classInstance = uiWidgets[widgetTypeName].coralType->CreateInstance();
|
||||
classInstance.SetPropertyValue("ID", uuid);
|
||||
widgetUUIDToManagedObjects[uuid] = classInstance;
|
||||
classInstance.SetFieldValue("CanvasUUID", Coral::String::New(std::to_string(canvasUUID)));
|
||||
classInstance.SetFieldValue("UUID", Coral::String::New(std::to_string(nodeUUID)));
|
||||
widgetUUIDToManagedObjects[std::make_pair(canvasUUID, nodeUUID)] = classInstance;
|
||||
}
|
||||
|
||||
bool ScriptingEngineNet::HasCustomWidgetInstance(const UUID& uuid)
|
||||
bool ScriptingEngineNet::HasCustomWidgetInstance(const UUID& canvasUUID, const UUID& uuid)
|
||||
{
|
||||
return widgetUUIDToManagedObjects.contains(uuid);
|
||||
return widgetUUIDToManagedObjects.contains(std::make_pair(canvasUUID, uuid));
|
||||
}
|
||||
|
||||
Coral::ManagedObject ScriptingEngineNet::GetCustomWidgetInstance(const UUID& uuid)
|
||||
Coral::ManagedObject ScriptingEngineNet::GetCustomWidgetInstance(const UUID& canvasUUID, const UUID& uuid)
|
||||
{
|
||||
if (!HasCustomWidgetInstance(uuid))
|
||||
if (!HasCustomWidgetInstance(canvasUUID, uuid))
|
||||
{
|
||||
Logger::Log("Failed to get custom widget .Net script instance, doesn't exist", ".net", CRITICAL);
|
||||
return Coral::ManagedObject();
|
||||
}
|
||||
|
||||
return widgetUUIDToManagedObjects[uuid];
|
||||
return widgetUUIDToManagedObjects[std::make_pair(canvasUUID, uuid)];
|
||||
}
|
||||
|
||||
std::vector<CompilationError> ScriptingEngineNet::BuildProjectAssembly(Ref<Project> project)
|
||||
|
||||
@@ -102,9 +102,9 @@ namespace Nuake
|
||||
|
||||
bool HasUIWidget(const std::string& widgetName);
|
||||
UIWidgetObject& GetUIWidget(const std::string& widgetName);
|
||||
void RegisterCustomWidgetInstance(const UUID& uuid, const std::string& widgetTypeName);
|
||||
bool HasCustomWidgetInstance(const UUID& uuid);
|
||||
Coral::ManagedObject GetCustomWidgetInstance(const UUID& uuid);
|
||||
void RegisterCustomWidgetInstance(const UUID& canvasUUID, const UUID& nodeUUID, const std::string& widgetTypeName);
|
||||
bool HasCustomWidgetInstance(const UUID& canvasUUID, const UUID& uuid);
|
||||
Coral::ManagedObject GetCustomWidgetInstance(const UUID& canvasUUID, const UUID& uuid);
|
||||
|
||||
std::unordered_map<std::string, NetGameScriptObject> GetBrushEntities() const { return brushEntityTypes; }
|
||||
std::unordered_map<std::string, NetGameScriptObject> GetPointEntities() const { return pointEntityTypes; }
|
||||
@@ -139,7 +139,8 @@ namespace Nuake
|
||||
std::unordered_map<std::string, UIWidgetObject> uiWidgets;
|
||||
|
||||
std::unordered_map<uint32_t, Coral::ManagedObject> entityToManagedObjects;
|
||||
std::unordered_map<UUID, Coral::ManagedObject> widgetUUIDToManagedObjects;
|
||||
std::map<std::pair<UUID, UUID>, Coral::ManagedObject> widgetUUIDToManagedObjects;
|
||||
|
||||
ScriptingEngineNet();
|
||||
~ScriptingEngineNet();
|
||||
|
||||
|
||||
Reference in New Issue
Block a user