summaryrefslogtreecommitdiff
path: root/indra/newview/llavataractions.cpp
diff options
context:
space:
mode:
authorAlexei Arabadji <aarabadji@productengine.com>2010-06-01 14:13:56 +0300
committerAlexei Arabadji <aarabadji@productengine.com>2010-06-01 14:13:56 +0300
commitb41aa1e0b2460f917d4d6cf4ddb2d641312455b5 (patch)
tree4d9bc98ea130df687464afe30d0097817a8375c3 /indra/newview/llavataractions.cpp
parent785abfcf41b02de8ea5b82be578b0c2d80747475 (diff)
EXT-6710 FIXED Added inventory items sharing confirmation and modified alert about non-copy objects sharing.
Current behavior: * user will be prompted about sharing items regardless is it one or more items; * user will be prompted about trying to share one ore more non-copy items; * in case user tries to share non-copy items among with copy items — copy tems will be shared and user will be prompted about sharing non-copy items reviewed by Mike Antipov at https://codereview.productengine.com/secondlife/r/475/ --HG-- branch : product-engine
Diffstat (limited to 'indra/newview/llavataractions.cpp')
-rw-r--r--indra/newview/llavataractions.cpp159
1 files changed, 141 insertions, 18 deletions
diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp
index 875ed72a12..01d6c3a8d5 100644
--- a/indra/newview/llavataractions.cpp
+++ b/indra/newview/llavataractions.cpp
@@ -475,32 +475,83 @@ namespace action_give_inventory
return acceptable;
}
- /**
- * Performs "give inventory" operations for provided avatars.
- *
- * Sends one requests to give all selected inventory items for each passed avatar.
- * Avatars are represent by two vectors: names and UUIDs which must be sychronized with each other.
- *
- * @param avatar_names - avatar names request to be sent.
- * @param avatar_uuids - avatar names request to be sent.
- */
- static void give_inventory(const std::vector<std::string>& avatar_names, const uuid_vec_t& avatar_uuids)
+ static void build_residents_string(const std::vector<std::string>& avatar_names, std::string& residents_string)
{
- llassert(avatar_names.size() == avatar_uuids.size());
+ llassert(avatar_names.size() > 0);
+
+ const std::string& separator = LLTrans::getString("words_separator");
+ for (std::vector<std::string>::const_iterator it = avatar_names.begin(); ; )
+ {
+ residents_string.append(*it);
+ if (++it == avatar_names.end())
+ {
+ break;
+ }
+ residents_string.append(separator);
+ }
+ }
+
+ static void build_items_string(const uuid_set_t& inventory_selected_uuids , std::string& items_string)
+ {
+ llassert(inventory_selected_uuids.size() > 0);
+
+ const std::string& separator = LLTrans::getString("words_separator");
+ for (uuid_set_t::const_iterator it = inventory_selected_uuids.begin(); ; )
+ {
+ LLViewerInventoryCategory* inv_cat = gInventory.getCategory(*it);
+ if (NULL != inv_cat)
+ {
+ items_string = inv_cat->getName();
+ break;
+ }
+ LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
+ if (NULL != inv_item)
+ {
+ items_string.append(inv_item->getName());
+ }
+ if(++it == inventory_selected_uuids.end())
+ {
+ break;
+ }
+ items_string.append(separator);
+ }
+ }
+
+ struct LLShareInfo : public LLSingleton<LLShareInfo>
+ {
+ std::vector<std::string> mAvatarNames;
+ uuid_vec_t mAvatarUuids;
+ };
+
+ static void give_inventory_cb(const LLSD& notification, const LLSD& response)
+ {
+ S32 option = LLNotificationsUtil::getSelectedOption(notification, response);
+ // if Cancel pressed
+ if (option == 1)
+ {
+ return;
+ }
LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
- if (NULL == active_panel) return;
+ if (NULL == active_panel)
+ {
+ return;
+ }
const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
- if (inventory_selected_uuids.empty()) return;
+ if (inventory_selected_uuids.empty())
+ {
+ return;
+ }
- S32 count = llmin(avatar_names.size(), avatar_uuids.size());
+ S32 count = LLShareInfo::instance().mAvatarNames.size();
+ bool shared = false;
// iterate through avatars
for(S32 i = 0; i < count; ++i)
{
- const std::string& avatar_name = avatar_names[i];
- const LLUUID& avatar_uuid = avatar_uuids[i];
+ const std::string& avatar_name = LLShareInfo::instance().mAvatarNames[i];
+ const LLUUID& avatar_uuid = LLShareInfo::instance().mAvatarUuids[i];
// Start up IM before give the item
const LLUUID session_id = gIMMgr->addSession(avatar_name, IM_NOTHING_SPECIAL, avatar_uuid);
@@ -508,6 +559,9 @@ namespace action_give_inventory
uuid_set_t::const_iterator it = inventory_selected_uuids.begin();
const uuid_set_t::const_iterator it_end = inventory_selected_uuids.end();
+ const std::string& separator = LLTrans::getString("words_separator");
+ std::string noncopy_item_names;
+ LLSD noncopy_items = LLSD::emptyArray();
// iterate through selected inventory objects
for (; it != it_end; ++it)
{
@@ -515,12 +569,82 @@ namespace action_give_inventory
if (inv_cat)
{
LLGiveInventory::doGiveInventoryCategory(avatar_uuid, inv_cat, session_id);
+ shared = true;
break;
}
LLViewerInventoryItem* inv_item = gInventory.getItem(*it);
- LLGiveInventory::doGiveInventoryItem(avatar_uuid, inv_item, session_id);
+ if (!inv_item->getPermissions().allowCopyBy(gAgentID))
+ {
+ if (!noncopy_item_names.empty())
+ {
+ noncopy_item_names.append(separator);
+ }
+ noncopy_item_names.append(inv_item->getName());
+ noncopy_items.append(*it);
+ }
+ else
+ {
+ LLGiveInventory::doGiveInventoryItem(avatar_uuid, inv_item, session_id);
+ shared = true;
+ }
+ }
+ if (noncopy_items.beginArray() != noncopy_items.endArray())
+ {
+ LLSD substitutions;
+ substitutions["ITEMS"] = noncopy_item_names;
+ LLSD payload;
+ payload["agent_id"] = avatar_uuid;
+ payload["items"] = noncopy_items;
+ LLNotificationsUtil::add("CannotCopyWarning", substitutions, payload,
+ &LLGiveInventory::handleCopyProtectedItem);
+ break;
}
}
+ if (shared)
+ {
+ LLFloaterReg::hideInstance("avatar_picker");
+ LLNotificationsUtil::add("ItemsShared");
+ }
+ }
+
+ /**
+ * Performs "give inventory" operations for provided avatars.
+ *
+ * Sends one requests to give all selected inventory items for each passed avatar.
+ * Avatars are represent by two vectors: names and UUIDs which must be sychronized with each other.
+ *
+ * @param avatar_names - avatar names request to be sent.
+ * @param avatar_uuids - avatar names request to be sent.
+ */
+ static void give_inventory(const std::vector<std::string>& avatar_names, const uuid_vec_t& avatar_uuids)
+ {
+ llassert(avatar_names.size() == avatar_uuids.size());
+
+
+ LLInventoryPanel* active_panel = LLInventoryPanel::getActiveInventoryPanel(FALSE);
+ if (NULL == active_panel)
+ {
+ return;
+ }
+
+ const uuid_set_t inventory_selected_uuids = active_panel->getRootFolder()->getSelectionList();
+ if (inventory_selected_uuids.empty())
+ {
+ return;
+ }
+
+ std::string residents;
+ build_residents_string(avatar_names, residents);
+
+ std::string items;
+ build_items_string(inventory_selected_uuids, items);
+
+ LLSD substitutions;
+ substitutions["RESIDENTS"] = residents;
+ substitutions["ITEMS"] = items;
+ LLShareInfo::instance().mAvatarNames = avatar_names;
+ LLShareInfo::instance().mAvatarUuids = avatar_uuids;
+ LLNotificationsUtil::add("ShareItemsConfirmation", substitutions, LLSD(), &give_inventory_cb);
}
}
@@ -532,7 +656,6 @@ void LLAvatarActions::shareWithAvatars()
LLFloaterAvatarPicker* picker =
LLFloaterAvatarPicker::show(boost::bind(give_inventory, _1, _2), TRUE, FALSE);
picker->setOkBtnEnableCb(boost::bind(is_give_inventory_acceptable));
- LLNotificationsUtil::add("ShareNotification");
}
// static