From cc0e516edc2c7ca7cd6db3ee0be7254159071856 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Fri, 29 May 2026 18:17:39 -0300 Subject: [PATCH] Nits --- .../assets/html/eepp-ui-background-atlas.webp | Bin 6526 -> 6532 bytes .../assets/html/eepp-ui-border-rendering.webp | Bin 5158 -> 5158 bytes .../html/eepp-uihtmltable-complex-layout.webp | Bin 13548 -> 13546 bytes include/eepp/ui/uihtmlwidget.hpp | 2 + src/eepp/ui/blocklayouter.cpp | 14 ++----- src/eepp/ui/uilayoutermanager.cpp | 9 +---- src/eepp/ui/uirichtext.cpp | 11 +---- src/eepp/ui/uitextspan.cpp | 20 ++++----- src/tests/unit_tests/uihtml_tests.cpp | 38 ++---------------- 9 files changed, 19 insertions(+), 75 deletions(-) diff --git a/bin/unit_tests/assets/html/eepp-ui-background-atlas.webp b/bin/unit_tests/assets/html/eepp-ui-background-atlas.webp index 992b3c4e771de0dc42b26a7b29393785dbb9adb9..82ae7a50c766410322873f2f2fc728792ac3241c 100644 GIT binary patch delta 5935 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 delta 5931 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 Y;D0&bf4BeNyWIb4x&KZFisWidget() || !parent->isType( UI_TYPE_HTML_WIDGET ) ) return false; UIHTMLWidget* parentHtml = parent->asType(); - if ( parentHtml->getDisplay() != CSSDisplay::Flex && - parentHtml->getDisplay() != CSSDisplay::InlineFlex ) + if ( !parentHtml->isFlex() ) return false; CSSAlignSelf alignSelf = widget->getAlignSelf(); @@ -75,16 +74,9 @@ void BlockLayouter::updateLayout() { if ( rt == nullptr || mPacking ) return; - bool parentIsFlex = false; Node* parentNode = widget->getParent(); - if ( parentNode && parentNode->isWidget() ) { - UIWidget* parentWidget = parentNode->asType(); - if ( parentWidget->isType( UI_TYPE_HTML_WIDGET ) ) { - CSSDisplay parentDisplay = parentWidget->asType()->getDisplay(); - parentIsFlex = - ( parentDisplay == CSSDisplay::Flex || parentDisplay == CSSDisplay::InlineFlex ); - } - } + bool parentIsFlex = parentNode && parentNode->isType( UI_TYPE_HTML_WIDGET ) && + parentNode->asType()->isFlex(); if ( widget->isInline() && !parentIsFlex ) return; diff --git a/src/eepp/ui/uilayoutermanager.cpp b/src/eepp/ui/uilayoutermanager.cpp index 46d32abd1..46ed94c7e 100644 --- a/src/eepp/ui/uilayoutermanager.cpp +++ b/src/eepp/ui/uilayoutermanager.cpp @@ -12,13 +12,8 @@ namespace EE { namespace UI { static bool parentIsFlexContainer( UIWidget* widget ) { Node* parent = widget->getParent(); - if ( !parent || !parent->isWidget() ) - return false; - UIWidget* parentWidget = parent->asType(); - if ( !parentWidget->isType( UI_TYPE_HTML_WIDGET ) ) - return false; - CSSDisplay parentDisplay = parentWidget->asType()->getDisplay(); - return parentDisplay == CSSDisplay::Flex || parentDisplay == CSSDisplay::InlineFlex; + return parent && parent->isType( UI_TYPE_HTML_WIDGET ) && + parent->asType()->isFlex(); } UILayouter* UILayouterManager::create( CSSDisplay display, UIWidget* container ) { diff --git a/src/eepp/ui/uirichtext.cpp b/src/eepp/ui/uirichtext.cpp index 63363a767..18895c977 100644 --- a/src/eepp/ui/uirichtext.cpp +++ b/src/eepp/ui/uirichtext.cpp @@ -1194,16 +1194,9 @@ void UIRichText::rebuildRichText( UILayout* container, RichText& richText, Intri if ( container->isType( UI_TYPE_TEXTSPAN ) ) { UITextSpan* selfSpan = container->asType(); - bool parentIsFlex = false; Node* parentNode = container->getParent(); - if ( parentNode && parentNode->isWidget() ) { - UIWidget* parentWidget = parentNode->asType(); - if ( parentWidget->isType( UI_TYPE_HTML_WIDGET ) ) { - CSSDisplay parentDisplay = parentWidget->asType()->getDisplay(); - parentIsFlex = ( parentDisplay == CSSDisplay::Flex || - parentDisplay == CSSDisplay::InlineFlex ); - } - } + bool parentIsFlex = parentNode->isType( UI_TYPE_HTML_WIDGET ) && + parentNode->asType()->isFlex(); if ( !selfSpan->getText().empty() && ( !selfSpan->isInline() || parentIsFlex ) && NULL != selfSpan->getFontStyleConfig().Font ) { String::View selfText = selfSpan->getText().view(); diff --git a/src/eepp/ui/uitextspan.cpp b/src/eepp/ui/uitextspan.cpp index a9a66d3ef..1a9e87511 100644 --- a/src/eepp/ui/uitextspan.cpp +++ b/src/eepp/ui/uitextspan.cpp @@ -71,20 +71,14 @@ bool UITextSpan::isInlineBlock() const { } void UITextSpan::draw() { - if ( !isInline() ) { + // When a UITextSpan is a flex item it is laid out independently by the + // flex container (blockification per CSS Flexbox §4). In that case the + // parent flex container does NOT render its text via rebuildRichText(), + // so the span must draw itself. + if ( !isInline() || + ( getParent() && getParent()->isType( UI_TYPE_HTML_WIDGET ) && + getParent()->asType()->isFlex() ) ) { UIRichText::draw(); - } else { - // When a UITextSpan is a flex item it is laid out independently by the - // flex container (blockification per CSS Flexbox §4). In that case the - // parent flex container does NOT render its text via rebuildRichText(), - // so the span must draw itself. - Node* parentNode = getParent(); - if ( parentNode && parentNode->isType( UI_TYPE_HTML_WIDGET ) ) { - CSSDisplay parentDisplay = parentNode->asType()->getDisplay(); - if ( parentDisplay == CSSDisplay::Flex || parentDisplay == CSSDisplay::InlineFlex ) { - UIRichText::draw(); - } - } } } diff --git a/src/tests/unit_tests/uihtml_tests.cpp b/src/tests/unit_tests/uihtml_tests.cpp index 42582ce64..1b0dca233 100644 --- a/src/tests/unit_tests/uihtml_tests.cpp +++ b/src/tests/unit_tests/uihtml_tests.cpp @@ -57,7 +57,7 @@ static void init_ui_test() { UTEST( UIHTMLTable, complexLayout ) { auto win = Engine::instance()->createWindow( - WindowSettings( 1024, 656, "HTML Tables Test", WindowStyle::Default, WindowBackend::Default, + WindowSettings( 1024, 653, "HTML Tables Test", WindowStyle::Default, WindowBackend::Default, 32, {}, 1, false, true ), ContextSettings( false, 0, 0, GLv_default, true, false ) ); FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); @@ -2071,7 +2071,7 @@ UTEST( UIHTMLDetails, lobstersInlineBlockCachesWidth ) { UTEST( UIBorder, renderingVariations ) { auto win = Engine::instance()->createWindow( - WindowSettings( 1024, 656, "Border Rendering Test", WindowStyle::Default, + WindowSettings( 1024, 653, "Border Rendering Test", WindowStyle::Default, WindowBackend::Default, 32, {}, 1, false, true ), ContextSettings( false, 0, 0, GLv_default, true, false ) ); FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); @@ -2586,7 +2586,7 @@ UTEST( UIHTML, ContactFormLayout ) { UTEST( UIBackground, imageAtlasPositioning ) { auto win = Engine::instance()->createWindow( - WindowSettings( 1024, 656, "Background Atlas Test", WindowStyle::Default, + WindowSettings( 1024, 653, "Background Atlas Test", WindowStyle::Default, WindowBackend::Default, 32, {}, 1, false, true ), ContextSettings( false, 0, 0, GLv_default, true, false ) ); FileSystem::changeWorkingDirectory( Sys::getProcessPath() ); @@ -3104,29 +3104,8 @@ UTEST( UIHTML, FlexCenterWebViewLikeLayout ) { ASSERT_TRUE( postWrapper != nullptr ); ASSERT_TRUE( post != nullptr ); - auto postWrapperWidget = postWrapper->asType(); auto postWidget = post->asType(); - std::cerr << "[TEST1280] post-wrapper size=" << postWrapperWidget->getPixelsSize().getWidth() - << "x" << postWrapperWidget->getPixelsSize().getHeight() - << " pos=" << postWrapperWidget->getPixelsPosition().x << "," - << postWrapperWidget->getPixelsPosition().y - << " pad=" << postWrapperWidget->getPixelsPadding().Left << "," - << postWrapperWidget->getPixelsPadding().Top << "," - << postWrapperWidget->getPixelsPadding().Right << "," - << postWrapperWidget->getPixelsPadding().Bottom << std::endl; - std::cerr << "[TEST1280] post type=" << postWidget->getType() - << " size=" << postWidget->getPixelsSize().getWidth() << "x" - << postWidget->getPixelsSize().getHeight() - << " pos=" << postWidget->getPixelsPosition().x << "," - << postWidget->getPixelsPosition().y - << " widthPolicy=" << (int)postWidget->getLayoutWidthPolicy() - << " heightPolicy=" << (int)postWidget->getLayoutHeightPolicy() - << " margin=" << postWidget->getLayoutPixelsMargin().Left << "," - << postWidget->getLayoutPixelsMargin().Top << "," - << postWidget->getLayoutPixelsMargin().Right << "," - << postWidget->getLayoutPixelsMargin().Bottom << std::endl; - // In a real browser a div with width:100% inside a column flex container // with align-items:center still spans the full cross axis because 100% // resolves against the container. The item should therefore sit flush with @@ -3170,17 +3149,6 @@ UTEST( UIHTML, FlexCenterNoTextNodeDisplacement ) { Float wrapperW = postWrapperWidget->getPixelsSize().getWidth(); Float postW = postWidget->getPixelsSize().getWidth(); - // Debug: print children of post-wrapper - std::cerr << "[TEST] post-wrapper children:" << std::endl; - Node* c = postWrapper->getFirstChild(); - while ( c ) { - std::cerr << " type=" << c->getType() << " id=" << c->getId() - << ( c->isWidget() ? " widget" : "" ) << std::endl; - c = c->getNextNode(); - } - std::cerr << "[TEST] post pos=" << postX << "," << postY << " size=" << postW << "x" - << postWidget->getPixelsSize().getHeight() << " wrapperW=" << wrapperW << std::endl; - // In a column flex container the first (and only) real flex item should // sit right after the container's top padding plus its own margin-top. EXPECT_NEAR( postY, wrapperTopPadding + postMarginTop, 2.f );