Changed: Keep track of all pseudo elements matching html element

--HG--
branch : develop
This commit is contained in:
Nimetu 2019-05-07 19:40:10 +03:00
parent 2f5de64d96
commit 077f57c4b9
4 changed files with 61 additions and 24 deletions

View file

@ -47,8 +47,6 @@ namespace NLGUI
// defined style and :before/:after pseudo elements // defined style and :before/:after pseudo elements
TStyle Style; TStyle Style;
TStyle StyleBefore;
TStyle StyleAfter;
// hierarchy // hierarchy
CHtmlElement *parent; CHtmlElement *parent;
@ -79,6 +77,16 @@ namespace NLGUI
// debug // debug
std::string toString(bool tree = false, uint depth = 0) const; std::string toString(bool tree = false, uint depth = 0) const;
// query, get, set pseudo element style rules
void clearPseudo();
bool hasPseudo(const std::string &key) const;
TStyle getPseudo(const std::string &key) const;
void setPseudo(const std::string &key, const TStyle &style);
private:
// pseudo elements like ":before" and ":after"
std::map<std::string, TStyle> _Pseudo;
}; };
} }

View file

@ -89,8 +89,7 @@ namespace NLGUI
} }
elm.Style.clear(); elm.Style.clear();
elm.StyleBefore.clear(); elm.clearPseudo();
elm.StyleAfter.clear();
if (!mRules.empty()) if (!mRules.empty())
{ {
@ -101,13 +100,9 @@ namespace NLGUI
{ {
merge(elm.Style, i->Properties); merge(elm.Style, i->Properties);
} }
else if (i->PseudoElement == ":before") else
{ {
merge(elm.StyleBefore, i->Properties); elm.setPseudo(i->PseudoElement, i->Properties);
}
else if (i->PseudoElement == ":after")
{
merge(elm.StyleAfter, i->Properties);
} }
} }
} }

View file

@ -1193,26 +1193,20 @@ namespace NLGUI
// *************************************************************************** // ***************************************************************************
void CGroupHTML::renderPseudoElement(const std::string &pseudo, const CHtmlElement &elm) void CGroupHTML::renderPseudoElement(const std::string &pseudo, const CHtmlElement &elm)
{ {
if (pseudo == ":before" && !elm.StyleBefore.empty()) if (pseudo != ":before" && pseudo != ":after")
{
_Style.pushStyle();
_Style.applyStyle(elm.StyleBefore);
}
else if (pseudo == ":after" && !elm.StyleAfter.empty())
{
_Style.pushStyle();
_Style.applyStyle(elm.StyleAfter);
}
else
{
// unknown pseudo element
return; return;
}
if (!elm.hasPseudo(pseudo))
return;
_Style.pushStyle();
_Style.applyStyle(elm.getPseudo(pseudo));
// TODO: 'content' should already be tokenized in css parser as it has all the functions for that // TODO: 'content' should already be tokenized in css parser as it has all the functions for that
std::string content = trim(_Style.getStyle("content")); std::string content = trim(_Style.getStyle("content"));
if (toLower(content) == "none" || toLower(content) == "normal") if (toLower(content) == "none" || toLower(content) == "normal")
{ {
_Style.popStyle();
return; return;
} }

View file

@ -82,6 +82,46 @@ namespace NLGUI
} }
} }
// ***************************************************************************
void CHtmlElement::clearPseudo()
{
_Pseudo.clear();
}
// ***************************************************************************
bool CHtmlElement::hasPseudo(const std::string &key) const
{
return _Pseudo.find(key) != _Pseudo.end();
}
// ***************************************************************************
TStyle CHtmlElement::getPseudo(const std::string &key) const
{
std::map<std::string, TStyle>::const_iterator it = _Pseudo.find(key);
if (it != _Pseudo.end())
return it->second;
return TStyle();
}
// ***************************************************************************
void CHtmlElement::setPseudo(const std::string &key, const TStyle &style)
{
std::map<std::string, TStyle>::iterator it = _Pseudo.find(key);
if (it != _Pseudo.end())
{
// insert into previous, override previous values if they exist
for(TStyle::const_iterator itStyle = style.begin(); itStyle != style.end(); ++itStyle)
{
it->second[itStyle->first] = itStyle->second;
}
}
else
{
_Pseudo[key] = style;
}
}
// *************************************************************************** // ***************************************************************************
std::string CHtmlElement::toString(bool tree, uint depth) const std::string CHtmlElement::toString(bool tree, uint depth) const
{ {