Cleaner hit testing: removed UISceneNode::overFind() override; UIRoot now has root-scoped child traversal extent for embedded document scenes.

This commit is contained in:
Martín Lucas Golini
2026-07-01 23:11:11 -03:00
parent e210736c2d
commit 5ad166b648
8 changed files with 256 additions and 65 deletions
@@ -5,6 +5,7 @@
#include <eepp/scene/scenemanager.hpp>
#include <eepp/system/filesystem.hpp>
#include <eepp/system/sys.hpp>
#include <eepp/ui/uiroot.hpp>
#include <eepp/ui/uiscenenode.hpp>
#include <eepp/ui/uithememanager.hpp>
#include <eepp/ui/uiwidget.hpp>
@@ -150,6 +151,44 @@ UTEST( UISceneNode, EmbeddedSceneCanKeepContentDrivenExtent ) {
Engine::destroySingleton();
}
UTEST( UISceneNode, LayoutViewportRootTraversesDocumentExtentForHitTesting ) {
Engine::instance()->createWindow( WindowSettings( 1024, 768, "Embedded Scene Hit Test Bounds",
WindowStyle::Default, WindowBackend::Default,
32, {}, 1, false, true ),
ContextSettings( false, 0, 0, GLv_default, true, false ) );
UISceneNode* hostScene = init_test_scene_node();
UIWidget* host = UIWidget::New();
host->setPixelsSize( 800, 600 );
host->setParent( hostScene->getRoot() );
UISceneNode* embeddedScene = UISceneNode::New();
embeddedScene->setFollowParentSize( false );
embeddedScene->setParent( host );
embeddedScene->setPixelsSize( 800, 1000 );
embeddedScene->setLayoutViewportPixelsSize( Sizef( 800, 300 ) );
UIWidget* target = UIWidget::New();
target->setId( "below-layout-viewport" );
target->setPixelsSize( 100, 50 );
target->setPosition( 10, 900 );
target->setParent( embeddedScene->getRoot() );
UIRoot* embeddedRoot = embeddedScene->getRoot()->asType<UIRoot>();
ASSERT_TRUE( embeddedRoot != nullptr );
ASSERT_TRUE( embeddedRoot->hasChildHitTestTraversalPixelsSize() );
EXPECT_NEAR( embeddedScene->getRoot()->getPixelsSize().getHeight(), 300.f, 0.5f );
EXPECT_NEAR( embeddedRoot->getChildHitTestTraversalPixelsSize().getHeight(), 1000.f, 0.5f );
Node* hit = embeddedScene->overFind( Vector2f( 20, 920 ) );
EXPECT_EQ( hit, target );
embeddedScene->clearLayoutViewportPixelsSize();
EXPECT_FALSE( embeddedRoot->hasChildHitTestTraversalPixelsSize() );
Engine::destroySingleton();
}
UTEST( UISceneNode, NestedSceneOwnsDescendantSceneAndStyles ) {
Engine::instance()->createWindow( WindowSettings( 1024, 768, "Nested Scene Isolation Test",
WindowStyle::Default, WindowBackend::Default,