From 88d43af276a4ed85500863b427bf370d8eca2095 Mon Sep 17 00:00:00 2001 From: sapier Date: Sun, 7 Jul 2013 15:53:40 -0400 Subject: Fix many formspec menu bugs --- src/defaultsettings.cpp | 2 +- src/environment.cpp | 2 +- src/guiEngine.cpp | 2 +- src/guiFormSpecMenu.cpp | 132 +++++++++++++++++++++++++++++++++++------------- src/guiFormSpecMenu.h | 11 +++- src/itemdef.cpp | 2 +- src/mapblock_mesh.cpp | 3 +- src/shader.cpp | 12 ++--- 8 files changed, 117 insertions(+), 49 deletions(-) (limited to 'src') 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 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(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 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 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; igotText(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 listbox_selections; } parserData; + typedef struct { + bool key_up; + bool key_down; + bool key_enter; + bool key_escape; + } fs_key_pendig; + std::vector 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 -- cgit v1.2.3