bool CompositeWidget::HitTest(Vector2n ParentPosition, std::list<Widget *> * Hits) const { #if 1 for (auto & Widget : reverse(GetWidgets())) { auto Result = Widget->HitTest(ParentToLocal(ParentPosition), Hits); #if DECISION_POINTER_MAPPING_CONTAINS_SINGLE_TOPMOST_WIDGET if (Result) return true; #endif } if (Widget::HitTest(ParentPosition, Hits)) return true; return false; #else bool HitInside = false; // HACK, TESTING: Swapped order of inner widgets and this widget for testing //>> FIX: Make clicking inside text area work... for (auto & Widget : reverse(GetWidgets())) { auto Result = Widget->HitTest(ParentToLocal(ParentPosition), nullptr); #if DECISION_POINTER_MAPPING_CONTAINS_SINGLE_TOPMOST_WIDGET if (Result) return true; #endif if (Result) HitInside = true; } if (Widget::HitTest(ParentPosition, Hits)) //return true; HitInside = true; if (HitInside && nullptr != Hits) { Hits->push_back(const_cast<CompositeWidget *>(this)); //return true; } for (auto & Widget : reverse(GetWidgets())) { auto Result = Widget->HitTest(ParentToLocal(ParentPosition), Hits); #if DECISION_POINTER_MAPPING_CONTAINS_SINGLE_TOPMOST_WIDGET if (Result) return true; #endif } if (HitInside) return true; return false; #endif }
void CControl::WorldToLocal(float &x, float &y) { CNode* pParent = GetParentNode(); if( pParent && pParent->GetType() == eNT_NodeGUI ) { down_cast<CControl*>(pParent)->WorldToLocal(x, y); } ParentToLocal(x, y); }
const Vector2n Widget::GlobalToLocal(const Vector2n GlobalPosition) const { /*Vector2d CanvasPositionDouble = GetParent()->GlobalToCanvas(GlobalPosition); Vector2n CanvasPosition(std::lround(CanvasPositionDouble.X()), std::lround(CanvasPositionDouble.Y())); // TODO: Loss of accuracy? Fix it if needed. return CanvasPosition - m_Position;*/ return ParentToLocal(GlobalToParent(GlobalPosition)); }
// TODO: Think this through bool CompositeWidget::IsHit(const Vector2n ParentPosition) const { for (auto & Widget : reverse(m_Widgets)) { if (Widget->IsHit(ParentToLocal(ParentPosition))) return true; } return Widget::IsHit(ParentPosition); }