From 24767a86dfc26ed4e55e3b7f2cf4f91a58c7508e Mon Sep 17 00:00:00 2001 From: Nimetu Date: Fri, 15 Mar 2019 15:41:02 +0200 Subject: [PATCH] Fixed: CSS inherit rules --HG-- branch : develop --- code/nel/include/nel/gui/group_html.h | 2 +- code/nel/src/gui/group_html.cpp | 73 +++++++++++++-------------- 2 files changed, 37 insertions(+), 38 deletions(-) diff --git a/code/nel/include/nel/gui/group_html.h b/code/nel/include/nel/gui/group_html.h index 71d7b9ff0..20584b04e 100644 --- a/code/nel/include/nel/gui/group_html.h +++ b/code/nel/include/nel/gui/group_html.h @@ -796,7 +796,7 @@ namespace NLGUI static TGroupHtmlByUIDMap _GroupHtmlByUID; // read style attribute - void getStyleParams(const std::string &styleString, CStyleParams &style, bool inherit = true); + void getStyleParams(const std::string &styleString, CStyleParams &style, const CStyleParams ¤t); void applyCssMinMax(sint32 &width, sint32 &height, sint32 minw=0, sint32 minh=0, sint32 maxw=0, sint32 maxh=0); // load and render local html file (from bnp for example) diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp index 783861f45..2b4786a79 100644 --- a/code/nel/src/gui/group_html.cpp +++ b/code/nel/src/gui/group_html.cpp @@ -1545,7 +1545,7 @@ namespace NLGUI { case HTML_HTML: if (present[MY_HTML_HTML_STYLE] && value[MY_HTML_HTML_STYLE]) - getStyleParams(value[MY_HTML_HTML_STYLE], _StyleDefault); + getStyleParams(value[MY_HTML_HTML_STYLE], _StyleDefault, _StyleDefault); _Style = _StyleDefault; setBackgroundColor(_Style.BackgroundColor); @@ -1616,7 +1616,7 @@ namespace NLGUI _Style.Height = -1; if (present[HTML_A_STYLE] && value[HTML_A_STYLE]) - getStyleParams(value[HTML_A_STYLE], _Style); + getStyleParams(value[HTML_A_STYLE], _Style, _StyleParams.back()); _A.push_back(true); _Link.push_back (""); @@ -1669,7 +1669,7 @@ namespace NLGUI style = value[MY_HTML_DIV_STYLE]; if (!style.empty()) - getStyleParams(style, _Style); + getStyleParams(style, _Style, _StyleParams.back()); // use generic template system if (_TrustedDomain && !instClass.empty() && instClass == "ryzom-ui-grouptemplate") @@ -1780,7 +1780,7 @@ namespace NLGUI style = value[HTML_BODY_STYLE]; if (!style.empty()) - getStyleParams(style, _Style); + getStyleParams(style, _Style, _StyleParams.back()); CRGBA bgColor = _Style.BackgroundColor; if (present[HTML_BODY_BGCOLOR] && value[HTML_BODY_BGCOLOR]) @@ -1841,7 +1841,7 @@ namespace NLGUI _Style.TextColor = H1Color; _Style.GlobalColor = H1ColorGlobalColor; if (present[MY_HTML_H1_STYLE] && value[MY_HTML_H1_STYLE]) - getStyleParams(value[MY_HTML_H1_STYLE], _Style); + getStyleParams(value[MY_HTML_H1_STYLE], _Style, _StyleParams.back()); } break; case HTML_H2: @@ -1853,7 +1853,7 @@ namespace NLGUI _Style.TextColor = H2Color; _Style.GlobalColor = H2ColorGlobalColor; if (present[MY_HTML_H2_STYLE] && value[MY_HTML_H2_STYLE]) - getStyleParams(value[MY_HTML_H2_STYLE], _Style); + getStyleParams(value[MY_HTML_H2_STYLE], _Style, _StyleParams.back()); } break; case HTML_H3: @@ -1865,7 +1865,7 @@ namespace NLGUI _Style.TextColor = H3Color; _Style.GlobalColor = H3ColorGlobalColor; if (present[MY_HTML_H3_STYLE] && value[MY_HTML_H3_STYLE]) - getStyleParams(value[MY_HTML_H3_STYLE], _Style); + getStyleParams(value[MY_HTML_H3_STYLE], _Style, _StyleParams.back()); } break; case HTML_H4: @@ -1877,7 +1877,7 @@ namespace NLGUI _Style.TextColor = H4Color; _Style.GlobalColor = H4ColorGlobalColor; if (present[MY_HTML_H4_STYLE] && value[MY_HTML_H4_STYLE]) - getStyleParams(value[MY_HTML_H4_STYLE], _Style); + getStyleParams(value[MY_HTML_H4_STYLE], _Style, _StyleParams.back()); } break; case HTML_H5: @@ -1889,7 +1889,7 @@ namespace NLGUI _Style.TextColor = H5Color; _Style.GlobalColor = H5ColorGlobalColor; if (present[MY_HTML_H5_STYLE] && value[MY_HTML_H5_STYLE]) - getStyleParams(value[MY_HTML_H5_STYLE], _Style); + getStyleParams(value[MY_HTML_H5_STYLE], _Style, _StyleParams.back()); } break; case HTML_H6: @@ -1901,7 +1901,7 @@ namespace NLGUI _Style.TextColor = H6Color; _Style.GlobalColor = H6ColorGlobalColor; if (present[MY_HTML_H6_STYLE] && value[MY_HTML_H6_STYLE]) - getStyleParams(value[MY_HTML_H6_STYLE], _Style); + getStyleParams(value[MY_HTML_H6_STYLE], _Style, _StyleParams.back()); } break; case HTML_IMG: @@ -1928,7 +1928,7 @@ namespace NLGUI // width, height from inline css if (present[MY_HTML_IMG_STYLE] && value[MY_HTML_IMG_STYLE]) - getStyleParams(value[MY_HTML_IMG_STYLE], style); + getStyleParams(value[MY_HTML_IMG_STYLE], style, _Style); // Tooltip const char *tooltip = NULL; @@ -2032,7 +2032,7 @@ namespace NLGUI tooltip = value[MY_HTML_INPUT_ALT]; if (present[MY_HTML_INPUT_STYLE] && value[MY_HTML_INPUT_STYLE]) - getStyleParams(value[MY_HTML_INPUT_STYLE], _Style); + getStyleParams(value[MY_HTML_INPUT_STYLE], _Style, _StyleParams.back()); string type = toLower(value[MY_HTML_INPUT_TYPE]); if (type == "image") @@ -2258,7 +2258,6 @@ namespace NLGUI if (!(_Forms.empty())) { CStyleParams style; - style.FontSize = _Style.FontSize; // A select box string name; @@ -2272,7 +2271,7 @@ namespace NLGUI if (present[HTML_SELECT_MULTIPLE] && value[HTML_SELECT_MULTIPLE]) multiple = true; if (present[HTML_SELECT_STYLE] && value[HTML_SELECT_STYLE]) - getStyleParams(value[HTML_SELECT_STYLE], style); + getStyleParams(value[HTML_SELECT_STYLE], style, _Style); CGroupHTML::CForm::CEntry entry; entry.Name = name; @@ -2356,7 +2355,7 @@ namespace NLGUI pushStyle(); if (present[HTML_LI_STYLE] && value[HTML_LI_STYLE]) - getStyleParams(value[HTML_LI_STYLE], _Style); + getStyleParams(value[HTML_LI_STYLE], _Style, _StyleParams.back()); ucstring str; str.fromUtf8(_UL.back().getListMarkerText()); @@ -2379,7 +2378,7 @@ namespace NLGUI newParagraph(PBeginSpace); pushStyle(); if (present[MY_HTML_P_STYLE] && value[MY_HTML_P_STYLE]) - getStyleParams(value[MY_HTML_P_STYLE], _Style); + getStyleParams(value[MY_HTML_P_STYLE], _Style, _StyleParams.back()); } break; case HTML_PRE: @@ -2388,7 +2387,7 @@ namespace NLGUI _Style.FontFamily = "monospace"; if (present[HTML_PRE_STYLE] && value[HTML_PRE_STYLE]) - getStyleParams(value[HTML_PRE_STYLE], _Style); + getStyleParams(value[HTML_PRE_STYLE], _Style, _StyleParams.back()); _PRE.push_back(true); @@ -2416,7 +2415,7 @@ namespace NLGUI if (present[MY_HTML_TABLE_CELLPADDING] && value[MY_HTML_TABLE_CELLPADDING]) fromString(value[MY_HTML_TABLE_CELLPADDING], table->CellPadding); if (present[MY_HTML_TABLE_STYLE] && value[MY_HTML_TABLE_STYLE]) - getStyleParams(value[MY_HTML_TABLE_STYLE], _Style); + getStyleParams(value[MY_HTML_TABLE_STYLE], _Style, _StyleParams.back()); table->setMarginLeft(getIndent()); addHtmlGroup (table, 0); @@ -2446,7 +2445,7 @@ namespace NLGUI } if (present[MY_HTML_TD_STYLE] && value[MY_HTML_TD_STYLE]) - getStyleParams(value[MY_HTML_TD_STYLE], _Style); + getStyleParams(value[MY_HTML_TD_STYLE], _Style, _StyleParams.back()); CGroupTable *table = getTable(); if (table) @@ -2541,7 +2540,7 @@ namespace NLGUI _Style.BackgroundColor.A = 0; if (present[MY_HTML_TEXTAREA_STYLE] && value[MY_HTML_TEXTAREA_STYLE]) - getStyleParams(value[MY_HTML_TEXTAREA_STYLE], _Style); + getStyleParams(value[MY_HTML_TEXTAREA_STYLE], _Style, _StyleParams.back()); // Got one form ? if (!(_Forms.empty())) @@ -2597,7 +2596,7 @@ namespace NLGUI pushStyle(); if (present[MY_HTML_TR_STYLE] && value[MY_HTML_TR_STYLE]) - getStyleParams(value[MY_HTML_TR_STYLE], _Style); + getStyleParams(value[MY_HTML_TR_STYLE], _Style, _StyleParams.back()); } break; case HTML_UL: @@ -2614,7 +2613,7 @@ namespace NLGUI pushStyle(); if (present[HTML_UL_STYLE] && value[HTML_UL_STYLE]) - getStyleParams(value[HTML_UL_STYLE], _Style); + getStyleParams(value[HTML_UL_STYLE], _Style, _StyleParams.back()); break; case HTML_OBJECT: _ObjectType.clear(); @@ -2637,7 +2636,7 @@ namespace NLGUI pushStyle(); if (present[MY_HTML_SPAN_STYLE] && value[MY_HTML_SPAN_STYLE]) - getStyleParams(value[MY_HTML_SPAN_STYLE], _Style); + getStyleParams(value[MY_HTML_SPAN_STYLE], _Style, _StyleParams.back()); } break; case HTML_DEL: @@ -2681,7 +2680,7 @@ namespace NLGUI endParagraph(); pushStyle(); if (present[HTML_GEN_STYLE] && value[HTML_GEN_STYLE]) - getStyleParams(value[HTML_GEN_STYLE], _Style); + getStyleParams(value[HTML_GEN_STYLE], _Style, _StyleParams.back()); } break; case HTML_DT: @@ -2704,7 +2703,7 @@ namespace NLGUI pushStyle(); _Style.FontWeight = FONT_WEIGHT_BOLD; if (present[HTML_GEN_STYLE] && value[HTML_GEN_STYLE]) - getStyleParams(value[HTML_GEN_STYLE], _Style); + getStyleParams(value[HTML_GEN_STYLE], _Style, _StyleParams.back()); if (!_LI) { @@ -2739,7 +2738,7 @@ namespace NLGUI pushStyle(); if (present[HTML_GEN_STYLE] && value[HTML_GEN_STYLE]) - getStyleParams(value[HTML_GEN_STYLE], _Style); + getStyleParams(value[HTML_GEN_STYLE], _Style, _StyleParams.back()); if (!_LI) { @@ -2763,7 +2762,7 @@ namespace NLGUI if (present[HTML_OL_TYPE] && value[HTML_OL_TYPE]) type = value[HTML_OL_TYPE]; if (present[HTML_OL_STYLE] && value[HTML_OL_STYLE]) - getStyleParams(value[HTML_OL_STYLE], _Style); + getStyleParams(value[HTML_OL_STYLE], _Style, _StyleParams.back()); _UL.push_back(HTMLOListElement(start, type)); // if LI is already present @@ -2786,7 +2785,7 @@ namespace NLGUI style.Width = 0; if (present[HTML_HR_STYLE] && value[HTML_HR_STYLE]) - getStyleParams(value[HTML_HR_STYLE], style); + getStyleParams(value[HTML_HR_STYLE], style, _Style); CViewBitmap *bitmap = dynamic_cast(sep->getView("hr")); if (bitmap) @@ -6364,16 +6363,8 @@ namespace NLGUI // style.TextColor; // color: #ABCDEF; // style.Underlined; // text-decoration: underline; text-decoration-line: underline; // style.StrikeThrough; // text-decoration: line-through; text-decoration-line: line-through; - void CGroupHTML::getStyleParams(const std::string &styleString, CStyleParams &style, bool inherit) + void CGroupHTML::getStyleParams(const std::string &styleString, CStyleParams &style, const CStyleParams ¤t) { - const CStyleParams current = _Style; - - if (inherit) - { - style.Underlined = current.Underlined; - style.StrikeThrough = current.StrikeThrough; - } - float tmpf; TStyle styles = parseStyle(styleString); TStyle::iterator it; @@ -6698,6 +6689,14 @@ namespace NLGUI scanHTMLColor(it->second.c_str(), style.BackgroundColorOver); } } + + // if outer element has underline set, then inner element cannot remove it + if (current.Underlined) + style.Underlined = current.Underlined; + + // if outer element has line-through set, then inner element cannot remove it + if (current.StrikeThrough) + style.StrikeThrough = current.StrikeThrough; } // ***************************************************************************