mirror of
https://github.com/thunderbrewhq/thunderbrew
synced 2025-12-12 03:02:30 +00:00
feat(ui): implement CSimpleCheckbox methods to support textures
This commit is contained in:
parent
e7434860ff
commit
3fb86ab12e
3 changed files with 205 additions and 7 deletions
|
|
@ -1,10 +1,15 @@
|
||||||
#include "ui/CSimpleCheckbox.hpp"
|
#include "ui/CSimpleCheckbox.hpp"
|
||||||
#include "ui/CSimpleCheckboxScript.hpp"
|
#include "ui/CSimpleCheckboxScript.hpp"
|
||||||
#include "ui/CSimpleTexture.hpp"
|
#include "ui/CSimpleTexture.hpp"
|
||||||
|
#include "ui/LoadXML.hpp"
|
||||||
|
#include "util/StringTo.hpp"
|
||||||
|
#include <common/XML.hpp>
|
||||||
|
|
||||||
|
|
||||||
int32_t CSimpleCheckbox::s_metatable;
|
int32_t CSimpleCheckbox::s_metatable;
|
||||||
int32_t CSimpleCheckbox::s_objectType;
|
int32_t CSimpleCheckbox::s_objectType;
|
||||||
|
|
||||||
|
|
||||||
void CSimpleCheckbox::CreateScriptMetaTable() {
|
void CSimpleCheckbox::CreateScriptMetaTable() {
|
||||||
lua_State* L = FrameScript_GetContext();
|
lua_State* L = FrameScript_GetContext();
|
||||||
int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CSimpleCheckbox::RegisterScriptMethods);
|
int32_t ref = FrameScript_Object::CreateScriptMetaTable(L, &CSimpleCheckbox::RegisterScriptMethods);
|
||||||
|
|
@ -32,6 +37,27 @@ int32_t CSimpleCheckbox::GetScriptMetaTable() {
|
||||||
return CSimpleCheckbox::s_metatable;
|
return CSimpleCheckbox::s_metatable;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSimpleCheckbox::LoadXML(XMLNode* node, CStatus* status) {
|
||||||
|
CSimpleButton::LoadXML(node, status);
|
||||||
|
|
||||||
|
const char* checked = node->GetAttributeByName("checked");
|
||||||
|
|
||||||
|
if (checked && *checked) {
|
||||||
|
this->SetChecked(StringToBOOL(checked), 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (XMLNode* child = node->m_child; child; child = child->m_next) {
|
||||||
|
if (!SStrCmpI(child->GetName(), "CheckedTexture", STORM_MAX_STR)) {
|
||||||
|
CSimpleTexture* texture = LoadXML_Texture(child, this, status);
|
||||||
|
this->SetCheckedTexture(texture);
|
||||||
|
|
||||||
|
} else if (!SStrCmpI(child->GetName(), "DisabledCheckedTexture", STORM_MAX_STR)) {
|
||||||
|
CSimpleTexture* texture = LoadXML_Texture(child, this, status);
|
||||||
|
this->SetDisabledCheckedTexture(texture);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void CSimpleCheckbox::Enable(int32_t enabled) {
|
void CSimpleCheckbox::Enable(int32_t enabled) {
|
||||||
this->CSimpleButton::Enable(enabled);
|
this->CSimpleButton::Enable(enabled);
|
||||||
this->SetChecked(this->m_checked, 1);
|
this->SetChecked(this->m_checked, 1);
|
||||||
|
|
@ -66,6 +92,74 @@ int32_t CSimpleCheckbox::GetChecked() {
|
||||||
return this->m_checked;
|
return this->m_checked;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CSimpleCheckbox::SetCheckedTexture(const char* texFile) {
|
||||||
|
if (this->m_checkedTexture) {
|
||||||
|
this->m_checkedTexture->SetTexture(texFile, false, false, GxTex_Linear, ImageMode_UI);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: CDataAllocator__GetData(CSimpleTexture::s_allocator, 0, ".?AVCSimpleTexture@@", -2);
|
||||||
|
auto texture = NEW(CSimpleTexture, nullptr, DRAWLAYER_ARTWORK, 0);
|
||||||
|
if (texture->SetTexture(texFile, false, false, GxTex_Linear, ImageMode_UI)) {
|
||||||
|
texture->SetAllPoints(this, 1);
|
||||||
|
texture->SetBlendMode(GxBlend_Add);
|
||||||
|
this->SetCheckedTexture(texture);
|
||||||
|
} else if (texture) {
|
||||||
|
// TODO: FrameScript_Object::LookupScriptMethod(texture, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCheckbox::SetCheckedTexture(CSimpleTexture* texture) {
|
||||||
|
if (texture == this->m_checkedTexture) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this->m_checkedTexture) {
|
||||||
|
// TODO: FrameScript_Object::LookupScriptMethod(this->m_checkedTexture, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (texture) {
|
||||||
|
texture->SetFrame(this, 3, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->m_checkedTexture = texture;
|
||||||
|
this->SetChecked(this->m_checked, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCheckbox::SetDisabledCheckedTexture(const char* texFile) {
|
||||||
|
if (this->m_disabledTexture) {
|
||||||
|
this->m_disabledTexture->SetTexture(texFile, false, false, GxTex_Linear, ImageMode_UI);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// TODO: CDataAllocator__GetData(CSimpleTexture::s_allocator, 0, ".?AVCSimpleTexture@@", -2);
|
||||||
|
auto texture = NEW(CSimpleTexture, nullptr, DRAWLAYER_ARTWORK, 0);
|
||||||
|
if (texture->SetTexture(texFile, false, false, GxTex_Linear, ImageMode_UI)) {
|
||||||
|
texture->SetAllPoints(this, 1);
|
||||||
|
texture->SetBlendMode(GxBlend_Add);
|
||||||
|
this->SetDisabledCheckedTexture(texture);
|
||||||
|
} else if (texture) {
|
||||||
|
// TODO: FrameScript_Object::LookupScriptMethod(texture, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void CSimpleCheckbox::SetDisabledCheckedTexture(CSimpleTexture* texture) {
|
||||||
|
if (texture == this->m_disabledTexture) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this->m_disabledTexture) {
|
||||||
|
// TODO: FrameScript_Object::LookupScriptMethod(this->m_disabledTexture, 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (texture) {
|
||||||
|
texture->SetFrame(this, 3, 0);
|
||||||
|
}
|
||||||
|
|
||||||
|
this->m_disabledTexture = texture;
|
||||||
|
this->SetChecked(this->m_checked, 1);
|
||||||
|
}
|
||||||
|
|
||||||
void CSimpleCheckbox::OnClick(const char* btn, int32_t a3) {
|
void CSimpleCheckbox::OnClick(const char* btn, int32_t a3) {
|
||||||
this->SetChecked(this->m_checked == 0, 0);
|
this->SetChecked(this->m_checked == 0, 0);
|
||||||
this->CSimpleButton::OnClick(btn, a3);
|
this->CSimpleButton::OnClick(btn, a3);
|
||||||
|
|
|
||||||
|
|
@ -22,9 +22,14 @@ class CSimpleCheckbox : public CSimpleButton {
|
||||||
// Virtual member functions
|
// Virtual member functions
|
||||||
virtual bool IsA(int32_t type);
|
virtual bool IsA(int32_t type);
|
||||||
virtual int32_t GetScriptMetaTable();
|
virtual int32_t GetScriptMetaTable();
|
||||||
|
virtual void LoadXML(XMLNode* node, CStatus* status);
|
||||||
virtual void Enable(int32_t enabled);
|
virtual void Enable(int32_t enabled);
|
||||||
virtual void SetChecked(int32_t state, int32_t force);
|
virtual void SetChecked(int32_t state, int32_t force);
|
||||||
virtual int32_t GetChecked();
|
virtual int32_t GetChecked();
|
||||||
|
virtual void SetCheckedTexture(const char* texFile);
|
||||||
|
virtual void SetCheckedTexture(CSimpleTexture* texture);
|
||||||
|
virtual void SetDisabledCheckedTexture(const char* texFile);
|
||||||
|
virtual void SetDisabledCheckedTexture(CSimpleTexture* texture);
|
||||||
virtual void OnClick(const char* btn, int32_t a3);
|
virtual void OnClick(const char* btn, int32_t a3);
|
||||||
|
|
||||||
// Member functions
|
// Member functions
|
||||||
|
|
|
||||||
|
|
@ -1,5 +1,6 @@
|
||||||
#include "ui/CSimpleCheckboxScript.hpp"
|
#include "ui/CSimpleCheckboxScript.hpp"
|
||||||
#include "ui/CSimpleCheckbox.hpp"
|
#include "ui/CSimpleCheckbox.hpp"
|
||||||
|
#include "ui/CSimpleTexture.hpp"
|
||||||
#include "util/Lua.hpp"
|
#include "util/Lua.hpp"
|
||||||
#include "util/StringTo.hpp"
|
#include "util/StringTo.hpp"
|
||||||
#include "util/Unimplemented.hpp"
|
#include "util/Unimplemented.hpp"
|
||||||
|
|
@ -9,7 +10,7 @@ int32_t CSimpleCheckbox_SetChecked(lua_State* L) {
|
||||||
auto type = CSimpleCheckbox::GetObjectType();
|
auto type = CSimpleCheckbox::GetObjectType();
|
||||||
auto checkbox = static_cast<CSimpleCheckbox*>(FrameScript_GetObjectThis(L, type));
|
auto checkbox = static_cast<CSimpleCheckbox*>(FrameScript_GetObjectThis(L, type));
|
||||||
|
|
||||||
int32_t state = StringToBOOL(L, 2, 0);
|
int32_t state = StringToBOOL(L, 2, 1);
|
||||||
checkbox->SetChecked(state, 0);
|
checkbox->SetChecked(state, 0);
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
@ -18,25 +19,123 @@ int32_t CSimpleCheckbox_GetChecked(lua_State* L) {
|
||||||
auto type = CSimpleCheckbox::GetObjectType();
|
auto type = CSimpleCheckbox::GetObjectType();
|
||||||
auto checkbox = static_cast<CSimpleCheckbox*>(FrameScript_GetObjectThis(L, type));
|
auto checkbox = static_cast<CSimpleCheckbox*>(FrameScript_GetObjectThis(L, type));
|
||||||
|
|
||||||
lua_Number state = checkbox->GetChecked() ? 1.0 : 0.0;
|
if (checkbox->GetChecked()) {
|
||||||
lua_pushnumber(L, state);
|
lua_pushnumber(L, 1.0);
|
||||||
|
} else {
|
||||||
|
lua_pushnil(L);
|
||||||
|
}
|
||||||
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t CSimpleCheckbox_GetCheckedTexture(lua_State* L) {
|
int32_t CSimpleCheckbox_GetCheckedTexture(lua_State* L) {
|
||||||
WHOA_UNIMPLEMENTED(0);
|
auto type = CSimpleCheckbox::GetObjectType();
|
||||||
|
auto checkbox = static_cast<CSimpleCheckbox*>(FrameScript_GetObjectThis(L, type));
|
||||||
|
auto texture = checkbox->m_checkedTexture;
|
||||||
|
|
||||||
|
if (texture) {
|
||||||
|
if (!texture->lua_registered) {
|
||||||
|
texture->RegisterScriptObject(nullptr);
|
||||||
|
}
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, texture->lua_objectRef);
|
||||||
|
} else {
|
||||||
|
lua_pushnil(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t CSimpleCheckbox_SetCheckedTexture(lua_State* L) {
|
int32_t CSimpleCheckbox_SetCheckedTexture(lua_State* L) {
|
||||||
WHOA_UNIMPLEMENTED(0);
|
auto type = CSimpleCheckbox::GetObjectType();
|
||||||
|
auto checkbox = static_cast<CSimpleCheckbox*>(FrameScript_GetObjectThis(L, type));
|
||||||
|
auto name = checkbox->GetDisplayName();
|
||||||
|
|
||||||
|
if (lua_type(L, 2) == LUA_TTABLE) {
|
||||||
|
lua_rawgeti(L, 2, 0);
|
||||||
|
auto texture = static_cast<CSimpleTexture*>(lua_touserdata(L, -1));
|
||||||
|
lua_settop(L, -2);
|
||||||
|
|
||||||
|
if (!texture) {
|
||||||
|
luaL_error(L, "%s:SetCheckedTexture(): Couldn't find 'this' in texture", name);
|
||||||
|
} else {
|
||||||
|
auto textureType = CSimpleTexture::GetObjectType();
|
||||||
|
if (!texture->IsA(textureType)) {
|
||||||
|
luaL_error(L, "%s:SetCheckedTexture(): Wrong object type, expected texture", name);
|
||||||
|
texture = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkbox->SetCheckedTexture(texture);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lua_isstring(L, 2)) {
|
||||||
|
auto texFile = lua_tostring(L, 2);
|
||||||
|
checkbox->SetCheckedTexture(texFile);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lua_type(L, 2) != LUA_TNIL) {
|
||||||
|
luaL_error(L, "Usage: %s:SetCheckedTexture(texture or \"texture\" or nil)", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
checkbox->SetCheckedTexture(static_cast<CSimpleTexture*>(nullptr));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t CSimpleCheckbox_GetDisabledCheckedTexture(lua_State* L) {
|
int32_t CSimpleCheckbox_GetDisabledCheckedTexture(lua_State* L) {
|
||||||
WHOA_UNIMPLEMENTED(0);
|
auto type = CSimpleCheckbox::GetObjectType();
|
||||||
|
auto checkbox = static_cast<CSimpleCheckbox*>(FrameScript_GetObjectThis(L, type));
|
||||||
|
auto texture = checkbox->m_disabledTexture;
|
||||||
|
|
||||||
|
if (texture) {
|
||||||
|
if (!texture->lua_registered) {
|
||||||
|
texture->RegisterScriptObject(nullptr);
|
||||||
|
}
|
||||||
|
lua_rawgeti(L, LUA_REGISTRYINDEX, texture->lua_objectRef);
|
||||||
|
} else {
|
||||||
|
lua_pushnil(L);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
int32_t CSimpleCheckbox_SetDisabledCheckedTexture(lua_State* L) {
|
int32_t CSimpleCheckbox_SetDisabledCheckedTexture(lua_State* L) {
|
||||||
WHOA_UNIMPLEMENTED(0);
|
auto type = CSimpleCheckbox::GetObjectType();
|
||||||
|
auto checkbox = static_cast<CSimpleCheckbox*>(FrameScript_GetObjectThis(L, type));
|
||||||
|
auto name = checkbox->GetDisplayName();
|
||||||
|
|
||||||
|
if (lua_type(L, 2) == LUA_TTABLE) {
|
||||||
|
lua_rawgeti(L, 2, 0);
|
||||||
|
auto texture = static_cast<CSimpleTexture*>(lua_touserdata(L, -1));
|
||||||
|
lua_settop(L, -2);
|
||||||
|
|
||||||
|
if (!texture) {
|
||||||
|
luaL_error(L, "%s:SetDisabledCheckedTexture(): Couldn't find 'this' in texture", name);
|
||||||
|
} else {
|
||||||
|
auto textureType = CSimpleTexture::GetObjectType();
|
||||||
|
if (!texture->IsA(textureType)) {
|
||||||
|
luaL_error(L, "%s:SetDisabledCheckedTexture(): Wrong object type, expected texture", name);
|
||||||
|
texture = nullptr;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
checkbox->SetDisabledCheckedTexture(texture);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lua_isstring(L, 2)) {
|
||||||
|
auto texFile = lua_tostring(L, 2);
|
||||||
|
checkbox->SetDisabledCheckedTexture(texFile);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lua_type(L, 2) != LUA_TNIL) {
|
||||||
|
luaL_error(L, "Usage: %s:SetDisabledCheckedTexture(texture or \"texture\" or nil)", name);
|
||||||
|
}
|
||||||
|
|
||||||
|
checkbox->SetDisabledCheckedTexture(static_cast<CSimpleTexture*>(nullptr));
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
FrameScript_Method SimpleCheckboxMethods[NUM_SIMPLE_CHECKBOX_SCRIPT_METHODS] = {
|
FrameScript_Method SimpleCheckboxMethods[NUM_SIMPLE_CHECKBOX_SCRIPT_METHODS] = {
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue