From 8a9bc2cd474ca1724637cea7d92a5b6585ddb98e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Lucas=20Golini?= Date: Sat, 25 Apr 2026 20:47:51 -0300 Subject: [PATCH] Some HTML rendering fixes. Most important is the media query is correctly processed when combining style sheets. --- bin/assets/ui/breeze.css | 4 ++++ include/eepp/ui/css/propertydefinition.hpp | 1 + include/eepp/ui/uipushbutton.hpp | 2 ++ include/eepp/ui/uitextspan.hpp | 2 ++ src/eepp/ui/css/stylesheetspecification.cpp | 15 ++++++++------- src/eepp/ui/uinode.cpp | 5 +++++ src/eepp/ui/uipushbutton.cpp | 9 +++++++++ src/eepp/ui/uirichtext.cpp | 4 +++- src/eepp/ui/uiscenenode.cpp | 15 +++++++++++++-- src/eepp/ui/uitextview.cpp | 10 ++++++---- src/eepp/ui/uiwidget.cpp | 3 +++ src/eepp/ui/uiwidgetcreator.cpp | 8 +++++++- src/tools/ecode/uiwelcomescreen.cpp | 16 ++++++++-------- 13 files changed, 71 insertions(+), 23 deletions(-) diff --git a/bin/assets/ui/breeze.css b/bin/assets/ui/breeze.css index f10fd3e86..48c6b0385 100644 --- a/bin/assets/ui/breeze.css +++ b/bin/assets/ui/breeze.css @@ -62,6 +62,10 @@ strong { font-style: bold; } +small { + font-size: smaller; +} + u, ins { text-decoration: underline; diff --git a/include/eepp/ui/css/propertydefinition.hpp b/include/eepp/ui/css/propertydefinition.hpp index 2b212b97e..4525ef866 100644 --- a/include/eepp/ui/css/propertydefinition.hpp +++ b/include/eepp/ui/css/propertydefinition.hpp @@ -239,6 +239,7 @@ enum class PropertyId : Uint32 { Rows = String::hash( "rows" ), Cols = String::hash( "cols" ), InputMode = String::hash( "input-mode" ), + Hidden = String::hash( "hidden" ), Display = String::hash( "display" ), Position = String::hash( "position" ), Top = String::hash( "top" ), diff --git a/include/eepp/ui/uipushbutton.hpp b/include/eepp/ui/uipushbutton.hpp index 877bc2bca..87e81276d 100644 --- a/include/eepp/ui/uipushbutton.hpp +++ b/include/eepp/ui/uipushbutton.hpp @@ -89,6 +89,8 @@ class EE_API UIPushButton : public UIWidget { UIPushButton* setExpandTextView( bool expand ); + virtual void loadFromXmlNode( const pugi::xml_node& node ); + protected: UIImage* mIcon; UITextView* mTextBox; diff --git a/include/eepp/ui/uitextspan.hpp b/include/eepp/ui/uitextspan.hpp index 9583a939e..d690e9f05 100644 --- a/include/eepp/ui/uitextspan.hpp +++ b/include/eepp/ui/uitextspan.hpp @@ -33,6 +33,8 @@ class EE_API UITextSpan : public UIHTMLWidget { static UITextSpan* NewCode() { return NewWithTag( "code" ); } + static UITextSpan* NewSmall() { return NewWithTag( "small" ); } + virtual ~UITextSpan(); virtual Uint32 getType() const; diff --git a/src/eepp/ui/css/stylesheetspecification.cpp b/src/eepp/ui/css/stylesheetspecification.cpp index 77dbc94dd..378b01d54 100644 --- a/src/eepp/ui/css/stylesheetspecification.cpp +++ b/src/eepp/ui/css/stylesheetspecification.cpp @@ -425,13 +425,14 @@ void StyleSheetSpecification::registerDefaultProperties() { registerProperty( "cols", "20" ).setType( PropertyType::NumberInt ); registerProperty( "input-mode", "normal" ).setType( PropertyType::String ); - registerProperty( "display", "inline" ); - registerProperty( "position", "static" ); - registerProperty( "top", "auto" ); - registerProperty( "right", "auto" ); - registerProperty( "bottom", "auto" ); - registerProperty( "left", "auto" ); - registerProperty( "z-index", "auto" ); + registerProperty( "hidden", "" ).setType( PropertyType::Bool ); + registerProperty( "display", "inline" ).setType( PropertyType::String ); + registerProperty( "position", "static" ).setType( PropertyType::String ); + registerProperty( "top", "auto" ).setType( PropertyType::NumberLength ); + registerProperty( "right", "auto" ).setType( PropertyType::NumberLength ); + registerProperty( "bottom", "auto" ).setType( PropertyType::NumberLength ); + registerProperty( "left", "auto" ).setType( PropertyType::NumberLength ); + registerProperty( "z-index", "auto" ).setType( PropertyType::NumberInt ); registerProperty( "inner-widget-orientation", "widgeticontextbox" ) .setType( PropertyType::String ); diff --git a/src/eepp/ui/uinode.cpp b/src/eepp/ui/uinode.cpp index 574dc7bee..4ce1ec627 100644 --- a/src/eepp/ui/uinode.cpp +++ b/src/eepp/ui/uinode.cpp @@ -1670,6 +1670,11 @@ Float UINode::lengthFromValue( const StyleSheetProperty& property, res.setValue( 1.2f, StyleSheetLength::Unit::Em ); } return convertLength( res, 0 ); + } else if ( property.getValue() == "inherit" ) { + // TODO: FIX inherit value + StyleSheetLength res; + res.setValue( 1, StyleSheetLength::Unit::Em ); + return convertLength( res, 0 ); } } return lengthFromValue( property.getValue(), diff --git a/src/eepp/ui/uipushbutton.cpp b/src/eepp/ui/uipushbutton.cpp index 173cd0002..0f5efafb9 100644 --- a/src/eepp/ui/uipushbutton.cpp +++ b/src/eepp/ui/uipushbutton.cpp @@ -6,6 +6,9 @@ #include #include +#define PUGIXML_HEADER_ONLY +#include + namespace EE { namespace UI { InnerWidgetOrientation UIPushButton::innerWidgetOrientationFromString( std::string iwo ) { @@ -739,4 +742,10 @@ bool UIPushButton::applyProperty( const StyleSheetProperty& attribute ) { return attributeSet; } +void UIPushButton::loadFromXmlNode( const pugi::xml_node& node ) { + UIWidget::loadFromXmlNode( node ); + if ( !node.text().empty() ) + setText( node.text().as_string() ); +} + }} // namespace EE::UI diff --git a/src/eepp/ui/uirichtext.cpp b/src/eepp/ui/uirichtext.cpp index 842fc59e4..08108ef1b 100644 --- a/src/eepp/ui/uirichtext.cpp +++ b/src/eepp/ui/uirichtext.cpp @@ -20,7 +20,9 @@ UIHTMLHtml* UIHTMLHtml::New( const std::string& tag ) { return eeNew( UIHTMLHtml, ( tag ) ); } -UIHTMLHtml::UIHTMLHtml( const std::string& tag ) : UIRichText( tag ) {} +UIHTMLHtml::UIHTMLHtml( const std::string& tag ) : UIRichText( tag ) { + enableReportSizeChangeToChildren(); +} Uint32 UIHTMLHtml::getType() const { return UI_TYPE_HTML_HTML; diff --git a/src/eepp/ui/uiscenenode.cpp b/src/eepp/ui/uiscenenode.cpp index 3aa0f749a..e643fe94e 100644 --- a/src/eepp/ui/uiscenenode.cpp +++ b/src/eepp/ui/uiscenenode.cpp @@ -400,10 +400,21 @@ void UISceneNode::setStyleSheet( const std::string& inlineStyleSheet ) { void UISceneNode::combineStyleSheet( const CSS::StyleSheet& styleSheet, bool forceReloadStyle, URI baseURI ) { mStyleSheet.combineStyleSheet( styleSheet ); + + bool mediaChanged = false; + if ( !mStyleSheet.isMediaQueryListEmpty() && + mStyleSheet.updateMediaLists( getMediaFeatures() ) ) { + mediaChanged = true; + } + + processStyleSheetAtRules( styleSheet, baseURI ); + if ( mRoot && mRoot->getUIStyle() ) mRoot->getUIStyle()->resetGlobalDefinition(); - processStyleSheetAtRules( styleSheet, baseURI ); - onMediaChanged(); + + if ( mRoot && mediaChanged ) + mRoot->reportStyleStateChangeRecursive( false, false ); + if ( forceReloadStyle ) reloadStyle(); } diff --git a/src/eepp/ui/uitextview.cpp b/src/eepp/ui/uitextview.cpp index 1463191a4..38f177ed8 100644 --- a/src/eepp/ui/uitextview.cpp +++ b/src/eepp/ui/uitextview.cpp @@ -742,15 +742,17 @@ bool UITextView::applyProperty( const StyleSheetProperty& attribute ) { setSelectionBackColor( attribute.asColor() ); break; case PropertyId::FontFamily: { - Font* font = FontManager::instance()->getByName( attribute.value() ); + if ( attribute.value() != "inherit" ) { + Font* font = FontManager::instance()->getByName( attribute.value() ); - if ( !mUsingCustomStyling && NULL != font && font->loaded() ) { - setFont( font ); + if ( !mUsingCustomStyling && NULL != font && font->loaded() ) { + setFont( font ); + } } break; } case PropertyId::FontSize: - if ( !mUsingCustomStyling ) + if ( !mUsingCustomStyling && attribute.value() != "inherit" ) setFontSize( lengthFromValue( attribute ) ); break; case PropertyId::TextDecoration: diff --git a/src/eepp/ui/uiwidget.cpp b/src/eepp/ui/uiwidget.cpp index 6a6a6054f..11c6a7f0a 100644 --- a/src/eepp/ui/uiwidget.cpp +++ b/src/eepp/ui/uiwidget.cpp @@ -2248,6 +2248,9 @@ bool UIWidget::applyProperty( const StyleSheetProperty& attribute ) { unsetFlags( UI_TAB_FOCUSABLE ); } break; + case PropertyId::Hidden: + setVisible( false ); + break; default: attributeSet = false; break; diff --git a/src/eepp/ui/uiwidgetcreator.cpp b/src/eepp/ui/uiwidgetcreator.cpp index 160ce7dbb..202c6ba6a 100644 --- a/src/eepp/ui/uiwidgetcreator.cpp +++ b/src/eepp/ui/uiwidgetcreator.cpp @@ -126,7 +126,6 @@ void UIWidgetCreator::createBaseWidgetList() { registeredWidget["hslider"] = UISlider::NewHorizontal; registeredWidget["vscrollbar"] = UIScrollBar::NewVertical; registeredWidget["hscrollbar"] = UIScrollBar::NewHorizontal; - registeredWidget["button"] = UIPushButton::New; registeredWidget["rlay"] = UIRelativeLayout::New; registeredWidget["tooltip"] = UITooltip::New; registeredWidget["tv"] = UITextView::New; @@ -137,6 +136,7 @@ void UIWidgetCreator::createBaseWidgetList() { registeredWidget["em"] = UITextSpan::NewEmphasis; registeredWidget["b"] = UITextSpan::NewBold; registeredWidget["strong"] = UITextSpan::NewBold; + registeredWidget["small"] = UITextSpan::NewSmall; registeredWidget["i"] = UITextSpan::NewItalics; registeredWidget["u"] = UITextSpan::NewUnderline; registeredWidget["ins"] = UITextSpan::NewUnderline; @@ -186,6 +186,12 @@ void UIWidgetCreator::createBaseWidgetList() { registeredWidget["td"] = [] { return UIHTMLTableCell::New( "td" ); }; registeredWidget["input"] = HTMLInput::New; registeredWidget["textarea"] = HTMLTextArea::New; + registeredWidget["button"] = [] { + auto but = UIPushButton::NewWithTag( "button" ); + but->setFlags( UI_HTML_ELEMENT ); + but->setLayoutSizePolicy( SizePolicy::WrapContent, SizePolicy::WrapContent ); + return but; + }; sBaseListCreated = true; } diff --git a/src/tools/ecode/uiwelcomescreen.cpp b/src/tools/ecode/uiwelcomescreen.cpp index b7e357522..fe20b8283 100644 --- a/src/tools/ecode/uiwelcomescreen.cpp +++ b/src/tools/ecode/uiwelcomescreen.cpp @@ -156,14 +156,14 @@ static const auto LAYOUT = R"xml( -