1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-08-11 17:51:04 +00:00

Add animated_image[] formspec element (#9258)

This commit is contained in:
Hugues Ross 2020-02-15 10:33:18 -05:00 committed by GitHub
parent ee7d357602
commit 7ce21788f8
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
11 changed files with 200 additions and 4 deletions

View file

@ -55,6 +55,7 @@ with this program; if not, write to the Free Software Foundation, Inc.,
#include "util/string.h" // for parseColorString()
#include "irrlicht_changes/static_text.h"
#include "client/guiscalingfilter.h"
#include "guiAnimatedImage.h"
#include "guiBackgroundImage.h"
#include "guiBox.h"
#include "guiButton.h"
@ -779,6 +780,58 @@ void GUIFormSpecMenu::parseImage(parserData* data, const std::string &element)
errorstream<< "Invalid image element(" << parts.size() << "): '" << element << "'" << std::endl;
}
void GUIFormSpecMenu::parseAnimatedImage(parserData *data, const std::string &element)
{
std::vector<std::string> parts = split(element, ';');
if (parts.size() != 3 &&
!(parts.size() > 3 && m_formspec_version > FORMSPEC_API_VERSION)) {
errorstream << "Invalid animated image element(" << parts.size()
<< "): '" << element << "'" << std::endl;
return;
}
std::vector<std::string> v_pos = split(parts[0], ',');
std::vector<std::string> v_geom = split(parts[1], ',');
std::string name = unescape_string(parts[2]);
MY_CHECKPOS("animated_image", 0);
MY_CHECKGEOM("animated_image", 1);
v2s32 pos;
v2s32 geom;
if (data->real_coordinates) {
pos = getRealCoordinateBasePos(v_pos);
geom = getRealCoordinateGeometry(v_geom);
} else {
pos = getElementBasePos(&v_pos);
geom.X = stof(v_geom[0]) * (float)imgsize.X;
geom.Y = stof(v_geom[1]) * (float)imgsize.Y;
}
if (!data->explicit_size)
warningstream << "invalid use of animated_image without a size[] element" << std::endl;
FieldSpec spec(
"",
L"",
L"",
258 + m_fields.size()
);
core::rect<s32> rect = core::rect<s32>(pos, pos + geom);
gui::IGUIElement *e = new GUIAnimatedImage(Environment, this, spec.fid,
rect, name, m_tsrc);
auto style = getStyleForElement("animated_image", spec.fname);
e->setNotClipped(style.getBool(StyleSpec::NOCLIP, false));
e->drop();
m_fields.push_back(spec);
}
void GUIFormSpecMenu::parseItemImage(parserData* data, const std::string &element)
{
std::vector<std::string> parts = split(element,';');
@ -2500,6 +2553,11 @@ void GUIFormSpecMenu::parseElement(parserData* data, const std::string &element)
return;
}
if (type == "animated_image") {
parseAnimatedImage(data, description);
return;
}
if (type == "item_image") {
parseItemImage(data, description);
return;