bool Gui::LoadMenu(const GameFile & a_menuFile, const DataPack * a_dataPack) { // Load the menu file Widget * createdMenu = NULL; if (a_menuFile.IsLoaded()) { // Create a new widget and copy properties from file if (GameFile::Object * menuObject = a_menuFile.FindObject("menu")) { if (GameFile::Property * nameProp = menuObject->FindProperty("name")) { createdMenu = new Widget(); createdMenu->SetName(a_menuFile.GetString("menu", "name")); if (a_dataPack == NULL || !a_dataPack->IsLoaded()) { char menuFilePath[StringUtils::s_maxCharsPerLine]; sprintf(menuFilePath, "%s%s.mnu", m_guiPath, createdMenu->GetName()); createdMenu->SetFilePath(menuFilePath); } createdMenu->SetActive(false); // TODO Support for non fullscreen menus createdMenu->SetSize(Vector2(2.0f, 2.0f)); createdMenu->SetDrawPos(Vector2(-1.0, 1.0)); // Load child elements of the menu LinkedListNode<GameFile::Object> * childWidget = menuObject->GetChildren(); while (childWidget != NULL) { GameFile::Object * curObject = childWidget->GetData(); Widget * newChild = CreateWidget(curObject, createdMenu); // If not specified in the file, align child widgets to the parent menu if (!newChild->HasAlignTo()) { newChild->SetAlignTo(createdMenu); } childWidget = childWidget->GetNext(); } // Add to list of menus m_menus.InsertNew(createdMenu); } else // No properties present { Log::Get().Write(LogLevel::Error, LogCategory::Engine, "Error loading menu file %s, menu does not have a name property.", a_menuFile); } // Set the active menu to the last menu with the begin loaded property if (createdMenu != NULL && menuObject->FindProperty("beginLoaded")) { if (menuObject->FindProperty("beginLoaded")->GetBool()) { m_startupMenu = createdMenu; } } } else // Unexpected file format, no root element { Log::Get().Write(LogLevel::Error, LogCategory::Engine, "Error loading menu file %s, no valid menu parent element.", a_menuFile); } return true; } return false; }