From f1be4f7cefca325975c337fbd3578baa0d4fc490 Mon Sep 17 00:00:00 2001 From: antopilo Date: Sat, 19 Oct 2024 23:23:26 -0400 Subject: [PATCH] Fixed memory leak + added visibility UI node C# endpoints + size --- Nuake/src/Scripting/NetModules/UINetAPI.cpp | 63 ++++++++++++++++++ Nuake/src/UI/Nodes/Canvas.cpp | 2 +- Nuake/src/Window.cpp | 2 +- NuakeNet/src/UI/UIComponent.cs | 74 +++++++++++++++++++++ 4 files changed, 139 insertions(+), 2 deletions(-) diff --git a/Nuake/src/Scripting/NetModules/UINetAPI.cpp b/Nuake/src/Scripting/NetModules/UINetAPI.cpp index ad321550..195ab534 100644 --- a/Nuake/src/Scripting/NetModules/UINetAPI.cpp +++ b/Nuake/src/Scripting/NetModules/UINetAPI.cpp @@ -84,6 +84,60 @@ Coral::ManagedObject GetNativeInstanceNodeICall(const Coral::String& canvasUUID, return Coral::ManagedObject(); } +Coral::Bool32 GetVisibilityICall(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); + } + + Ref uiResource = ResourceManager::GetResource(UUIDFromString(canvasUUID)); + Ref canvas = uiResource->GetCanvas(); + Ref node = std::static_pointer_cast(canvas->GetNodeByUUID(UUIDFromString(nodeUUID))); + return node->ComputedStyle.Visibility == VisibilityType::Show; +} + +void SetWidthPercentageICall(const Coral::String& canvasUUID, const Coral::String& nodeUUID, float percentage) +{ + if (!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID))) + { + Logger::Log("Error getting native instance of UI node, canvas is not loaded.", ".net/ui", CRITICAL); + } + + Ref uiResource = ResourceManager::GetResource(UUIDFromString(canvasUUID)); + Ref canvas = uiResource->GetCanvas(); + Ref node = std::static_pointer_cast(canvas->GetNodeByUUID(UUIDFromString(nodeUUID))); + node->ComputedStyle.Width.type = LengthType::Percentage; + node->ComputedStyle.Width.value = percentage; +} + +void SetHeightPercentageICall(const Coral::String& canvasUUID, const Coral::String& nodeUUID, float percentage) +{ + if (!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID))) + { + Logger::Log("Error getting native instance of UI node, canvas is not loaded.", ".net/ui", CRITICAL); + } + + Ref uiResource = ResourceManager::GetResource(UUIDFromString(canvasUUID)); + Ref canvas = uiResource->GetCanvas(); + Ref node = std::static_pointer_cast(canvas->GetNodeByUUID(UUIDFromString(nodeUUID))); + node->ComputedStyle.Height.type = LengthType::Percentage; + node->ComputedStyle.Height.value = percentage; +} + +void SetVisibilityICall(const Coral::String& canvasUUID, const Coral::String& nodeUUID, Coral::Bool32 visible) +{ + if (!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID))) + { + Logger::Log("Error getting native instance of UI node, canvas is not loaded.", ".net/ui", CRITICAL); + } + + Ref uiResource = ResourceManager::GetResource(UUIDFromString(canvasUUID)); + Ref canvas = uiResource->GetCanvas(); + Ref node = std::static_pointer_cast(canvas->GetNodeByUUID(UUIDFromString(nodeUUID))); + node->ComputedStyle.Visibility = visible ? VisibilityType::Show : VisibilityType::Hidden; +} + Coral::String GetTextNodeTextICall(const Coral::String& canvasUUID, const Coral::String& nodeUUID) { if(!ResourceManager::IsResourceLoaded(UUIDFromString(canvasUUID))) @@ -118,6 +172,15 @@ void UINetAPI::RegisterMethods() RegisterMethod("Node.HasNativeInstanceICall", &HasNativeInstanceICall); RegisterMethod("Node.GetNativeInstanceNodeICall", &GetNativeInstanceNodeICall); + // Styling + RegisterMethod("Node.GetVisibilityICall", &GetVisibilityICall); + RegisterMethod("Node.SetVisibilityICall", &SetVisibilityICall); + + //RegisterMethod("Node.GetWidthPercentageICall", &GetWidthPercentageICall); + RegisterMethod("Node.SetWidthPercentageICall", &SetWidthPercentageICall); + // RegisterMethod("Node.GetHeightPercentageICall", &GetHeightPercentageICall); + RegisterMethod("Node.SetHeightPercentageICall", &SetHeightPercentageICall); + RegisterMethod("TextNode.GetTextNodeTextICall", &GetTextNodeTextICall); RegisterMethod("TextNode.SetTextNodeTextICall", &SetTextNodeTextICall); } \ No newline at end of file diff --git a/Nuake/src/UI/Nodes/Canvas.cpp b/Nuake/src/UI/Nodes/Canvas.cpp index 960ce54a..e20bc45e 100644 --- a/Nuake/src/UI/Nodes/Canvas.cpp +++ b/Nuake/src/UI/Nodes/Canvas.cpp @@ -92,7 +92,7 @@ namespace NuakeUI { std::vector relationStyles; - auto allRules = mStyleSheet->Rules; + auto& allRules = mStyleSheet->Rules; for (auto& i : inheritedRules) { allRules.push_back(i); diff --git a/Nuake/src/Window.cpp b/Nuake/src/Window.cpp index 81b90c70..0f21aaa2 100644 --- a/Nuake/src/Window.cpp +++ b/Nuake/src/Window.cpp @@ -305,7 +305,7 @@ Ref Window::GetScene() bool Window::SetScene(Ref newScene) { - windowSetSceneDelegate.Broadcast(scene, newScene); + //windowSetSceneDelegate.Broadcast(scene, newScene); scene = newScene; diff --git a/NuakeNet/src/UI/UIComponent.cs b/NuakeNet/src/UI/UIComponent.cs index 8dcdb6cd..cf34572b 100644 --- a/NuakeNet/src/UI/UIComponent.cs +++ b/NuakeNet/src/UI/UIComponent.cs @@ -69,11 +69,25 @@ namespace Nuake.Net } } + public enum Visibility + { + Hidden, + Visible, + } + + public class Node { internal static unsafe delegate* FindChildByIDICall; internal static unsafe delegate* HasNativeInstanceICall; internal static unsafe delegate*> GetNativeInstanceNodeICall; + internal static unsafe delegate* SetVisibilityICall; + internal static unsafe delegate* GetVisibilityICall; + + internal static unsafe delegate* GetHeightPercentageICall; + internal static unsafe delegate* SetHeightPercentageICall; + internal static unsafe delegate* GetWidthPercentageICall; + internal static unsafe delegate* SetWidthPercentageICall; public string UUID; public string CanvasUUID; @@ -88,6 +102,66 @@ namespace Nuake.Net public string ID { get; set; } = ""; public List Classes { get; set; } = new(); + public float GetWidthPercentage() + { + unsafe + { + return GetHeightPercentageICall(CanvasUUID, UUID); + } + } + + public void SetWidthPercentage(float percentage) + { + unsafe + { + if (percentage < 0.0f) + { + throw new ArgumentException("Percentage has to be greater than 0."); + } + + SetWidthPercentageICall(CanvasUUID, UUID, percentage); + } + } + + public float GetHeightPercentage() + { + unsafe + { + return GetHeightPercentageICall(CanvasUUID, UUID); + } + } + + public void SetHeightPercentage(float percentage) + { + unsafe + { + if(percentage < 0.0f) + { + throw new ArgumentException("Percentage has to be greater than 0."); + } + + SetHeightPercentageICall(CanvasUUID, UUID, percentage); + } + } + + public Visibility Visibility + { + get + { + unsafe + { + return GetVisibilityICall(CanvasUUID, UUID) ? Visibility.Visible : Visibility.Hidden; + } + } + set + { + unsafe + { + SetVisibilityICall(CanvasUUID, UUID, value == Visibility.Visible); + } + } + } + /// /// Traverse the DOM starting from this node to find a child from a unique ID ///