viewer#1300 Inventory favorites context menu
parent
a0b0f20777
commit
384d694aba
|
|
@ -60,6 +60,7 @@ static const std::string INV_LINKED_ID_LABEL("linked_id");
|
|||
static const std::string INV_SALE_INFO_LABEL("sale_info");
|
||||
static const std::string INV_FLAGS_LABEL("flags");
|
||||
static const std::string INV_CREATION_DATE_LABEL("created_at");
|
||||
static const std::string INV_TOGGLED_LABEL("toggled");
|
||||
|
||||
// key used by agent-inventory-service
|
||||
static const std::string INV_ASSET_TYPE_LABEL_WS("type_default");
|
||||
|
|
@ -261,9 +262,18 @@ BOOL LLInventoryObject::importLegacyStream(std::istream& input_stream)
|
|||
{
|
||||
setThumbnailUUID(LLUUID::null);
|
||||
}
|
||||
|
||||
if (metadata.has("favorite"))
|
||||
{
|
||||
setFavorite(metadata["favorite"].asBoolean());
|
||||
const LLSD& favorite = metadata["favorite"];
|
||||
if (favorite.has("toggled"))
|
||||
{
|
||||
setFavorite(favorite["toggled"].asBoolean());
|
||||
}
|
||||
else
|
||||
{
|
||||
setFavorite(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -757,9 +767,18 @@ BOOL LLInventoryItem::importLegacyStream(std::istream& input_stream)
|
|||
{
|
||||
setThumbnailUUID(LLUUID::null);
|
||||
}
|
||||
|
||||
if (metadata.has("favorite"))
|
||||
{
|
||||
setFavorite(metadata["favorite"].asBoolean());
|
||||
const LLSD& favorite = metadata["favorite"];
|
||||
if (favorite.has("toggled"))
|
||||
{
|
||||
setFavorite(favorite["toggled"].asBoolean());
|
||||
}
|
||||
else
|
||||
{
|
||||
setFavorite(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -927,7 +946,7 @@ void LLInventoryItem::asLLSD( LLSD& sd ) const
|
|||
|
||||
if (mFavorite)
|
||||
{
|
||||
sd[INV_FAVORITE_LABEL] = mFavorite;
|
||||
sd[INV_FAVORITE_LABEL] = LLSD().with(INV_TOGGLED_LABEL, mFavorite);
|
||||
}
|
||||
|
||||
U32 mask = mPermissions.getMaskBase();
|
||||
|
|
@ -972,6 +991,7 @@ bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
|
|||
|
||||
// TODO - figure out if this should be moved into the noclobber fields above
|
||||
mThumbnailUUID.setNull();
|
||||
mFavorite = false;
|
||||
|
||||
// iterate as map to avoid making unnecessary temp copies of everything
|
||||
LLSD::map_const_iterator i, end;
|
||||
|
|
@ -1019,7 +1039,12 @@ bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
|
|||
|
||||
if (i->first == INV_FAVORITE_LABEL)
|
||||
{
|
||||
mFavorite = i->second.asBoolean();
|
||||
const LLSD& favorite_map = i->second;
|
||||
const std::string w = INV_TOGGLED_LABEL;
|
||||
if (favorite_map.has(w))
|
||||
{
|
||||
mFavorite = favorite_map[w].asBoolean();
|
||||
}
|
||||
continue;
|
||||
}
|
||||
|
||||
|
|
@ -1220,7 +1245,7 @@ LLSD LLInventoryCategory::asLLSD() const
|
|||
|
||||
if (mFavorite)
|
||||
{
|
||||
sd[INV_FAVORITE_LABEL] = mFavorite;
|
||||
sd[INV_FAVORITE_LABEL] = LLSD().with(INV_TOGGLED_LABEL, mFavorite);
|
||||
}
|
||||
|
||||
return sd;
|
||||
|
|
@ -1234,13 +1259,15 @@ LLSD LLInventoryCategory::asAISCreateCatLLSD() const
|
|||
S8 type = static_cast<S8>(mPreferredType);
|
||||
sd[INV_ASSET_TYPE_LABEL_WS] = type;
|
||||
sd[INV_NAME_LABEL] = mName;
|
||||
|
||||
if (mThumbnailUUID.notNull())
|
||||
{
|
||||
sd[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID);
|
||||
}
|
||||
|
||||
if (mFavorite)
|
||||
{
|
||||
sd[INV_FAVORITE_LABEL] = mFavorite;
|
||||
sd[INV_FAVORITE_LABEL] = LLSD().with(INV_TOGGLED_LABEL, mFavorite);
|
||||
}
|
||||
|
||||
return sd;
|
||||
|
|
@ -1290,10 +1317,16 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd)
|
|||
mThumbnailUUID = sd[w];
|
||||
}
|
||||
}
|
||||
mFavorite = false;
|
||||
w = INV_FAVORITE_LABEL;
|
||||
if (sd.has(w))
|
||||
{
|
||||
mFavorite = sd[w].asBoolean();
|
||||
const LLSD& favorite_map = sd[w];
|
||||
w = INV_TOGGLED_LABEL;
|
||||
if (favorite_map.has(w))
|
||||
{
|
||||
mFavorite = favorite_map[w].asBoolean();
|
||||
}
|
||||
}
|
||||
w = INV_ASSET_TYPE_LABEL;
|
||||
if (sd.has(w))
|
||||
|
|
@ -1417,9 +1450,18 @@ BOOL LLInventoryCategory::importLegacyStream(std::istream& input_stream)
|
|||
{
|
||||
setThumbnailUUID(LLUUID::null);
|
||||
}
|
||||
|
||||
if (metadata.has("favorite"))
|
||||
{
|
||||
setFavorite(metadata["favorite"].asBoolean());
|
||||
const LLSD& favorite = metadata["favorite"];
|
||||
if (favorite.has("toggled"))
|
||||
{
|
||||
setFavorite(favorite["toggled"].asBoolean());
|
||||
}
|
||||
else
|
||||
{
|
||||
setFavorite(false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1474,7 +1516,7 @@ LLSD LLInventoryCategory::exportLLSD() const
|
|||
}
|
||||
if (mFavorite)
|
||||
{
|
||||
cat_data[INV_FAVORITE_LABEL] = mFavorite;
|
||||
cat_data[INV_FAVORITE_LABEL] = LLSD().with(INV_TOGGLED_LABEL, mFavorite);
|
||||
}
|
||||
|
||||
return cat_data;
|
||||
|
|
@ -1510,7 +1552,13 @@ bool LLInventoryCategory::importLLSD(const LLSD& cat_data)
|
|||
}
|
||||
if (cat_data.has(INV_FAVORITE_LABEL))
|
||||
{
|
||||
setFavorite(cat_data[INV_FAVORITE_LABEL].asBoolean());
|
||||
bool favorite = false;
|
||||
const LLSD& favorite_data = cat_data[INV_FAVORITE_LABEL];
|
||||
if (favorite_data.has(INV_TOGGLED_LABEL))
|
||||
{
|
||||
favorite = favorite_data[INV_ASSET_ID_LABEL].asBoolean();
|
||||
}
|
||||
setFavorite(favorite);
|
||||
}
|
||||
if (cat_data.has(INV_NAME_LABEL))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -852,7 +852,8 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
|
|||
disabled_items.push_back(std::string("Copy"));
|
||||
}
|
||||
|
||||
if (isAgentInventory() && !single_folder_root)
|
||||
bool is_agent_inventory = isAgentInventory();
|
||||
if (is_agent_inventory && !single_folder_root)
|
||||
{
|
||||
items.push_back(std::string("New folder from selected"));
|
||||
items.push_back(std::string("Subfolder Separator"));
|
||||
|
|
@ -865,6 +866,17 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
|
|||
}
|
||||
}
|
||||
|
||||
if (getIsFavorite())
|
||||
{
|
||||
items.push_back(std::string("Remove from Favorites"));
|
||||
}
|
||||
else if (is_agent_inventory
|
||||
&& gInventory.getRootFolderID() != mUUID
|
||||
&& !gInventory.isObjectDescendentOf(mUUID, gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH)))
|
||||
{
|
||||
items.push_back(std::string("Add to Favorites"));
|
||||
}
|
||||
|
||||
if (obj->getIsLinkType())
|
||||
{
|
||||
items.push_back(std::string("Find Original"));
|
||||
|
|
|
|||
|
|
@ -2344,6 +2344,26 @@ void ungroup_folder_items(const LLUUID& folder_id)
|
|||
gInventory.notifyObservers();
|
||||
}
|
||||
|
||||
void set_favorite(const LLUUID& obj_id, bool favorite)
|
||||
{
|
||||
LLInventoryObject* obj = gInventory.getObject(obj_id);
|
||||
if (obj->getIsFavorite() != favorite)
|
||||
{
|
||||
LLSD updates;
|
||||
updates["favorite"] = LLSD().with("toggled", favorite);
|
||||
LLViewerInventoryCategory* view_folder = dynamic_cast<LLViewerInventoryCategory*>(obj);
|
||||
if (view_folder)
|
||||
{
|
||||
update_inventory_category(obj_id, updates, NULL);
|
||||
}
|
||||
LLViewerInventoryItem* view_item = dynamic_cast<LLViewerInventoryItem*>(obj);
|
||||
if (view_item)
|
||||
{
|
||||
update_inventory_item(obj_id, updates, NULL);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
std::string get_searchable_description(LLInventoryModel* model, const LLUUID& item_id)
|
||||
{
|
||||
if (model)
|
||||
|
|
@ -3322,6 +3342,20 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
|
|||
ungroup_folder_items(*ids.begin());
|
||||
}
|
||||
}
|
||||
else if ("add_to_favorites" == action)
|
||||
{
|
||||
for (const LLUUID& id : ids)
|
||||
{
|
||||
set_favorite(id, true);
|
||||
}
|
||||
}
|
||||
else if ("remove_from_favorites" == action)
|
||||
{
|
||||
for (const LLUUID& id : ids)
|
||||
{
|
||||
set_favorite(id, false);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
std::set<LLFolderViewItem*>::iterator set_iter;
|
||||
|
|
|
|||
|
|
@ -114,6 +114,7 @@ bool can_move_to_my_outfits(LLInventoryModel* model, LLInventoryCategory* inv_ca
|
|||
std::string get_localized_folder_name(LLUUID cat_uuid);
|
||||
void new_folder_window(const LLUUID& folder_id);
|
||||
void ungroup_folder_items(const LLUUID& folder_id);
|
||||
void set_favorite(const LLUUID& obj_id, bool favorite);
|
||||
std::string get_searchable_description(LLInventoryModel* model, const LLUUID& item_id);
|
||||
std::string get_searchable_creator_name(LLInventoryModel* model, const LLUUID& item_id);
|
||||
std::string get_searchable_UUID(LLInventoryModel* model, const LLUUID& item_id);
|
||||
|
|
|
|||
|
|
@ -186,6 +186,20 @@ void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata)
|
|||
{
|
||||
ungroup_folder_items(mUUIDs.front());
|
||||
}
|
||||
else if ("add_to_favorites" == action)
|
||||
{
|
||||
for (const LLUUID& id : mUUIDs)
|
||||
{
|
||||
set_favorite(id, true);
|
||||
}
|
||||
}
|
||||
else if ("remove_from_favorites" == action)
|
||||
{
|
||||
for (const LLUUID& id : mUUIDs)
|
||||
{
|
||||
set_favorite(id, false);
|
||||
}
|
||||
}
|
||||
else if ("take_off" == action || "detach" == action)
|
||||
{
|
||||
for (LLUUID& selected_id : mUUIDs)
|
||||
|
|
@ -707,6 +721,15 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
|
|||
disabled_items.push_back(std::string("New Folder"));
|
||||
disabled_items.push_back(std::string("upload_def"));
|
||||
}
|
||||
|
||||
if (obj->getIsFavorite())
|
||||
{
|
||||
items.push_back(std::string("Remove from Favorites"));
|
||||
}
|
||||
else if (is_agent_inventory)
|
||||
{
|
||||
items.push_back(std::string("Add to Favorites"));
|
||||
}
|
||||
}
|
||||
|
||||
hide_context_entries(*menu, items, disabled_items);
|
||||
|
|
|
|||
|
|
@ -442,6 +442,22 @@
|
|||
function="Inventory.DoToSelected"
|
||||
parameter="ungroup_folder_items" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Add to Favorites"
|
||||
layout="topleft"
|
||||
name="Add to Favorites">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.DoToSelected"
|
||||
parameter="add_to_favorites" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Remove from Favorites"
|
||||
layout="topleft"
|
||||
name="Remove from Favorites">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.DoToSelected"
|
||||
parameter="remove_from_favorites" />
|
||||
</menu_item_call>
|
||||
<menu
|
||||
label="Use as default for"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -926,7 +926,7 @@
|
|||
function="Inventory.EnvironmentEnabled" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
</menu>
|
||||
</menu>
|
||||
<menu_item_call
|
||||
label="Create folder from selected"
|
||||
layout="topleft"
|
||||
|
|
@ -943,6 +943,22 @@
|
|||
function="Inventory.DoToSelected"
|
||||
parameter="ungroup_folder_items" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Add to Favorites"
|
||||
layout="topleft"
|
||||
name="Add to Favorites">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.DoToSelected"
|
||||
parameter="add_to_favorites" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Remove from Favorites"
|
||||
layout="topleft"
|
||||
name="Remove from Favorites">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.DoToSelected"
|
||||
parameter="remove_from_favorites" />
|
||||
</menu_item_call>
|
||||
<menu
|
||||
label="Use as default for"
|
||||
layout="topleft"
|
||||
|
|
|
|||
Loading…
Reference in New Issue