diff --git a/code/nel/include/nel/gui/group_html.h b/code/nel/include/nel/gui/group_html.h index ce06c11cb..576c54ca7 100644 --- a/code/nel/include/nel/gui/group_html.h +++ b/code/nel/include/nel/gui/group_html.h @@ -385,6 +385,7 @@ namespace NLGUI bool _BrowseNextTime; bool _PostNextTime; uint _PostFormId; + std::string _PostFormAction; std::string _PostFormSubmitType; std::string _PostFormSubmitButton; std::string _PostFormSubmitValue; @@ -614,14 +615,16 @@ namespace NLGUI // submit buttons added to from struct SFormSubmitButton { - SFormSubmitButton(const std::string &form, const std::string &name, const std::string &value, const std::string &type) - : form(form), name(name), value(value), type(type) + SFormSubmitButton(const std::string &form, const std::string &name, const std::string &value, const std::string &type, const std::string &formAction="") + : form(form), name(name), value(value), type(type), formAction(formAction) { } std::string form; // form 'id' std::string name; // submit button name std::string value; // submit button value std::string type; // button type, ie 'image' + + std::string formAction; // override form action attribute (url) }; // submit buttons added to form @@ -862,6 +865,8 @@ namespace NLGUI void htmlBASE(const CHtmlElement &elm); void htmlBODY(const CHtmlElement &elm); void htmlBR(const CHtmlElement &elm); + void htmlBUTTON(const CHtmlElement &elm); + void htmlBUTTONend(const CHtmlElement &elm); void htmlDD(const CHtmlElement &elm); void htmlDDend(const CHtmlElement &elm); //void htmlDEL(const CHtmlElement &elm); diff --git a/code/nel/src/gui/group_html.cpp b/code/nel/src/gui/group_html.cpp index e65550c26..7f8d29a79 100644 --- a/code/nel/src/gui/group_html.cpp +++ b/code/nel/src/gui/group_html.cpp @@ -1078,6 +1078,7 @@ namespace NLGUI case HTML_BASE: htmlBASE(elm); break; case HTML_BODY: htmlBODY(elm); break; case HTML_BR: htmlBR(elm); break; + case HTML_BUTTON: htmlBUTTON(elm); break; case HTML_DD: htmlDD(elm); break; case HTML_DEL: renderPseudoElement(":before", elm); break; case HTML_DIV: htmlDIV(elm); break; @@ -1137,6 +1138,7 @@ namespace NLGUI case HTML_BASE: break; case HTML_BODY: renderPseudoElement(":after", elm); break; case HTML_BR: break; + case HTML_BUTTON: htmlBUTTONend(elm); break; case HTML_DD: htmlDDend(elm); break; case HTML_DEL: renderPseudoElement(":after", elm); break; case HTML_DIV: htmlDIVend(elm); break; @@ -2757,6 +2759,9 @@ namespace NLGUI // Translate the tooltip ctrlButton->setDefaultContextHelp(ucstring::makeFromUtf8(getLinkTitle())); ctrlButton->setText(tmpStr); + // empty url / button disabled + bool disabled = string(getLink()).empty(); + ctrlButton->setFrozen(disabled); setTextButtonStyle(ctrlButton, style); } @@ -3341,6 +3346,7 @@ namespace NLGUI { _PostNextTime = true; _PostFormId = formId; + _PostFormAction = _FormSubmit[button].formAction; _PostFormSubmitType = _FormSubmit[button].type; _PostFormSubmitButton = _FormSubmit[button].name; _PostFormSubmitValue = _FormSubmit[button].value; @@ -3525,7 +3531,8 @@ namespace NLGUI // Ref the form CForm &form = _Forms[_PostFormId]; - _URL = form.Action; + // button can override form action url (and methor, but we only do POST) + _URL = _PostFormAction.empty() ? form.Action : _PostFormAction; CUrlParser uri(_URL); _TrustedDomain = isTrustedDomain(uri.host); @@ -5223,6 +5230,55 @@ namespace NLGUI addString(tmp); } + // *************************************************************************** + void CGroupHTML::htmlBUTTON(const CHtmlElement &elm) + { + std::string name = elm.getAttribute("name"); + std::string value = elm.getAttribute("value"); + std::string formId = elm.getAttribute("form"); + std::string formAction = elm.getAttribute("formaction"); + std::string tooltip = elm.getAttribute("tooltip"); + bool disabled = elm.hasAttribute("disabled"); + + if (!formAction.empty()) + { + formAction = getAbsoluteUrl(formAction); + } + + _FormSubmit.push_back(SFormSubmitButton(formId, name, value, "text", formAction)); + // Action handler parameters + std::string param; + if (!disabled) + { + if (elm.getAttribute("type") == "submit") + { + param = "ah:html_submit_form&name=" + getId() + "&button=" + toString(_FormSubmit.size()-1); + } + else + { + param = "ah:"; + } + } + + _A.push_back(true); + _Link.push_back(param); + _LinkTitle.push_back(tooltip); + _LinkClass.push_back("ryzom-ui-button"); + + // TODO: this creates separate button element + //renderPseudoElement(":before", elm); + } + void CGroupHTML::htmlBUTTONend(const CHtmlElement &elm) + { + // TODO: this creates separate button element + //renderPseudoElement(":after", elm); + + popIfNotEmpty(_A); + popIfNotEmpty(_Link); + popIfNotEmpty(_LinkTitle); + popIfNotEmpty(_LinkClass); + } + // *************************************************************************** void CGroupHTML::htmlDD(const CHtmlElement &elm) { @@ -5613,9 +5669,11 @@ namespace NLGUI // Mouse over image string overSrc = elm.getAttribute("data-over-src"); - if (getA() && getParent () && getParent ()->getParent()) + // inside a/button with valid url (ie, button is not disabled) + string url = getLink(); + if (getA() && !url.empty() && getParent() && getParent()->getParent()) { - string params = "name=" + getId() + "|url=" + getLink (); + string params = "name=" + getId() + "|url=" + url; addButton(CCtrlButton::PushButton, id, src, src, overSrc, "browse", params.c_str(), tooltip, _Style.Current); } else