mirror of
https://github.com/isledecomp/isle-portable.git
synced 2026-01-17 21:01:15 +00:00
227 lines
5.4 KiB
C++
227 lines
5.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(LegoControlManagerNotificationParam, 0x2c)
|
|
DECOMP_SIZE_ASSERT(LegoEventNotificationParam, 0x20)
|
|
|
|
// FUNCTION: LEGO1 0x10028520
|
|
LegoControlManager::LegoControlManager()
|
|
{
|
|
m_presenterList = NULL;
|
|
m_buttonDownState = e_idle;
|
|
m_handleUpNextTickle = 0;
|
|
m_secondButtonDown = FALSE;
|
|
m_handledPresenter = NULL;
|
|
TickleManager()->RegisterClient(this, 10);
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10028d60
|
|
LegoControlManager::~LegoControlManager()
|
|
{
|
|
TickleManager()->UnregisterClient(this);
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10028df0
|
|
void LegoControlManager::SetPresenterList(MxPresenterList* p_presenterList)
|
|
{
|
|
m_presenterList = p_presenterList;
|
|
g_clickedObjectId = -1;
|
|
g_clickedAtom = NULL;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10028e10
|
|
// FUNCTION: BETA10 0x1007c232
|
|
void LegoControlManager::Register(MxCore* p_listener)
|
|
{
|
|
m_notifyList.Append(p_listener);
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10028ea0
|
|
// FUNCTION: BETA10 0x1007c330
|
|
void LegoControlManager::Unregister(MxCore* p_listener)
|
|
{
|
|
LegoNotifyListCursor cursor(&m_notifyList);
|
|
if (cursor.Find(p_listener)) {
|
|
cursor.Detach();
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10029210
|
|
MxBool LegoControlManager::HandleButtonDown(LegoEventNotificationParam& p_param, MxPresenter* p_presenter)
|
|
{
|
|
if (m_presenterList != NULL && m_presenterList->GetNumElements() != 0) {
|
|
m_handledPresenter = p_presenter;
|
|
|
|
if (p_param.GetNotification() == c_notificationButtonUp ||
|
|
p_param.GetNotification() == c_notificationButtonDown) {
|
|
m_event.SetNotification(p_param.GetNotification());
|
|
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.GetNotification() == c_notificationButtonUp) {
|
|
if (m_secondButtonDown == TRUE) {
|
|
m_secondButtonDown = FALSE;
|
|
return TRUE;
|
|
}
|
|
|
|
if (g_clickedObjectId != -1 && g_clickedAtom != NULL) {
|
|
if (m_buttonDownState == e_tickled) {
|
|
return HandleButtonUp();
|
|
}
|
|
else {
|
|
m_handleUpNextTickle = 1;
|
|
return TRUE;
|
|
}
|
|
}
|
|
}
|
|
else if (p_param.GetNotification() == c_notificationButtonDown) {
|
|
if (m_handleUpNextTickle == 1) {
|
|
m_secondButtonDown = TRUE;
|
|
return TRUE;
|
|
}
|
|
else {
|
|
return HandleButtonDown();
|
|
}
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
else {
|
|
g_clickedObjectId = -1;
|
|
g_clickedAtom = NULL;
|
|
|
|
return FALSE;
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100292e0
|
|
void LegoControlManager::Notify()
|
|
{
|
|
LegoNotifyListCursor cursor(&m_notifyList);
|
|
MxCore* target;
|
|
|
|
cursor.Head();
|
|
while (cursor.Current(target)) {
|
|
cursor.Next();
|
|
target->Notify(m_event);
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100293c0
|
|
void LegoControlManager::UpdateEnabledChild(MxU32 p_objectId, const char* p_atom, MxS16 p_enabledChild)
|
|
{
|
|
if (m_presenterList) {
|
|
MxPresenterListCursor cursor(m_presenterList);
|
|
MxPresenter* control;
|
|
|
|
while (cursor.Next(control)) {
|
|
MxDSAction* action = control->GetAction();
|
|
|
|
if (action->GetObjectId() == p_objectId && action->GetAtomId().GetInternal() == p_atom) {
|
|
((MxControlPresenter*) control)->UpdateEnabledChild(p_enabledChild);
|
|
|
|
if (((MxControlPresenter*) control)->GetEnabledChild() == 0) {
|
|
g_clickedObjectId = -1;
|
|
g_clickedAtom = NULL;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x100294e0
|
|
// FUNCTION: BETA10 0x1007c92f
|
|
MxControlPresenter* LegoControlManager::GetControlAt(MxS32 p_x, MxS32 p_y)
|
|
{
|
|
if (m_presenterList) {
|
|
MxPresenterListCursor cursor(m_presenterList);
|
|
MxPresenter* control;
|
|
MxPresenter* presenter = VideoManager()->GetPresenterAt(p_x, p_y);
|
|
|
|
if (presenter) {
|
|
while (cursor.Next(control)) {
|
|
if (((MxControlPresenter*) control)->CheckButtonDown(p_x, p_y, presenter)) {
|
|
return (MxControlPresenter*) control;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return NULL;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10029600
|
|
MxResult LegoControlManager::Tickle()
|
|
{
|
|
if (m_buttonDownState == e_tickled && m_handleUpNextTickle == 1) {
|
|
m_event.SetNotification(c_notificationButtonUp);
|
|
HandleButtonUp();
|
|
return 0;
|
|
}
|
|
else if (m_buttonDownState == e_waitNextTickle) {
|
|
m_buttonDownState = e_tickled;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10029630
|
|
MxBool LegoControlManager::HandleButtonDown()
|
|
{
|
|
MxPresenterListCursor cursor(m_presenterList);
|
|
MxPresenter* presenter;
|
|
|
|
while (cursor.Next(presenter)) {
|
|
if (((MxControlPresenter*) presenter)->Notify(&m_event, m_handledPresenter)) {
|
|
g_clickedObjectId = m_event.m_clickedObjectId;
|
|
g_clickedAtom = m_event.GetClickedAtom();
|
|
Notify();
|
|
m_buttonDownState = e_waitNextTickle;
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
// FUNCTION: LEGO1 0x10029750
|
|
MxBool LegoControlManager::HandleButtonUp()
|
|
{
|
|
MxPresenterListCursor cursor(m_presenterList);
|
|
MxPresenter* presenter;
|
|
|
|
while (cursor.Next(presenter)) {
|
|
if (presenter->GetAction() && presenter->GetAction()->GetObjectId() == g_clickedObjectId &&
|
|
presenter->GetAction()->GetAtomId().GetInternal() == g_clickedAtom) {
|
|
if (((MxControlPresenter*) presenter)->Notify(&m_event, m_handledPresenter)) {
|
|
Notify();
|
|
}
|
|
|
|
g_clickedObjectId = -1;
|
|
g_clickedAtom = NULL;
|
|
|
|
m_buttonDownState = e_idle;
|
|
m_handleUpNextTickle = 0;
|
|
|
|
return TRUE;
|
|
}
|
|
}
|
|
|
|
g_clickedObjectId = -1;
|
|
g_clickedAtom = NULL;
|
|
return FALSE;
|
|
}
|