Changed: Normalize style values
--HG-- branch : develop
This commit is contained in:
parent
7ca3b85c54
commit
9444e05755
3 changed files with 109 additions and 47 deletions
|
@ -47,7 +47,7 @@ namespace NLGUI
|
||||||
sint32 X;
|
sint32 X;
|
||||||
sint32 Y;
|
sint32 Y;
|
||||||
NLMISC::CRGBA Color;
|
NLMISC::CRGBA Color;
|
||||||
};
|
};
|
||||||
public:
|
public:
|
||||||
CStyleParams () : FontFamily(""), TextColor(255,255,255,255), TextShadow()
|
CStyleParams () : FontFamily(""), TextColor(255,255,255,255), TextShadow()
|
||||||
{
|
{
|
||||||
|
@ -110,7 +110,7 @@ namespace NLGUI
|
||||||
|
|
||||||
// pseudo element like ':before'
|
// pseudo element like ':before'
|
||||||
std::string PseudoElement;
|
std::string PseudoElement;
|
||||||
|
|
||||||
// returns selector specificity
|
// returns selector specificity
|
||||||
uint specificity() const;
|
uint specificity() const;
|
||||||
};
|
};
|
||||||
|
@ -134,6 +134,12 @@ namespace NLGUI
|
||||||
void getStyleParams(const std::string &styleString, CStyleParams &style, const CStyleParams ¤t) const;
|
void getStyleParams(const std::string &styleString, CStyleParams &style, const CStyleParams ¤t) const;
|
||||||
void getStyleParams(const TStyle &styleRules, CStyleParams &style, const CStyleParams ¤t) const;
|
void getStyleParams(const TStyle &styleRules, CStyleParams &style, const CStyleParams ¤t) const;
|
||||||
|
|
||||||
|
// extract from styleRules into style.StyleRules (expand shorthand, normalize, calculate current font-size)
|
||||||
|
void normalize(const TStyle &styleRules, CStyleParams &style, const CStyleParams ¤t) const;
|
||||||
|
|
||||||
|
// apply style.StyleRyles
|
||||||
|
void apply(CStyleParams &style, const CStyleParams ¤t) const;
|
||||||
|
|
||||||
// merge src into dest by overwriting key in dest
|
// merge src into dest by overwriting key in dest
|
||||||
void merge(TStyle &dst, const TStyle &src) const;
|
void merge(TStyle &dst, const TStyle &src) const;
|
||||||
|
|
||||||
|
@ -171,7 +177,7 @@ namespace NLGUI
|
||||||
Current.MaxWidth=-1;
|
Current.MaxWidth=-1;
|
||||||
Current.MaxHeight=-1;
|
Current.MaxHeight=-1;
|
||||||
Current.BorderWidth=1;
|
Current.BorderWidth=1;
|
||||||
|
|
||||||
Current.StyleRules.clear();
|
Current.StyleRules.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -332,10 +332,18 @@ namespace NLGUI
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// first pass:
|
normalize(styleRules, style, current);
|
||||||
// - get font-size for 'em' sizes
|
apply(style, current);
|
||||||
// - split shorthand to its parts
|
}
|
||||||
// - get TextColor value that could be used for 'currentcolor'
|
|
||||||
|
// first pass
|
||||||
|
// - get font-size for 'em' sizes
|
||||||
|
// - split shorthand to its parts
|
||||||
|
// - get TextColor value that could be used for 'currentcolor'
|
||||||
|
// - normalize values
|
||||||
|
void CCssStyle::normalize(const TStyle &styleRules, CStyleParams &style, const CStyleParams ¤t) const
|
||||||
|
{
|
||||||
|
TStyle::const_iterator it;
|
||||||
for (it=styleRules.begin(); it != styleRules.end(); ++it)
|
for (it=styleRules.begin(); it != styleRules.end(); ++it)
|
||||||
{
|
{
|
||||||
// update local copy of applied style
|
// update local copy of applied style
|
||||||
|
@ -407,6 +415,7 @@ namespace NLGUI
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
float tmpf;
|
||||||
std::string unit;
|
std::string unit;
|
||||||
if (getCssLength(tmpf, unit, it->second.c_str()))
|
if (getCssLength(tmpf, unit, it->second.c_str()))
|
||||||
{
|
{
|
||||||
|
@ -428,9 +437,38 @@ namespace NLGUI
|
||||||
{
|
{
|
||||||
parseBackgroundShorthand(it->second, style);
|
parseBackgroundShorthand(it->second, style);
|
||||||
}
|
}
|
||||||
}
|
else
|
||||||
|
if (it->first == "background-repeat")
|
||||||
|
{
|
||||||
|
// old ryzom specific value
|
||||||
|
if (it->second == "1")
|
||||||
|
style.StyleRules[it->first] = "repeat";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (it->first == "background-scale")
|
||||||
|
{
|
||||||
|
// replace old ryzom specific rule with background-size
|
||||||
|
if (it->second != "1")
|
||||||
|
{
|
||||||
|
style.StyleRules["background-size"] = "auto";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
style.StyleRules["background-size"] = "100%";
|
||||||
|
}
|
||||||
|
|
||||||
// second pass: use style own StyleRules as its updated from first pass
|
TStyle::iterator pos = style.StyleRules.find(it->first);
|
||||||
|
if (pos != style.StyleRules.end())
|
||||||
|
style.StyleRules.erase(pos);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// apply style rules
|
||||||
|
void CCssStyle::apply(CStyleParams &style, const CStyleParams ¤t) const
|
||||||
|
{
|
||||||
|
float tmpf;
|
||||||
|
TStyle::const_iterator it;
|
||||||
for (it=style.StyleRules.begin(); it != style.StyleRules.end(); ++it)
|
for (it=style.StyleRules.begin(); it != style.StyleRules.end(); ++it)
|
||||||
{
|
{
|
||||||
if (it->first == "border" || it->first == "border-width")
|
if (it->first == "border" || it->first == "border-width")
|
||||||
|
@ -458,6 +496,7 @@ namespace NLGUI
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
float tmpf;
|
||||||
std::string unit;
|
std::string unit;
|
||||||
if (getCssLength(tmpf, unit, it->second.c_str()))
|
if (getCssLength(tmpf, unit, it->second.c_str()))
|
||||||
{
|
{
|
||||||
|
@ -767,6 +806,42 @@ namespace NLGUI
|
||||||
else
|
else
|
||||||
scanHTMLColor(it->second.c_str(), style.BackgroundColorOver);
|
scanHTMLColor(it->second.c_str(), style.BackgroundColorOver);
|
||||||
}
|
}
|
||||||
|
else
|
||||||
|
if (it->first == "background-image")
|
||||||
|
{
|
||||||
|
// normalize
|
||||||
|
std::string image = trim(it->second);
|
||||||
|
if (toLower(image.substr(0, 4)) == "url(")
|
||||||
|
{
|
||||||
|
image = image.substr(4, image.size()-5);
|
||||||
|
}
|
||||||
|
style.StyleRules[it->first] = trimQuotes(image);
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (it->first == "background-repeat")
|
||||||
|
{
|
||||||
|
// normalize
|
||||||
|
std::string val = toLower(trim(it->second));
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
NLMISC::splitString(val, " ", parts);
|
||||||
|
// check for "repeat repeat"
|
||||||
|
if (parts.size() == 2 && parts[0] == parts[1])
|
||||||
|
val = parts[0];
|
||||||
|
|
||||||
|
style.StyleRules[it->first] = val;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
if (it->first == "background-size")
|
||||||
|
{
|
||||||
|
// normalize
|
||||||
|
std::string val = toLower(trim(it->second));
|
||||||
|
std::vector<std::string> parts;
|
||||||
|
NLMISC::splitString(val, " ", parts);
|
||||||
|
if (parts.size() == 2 && parts[0] == parts[1])
|
||||||
|
val = parts[0];
|
||||||
|
|
||||||
|
style.StyleRules[it->first] = val;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// if outer element has underline set, then inner element cannot remove it
|
// if outer element has underline set, then inner element cannot remove it
|
||||||
|
|
|
@ -1220,7 +1220,7 @@ namespace NLGUI
|
||||||
{
|
{
|
||||||
std::string::size_type start;
|
std::string::size_type start;
|
||||||
std::string token;
|
std::string token;
|
||||||
|
|
||||||
// not supported
|
// not supported
|
||||||
// counter, open-quote, close-quote, no-open-quote, no-close-quote
|
// counter, open-quote, close-quote, no-open-quote, no-close-quote
|
||||||
if (content[pos] == '"' || content[pos] == '\'')
|
if (content[pos] == '"' || content[pos] == '\'')
|
||||||
|
@ -3271,9 +3271,9 @@ namespace NLGUI
|
||||||
|
|
||||||
setTitle(_TitleString);
|
setTitle(_TitleString);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string CGroupHTML::getTitle() const {
|
std::string CGroupHTML::getTitle() const {
|
||||||
return _TitleString.toUtf8();
|
return _TitleString.toUtf8();
|
||||||
};
|
};
|
||||||
|
|
||||||
// ***************************************************************************
|
// ***************************************************************************
|
||||||
|
@ -4075,7 +4075,7 @@ namespace NLGUI
|
||||||
{
|
{
|
||||||
// clear the page
|
// clear the page
|
||||||
beginBuild();
|
beginBuild();
|
||||||
|
|
||||||
// clear previous page and state
|
// clear previous page and state
|
||||||
removeContent();
|
removeContent();
|
||||||
|
|
||||||
|
@ -4698,7 +4698,7 @@ namespace NLGUI
|
||||||
nlwarning("BUG: unable to find current element iterator from parent");
|
nlwarning("BUG: unable to find current element iterator from parent");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// where fragment should be moved
|
// where fragment should be moved
|
||||||
std::list<CHtmlElement>::iterator insertBefore;
|
std::list<CHtmlElement>::iterator insertBefore;
|
||||||
if (_CurrentHTMLNextSibling == NULL)
|
if (_CurrentHTMLNextSibling == NULL)
|
||||||
|
@ -5010,7 +5010,7 @@ namespace NLGUI
|
||||||
valign = _Style.Current.VerticalAlign;
|
valign = _Style.Current.VerticalAlign;
|
||||||
else if (elm.hasNonEmptyAttribute("valign"))
|
else if (elm.hasNonEmptyAttribute("valign"))
|
||||||
valign = toLower(elm.getAttribute("valign"));
|
valign = toLower(elm.getAttribute("valign"));
|
||||||
|
|
||||||
if (valign == "top")
|
if (valign == "top")
|
||||||
cellParams.VAlign = CGroupCell::Top;
|
cellParams.VAlign = CGroupCell::Top;
|
||||||
else if (valign == "middle")
|
else if (valign == "middle")
|
||||||
|
@ -5018,7 +5018,7 @@ namespace NLGUI
|
||||||
else if (valign == "bottom")
|
else if (valign == "bottom")
|
||||||
cellParams.VAlign = CGroupCell::Bottom;
|
cellParams.VAlign = CGroupCell::Bottom;
|
||||||
}
|
}
|
||||||
|
|
||||||
_CellParams.push_back (cellParams);
|
_CellParams.push_back (cellParams);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5030,15 +5030,9 @@ namespace NLGUI
|
||||||
// non-empty image
|
// non-empty image
|
||||||
if (_Style.hasStyle("background-image"))
|
if (_Style.hasStyle("background-image"))
|
||||||
{
|
{
|
||||||
// value '1' and 'background-scale' are ryzom only
|
bool repeat = _Style.checkStyle("background-repeat", "repeat");
|
||||||
bool repeat = _Style.checkStyle("background-repeat", "1") || _Style.checkStyle("background-repeat", "repeat");
|
bool scale = _Style.checkStyle("background-size", "100%");
|
||||||
bool scale = _Style.checkStyle("background-scale", "1") || _Style.checkStyle("background-size", "100% 100%");
|
std::string image = _Style.getStyle("background-image");
|
||||||
std::string image = trim(_Style.getStyle("background-image"));
|
|
||||||
string::size_type texExt = toLower(image).find("url(");
|
|
||||||
if (texExt != string::npos)
|
|
||||||
{
|
|
||||||
image = image.substr(texExt+4, image.size()-texExt-5);
|
|
||||||
}
|
|
||||||
if (!image.empty())
|
if (!image.empty())
|
||||||
{
|
{
|
||||||
if (root)
|
if (root)
|
||||||
|
@ -5063,7 +5057,7 @@ namespace NLGUI
|
||||||
{
|
{
|
||||||
setBackgroundColor(bgColor);
|
setBackgroundColor(bgColor);
|
||||||
}
|
}
|
||||||
// TODO: else
|
// TODO: else
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -5369,7 +5363,7 @@ namespace NLGUI
|
||||||
{
|
{
|
||||||
newParagraph(LIBeginSpace);
|
newParagraph(LIBeginSpace);
|
||||||
}
|
}
|
||||||
|
|
||||||
renderPseudoElement(":before", elm);
|
renderPseudoElement(":before", elm);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -5597,7 +5591,7 @@ namespace NLGUI
|
||||||
// no 'type' attribute, or empty
|
// no 'type' attribute, or empty
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Global color flag
|
// Global color flag
|
||||||
if (elm.hasAttribute("global_color"))
|
if (elm.hasAttribute("global_color"))
|
||||||
_Style.Current.GlobalColor = true;
|
_Style.Current.GlobalColor = true;
|
||||||
|
@ -5862,7 +5856,7 @@ namespace NLGUI
|
||||||
_ParsingLua = _TrustedDomain; // Only parse lua if TrustedDomain
|
_ParsingLua = _TrustedDomain; // Only parse lua if TrustedDomain
|
||||||
_LuaScript.clear();
|
_LuaScript.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void CGroupHTML::htmlLUAend(const CHtmlElement &elm)
|
void CGroupHTML::htmlLUAend(const CHtmlElement &elm)
|
||||||
{
|
{
|
||||||
if (_ParsingLua && _TrustedDomain)
|
if (_ParsingLua && _TrustedDomain)
|
||||||
|
@ -6189,7 +6183,7 @@ namespace NLGUI
|
||||||
{
|
{
|
||||||
if (elm.hasNonEmptyAttribute("cellspacing"))
|
if (elm.hasNonEmptyAttribute("cellspacing"))
|
||||||
fromString(elm.getAttribute("cellspacing"), table->CellSpacing);
|
fromString(elm.getAttribute("cellspacing"), table->CellSpacing);
|
||||||
|
|
||||||
// TODO: cssLength, horiz/vert values
|
// TODO: cssLength, horiz/vert values
|
||||||
if (_Style.hasStyle("border-spacing"))
|
if (_Style.hasStyle("border-spacing"))
|
||||||
fromString(_Style.getStyle("border-spacing"), table->CellSpacing);
|
fromString(_Style.getStyle("border-spacing"), table->CellSpacing);
|
||||||
|
@ -6296,29 +6290,16 @@ namespace NLGUI
|
||||||
|
|
||||||
_Cells.back() = new CGroupCell(CViewBase::TCtorParam());
|
_Cells.back() = new CGroupCell(CViewBase::TCtorParam());
|
||||||
|
|
||||||
if (_Style.checkStyle("background-repeat", "1") || _Style.checkStyle("background-repeat", "repeat"))
|
if (_Style.checkStyle("background-repeat", "repeat"))
|
||||||
_Cells.back()->setTextureTile(true);
|
_Cells.back()->setTextureTile(true);
|
||||||
|
|
||||||
if (_Style.checkStyle("background-scale", "1") || _Style.checkStyle("background-size", "100% 100%"))
|
if (_Style.checkStyle("background-size", "100%"))
|
||||||
_Cells.back()->setTextureScale(true);
|
_Cells.back()->setTextureScale(true);
|
||||||
|
|
||||||
if (_Style.hasStyle("background-image"))
|
if (_Style.hasStyle("background-image"))
|
||||||
{
|
{
|
||||||
string image = _Style.getStyle("background-image");
|
string image = _Style.getStyle("background-image");
|
||||||
|
addImageDownload(image, _Cells.back());
|
||||||
string::size_type texExt = toLower(image).find("url(");
|
|
||||||
// Url image
|
|
||||||
if (texExt != string::npos)
|
|
||||||
{
|
|
||||||
// Remove url()
|
|
||||||
image = image.substr(4, image.size()-5);
|
|
||||||
addImageDownload(image, _Cells.back());
|
|
||||||
// Image in BNP
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
_Cells.back()->setTexture(image);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (elm.hasNonEmptyAttribute("colspan"))
|
if (elm.hasNonEmptyAttribute("colspan"))
|
||||||
|
@ -6339,7 +6320,7 @@ namespace NLGUI
|
||||||
getPercentage (_Cells.back()->WidthWanted, _Cells.back()->TableRatio, _Style.getStyle("width").c_str());
|
getPercentage (_Cells.back()->WidthWanted, _Cells.back()->TableRatio, _Style.getStyle("width").c_str());
|
||||||
else if (elm.hasNonEmptyAttribute("width"))
|
else if (elm.hasNonEmptyAttribute("width"))
|
||||||
getPercentage (_Cells.back()->WidthWanted, _Cells.back()->TableRatio, elm.getAttribute("width").c_str());
|
getPercentage (_Cells.back()->WidthWanted, _Cells.back()->TableRatio, elm.getAttribute("width").c_str());
|
||||||
|
|
||||||
if (_Style.hasStyle("height"))
|
if (_Style.hasStyle("height"))
|
||||||
getPercentage (_Cells.back()->Height, temp, _Style.getStyle("height").c_str());
|
getPercentage (_Cells.back()->Height, temp, _Style.getStyle("height").c_str());
|
||||||
else if (elm.hasNonEmptyAttribute("height"))
|
else if (elm.hasNonEmptyAttribute("height"))
|
||||||
|
|
Loading…
Reference in a new issue