From 88f2cb7e5f0d1151980263844f97f4e52a2370a6 Mon Sep 17 00:00:00 2001 From: VDm Date: Sun, 10 Aug 2025 23:49:54 +0400 Subject: [PATCH] feat(ui): implement CSimpleFrame::LoadXML_Attributes --- src/gameui/CGTooltip.hpp | 2 +- src/gameui/GameScriptFunctions.cpp | 2 + .../scripts/GameScriptFunctionsPartyInfo.cpp | 8 ++- .../scripts/GameScriptFunctionsRaidInfo.cpp | 8 ++- src/ui/CSimpleButtonScript.cpp | 13 +++- src/ui/CSimpleFrame.cpp | 65 ++++++++++++++++++- src/ui/CSimpleFrame.hpp | 7 ++ src/ui/CSimpleStatusBar.cpp | 20 ++++++ src/ui/CSimpleStatusBar.hpp | 5 ++ 9 files changed, 123 insertions(+), 7 deletions(-) diff --git a/src/gameui/CGTooltip.hpp b/src/gameui/CGTooltip.hpp index 4c175da..dd64fca 100644 --- a/src/gameui/CGTooltip.hpp +++ b/src/gameui/CGTooltip.hpp @@ -24,7 +24,7 @@ class CGTooltip : public CSimpleFrame { virtual int32_t GetScriptMetaTable(); virtual ScriptIx* GetScriptByName(const char* name, ScriptData& data); - // Members + // Member variables ScriptIx m_onTooltipSetDefaultAnchor; ScriptIx m_onTooltipCleared; ScriptIx m_onTooltipAddMoney; diff --git a/src/gameui/GameScriptFunctions.cpp b/src/gameui/GameScriptFunctions.cpp index c674e1a..2480b7f 100644 --- a/src/gameui/GameScriptFunctions.cpp +++ b/src/gameui/GameScriptFunctions.cpp @@ -8,6 +8,7 @@ #include "gameui/CGTabardModelFrame.hpp" #include "gameui/CGQuestPOIFrame.hpp" #include "console/Console.hpp" +#include "gx/CGVideoOptions.hpp" #include "ui/FrameXML.hpp" #include "ui/FrameScript.hpp" #include "util/Lua.hpp" @@ -1690,6 +1691,7 @@ void LoadScriptFunctions() { GlyphInfoRegisterScriptFunctions(); AchievementInfoRegisterScriptFunctions(); CurrencyTypesRegisterScriptFunctions(); + CGVideoOptions::RegisterScriptFunctions(); EquipmentManagerRegisterScriptFunctions(); GMTicketInfoRegisterScriptFunctions(); BattlenetUIRegisterScriptFunctions(); diff --git a/src/gameui/scripts/GameScriptFunctionsPartyInfo.cpp b/src/gameui/scripts/GameScriptFunctionsPartyInfo.cpp index 1a7f8fe..0c33c4f 100644 --- a/src/gameui/scripts/GameScriptFunctionsPartyInfo.cpp +++ b/src/gameui/scripts/GameScriptFunctionsPartyInfo.cpp @@ -5,11 +5,15 @@ static int32_t Script_GetNumPartyMembers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetRealNumPartyMembers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetPartyMember(lua_State* L) { diff --git a/src/gameui/scripts/GameScriptFunctionsRaidInfo.cpp b/src/gameui/scripts/GameScriptFunctionsRaidInfo.cpp index d69ebda..ff27784 100644 --- a/src/gameui/scripts/GameScriptFunctionsRaidInfo.cpp +++ b/src/gameui/scripts/GameScriptFunctionsRaidInfo.cpp @@ -5,11 +5,15 @@ static int32_t Script_GetNumRaidMembers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetRealNumRaidMembers(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + // TODO + lua_pushnumber(L, 0.0); + return 1; } static int32_t Script_GetRaidRosterInfo(lua_State* L) { diff --git a/src/ui/CSimpleButtonScript.cpp b/src/ui/CSimpleButtonScript.cpp index 46a2420..8010475 100644 --- a/src/ui/CSimpleButtonScript.cpp +++ b/src/ui/CSimpleButtonScript.cpp @@ -128,7 +128,18 @@ int32_t CSimpleButton_SetFontString(lua_State* L) { } int32_t CSimpleButton_GetFontString(lua_State* L) { - WHOA_UNIMPLEMENTED(0); + auto type = CSimpleButton::GetObjectType(); + auto button = static_cast(FrameScript_GetObjectThis(L, type)); + auto fontString = button->m_text; + if (fontString) { + if (!fontString->lua_registered) { + fontString->RegisterScriptObject(nullptr); + } + lua_rawgeti(L, LUA_REGISTRYINDEX, fontString->lua_objectRef); + } else { + lua_pushnil(L); + } + return 1; } int32_t CSimpleButton_SetText(lua_State* L) { diff --git a/src/ui/CSimpleFrame.cpp b/src/ui/CSimpleFrame.cpp index e610bca..1441a58 100644 --- a/src/ui/CSimpleFrame.cpp +++ b/src/ui/CSimpleFrame.cpp @@ -700,7 +700,70 @@ int32_t CSimpleFrame::HideThis() { } void CSimpleFrame::LoadXML_Attributes(XMLNode* node, CStatus* status) { - // TODO + auto L = FrameScript_GetContext(); + + auto child = node->m_child; + while (child) { + auto childName = child->m_name.GetString(); + if (SStrCmpI(childName, "Attribute", STORM_MAX_STR)) { + const char* frameName = this->GetName(); + if (!frameName) { + frameName = ""; + } + status->Add(STATUS_WARNING, "Frame %s: Unknown attributes element %s", frameName, childName); + child = child->m_next; + continue; + } + + auto name = child->GetAttributeByName("name"); + if (!name) { + const char* frameName = this->GetName(); + if (!frameName) { + frameName = ""; + } + status->Add(STATUS_WARNING, "Frame %s: unnamed attribute element", frameName); + child = child->m_next; + continue; + } + + auto type = child->GetAttributeByName("type"); + if (!type) { + type = "string"; + } + + auto value = child->GetAttributeByName("value"); + if (!value || !SStrCmpI(value, "nil", STORM_MAX_STR)) { + const char* frameName = this->GetName(); + if (!frameName) { + frameName = ""; + } + status->Add(STATUS_WARNING, "Frame %s: attribute element named %s missing value", frameName, name); + child = child->m_next; + continue; + } + + if (!SStrCmpI(type, "nil", STORM_MAX_STR)) { + lua_pushnil(L); + } else if (!SStrCmpI(type, "boolean", STORM_MAX_STR)) { + lua_pushboolean(L, StringToBOOL(value)); + } else if (!SStrCmpI(type, "number", STORM_MAX_STR)) { + lua_pushnumber(L, SStrToFloat(value)); + } else { + lua_pushstring(L, value); + } + + auto attribute = this->m_attributes.Ptr(name); + if (attribute) { + luaL_unref(L, LUA_REGISTRYINDEX, attribute->luaRef); + } else { + attribute = this->m_attributes.New(name, 0, 0); + } + + // TODO: LUA Tainted Logic + attribute->luaRef = luaL_ref(L, LUA_REGISTRYINDEX); + + child = child->m_next; + } } void CSimpleFrame::LoadXML_Backdrop(XMLNode* node, CStatus* status) { diff --git a/src/ui/CSimpleFrame.hpp b/src/ui/CSimpleFrame.hpp index 40abe7d..a477e37 100644 --- a/src/ui/CSimpleFrame.hpp +++ b/src/ui/CSimpleFrame.hpp @@ -7,6 +7,7 @@ #include "ui/Types.hpp" #include #include +#include class CBackdropGenerator; class CCharEvent; @@ -16,6 +17,11 @@ class CSimpleTitleRegion; class CSimpleTop; struct lua_State; +class FRAMEATTR : public TSHashObject { + public: + int32_t luaRef; +}; + class CSimpleFrame : public CScriptRegion { public: // Static members @@ -79,6 +85,7 @@ class CSimpleFrame : public CScriptRegion { TSLink m_framesLink; TSLink m_destroyedLink; TSLink m_strataLink; + TSHashTable m_attributes; // Virtual member functions virtual ~CSimpleFrame(); diff --git a/src/ui/CSimpleStatusBar.cpp b/src/ui/CSimpleStatusBar.cpp index 24aba74..b07e28d 100644 --- a/src/ui/CSimpleStatusBar.cpp +++ b/src/ui/CSimpleStatusBar.cpp @@ -37,3 +37,23 @@ bool CSimpleStatusBar::IsA(int32_t type) { int32_t CSimpleStatusBar::GetScriptMetaTable() { return CSimpleStatusBar::s_metatable; } + +FrameScript_Object::ScriptIx* CSimpleStatusBar::GetScriptByName(const char* name, ScriptData& data) { + auto parentScript = CSimpleFrame::GetScriptByName(name, data); + + if (parentScript) { + return parentScript; + } + + if (!SStrCmpI(name, "OnValueChanged", STORM_MAX_STR)) { + data.wrapper = "return function(self,value) %s end"; + return &this->m_onValueChanged; + } + + if (!SStrCmpI(name, "OnMinMaxChanged", STORM_MAX_STR)) { + data.wrapper = "return function(self,min,max) %s end"; + return &this->m_onMinMaxChanged; + } + + return nullptr; +} diff --git a/src/ui/CSimpleStatusBar.hpp b/src/ui/CSimpleStatusBar.hpp index 6328186..e7973b3 100644 --- a/src/ui/CSimpleStatusBar.hpp +++ b/src/ui/CSimpleStatusBar.hpp @@ -20,6 +20,11 @@ class CSimpleStatusBar : public CSimpleFrame { // Virtual member functions virtual bool IsA(int32_t type); virtual int32_t GetScriptMetaTable(); + virtual ScriptIx* GetScriptByName(const char* name, ScriptData& data); + + // Member variables + ScriptIx m_onValueChanged; + ScriptIx m_onMinMaxChanged; }; #endif