thunderbrew/src/ui/CSimpleButtonScript.cpp
2023-01-02 13:17:18 -06:00

350 lines
11 KiB
C++

#include "ui/CSimpleButtonScript.hpp"
#include "gx/Coordinate.hpp"
#include "ui/CSimpleButton.hpp"
#include "ui/CSimpleFontString.hpp"
#include "ui/CSimpleTexture.hpp"
#include "util/Lua.hpp"
#include "util/StringTo.hpp"
#include "util/Unimplemented.hpp"
#include <cstdint>
int32_t CSimpleButton_SetStateTexture(lua_State* L, CSimpleButtonState state, const char* method) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
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:%s(): Couldn't find 'this' in texture", button->GetDisplayName(), method);
}
if (!texture->IsA(CSimpleTexture::GetObjectType())) {
luaL_error(L, "%s:%s(): Wrong object type, expected texture", button->GetDisplayName(), method);
}
button->SetStateTexture(state, texture);
} else if (lua_isstring(L, 2)) {
auto texFile = lua_tolstring(L, 2, nullptr);
button->SetStateTexture(state, texFile);
} else if (lua_type(L, 2) == LUA_TNIL) {
CSimpleTexture* texture = nullptr;
button->SetStateTexture(state, texture);
} else {
luaL_error(L, "Usage: %s:%s(texture or \"texture\" or nil)", button->GetDisplayName(), method);
}
return 0;
}
int32_t CSimpleButton_Enable(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
if (button->ProtectedFunctionsAllowed()) {
button->Enable(1);
} else {
// TODO
// - disallowed logic
}
return 0;
}
int32_t CSimpleButton_Disable(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
if (button->ProtectedFunctionsAllowed()) {
button->Enable(0);
} else {
// TODO
// - disallowed logic
}
return 0;
}
int32_t CSimpleButton_IsEnabled(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_GetButtonState(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetButtonState(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetNormalFontObject(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_GetNormalFontObject(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetDisabledFontObject(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_GetDisabledFontObject(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetHighlightFontObject(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_GetHighlightFontObject(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetFontString(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_GetFontString(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetText(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
const char* text = lua_tolstring(L, 2, 0);
button->SetText(text);
return 0;
}
int32_t CSimpleButton_SetFormattedText(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_GetText(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
const char* text = nullptr;
if (button->m_text && button->m_text->GetText() && *button->m_text->GetText()) {
text = button->m_text->GetText();
}
lua_pushstring(L, text);
return 1;
}
int32_t CSimpleButton_SetNormalTexture(lua_State* L) {
return CSimpleButton_SetStateTexture(L, BUTTONSTATE_NORMAL, "SetNormalTexture");
}
int32_t CSimpleButton_GetNormalTexture(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetPushedTexture(lua_State* L) {
return CSimpleButton_SetStateTexture(L, BUTTONSTATE_PUSHED, "SetPushedTexture");
}
int32_t CSimpleButton_GetPushedTexture(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetDisabledTexture(lua_State* L) {
return CSimpleButton_SetStateTexture(L, BUTTONSTATE_DISABLED, "SetDisabledTexture");
}
int32_t CSimpleButton_GetDisabledTexture(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetHighlightTexture(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
EGxBlend blendMode = GxBlend_Add;
if (lua_isstring(L, 3)) {
auto blendString = lua_tolstring(L, 3, nullptr);
StringToBlendMode(blendString, blendMode);
}
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:SetHighlightTexture(): Couldn't find 'this' in texture", button->GetDisplayName());
}
if (!texture->IsA(CSimpleTexture::GetObjectType())) {
luaL_error(L, "%s:SetHighlightTexture(): Wrong object type, expected texture", button->GetDisplayName());
}
button->SetHighlight(texture, blendMode);
} else if (lua_isstring(L, 2)) {
auto texFile = lua_tolstring(L, 2, nullptr);
button->SetHighlight(texFile, blendMode);
} else if (lua_type(L, 2) == LUA_TNIL) {
CSimpleTexture* texture = nullptr;
button->SetHighlight(texture, GxBlend_Add);
} else {
luaL_error(L, "Usage: %s:SetHighlightTexture(texture or \"texture\" or nil [, \"blendmode\")", button->GetDisplayName());
}
return 0;
}
int32_t CSimpleButton_GetHighlightTexture(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
auto texture = button->m_highlightTexture;
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 CSimpleButton_SetPushedTextOffset(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_GetPushedTextOffset(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_GetTextWidth(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
auto text = button->m_text;
float width = text ? text->GetWidth() : 0.0f;
float ddcWidth = CoordinateGetAspectCompensation() * 1024.0f * width;
float ndcWidth = DDCToNDCWidth(ddcWidth);
lua_pushnumber(L, ndcWidth);
return 1;
}
int32_t CSimpleButton_GetTextHeight(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_RegisterForClicks(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
uint64_t action = 0;
for (int32_t i = 2; lua_isstring(L, i); i++) {
auto actionStr = lua_tolstring(L, i, nullptr);
action |= StringToClickAction(actionStr);
}
button->SetClickAction(action);
return 0;
}
int32_t CSimpleButton_Click(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
auto inputButton = "LeftButton";
if (lua_isstring(L, 2)) {
inputButton = lua_tolstring(L, 2, nullptr);
}
auto v6 = StringToBOOL(L, 3, 0);
button->OnClick(inputButton, v6);
return 0;
}
int32_t CSimpleButton_LockHighlight(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
button->LockHighlight(1);
return 0;
}
int32_t CSimpleButton_UnlockHighlight(lua_State* L) {
auto type = CSimpleButton::GetObjectType();
auto button = static_cast<CSimpleButton*>(FrameScript_GetObjectThis(L, type));
button->LockHighlight(0);
return 0;
}
int32_t CSimpleButton_GetMotionScriptsWhileDisabled(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
int32_t CSimpleButton_SetMotionScriptsWhileDisabled(lua_State* L) {
WHOA_UNIMPLEMENTED();
}
FrameScript_Method SimpleButtonMethods[NUM_SIMPLE_BUTTON_SCRIPT_METHODS] = {
{ "Enable", &CSimpleButton_Enable },
{ "Disable", &CSimpleButton_Disable },
{ "IsEnabled", &CSimpleButton_IsEnabled },
{ "GetButtonState", &CSimpleButton_GetButtonState },
{ "SetButtonState", &CSimpleButton_SetButtonState },
{ "SetNormalFontObject", &CSimpleButton_SetNormalFontObject },
{ "GetNormalFontObject", &CSimpleButton_GetNormalFontObject },
{ "SetDisabledFontObject", &CSimpleButton_SetDisabledFontObject },
{ "GetDisabledFontObject", &CSimpleButton_GetDisabledFontObject },
{ "SetHighlightFontObject", &CSimpleButton_SetHighlightFontObject },
{ "GetHighlightFontObject", &CSimpleButton_GetHighlightFontObject },
{ "SetFontString", &CSimpleButton_SetFontString },
{ "GetFontString", &CSimpleButton_GetFontString },
{ "SetText", &CSimpleButton_SetText },
{ "SetFormattedText", &CSimpleButton_SetFormattedText },
{ "GetText", &CSimpleButton_GetText },
{ "SetNormalTexture", &CSimpleButton_SetNormalTexture },
{ "GetNormalTexture", &CSimpleButton_GetNormalTexture },
{ "SetPushedTexture", &CSimpleButton_SetPushedTexture },
{ "GetPushedTexture", &CSimpleButton_GetPushedTexture },
{ "SetDisabledTexture", &CSimpleButton_SetDisabledTexture },
{ "GetDisabledTexture", &CSimpleButton_GetDisabledTexture },
{ "SetHighlightTexture", &CSimpleButton_SetHighlightTexture },
{ "GetHighlightTexture", &CSimpleButton_GetHighlightTexture },
{ "SetPushedTextOffset", &CSimpleButton_SetPushedTextOffset },
{ "GetPushedTextOffset", &CSimpleButton_GetPushedTextOffset },
{ "GetTextWidth", &CSimpleButton_GetTextWidth },
{ "GetTextHeight", &CSimpleButton_GetTextHeight },
{ "RegisterForClicks", &CSimpleButton_RegisterForClicks },
{ "Click", &CSimpleButton_Click },
{ "LockHighlight", &CSimpleButton_LockHighlight },
{ "UnlockHighlight", &CSimpleButton_UnlockHighlight },
{ "GetMotionScriptsWhileDisabled", &CSimpleButton_GetMotionScriptsWhileDisabled },
{ "SetMotionScriptsWhileDisabled", &CSimpleButton_SetMotionScriptsWhileDisabled }
};