summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorsapier <Sapier at GMX dot net>2013-07-07 15:53:40 -0400
committerkwolekr <kwolekr@minetest.net>2013-07-07 19:49:52 -0400
commit88d43af276a4ed85500863b427bf370d8eca2095 (patch)
treed02fe1196639c48ad14bc4cfc6c5d621015488bf /src
parent7e73b7cae9faf203e369dc5cf2b85cff6e6efbad (diff)
downloadminetest-88d43af276a4ed85500863b427bf370d8eca2095.tar.gz
minetest-88d43af276a4ed85500863b427bf370d8eca2095.tar.bz2
minetest-88d43af276a4ed85500863b427bf370d8eca2095.zip
Fix many formspec menu bugs
Diffstat (limited to 'src')
-rw-r--r--src/defaultsettings.cpp2
-rw-r--r--src/environment.cpp2
-rw-r--r--src/guiEngine.cpp2
-rw-r--r--src/guiFormSpecMenu.cpp132
-rw-r--r--src/guiFormSpecMenu.h11
-rw-r--r--src/itemdef.cpp2
-rw-r--r--src/mapblock_mesh.cpp3
-rw-r--r--src/shader.cpp12
8 files changed, 117 insertions, 49 deletions
diff --git a/src/defaultsettings.cpp b/src/defaultsettings.cpp
index 101eb35a4..b6ee5e71c 100644
--- a/src/defaultsettings.cpp
+++ b/src/defaultsettings.cpp
@@ -126,8 +126,8 @@ void set_default_settings(Settings *settings)
settings->setDefault("bilinear_filter", "false");
settings->setDefault("trilinear_filter", "false");
settings->setDefault("preload_item_visuals", "true");
- settings->setDefault("enable_shaders", "2");
settings->setDefault("enable_bumpmapping", "false");
+ settings->setDefault("enable_shaders", "true");
settings->setDefault("repeat_rightclick_time", "0.25");
settings->setDefault("enable_particles", "true");
diff --git a/src/environment.cpp b/src/environment.cpp
index 21a6258b7..cd8783984 100644
--- a/src/environment.cpp
+++ b/src/environment.cpp
@@ -204,7 +204,7 @@ void Environment::printPlayers(std::ostream &o)
u32 Environment::getDayNightRatio()
{
- bool smooth = (g_settings->getS32("enable_shaders") != 0);
+ bool smooth = g_settings->getBool("enable_shaders");
return time_to_daynight_ratio(m_time_of_day_f*24000, smooth);
}
diff --git a/src/guiEngine.cpp b/src/guiEngine.cpp
index 2c5000d8b..f3b3a6845 100644
--- a/src/guiEngine.cpp
+++ b/src/guiEngine.cpp
@@ -182,7 +182,7 @@ GUIEngine::GUIEngine( irr::IrrlichtDevice* dev,
errorstream
<< "GUIEngine::GUIEngine unable to load builtin menu"
<< std::endl;
- return;
+ assert("no future without mainmenu" == 0);
}
}
diff --git a/src/guiFormSpecMenu.cpp b/src/guiFormSpecMenu.cpp
index 994730619..abe519798 100644
--- a/src/guiFormSpecMenu.cpp
+++ b/src/guiFormSpecMenu.cpp
@@ -171,6 +171,10 @@ GUIFormSpecMenu::GUIFormSpecMenu(irr::IrrlichtDevice* dev,
m_use_gettext(false),
m_lock(false)
{
+ current_keys_pending.key_down = false;
+ current_keys_pending.key_up = false;
+ current_keys_pending.key_enter = false;
+
}
GUIFormSpecMenu::~GUIFormSpecMenu()
@@ -243,28 +247,25 @@ std::vector<std::string> split(const std::string &s, char delim, bool escape=fal
else {
std::string current = "";
current += s.c_str()[0];
- bool last_was_delim = false;
+ bool last_was_escape = false;
for(unsigned int i=1; i < s.size(); i++) {
- if (last_was_delim) {
+ if (last_was_escape) {
+ current += '\\';
+ current += s.c_str()[i];
+ last_was_escape = false;
+ }
+ else {
if (s.c_str()[i] == delim) {
- current += s.c_str()[i];
- last_was_delim = false;
- }
- else {
tokens.push_back(current);
-
current = "";
- current += s.c_str()[i];
- last_was_delim = false;
+ last_was_escape = false;
}
- }
- else {
- if (s.c_str()[i] == delim) {
- last_was_delim = true;
+ else if (s.c_str()[i] == '\\'){
+ last_was_escape = true;
}
else {
- last_was_delim = false;
current += s.c_str()[i];
+ last_was_escape = false;
}
}
}
@@ -659,32 +660,34 @@ void GUIFormSpecMenu::parseTextList(parserData* data,std::string element) {
for (unsigned int i=0; i < items.size(); i++) {
if (items[i].c_str()[0] == '#') {
if (items[i].c_str()[1] == '#') {
- e->addItem(narrow_to_wide(items[i]).c_str() +1);
+ e->addItem(narrow_to_wide(unescape_string(items[i])).c_str() +1);
}
else {
- std::wstring toadd = narrow_to_wide(items[i].c_str() + 7);
std::string color = items[i].substr(1,6);
+ std::wstring toadd =
+ narrow_to_wide(unescape_string(items[i]).c_str() + 7);
+
e->addItem(toadd.c_str());
irr::video::SColor toset;
- if (parseColor(color,toset))
+ if (parseColor(color, toset))
e->setItemOverrideColor(i,toset);
}
}
else {
- e->addItem(narrow_to_wide(items[i]).c_str());
+ e->addItem(narrow_to_wide(unescape_string(items[i])).c_str());
}
}
- if (str_initial_selection != "")
- e->setSelected(stoi(str_initial_selection.c_str())-1);
-
if (data->listbox_selections.find(fname_w) != data->listbox_selections.end()) {
e->setSelected(data->listbox_selections[fname_w]);
}
+ if (str_initial_selection != "")
+ e->setSelected(stoi(str_initial_selection.c_str())-1);
+
m_listboxes.push_back(std::pair<FieldSpec,gui::IGUIListBox*>(spec,e));
m_fields.push_back(spec);
return;
@@ -1335,7 +1338,7 @@ void GUIFormSpecMenu::parseBox(parserData* data,std::string element) {
irr::video::SColor color;
- if (parseColor(color_str,color)) {
+ if (parseColor(color_str, color)) {
BoxDrawSpec spec(pos,geom,color);
m_boxes.push_back(spec);
@@ -1355,8 +1358,19 @@ void GUIFormSpecMenu::parseElement(parserData* data,std::string element) {
std::vector<std::string> parts = split(element,'[', true);
- if (parts.size() != 2)
+ // ugly workaround to keep compatibility
+ if (parts.size() > 2) {
+ if (trim(parts[0]) == "image") {
+ for (unsigned int i=2;i< parts.size(); i++) {
+ parts[1] += "[" + parts[i];
+ }
+ }
+ else { return; }
+ }
+
+ if (parts.size() < 2) {
return;
+ }
std::string type = trim(parts[0]);
std::string description = trim(parts[1]);
@@ -2010,6 +2024,26 @@ void GUIFormSpecMenu::acceptInput(int eventtype)
{
std::map<std::string, std::string> fields;
+ if (current_keys_pending.key_down) {
+ fields["key_down"] = "true";
+ current_keys_pending.key_down = false;
+ }
+
+ if (current_keys_pending.key_up) {
+ fields["key_up"] = "true";
+ current_keys_pending.key_up = false;
+ }
+
+ if (current_keys_pending.key_enter) {
+ fields["key_enter"] = "true";
+ current_keys_pending.key_enter = false;
+ }
+
+ if (current_keys_pending.key_escape) {
+ fields["key_escape"] = "true";
+ current_keys_pending.key_escape = false;
+ }
+
for(u32 i=0; i<m_fields.size(); i++)
{
const FieldSpec &s = m_fields[i];
@@ -2101,16 +2135,38 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
m_text_dst->gotText(narrow_to_wide("MenuQuit"));
return true;
}
- if(event.KeyInput.Key==KEY_RETURN && event.KeyInput.PressedDown)
- {
+ if (event.KeyInput.PressedDown &&
+ (event.KeyInput.Key==KEY_RETURN ||
+ event.KeyInput.Key==KEY_UP ||
+ event.KeyInput.Key==KEY_DOWN)
+ ) {
+
+
+ switch (event.KeyInput.Key) {
+ case KEY_RETURN:
+ if (m_allowclose) {
+ acceptInput();
+ quitMenu();
+ }
+ else
+ current_keys_pending.key_enter = true;
+ break;
+ case KEY_UP:
+ current_keys_pending.key_up = true;
+ break;
+ case KEY_DOWN:
+ current_keys_pending.key_down = true;
+ break;
+ break;
+ default:
+ //can't happen at all!
+ assert("reached a source line that can't ever been reached" == 0);
+ break;
+ }
acceptInput();
-
- if (m_allowclose)
- quitMenu();
- else
- m_text_dst->gotText(narrow_to_wide("KeyEnter"));
return true;
}
+
}
if(event.EventType==EET_MOUSE_INPUT_EVENT
&& event.MouseInput.Event != EMIE_MOUSE_MOVED)
@@ -2477,11 +2533,15 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
{
if(event.GUIEvent.Caller->getID() > 257)
{
- acceptInput();
- if (m_allowclose)
+
+ if (m_allowclose) {
+ acceptInput();
quitMenu();
- else
- m_text_dst->gotText(narrow_to_wide("EditBoxEnter"));
+ }
+ else {
+ current_keys_pending.key_enter = true;
+ acceptInput();
+ }
// quitMenu deallocates menu
return true;
}
@@ -2519,15 +2579,15 @@ bool GUIFormSpecMenu::OnEvent(const SEvent& event)
bool GUIFormSpecMenu::parseColor(std::string color, irr::video::SColor& outcolor) {
outcolor = irr::video::SColor(0,0,0,0);
- if(!string_allowed(color, "0123456789abcdefABCDEF"))
+ if (!string_allowed(color, "0123456789abcdefABCDEF"))
return false;
u32 color_value;
std::istringstream iss(color);
iss >> std::hex >> color_value;
+
outcolor = irr::video::SColor(color_value);
outcolor.setAlpha(255);
return true;
}
-
diff --git a/src/guiFormSpecMenu.h b/src/guiFormSpecMenu.h
index 60d170fda..116f7b95d 100644
--- a/src/guiFormSpecMenu.h
+++ b/src/guiFormSpecMenu.h
@@ -297,8 +297,17 @@ private:
std::map<std::wstring,int> listbox_selections;
} parserData;
+ typedef struct {
+ bool key_up;
+ bool key_down;
+ bool key_enter;
+ bool key_escape;
+ } fs_key_pendig;
+
std::vector<video::ITexture *> m_Textures;
+ fs_key_pendig current_keys_pending;
+
void parseElement(parserData* data,std::string element);
void parseSize(parserData* data,std::string element);
@@ -321,7 +330,7 @@ private:
void parseTabHeader(parserData* data,std::string element);
void parseBox(parserData* data,std::string element);
- bool parseColor(std::string color, irr::video::SColor& outcolor);
+ bool parseColor(std::string color, irr::video::SColor& outcolor);
};
class FormspecFormSource: public IFormSource
diff --git a/src/itemdef.cpp b/src/itemdef.cpp
index 238ff58c0..f692ccf55 100644
--- a/src/itemdef.cpp
+++ b/src/itemdef.cpp
@@ -389,7 +389,7 @@ public:
scene::IMesh *node_mesh = mapblock_mesh.getMesh();
assert(node_mesh);
video::SColor c(255, 255, 255, 255);
- if(g_settings->getS32("enable_shaders") != 0)
+ if(g_settings->getBool("enable_shaders"))
c = MapBlock_LightColor(255, 0xffff, decode_light(f.light_source));
setMeshColor(node_mesh, c);
diff --git a/src/mapblock_mesh.cpp b/src/mapblock_mesh.cpp
index 5e4d713b0..4386a1f13 100644
--- a/src/mapblock_mesh.cpp
+++ b/src/mapblock_mesh.cpp
@@ -1069,10 +1069,9 @@ MapBlockMesh::MapBlockMesh(MeshMakeData *data):
/*
Convert MeshCollector to SMesh
- Also store animation info
*/
- bool enable_shaders = (g_settings->getS32("enable_shaders") > 0);
bool enable_bumpmapping = g_settings->getBool("enable_bumpmapping");
+ bool enable_shaders = g_settings->getBool("enable_shaders");
video::E_MATERIAL_TYPE shadermat1 = m_gamedef->getShaderSource()->
getShader("test_shader_1").material;
video::E_MATERIAL_TYPE shadermat2 = m_gamedef->getShaderSource()->
diff --git a/src/shader.cpp b/src/shader.cpp
index 58042e651..19b8d7c9d 100644
--- a/src/shader.cpp
+++ b/src/shader.cpp
@@ -362,7 +362,7 @@ ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
Load shader programs
*/
void load_shaders(std::string name, SourceShaderCache *sourcecache,
- video::E_DRIVER_TYPE drivertype, s32 enable_shaders,
+ video::E_DRIVER_TYPE drivertype, bool enable_shaders,
std::string &vertex_program, std::string &pixel_program,
std::string &geometry_program, bool &is_highlevel);
@@ -625,8 +625,8 @@ ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
}
// 0 = off, 1 = assembly shaders only, 2 = highlevel or assembly
- s32 enable_shaders = g_settings->getS32("enable_shaders");
- if(enable_shaders <= 0)
+ bool enable_shaders = g_settings->getBool("enable_shaders");
+ if(!enable_shaders)
return shaderinfo;
video::IVideoDriver* driver = device->getVideoDriver();
@@ -748,7 +748,7 @@ ShaderInfo generate_shader(std::string name, IrrlichtDevice *device,
}
void load_shaders(std::string name, SourceShaderCache *sourcecache,
- video::E_DRIVER_TYPE drivertype, s32 enable_shaders,
+ video::E_DRIVER_TYPE drivertype, bool enable_shaders,
std::string &vertex_program, std::string &pixel_program,
std::string &geometry_program, bool &is_highlevel)
{
@@ -757,7 +757,7 @@ void load_shaders(std::string name, SourceShaderCache *sourcecache,
geometry_program = "";
is_highlevel = false;
- if(enable_shaders >= 2){
+ if(enable_shaders){
// Look for high level shaders
if(drivertype == video::EDT_DIRECT3D9){
// Direct3D 9: HLSL
@@ -778,7 +778,7 @@ void load_shaders(std::string name, SourceShaderCache *sourcecache,
}
}
- if(enable_shaders >= 1){
+ if(enable_shaders){
// Look for assembly shaders
if(drivertype == video::EDT_DIRECT3D8){
// Direct3D 8 assembly shaders