aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/guiFormSpecMenu.cpp24
-rw-r--r--src/guiFormSpecMenu.h39
2 files changed, 33 insertions, 30 deletions
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp
index 2564671a3..084a53c9d 100644
--- a/src/guiFormSpecMenu.cpp
+++ b/src/guiFormSpecMenu.cpp
@@ -637,17 +637,17 @@ void GUIFormSpecMenu::parseBackground(parserData* data,std::string element)
geom.X = stof(v_geom[0]) * (float)spacing.X;
geom.Y = stof(v_geom[1]) * (float)spacing.Y;
- if (parts.size() == 4) {
- m_clipbackground = is_yes(parts[3]);
- if (m_clipbackground) {
- pos.X = stoi(v_pos[0]); //acts as offset
- pos.Y = stoi(v_pos[1]); //acts as offset
- }
+ if (!data->explicit_size)
+ warningstream<<"invalid use of background without a size[] element"<<std::endl;
+
+ bool clip = false;
+ if (parts.size() == 4 && is_yes(parts[3])) {
+ pos.X = stoi(v_pos[0]); //acts as offset
+ pos.Y = stoi(v_pos[1]); //acts as offset
+ clip = true;
}
+ m_backgrounds.push_back(ImageDrawSpec(name, pos, geom, clip));
- if(!data->explicit_size)
- warningstream<<"invalid use of background without a size[] element"<<std::endl;
- m_backgrounds.push_back(ImageDrawSpec(name, pos, geom));
return;
}
errorstream<< "Invalid background element(" << parts.size() << "): '" << element << "'" << std::endl;
@@ -1892,7 +1892,6 @@ void GUIFormSpecMenu::regenerateGui(v2u32 screensize)
m_slotbordercolor = video::SColor(200,0,0,0);
m_slotborder = false;
- m_clipbackground = false;
// Add tooltip
{
assert(m_tooltip_element == NULL);
@@ -2344,7 +2343,7 @@ void GUIFormSpecMenu::drawMenu()
// Image rectangle on screen
core::rect<s32> rect = imgrect + spec.pos;
- if (m_clipbackground) {
+ if (spec.clip) {
core::dimension2d<s32> absrec_size = AbsoluteRect.getSize();
rect = core::rect<s32>(AbsoluteRect.UpperLeftCorner.X - spec.pos.X,
AbsoluteRect.UpperLeftCorner.Y - spec.pos.Y,
@@ -2358,8 +2357,7 @@ void GUIFormSpecMenu::drawMenu()
core::rect<s32>(core::position2d<s32>(0,0),
core::dimension2di(texture->getOriginalSize())),
NULL/*&AbsoluteClippingRect*/, colors, true);
- }
- else {
+ } else {
errorstream << "GUIFormSpecMenu::drawMenu() Draw backgrounds unable to load texture:" << std::endl;
errorstream << "\t" << spec.name << std::endl;
}
diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h
index d06aa6cf5..dbcbf126a 100644
--- a/src/guiFormSpecMenu.h
+++ b/src/guiFormSpecMenu.h
@@ -143,9 +143,10 @@ class GUIFormSpecMenu : public GUIModalMenu
struct ImageDrawSpec
{
ImageDrawSpec():
- parent_button(NULL)
- {
- }
+ parent_button(NULL),
+ clip(false)
+ {}
+
ImageDrawSpec(const std::string &a_name,
const std::string &a_item_name,
gui::IGUIButton *a_parent_button,
@@ -155,9 +156,10 @@ class GUIFormSpecMenu : public GUIModalMenu
parent_button(a_parent_button),
pos(a_pos),
geom(a_geom),
- scale(true)
- {
- }
+ scale(true),
+ clip(false)
+ {}
+
ImageDrawSpec(const std::string &a_name,
const std::string &a_item_name,
const v2s32 &a_pos, const v2s32 &a_geom):
@@ -166,32 +168,36 @@ class GUIFormSpecMenu : public GUIModalMenu
parent_button(NULL),
pos(a_pos),
geom(a_geom),
- scale(true)
- {
- }
+ scale(true),
+ clip(false)
+ {}
+
ImageDrawSpec(const std::string &a_name,
- const v2s32 &a_pos, const v2s32 &a_geom):
+ const v2s32 &a_pos, const v2s32 &a_geom, bool clip=false):
name(a_name),
parent_button(NULL),
pos(a_pos),
geom(a_geom),
- scale(true)
- {
- }
+ scale(true),
+ clip(clip)
+ {}
+
ImageDrawSpec(const std::string &a_name,
const v2s32 &a_pos):
name(a_name),
parent_button(NULL),
pos(a_pos),
- scale(false)
- {
- }
+ scale(false),
+ clip(false)
+ {}
+
std::string name;
std::string item_name;
gui::IGUIButton *parent_button;
v2s32 pos;
v2s32 geom;
bool scale;
+ bool clip;
};
struct FieldSpec
@@ -428,7 +434,6 @@ protected:
bool m_bgfullscreen;
bool m_slotborder;
- bool m_clipbackground;
video::SColor m_bgcolor;
video::SColor m_slotbg_n;
video::SColor m_slotbg_h;
special meaning. ]] local write_table, literal_to_string, escape_chars, table_is_empty function table_is_empty(t) for _,_ in pairs(t) do return false end return true end function write_table(t, file, config) local ks, vs, writeit, istable for key, value in pairs(t) do ks = value_to_string(key, false) writeit = true istable = type(value)=="table" if istable then vs = "T" if config and config.skip_empty_tables then writeit = not table_is_empty(value) end else vs = value_to_string(value, true) end if writeit then file:write(ks..":"..vs.."\n") if istable then write_table(value, file, config) file:write("E\n") end end end end function value_to_string(t) if type(t)=="table" then file:close() error("Can not serialize a table in the key position!") elseif type(t)=="boolean" then if t then return "B1" else return "B0" end elseif type(t)=="number" then return "N"..t elseif type(t)=="string" then return "S"..escape_chars(t) else --error("Can not serialize '"..type(t).."' type!") return "S<function>" end return str end function escape_chars(str) local rstr = string.gsub(str, "&", "&&") rstr = string.gsub(rstr, ":", "&:") rstr = string.gsub(rstr, "\r", "&r") rstr = string.gsub(rstr, "\n", "&n") return rstr end ------ local read_table, string_to_value, unescape_chars function read_table(t, file) local line, ks, vs, kv, vv, vt while true do line = file:read("*l") if not line then file:close() error("Unexpected EOF or read error!") end -- possibly windows fix: strip trailing \r's from line line = string.gsub(line, "\r$", "") if line=="E" then -- done with this table return end ks, vs = string.match(line, "^(.*[^&]):(.+)$") if not ks or not vs then file:close() error("Unable to parse line: '"..line.."'!") end kv = string_to_value(ks) vv, vt = string_to_value(vs, true) if vt then read_table(vv, file) end -- put read value in table t[kv] = vv end end -- returns: value, is_table function string_to_value(str, table_allow) local first = string.sub(str, 1,1) local rest = string.sub(str, 2) if first=="T" then if table_allow then return {}, true else file:close() error("Table not allowed in key component!") end elseif first=="N" then local num = tonumber(rest) if num then return num else file:close() error("Unable to parse number: '"..rest.."'!") end elseif first=="B" then if rest=="0" then return false elseif rest=="1" then return true else file:close() error("Unable to parse boolean: '"..rest.."'!") end elseif first=="S" then return unescape_chars(rest) else file:close() error("Unknown literal type '"..first.."' for literal '"..str.."'!") end end function unescape_chars(str) --TODO local rstr = string.gsub(str, "&:", ":") rstr = string.gsub(rstr, "&n", "\n") rstr = string.gsub(rstr, "&r", "\r") rstr = string.gsub(rstr, "&&", "&") return rstr end ------ --[[ config = { skip_empty_tables = false -- if true, does not store empty tables -- On next read, keys that mapped to empty tables resolve to nil } ]] -- Writes the passed table into the passed file descriptor, and closes the file local function write_to_fd(root_table, file, config) file:write("LUA_SER v=2\n") write_table(root_table, file, config) file:write("E\nEND_SER\n") file:close() end -- Reads the file contents from the passed file descriptor and returns the table on success -- Throws errors when something is wrong. Closes the file. -- config: see above local function read_from_fd(file) local first_line = file:read("*line") if not string.match(first_line, "LUA_SER v=[12]") then file:close() error("Expected header, got '"..first_line.."' instead!") end local t = {} read_table(t, file) local last_line = file:read("*line") file:close() if last_line ~= "END_SER" then error("Missing END_SER, got '"..last_line.."' instead!") end return t end -- Opens the passed filename and serializes root_table into it -- config: see above function write_to_file(root_table, filename, config) -- try opening the file local file, err = io.open(filename, "wb") if not file then error("Failed opening file '"..filename.."' for write:\n"..err) end write_to_fd(root_table, file, config) return true end -- Opens the passed filename, and returns its deserialized contents function read_from_file(filename) -- try opening the file local file, err = io.open(filename, "rb") if not file then error("Failed opening file '"..filename.."' for read:\n"..err) end return read_from_fd(file) end --[[ simple unit test local testtable = { key = "value", [1] = "eins", [true] = { a = "b", c = false, }, ["es:cape1"] = "foo:bar", ["es&ca\npe2"] = "baz&bam\nbim", ["es&&ca&\npe3"] = "baz&&bam&\nbim", ["es&:cape4"] = "foo\n:bar" } local config = {} --write_to_file(testtable, "test_out", config) local t = read_from_file("test_out") write_to_file(t, "test_out_2", config) local t2 = read_from_file("test_out_2") write_to_file(t2, "test_out_3", config) -- test_out_2 and test_out_3 should be equal --]] return { read_from_fd = read_from_fd, write_to_fd = write_to_fd, read_from_file = read_from_file, write_to_file = write_to_file, }