isle/LEGO1/lego/legoomni/src/control/legocontrolmanager.cpp
Christian Semmler 51adf75b9b
(Refactor) Use more forward declarations (#881)
* Use more forward declarations

* Use more forward declarations

* Add more forward declarations

* Fix
2024-05-03 18:19:12 +02:00

203 lines
4.4 KiB
C++

#include "legocontrolmanager.h"
#include "legoeventnotificationparam.h"
#include "legovideomanager.h"
#include "misc.h"
#include "mxcontrolpresenter.h"
#include "mxdsaction.h"
#include "mxmisc.h"
#include "mxpresenter.h"
#include "mxticklemanager.h"
DECOMP_SIZE_ASSERT(LegoControlManager, 0x60)
DECOMP_SIZE_ASSERT(LegoControlManagerEvent, 0x2c)
// FUNCTION: LEGO1 0x10028520
LegoControlManager::LegoControlManager()
{
m_presenterList = NULL;
m_unk0x08 = 0;
m_unk0x0c = 0;
m_unk0x10 = FALSE;
m_unk0x14 = NULL;
TickleManager()->RegisterClient(this, 10);
}
// FUNCTION: LEGO1 0x10028d60
LegoControlManager::~LegoControlManager()
{
TickleManager()->UnregisterClient(this);
}
// FUNCTION: LEGO1 0x10028df0
void LegoControlManager::FUN_10028df0(MxPresenterList* p_presenterList)
{
m_presenterList = p_presenterList;
g_unk0x100f31b0 = -1;
g_unk0x100f31b4 = NULL;
}
// FUNCTION: LEGO1 0x10028e10
void LegoControlManager::Register(MxCore* p_listener)
{
m_notifyList.Append(p_listener);
}
// FUNCTION: LEGO1 0x10028ea0
void LegoControlManager::Unregister(MxCore* p_listener)
{
LegoNotifyListCursor cursor(&m_notifyList);
if (cursor.Find(p_listener)) {
cursor.Detach();
}
}
// FUNCTION: LEGO1 0x10029210
MxBool LegoControlManager::FUN_10029210(LegoEventNotificationParam& p_param, MxPresenter* p_presenter)
{
if (m_presenterList != NULL && m_presenterList->GetCount() != 0) {
m_unk0x14 = p_presenter;
if (p_param.GetType() == c_notificationButtonUp || p_param.GetType() == c_notificationButtonDown) {
m_event.SetType(p_param.GetType());
m_event.SetSender(p_param.GetSender());
m_event.SetModifier(p_param.GetModifier());
m_event.SetX(p_param.GetX());
m_event.SetY(p_param.GetY());
m_event.SetKey(p_param.GetKey());
if (p_param.GetType() == c_notificationButtonUp) {
if (m_unk0x10 == TRUE) {
m_unk0x10 = FALSE;
return TRUE;
}
if (g_unk0x100f31b0 != -1 && g_unk0x100f31b4 != NULL) {
if (m_unk0x08 == 2) {
return FUN_10029750();
}
else {
m_unk0x0c = 1;
return TRUE;
}
}
}
else if (p_param.GetType() == c_notificationButtonDown) {
if (m_unk0x0c == 1) {
m_unk0x10 = TRUE;
return TRUE;
}
else {
return FUN_10029630();
}
}
}
return FALSE;
}
else {
g_unk0x100f31b0 = -1;
g_unk0x100f31b4 = NULL;
return FALSE;
}
}
// FUNCTION: LEGO1 0x100292e0
void LegoControlManager::FUN_100292e0()
{
LegoNotifyListCursor cursor(&m_notifyList);
MxCore* target;
cursor.Head();
while (cursor.Current(target)) {
cursor.Next();
target->Notify(m_event);
}
}
// STUB: LEGO1 0x100293c0
void LegoControlManager::FUN_100293c0(undefined4, const char*, undefined2)
{
}
// FUNCTION: LEGO1 0x100294e0
MxControlPresenter* LegoControlManager::FUN_100294e0(MxS32 p_x, MxS32 p_y)
{
if (m_presenterList) {
MxPresenterListCursor cursor(m_presenterList);
MxPresenter* control;
MxVideoPresenter* presenter = (MxVideoPresenter*) VideoManager()->GetPresenterAt(p_x, p_y);
if (presenter) {
while (cursor.Next(control)) {
if (((MxControlPresenter*) control)->FUN_10044270(p_x, p_y, presenter)) {
return (MxControlPresenter*) control;
}
}
}
}
return NULL;
}
// FUNCTION: LEGO1 0x10029600
MxResult LegoControlManager::Tickle()
{
if (m_unk0x08 == 2 && m_unk0x0c == 1) {
m_event.SetType(c_notificationButtonUp);
FUN_10029750();
return 0;
}
else if (m_unk0x08 == 1) {
m_unk0x08 = 2;
}
return 0;
}
// FUNCTION: LEGO1 0x10029630
MxBool LegoControlManager::FUN_10029630()
{
MxPresenterListCursor cursor(m_presenterList);
MxPresenter* presenter;
while (cursor.Next(presenter)) {
if (((MxControlPresenter*) presenter)->FUN_10044480(&m_event, m_unk0x14)) {
g_unk0x100f31b0 = m_event.GetClickedObjectId();
g_unk0x100f31b4 = m_event.GetClickedAtom();
FUN_100292e0();
m_unk0x08 = 1;
return TRUE;
}
}
return FALSE;
}
// FUNCTION: LEGO1 0x10029750
MxBool LegoControlManager::FUN_10029750()
{
MxPresenterListCursor cursor(m_presenterList);
MxPresenter* presenter;
while (cursor.Next(presenter)) {
if (presenter->GetAction() && presenter->GetAction()->GetObjectId() == g_unk0x100f31b0 &&
presenter->GetAction()->GetAtomId().GetInternal() == g_unk0x100f31b4) {
if (((MxControlPresenter*) presenter)->FUN_10044480(&m_event, m_unk0x14)) {
FUN_100292e0();
}
g_unk0x100f31b0 = -1;
g_unk0x100f31b4 = NULL;
m_unk0x08 = 0;
m_unk0x0c = 0;
return TRUE;
}
}
g_unk0x100f31b0 = -1;
g_unk0x100f31b4 = NULL;
return FALSE;
}