void WidgetContainer::OnInputPointerPress(const EventInputPointer *ev) { ASSERT_NULL(ev); WidgetIterator it = vWidget.begin(); WidgetIterator end = vWidget.end(); f32 cX = ev->GetX(); f32 cY = ev->GetY(); BOOL found = FALSE; for (; it != end; ++it) { IWidget *w = (*it); ASSERT_NULL(w); bEventConsumed = FALSE; if (w->IsDisabled()) continue; if (!w->ContainsPoint(cX, cY)) continue; if (w->GetObjectType() == Seed::ObjectGuiWidgetContainer) { WidgetContainer *wc = reinterpret_cast<WidgetContainer *>(w); wc->OnInputPointerPress(ev); bEventConsumed = wc->IsEventConsumed(); if (bEventConsumed) break; } if (!(w->GetTrigger() & ev->GetPressed())) continue; u32 j = ev->GetJoystick(); //LOG("> PRESS [%d, %f, %f]", j, cX, cY); if (w->GetState() == Seed::WidgetStateDrag) { continue; } found = TRUE; const EventWidget newEvent(w, NULL, WidgetEventPressed, j, cX, cY, ev->GetPressed(), ev->GetHold(), ev->GetReleased()); LOG(">PRESSED_OVER [id: %d]", w->GetId()); // GetState eh o baseado em prioridade a partir de todos os inputs. if (w->GetState() != Seed::WidgetStatePressedOver && w->GetPlayerState(j) != Seed::WidgetStatePressedOver) { // muda apenas o estado interno do widget LOG("\tEstado WIDGET"); w->OnWidgetPress(&newEvent); } w->SetState(Seed::WidgetStatePressed); w->SetPlayerState(Seed::WidgetStatePressedOver, j); LOG("\tEstado PLAYER"); w->SendOnPress(&newEvent); LOG("\tEvento"); //if (newEvent.IsConsumed()) bEventConsumed = newEvent.IsConsumed(); if (bEventConsumed) break; } if (!found) // avoid call { // If no widget have collision, then we try distance based input; f32 maxDist = pConfiguration->GetInputDistanceRadius(); if (maxDist) { IWidget *nearest = this->FindNearestByRadius(maxDist, ev); if (nearest) { IWidget *w = nearest; if (w->GetObjectType() == Seed::ObjectGuiWidgetContainer) { WidgetContainer *wc = reinterpret_cast<WidgetContainer *>(w); wc->OnInputPointerPress(ev); bEventConsumed = wc->IsEventConsumed(); if (bEventConsumed) return; } u32 j = ev->GetJoystick(); const EventWidget newEvent(w, NULL, WidgetEventPressed, j, cX, cY, ev->GetPressed(), ev->GetHold(), ev->GetReleased()); LOG(">PRESSED_OVER [id: %d]", w->GetId()); // GetState eh o baseado em prioridade a partir de todos os inputs. if (w->GetState() != Seed::WidgetStatePressedOver && w->GetPlayerState(j) != Seed::WidgetStatePressedOver) { // muda apenas o estado interno do widget LOG("\tEstado WIDGET"); w->OnWidgetPress(&newEvent); } w->SetState(Seed::WidgetStatePressed); w->SetPlayerState(Seed::WidgetStatePressedOver, j); LOG("\tEstado PLAYER"); w->SendOnPress(&newEvent); LOG("\tEvento"); bEventConsumed = newEvent.IsConsumed(); if (bEventConsumed) return; } } } }
void WidgetContainer::OnInputPointerRelease(const EventInputPointer *ev) { ASSERT_NULL(ev); WidgetIterator it = vWidget.begin(); WidgetIterator end = vWidget.end(); for (; it != end; ++it) { IWidget *w = (*it); //BOOL consumed = FALSE; bEventConsumed = FALSE; ASSERT_NULL(w); if (w->IsDisabled()) continue; if (w->GetObjectType() == Seed::ObjectGuiWidgetContainer) { WidgetContainer *wc = reinterpret_cast<WidgetContainer *>(w); wc->OnInputPointerRelease(ev); bEventConsumed = wc->IsEventConsumed(); if (bEventConsumed) break; } //f32 cX = ev->GetX(); //f32 cY = ev->GetY(); u32 j = ev->GetJoystick(); if (!(w->GetTrigger() & ev->GetReleased())) continue; if (w->GetState() == Seed::WidgetStateDrag) { //LOG("> STOP DRAG [%d, %f, %f]", j, cX, cY); bEventConsumed = this->DoDrop(ev, w); } else { if (w->GetPlayerState(j) == Seed::WidgetStatePressedOver) { //LOG("> RELEASE [%d, %f, %f]", j, cX, cY); //consumed = this->DoRelease(ev, w); bEventConsumed = this->DoRelease(ev, w); } else if (w->GetPlayerState(j) == Seed::WidgetStatePressedOut) { //LOG("> RELEASE OUT [%d, %f, %f]", j, cX, cY); //consumed = this->DoReleaseOut(ev, w); bEventConsumed = this->DoReleaseOut(ev, w); } } //if (consumed) if (bEventConsumed) break; } }
void WidgetContainer::OnInputPointerPress(const EventInputPointer *ev) { ASSERT_NULL(ev); WidgetIterator it = vWidget.begin(); WidgetIterator end = vWidget.end(); for (; it != end; ++it) { IWidget *w = (*it); ASSERT_NULL(w); bEventConsumed = FALSE; if (w->IsDisabled()) continue; f32 cX = ev->GetX(); f32 cY = ev->GetY(); if (!w->ContainsPoint(cX, cY)) continue; if (w->GetObjectType() == Seed::ObjectGuiWidgetContainer) { WidgetContainer *wc = reinterpret_cast<WidgetContainer *>(w); wc->OnInputPointerPress(ev); bEventConsumed = wc->IsEventConsumed(); if (bEventConsumed) break; } if (!(w->GetTrigger() & ev->GetPressed())) continue; u32 j = ev->GetJoystick(); //LOG("> PRESS [%d, %f, %f]", j, cX, cY); if (w->GetState() == Seed::WidgetStateDrag) { continue; } const EventWidget newEvent(w, NULL, WidgetEventPressed, j, cX, cY, ev->GetPressed(), ev->GetHold(), ev->GetReleased()); LOG(">PRESSED_OVER [id: %d]", w->GetId()); // GetState eh o baseado em prioridade a partir de todos os inputs. if (w->GetState() != Seed::WidgetStatePressedOver && w->GetPlayerState(j) != Seed::WidgetStatePressedOver) { // muda apenas o estado interno do widget LOG("\tEstado WIDGET"); w->OnWidgetPress(&newEvent); } w->SetState(Seed::WidgetStatePressed); w->SetPlayerState(Seed::WidgetStatePressedOver, j); LOG("\tEstado PLAYER"); w->SendOnPress(&newEvent); LOG("\tEvento"); //if (newEvent.IsConsumed()) bEventConsumed = newEvent.IsConsumed(); if (bEventConsumed) break; } }