// *************************************************************************** void CEncyclopediaManager::rebuildAlbumList() { CInterfaceManager *pIM = CInterfaceManager::getInstance(); STRING_MANAGER::CStringManagerClient *pSMC = STRING_MANAGER::CStringManagerClient::instance(); CGroupTree *pTree = dynamic_cast<CGroupTree*>(pIM->getElementFromId(LIST_ENCY_ALBUM)); nlassert(pTree != NULL); CGroupTree::SNode *pRoot = new CGroupTree::SNode; ucstring res; // Add all albums for (uint32 i = 0; i < _Albums.size(); ++i) { CGroupTree::SNode *pAlb = new CGroupTree::SNode; pAlb->Id = "a_" + toString(i); pAlb->AHName = "ency_click_album"; pAlb->AHParams = toString(_Albums[i].Name); if (_Albums[i].Name == _AlbumNameSelected) pAlb->Opened = true; if (pSMC->getDynString(_Albums[i].Name, res)) pAlb->Text = res; else nlwarning("try to construct album without name"); // Add all themas for (uint32 j = 0; j < _Albums[i].Themas.size(); ++j) { CGroupTree::SNode *pThm = new CGroupTree::SNode; pThm->Id = "t_" + toString(i) + "_" + toString(j); pThm->AHName = "ency_click_thema"; pThm->AHParams = toString(_Albums[i].Themas[j].Name); if (pSMC->getDynString(_Albums[i].Themas[j].Name, res)) pThm->Text = res; else nlwarning("try to construct thema without name"); pAlb->addChild(pThm); } pRoot->addChild(pAlb); } pTree->setRootNode(pRoot); // if previously selected album if ((_AlbumNameSelected != 0) && (_ThemaNameSelected == 0)) { for (uint32 i = 0; i < _Albums.size(); ++i) { if (_Albums[i].Name == _AlbumNameSelected) { pTree->selectNodeById("a_" + toString(i)); break; } } } // if previously selected thema if ((_AlbumNameSelected != 0) && (_ThemaNameSelected != 0)) { for (uint32 i = 0; i < _Albums.size(); ++i) { if (_Albums[i].Name == _AlbumNameSelected) { for (uint32 j = 0; j < _Albums[i].Themas.size(); ++j) { if (_Albums[i].Themas[j].Name == _ThemaNameSelected) { pTree->selectNodeById("t_" + toString(i) + "_" + toString(j)); break; } } } } } }
void CGroupPhraseSkillFilter::rebuild() { CInterfaceManager *pIM = CInterfaceManager::getInstance(); CSkillManager *pSM = CSkillManager::getInstance(); // get the tree if (_Tree == NULL) { _Tree = dynamic_cast<CGroupTree*>(CWidgetManager::getInstance()->getElementFromId(getId(),"sbtree:tree_list")); if (_Tree == NULL) { nlwarning("cant find tree"); return; } } // **** Bkup old tree state // get the old skill selected string oldSkillId= _Tree->getSelectedNodeId(); // Backup for each skill the Opened State, to keep it after rebuild bool skillOpened[SKILLS::NUM_SKILLS]; memset(skillOpened, 0, SKILLS::NUM_SKILLS * sizeof(bool)); bkupSkillOpenedStateRecurs(skillOpened, _Tree->getRootNode()); // **** Build the new Skill Tree // clean all _Tree->removeAll(); // Construct the snode hierarchy structure CGroupTree::SNode *pRoot = new CGroupTree::SNode; vector<CGroupTree::SNode*> allNodes; allNodes.resize(SKILLS::NUM_SKILLS, NULL); bool bQuit = false; uint nCounter = 0; // local variable (avoid realloc in loop) vector< pair<string, string> > tempVec(2); ucstring sSkillName; string sDBNameSkillValue; // Build the hierarchy while ((!bQuit) && (nCounter < 32)) // Counter is used to not infinitly loop { nCounter++; bQuit = true; // Try to create a skill for (uint32 i = 0; i < SKILLS::NUM_SKILLS; ++i) if (allNodes[i] == NULL) // not already created { if (pSM->isUnknown((SKILLS::ESkills)i)) continue; // if no bricks use this skill, skip if (!_BrickSkillUsage[i]) continue; // Can create if we can obtain its parent (if it get a parent) if (pSM->getParent((SKILLS::ESkills)i) != SKILLS::unknown) { if (allNodes[pSM->getParent((SKILLS::ESkills)i)] == NULL) { bQuit = false; continue; } } // Ok lets create it CGroupTree::SNode *pNode = new CGroupTree::SNode; pNode->Id = NLMISC::toString(i); // just text pNode->DisplayText = true; pNode->Template = NULL; pNode->Text= STRING_MANAGER::CStringManagerClient::getSkillLocalizedName((SKILLS::ESkills)i);; // Action handler? if(!_AHCtrlNode.empty()) { pNode->AHName= _AHCtrlNode; pNode->AHParams= NLMISC::toString(i); } // Opened? pNode->Opened= skillOpened[i]; // bkup allNodes[i] = pNode; // Attach to the good parent if (pSM->getParent((SKILLS::ESkills)i) == SKILLS::unknown) pRoot->addChild(pNode); else allNodes[pSM->getParent((SKILLS::ESkills)i)]->addChild(pNode); } } // Sort the First level in this order: Combat/Magic/Craft/Forage/Others. vector<CSortNode> sortNodes; sortNodes.resize(pRoot->Children.size()); uint i; for(i=0;i<pRoot->Children.size();i++) { sortNodes[i].Node= pRoot->Children[i]; // get the skill value of this node sint skillValue; fromString(pRoot->Children[i]->Id, skillValue); // Special sort: if(skillValue==SKILLS::SF) skillValue= -4; if(skillValue==SKILLS::SM) skillValue= -3; if(skillValue==SKILLS::SC) skillValue= -2; if(skillValue==SKILLS::SH) skillValue= -1; // prepare tri sortNodes[i].Value= skillValue; } sort(sortNodes.begin(), sortNodes.end()); // store sorted values for(i=0;i<pRoot->Children.size();i++) { pRoot->Children[i]= sortNodes[i].Node; } // Add a special Fitler at root for No filter (All) { // Ok lets create it CGroupTree::SNode *pNode = new CGroupTree::SNode; pNode->Id = NodeIdNoFilter; // just text pNode->DisplayText = true; pNode->Template = NULL; pNode->Text= CI18N::get("uiPhraseNoFilter"); // Action handler? if(!_AHCtrlNode.empty()) { pNode->AHName= _AHCtrlNode; pNode->AHParams= NLMISC::toString((uint32)SKILLS::unknown); } // No sons. pNode->Opened= false; // Append front pRoot->addChildFront(pNode); } // Add a special Fitler at root for Special Powers Phrases (because they don't use skill) { // Ok lets create it CGroupTree::SNode *pNode = new CGroupTree::SNode; pNode->Id = NodeIdSpecialPower; // just text pNode->DisplayText = true; pNode->Template = NULL; pNode->Text= CI18N::get("uiSpecialPowerFilter"); // Action handler? if(!_AHCtrlNode.empty()) { pNode->AHName= _AHCtrlNode; pNode->AHParams= "bt=" + BRICK_TYPE::toString(BRICK_TYPE::SPECIAL_POWER); } // No sons. pNode->Opened= false; pRoot->addChild(pNode); } // Setup the Ctrl Tree _Tree->setRootNode (pRoot); // **** Reset old Tree state. // Select node by its id setuped before. if(!_Tree->selectNodeById(oldSkillId)) // if some error (none selected before...), select line 0: All. _Tree->selectLine(0); invalidateCoords(); _MustRebuild = false; }