diff --git a/src/frontend/menu.cpp b/src/frontend/menu.cpp index f2c8ae31..cb4dc7f3 100644 --- a/src/frontend/menu.cpp +++ b/src/frontend/menu.cpp @@ -2,6 +2,7 @@ #include "locale.hpp" #include "UiDocument.hpp" +#include "screens/MenuScreen.hpp" #include "../delegates.hpp" #include "../engine.hpp" @@ -72,6 +73,39 @@ gui::page_loader_func menus::create_page_loader(Engine* engine) { }; } +bool menus::call(Engine* engine, runnable func) { + try { + func(); + return true; + } catch (const contentpack_error& error) { + engine->setScreen(std::make_shared(engine)); + // could not to find or read pack + guiutil::alert( + engine->getGUI(), langs::get(L"error.pack-not-found")+L": "+ + util::str2wstr_utf8(error.getPackId()) + ); + return false; + } catch (const assetload::error& error) { + engine->setScreen(std::make_shared(engine)); + guiutil::alert( + engine->getGUI(), langs::get(L"Assets Load Error", L"menu")+L":\n"+ + util::str2wstr_utf8(error.what()) + ); + return false; + } catch (const parsing_error& error) { + engine->setScreen(std::make_shared(engine)); + guiutil::alert(engine->getGUI(), util::str2wstr_utf8(error.errorLog())); + return false; + } catch (const std::runtime_error& error) { + engine->setScreen(std::make_shared(engine)); + guiutil::alert( + engine->getGUI(), langs::get(L"Content Error", L"menu")+L":\n"+ + util::str2wstr_utf8(error.what()) + ); + return false; + } +} + UiDocument* menus::show(Engine* engine, const std::string& name, std::vector args) { auto menu = engine->getGUI()->getMenu(); auto file = engine->getResPaths()->find("layouts/"+name+".xml"); diff --git a/src/frontend/menu.hpp b/src/frontend/menu.hpp index 2ef77c5a..4bc5e4ea 100644 --- a/src/frontend/menu.hpp +++ b/src/frontend/menu.hpp @@ -26,6 +26,8 @@ namespace menus { ); void show_process_panel(Engine* engine, const std::shared_ptr& task, const std::wstring& text=L""); + + bool call(Engine* engine, runnable func); } #endif // FRONTEND_MENU_MENU_HPP_ diff --git a/src/logic/EngineController.cpp b/src/logic/EngineController.cpp index 27874a78..2ea9296c 100644 --- a/src/logic/EngineController.cpp +++ b/src/logic/EngineController.cpp @@ -85,37 +85,9 @@ static void show_content_missing( } static bool loadWorldContent(Engine* engine, const fs::path& folder) { - // TODO: combine errors handling with newWorld - try { + return menus::call(engine, [engine, folder]() { engine->loadWorldContent(folder); - return true; - } catch (const contentpack_error& error) { - engine->setScreen(std::make_shared(engine)); - // could not to find or read pack - guiutil::alert( - engine->getGUI(), langs::get(L"error.pack-not-found")+L": "+ - util::str2wstr_utf8(error.getPackId()) - ); - return false; - } catch (const assetload::error& error) { - engine->setScreen(std::make_shared(engine)); - guiutil::alert( - engine->getGUI(), langs::get(L"Assets Load Error", L"menu")+L":\n"+ - util::str2wstr_utf8(error.what()) - ); - return false; - } catch (const parsing_error& error) { - engine->setScreen(std::make_shared(engine)); - guiutil::alert(engine->getGUI(), util::str2wstr_utf8(error.errorLog())); - return false; - } catch (const std::runtime_error& error) { - engine->setScreen(std::make_shared(engine)); - guiutil::alert( - engine->getGUI(), langs::get(L"Content Error", L"menu")+L":\n"+ - util::str2wstr_utf8(error.what()) - ); - return false; - } + }); } static void loadWorld(Engine* engine, const fs::path& folder) { @@ -188,40 +160,13 @@ void EngineController::createWorld( EnginePaths* paths = engine->getPaths(); auto folder = paths->getWorldsFolder()/fs::u8path(name); - try { + + if (!menus::call(engine, [this, paths, folder]() { engine->loadContent(); paths->setWorldFolder(folder); - } catch (const contentpack_error& error) { - guiutil::alert( - engine->getGUI(), - langs::get(L"Content Error", L"menu")+L":\n"+ - util::str2wstr_utf8( - std::string(error.what())+ - "\npack '"+error.getPackId()+"' from "+ - error.getFolder().u8string() - ) - ); - return; - } catch (const assetload::error& error) { - guiutil::alert( - engine->getGUI(), - langs::get(L"Assets Loading Error", L"menu")+ - L":\n"+util::str2wstr_utf8(error.what()) - ); - return; - } catch (const parsing_error& error) { - engine->setScreen(std::make_shared(engine)); - guiutil::alert(engine->getGUI(), util::str2wstr_utf8(error.errorLog())); - return; - } catch (const std::runtime_error& error) { - engine->setScreen(std::make_shared(engine)); - guiutil::alert( - engine->getGUI(), langs::get(L"Content Error", L"menu")+L":\n"+ - util::str2wstr_utf8(error.what()) - ); + })) { return; } - auto level = World::create( name, generatorID, folder, seed, engine->getSettings(),