// static void LLViewerAttachMenu::populateMenus(const std::string& attach_to_menu_name, const std::string& attach_to_hud_menu_name) { // *TODO: share this code with other similar menus // (inventory panel context menu, in-world object menu). if (attach_to_menu_name.empty() || attach_to_hud_menu_name.empty() || !isAgentAvatarValid()) return; LLContextMenu* attach_menu = gMenuHolder->getChild<LLContextMenu>(attach_to_menu_name); LLContextMenu* attach_hud_menu = gMenuHolder->getChild<LLContextMenu>(attach_to_hud_menu_name); if (!attach_menu || attach_menu->getChildCount() != 0 || !attach_hud_menu || attach_hud_menu->getChildCount() != 0) { return; } // Populate "Attach to..." / "Attach to HUD..." submenus. for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); iter != gAgentAvatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; LLMenuItemCallGL::Params p; std::string submenu_name = attachment->getName(); std::string translated_submenu_name; if (LLTrans::findString(translated_submenu_name, submenu_name)) { p.name = (" ") + translated_submenu_name + " "; } else { p.name = submenu_name; } LLSD cbparams; cbparams["index"] = curiter->first; cbparams["label"] = p.name; p.on_click.function_name = "Object.Attach"; p.on_click.parameter = LLSD(attachment->getName()); p.on_enable.function_name = "Attachment.Label"; p.on_enable.parameter = cbparams; LLMenuItemCallGL* item = LLUICtrlFactory::create<LLMenuItemCallGL>(p); LLView* parent_menu = attachment->getIsHUDAttachment() ? attach_hud_menu : attach_menu; parent_menu->addChild(item); } }
void LLMakeOutfitDialog::getIncludedItems(LLInventoryModel::item_array_t& item_list) { LLInventoryModel::cat_array_t *cats; LLInventoryModel::item_array_t *items; gInventory.getDirectDescendentsOf(LLAppearanceMgr::instance().getCOF(), cats, items); for (LLInventoryModel::item_array_t::const_iterator iter = items->begin(); iter != items->end(); ++iter) { LLViewerInventoryItem* item = (*iter); if (!item) continue; if (item->isWearableType()) { LLWearableType::EType type = item->getWearableType(); if (type < LLWearableType::WT_COUNT && childGetValue(mCheckBoxList[type].first).asBoolean()) { item_list.push_back(item); } } else { LLViewerJointAttachment* attachment = gAgentAvatarp->getWornAttachmentPoint(item->getLinkedUUID()); if (attachment && childGetValue(std::string("checkbox_")+attachment->getName()).asBoolean()) { item_list.push_back(item); } } } }
LLMakeOutfitDialog::LLMakeOutfitDialog(bool modal) : LLModalDialog(LLStringUtil::null, 515, 510, modal) { LLUICtrlFactory::getInstance()->buildFloater(this, "floater_new_outfit_dialog.xml"); setCanClose(!modal); setCanMinimize(!modal); // Build list of check boxes for (S32 i = 0; i < LLWearableType::WT_COUNT; i++) { std::string name = std::string("checkbox_") + LLWearableType::getTypeLabel((LLWearableType::EType)i); mCheckBoxList.push_back(std::make_pair(name, i)); // Hide undergarments from teens if (gAgent.isTeen() && ((LLWearableType::WT_UNDERSHIRT == (LLWearableType::EType)i) || (LLWearableType::WT_UNDERPANTS == (LLWearableType::EType)i))) { childSetVisible(name, false); // Lest they know what's beyond their reach. } else { bool enabled = gAgentWearables.getWearableCount((LLWearableType::EType)i); // TODO: MULTI-WEARABLE bool selected = enabled && (LLWearableType::WT_SHIRT <= i); // only select clothing by default childSetEnabled(name, enabled); childSetValue(name, selected); } } // NOTE: .xml needs to be updated if attachments are added or their names are changed! LLVOAvatar* avatar = gAgentAvatarp; if (avatar) { for (LLVOAvatar::attachment_map_t::iterator iter = avatar->mAttachmentPoints.begin(); iter != avatar->mAttachmentPoints.end();) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; S32 attachment_pt = curiter->first; bool object_attached = (attachment->getNumObjects() > 0); std::string name = std::string("checkbox_") + attachment->getName(); mCheckBoxList.push_back(std::make_pair(name, attachment_pt)); childSetEnabled(name, object_attached); } } if (!gHippoGridManager->getConnectedGrid()->supportsInvLinks()) { childSetEnabled("checkbox_use_links", false); childSetValue("checkbox_use_links", false); childSetEnabled("checkbox_use_outfits", false); childSetValue("checkbox_use_outfits", false); } getChild<LLUICtrl>("Save")->setCommitCallback(boost::bind(&LLMakeOutfitDialog::onSave, this)); getChild<LLUICtrl>("Cancel")->setCommitCallback(boost::bind(&LLMakeOutfitDialog::close, this, _1)); getChild<LLUICtrl>("Check All")->setCommitCallback(boost::bind(&LLMakeOutfitDialog::onCheckAll, this, true)); getChild<LLUICtrl>("Uncheck All")->setCommitCallback(boost::bind(&LLMakeOutfitDialog::onCheckAll, this, false)); getChild<LLUICtrl>("checkbox_use_outfits")->setCommitCallback(boost::bind(&LLMakeOutfitDialog::refresh, this)); startModal(); }
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { LLInventoryPanel *panel = mPtr; LLFolderView* folder = panel->getRootFolder(); if(!folder) return true; std::set<LLUUID> selected_items = folder->getSelectionList(); LLUUID id = *selected_items.begin(); std::string joint_name = userdata.asString(); LLViewerJointAttachment* attachmentp = NULL; for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); iter != gAgentAvatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; if (attachment->getName() == joint_name) { attachmentp = attachment; break; } } if (!attachmentp) { return true; } if (LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getLinkedItem(id)) { if(gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) { rez_attachment(item, attachmentp); // don't replace if called from an "Attach To..." menu } else if(item->isFinished()) { // must be in library. copy it to our inventory and put it on. // LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(&rez_attachment_cb, _1, attachmentp)); // [SL:KB] - Patch: Appearance-DnDWear | Checked: 2013-02-04 (Catznip-3.4) LLPointer<LLInventoryCallback> cb = new LLBoostFuncInventoryCallback(boost::bind(&rez_attachment_cb, _1, attachmentp, false)); // [/SL;KB] copy_inventory_item( gAgentID, item->getPermissions().getOwner(), item->getUUID(), LLUUID::null, std::string(), cb); } } gFocusMgr.setKeyboardFocus(NULL); return true; }
bool handleEvent(LLPointer<LLEvent> event, const LLSD& userdata) { LLInventoryPanel *panel = mPtr; LLFolderView* folder = panel->getRootFolder(); if(!folder) return true; std::set<LLUUID> selected_items; folder->getSelectionList(selected_items); LLUUID id = *selected_items.begin(); std::string joint_name = userdata.asString(); LLVOAvatar *avatarp = gAgent.getAvatarObject(); LLViewerJointAttachment* attachmentp = NULL; for (LLVOAvatar::attachment_map_t::iterator iter = avatarp->mAttachmentPoints.begin(); iter != avatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; if (attachment->getName() == joint_name) { attachmentp = attachment; break; } } if (attachmentp == NULL) { return true; } LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getItem(id); if(item && gInventory.isObjectDescendentOf(id, gAgent.getInventoryRootID())) { rez_attachment(item, attachmentp); } else if(item && item->isComplete()) { // must be in library. copy it to our inventory and put it on. LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); copy_inventory_item( gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), LLUUID::null, std::string(), cb); } gFocusMgr.setKeyboardFocus(NULL); return true; }
// static void LLViewerAttachMenu::attachObjects(const uuid_vec_t& items, const std::string& joint_name) { LLViewerJointAttachment* attachmentp = NULL; for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); iter != gAgentAvatarp->mAttachmentPoints.end(); ) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; if (attachment->getName() == joint_name) { attachmentp = attachment; break; } } if (attachmentp == NULL) { return; } for (uuid_vec_t::const_iterator it = items.begin(); it != items.end(); ++it) { const LLUUID &id = *it; LLViewerInventoryItem* item = (LLViewerInventoryItem*)gInventory.getLinkedItem(id); if(item && gInventory.isObjectDescendentOf(id, gInventory.getRootFolderID())) { rez_attachment(item, attachmentp); // don't replace if called from an "Attach To..." menu } else if(item && item->isFinished()) { // must be in library. copy it to our inventory and put it on. LLPointer<LLInventoryCallback> cb = new RezAttachmentCallback(attachmentp); copy_inventory_item(gAgent.getID(), item->getPermissions().getOwner(), item->getUUID(), LLUUID::null, std::string(), cb); } } }