mirror of
https://github.com/FirestormViewer/phoenix-firestorm.git
synced 2026-08-14 00:48:30 +00:00
Merge branch 'develop' of https://github.com/secondlife/viewer
# Conflicts: # indra/llappearance/lltexlayer.cpp # indra/newview/llinventorybridge.cpp # indra/newview/llinventorymodel.cpp # indra/newview/llinventorymodel.h # indra/newview/llpanellogin.cpp
This commit is contained in:
@@ -1431,6 +1431,12 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
||||
size_t mem_size = pixels * bytes_per_pixel;
|
||||
|
||||
alpha_data = (U8*)ll_aligned_malloc_32(mem_size);
|
||||
if (!alpha_data)
|
||||
{
|
||||
LLError::LLUserWarningMsg::showOutOfMemory();
|
||||
LL_ERRS() << "Failed to allocate memory for morph texture: " << (S32)(mem_size) << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
bool skip_readback = LLRender::sNsightDebugSupport; // nSight doesn't support use of glReadPixels
|
||||
|
||||
@@ -1440,8 +1446,8 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
||||
{ // work-around for broken intel drivers which cannot do glReadPixels on an RGBA FBO
|
||||
// returning only the alpha portion without locking up downstream
|
||||
|
||||
// <FS:ND> glGetTexImagec will copy the whole texture, which might be greater than width*height
|
||||
// Also what about the shenanigans with passing bound_target around everywhere rather than use LLRenderTarget::getCurrentBoundTarget
|
||||
// <FS:ND> glGetTexImagec will copy the whole texture, which might be greater than width*height
|
||||
// Also what about the shenanigans with passing bound_target around everywhere rather than use LLRenderTarget::getCurrentBoundTarget
|
||||
// Sometimes it also does happen that bound_target == nullptr but a render target ist bound
|
||||
//
|
||||
// U8* temp = (U8*)ll_aligned_malloc_32(mem_size << 2); // allocate same size, but RGBA
|
||||
@@ -1492,8 +1498,14 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
||||
llassert_always(y == 0);
|
||||
|
||||
// Not really needed to use aligned_malloc_32 here, but I suppose because we can and why not
|
||||
U8 *temp{ (U8*)ll_aligned_malloc_32(textureW * textureH * 4) };
|
||||
U8* temp{ (U8*)ll_aligned_malloc_32(textureW * textureH * 4) };
|
||||
// </FS:ND>
|
||||
if (!temp)
|
||||
{
|
||||
LLError::LLUserWarningMsg::showOutOfMemory();
|
||||
LL_ERRS() << "Failed to allocate temporary memory for morph texture readback: " << (S32)(mem_size << 2) << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
|
||||
glGetTexImage(LLTexUnit::getInternalType(LLTexUnit::TT_TEXTURE), 0, GL_RGBA, GL_UNSIGNED_BYTE, temp);
|
||||
GLenum error = glGetError();
|
||||
@@ -1531,6 +1543,12 @@ void LLTexLayer::renderMorphMasks(S32 x, S32 y, S32 width, S32 height, const LLC
|
||||
// We just want GL_ALPHA, but that isn't supported in OGL core profile 4.
|
||||
static const size_t TEMP_BYTES_PER_PIXEL = 4;
|
||||
U8* temp_data = (U8*)ll_aligned_malloc_32(mem_size * TEMP_BYTES_PER_PIXEL);
|
||||
if (!temp_data)
|
||||
{
|
||||
LLError::LLUserWarningMsg::showOutOfMemory();
|
||||
LL_ERRS() << "Failed to allocate temporary memory for morph texture: " << (S32)(mem_size * TEMP_BYTES_PER_PIXEL) << LL_ENDL;
|
||||
return;
|
||||
}
|
||||
glReadPixels(x, y, width, height, GL_RGBA, GL_UNSIGNED_BYTE, temp_data);
|
||||
for (size_t pixel = 0; pixel < pixels; pixel++) {
|
||||
alpha_data[pixel] = temp_data[(pixel * TEMP_BYTES_PER_PIXEL) + 3];
|
||||
|
||||
@@ -2498,7 +2498,11 @@ F32 LLFace::adjustPartialOverlapPixelArea(F32 cos_angle_to_view_dir, F32 radius
|
||||
|
||||
//the above calculation is too expensive
|
||||
//the below is a good estimation: bounding box of the bounding sphere:
|
||||
F32 alpha = 0.5f * (radius + screen_radius - d) / radius ;
|
||||
F32 alpha = 1.f;
|
||||
if (!is_approx_zero(radius)) // radius can be something like -1e-10
|
||||
{
|
||||
alpha = 0.5f * (radius + screen_radius - d) / radius;
|
||||
}
|
||||
alpha = llclamp(alpha, 0.f, 1.f) ;
|
||||
return alpha * alpha ;
|
||||
}
|
||||
|
||||
@@ -262,7 +262,7 @@ void LLFloaterEditEnvironmentBase::onSaveAsCommit(const LLSD& notification, cons
|
||||
}
|
||||
else if (mInventoryItem)
|
||||
{
|
||||
const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
LLUUID parent_id = mInventoryItem->getParentUUID();
|
||||
if (marketplacelistings_id == parent_id || gInventory.isObjectDescendentOf(mInventoryItem->getUUID(), gInventory.getLibraryRootFolderID()))
|
||||
{
|
||||
|
||||
@@ -29,6 +29,7 @@
|
||||
|
||||
#include "llfloatermarketplacelistings.h"
|
||||
|
||||
#include "llcallbacklist.h"
|
||||
#include "llfloaterreg.h"
|
||||
#include "llfiltereditor.h"
|
||||
#include "llfolderview.h"
|
||||
@@ -232,7 +233,7 @@ void LLPanelMarketplaceListings::onTabChange()
|
||||
|
||||
void LLPanelMarketplaceListings::onAddButtonClicked()
|
||||
{
|
||||
LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
LLUUID marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
llassert(marketplacelistings_id.notNull());
|
||||
LLFolderType::EType preferred_type = LLFolderType::lookup("category");
|
||||
LLHandle<LLPanel> handle = getHandle();
|
||||
@@ -352,7 +353,15 @@ public:
|
||||
|
||||
if (added_category_type == LLFolderType::FT_MARKETPLACE_LISTINGS)
|
||||
{
|
||||
mMarketplaceListingsFloater->initializeMarketPlace();
|
||||
LLHandle<LLFloater> handle = mMarketplaceListingsFloater->getHandle();
|
||||
doOnIdleOneTime([handle]()
|
||||
{
|
||||
LLFloaterMarketplaceListings* floater = (LLFloaterMarketplaceListings*)handle.get();
|
||||
if (floater)
|
||||
{
|
||||
floater->initializeMarketPlace();
|
||||
}
|
||||
});
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -416,7 +425,7 @@ bool LLFloaterMarketplaceListings::postBuild()
|
||||
// Fetch aggressively so we can interact with listings as soon as possible
|
||||
if (!fetchContents())
|
||||
{
|
||||
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
LLInventoryModelBackgroundFetch::instance().start(marketplacelistings_id, true);
|
||||
}
|
||||
|
||||
@@ -514,8 +523,6 @@ void LLFloaterMarketplaceListings::setRootFolder()
|
||||
return;
|
||||
}
|
||||
|
||||
mRootFolderCreating = false;
|
||||
|
||||
// No longer need to observe new category creation
|
||||
if (mCategoryAddedObserver && gInventory.containsObserver(mCategoryAddedObserver))
|
||||
{
|
||||
@@ -525,6 +532,8 @@ void LLFloaterMarketplaceListings::setRootFolder()
|
||||
}
|
||||
llassert(!mCategoryAddedObserver);
|
||||
|
||||
mRootFolderCreating = false;
|
||||
|
||||
if (marketplacelistings_id == mRootFolderId)
|
||||
{
|
||||
LL_WARNS("SLM") << "Inventory warning: Marketplace listings folder already set" << LL_ENDL;
|
||||
@@ -567,7 +576,8 @@ void LLFloaterMarketplaceListings::setPanels()
|
||||
|
||||
void LLFloaterMarketplaceListings::initializeMarketPlace()
|
||||
{
|
||||
LLMarketplaceData::instance().initializeSLM(boost::bind(&LLFloaterMarketplaceListings::updateView, this));
|
||||
if (!mRootFolderCreating)
|
||||
LLMarketplaceData::instance().initializeSLM(boost::bind(&LLFloaterMarketplaceListings::updateView, this));
|
||||
}
|
||||
|
||||
S32 LLFloaterMarketplaceListings::getFolderCount()
|
||||
@@ -923,7 +933,7 @@ void LLFloaterMarketplaceValidation::onOpen(const LLSD& key)
|
||||
LLUUID cat_id(key.asUUID());
|
||||
if (cat_id.isNull())
|
||||
{
|
||||
cat_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
cat_id = gInventory.getMarketplaceListingsUUID();
|
||||
}
|
||||
|
||||
// Validates the folder
|
||||
|
||||
@@ -699,7 +699,8 @@ bool LLFloaterPreference::postBuild()
|
||||
getChild<LLUICtrl>("FSSoundCacheLocation")->setEnabled(false);
|
||||
// </FS:Ansariel>
|
||||
|
||||
getChild<LLComboBox>("language_combobox")->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this));
|
||||
mLanguageCombobox = getChild<LLComboBox>("language_combobox");
|
||||
mLanguageCombobox->setCommitCallback(boost::bind(&LLFloaterPreference::onLanguageChange, this));
|
||||
mTimeFormatCombobox = getChild<LLComboBox>("time_format_combobox");
|
||||
mTimeFormatCombobox->setCommitCallback(boost::bind(&LLFloaterPreference::onTimeFormatChange, this));
|
||||
|
||||
@@ -752,18 +753,18 @@ bool LLFloaterPreference::postBuild()
|
||||
std::map<std::string, std::string>::iterator iter = labels.find(system_lang);
|
||||
if (iter != labels.end())
|
||||
{
|
||||
getChild<LLComboBox>("language_combobox")->add(iter->second, LLSD("default"), ADD_TOP, true);
|
||||
mLanguageCombobox->add(iter->second, LLSD("default"), ADD_TOP, true);
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Language \"" << system_lang << "\" is not in default_languages.xml" << LL_ENDL;
|
||||
getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true);
|
||||
mLanguageCombobox->add("System default", LLSD("default"), ADD_TOP, true);
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
LL_WARNS() << "Failed to load labels from " << user_filename << ". Using default." << LL_ENDL;
|
||||
getChild<LLComboBox>("language_combobox")->add("System default", LLSD("default"), ADD_TOP, true);
|
||||
mLanguageCombobox->add("System default", LLSD("default"), ADD_TOP, true);
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Prefer FS-specific Discord implementation
|
||||
@@ -2394,6 +2395,12 @@ void LLFloaterPreference::refresh()
|
||||
updateClickActionViews();
|
||||
|
||||
mTimeFormatCombobox->selectByValue(gSavedSettings.getBOOL("Use24HourClock") ? "1" : "0");
|
||||
|
||||
std::string current_language = gSavedSettings.getString("Language");
|
||||
if (current_language != "default" && !current_language.empty())
|
||||
{
|
||||
mLanguageCombobox->selectByValue(LLSD(current_language));
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onCommitWindowedMode()
|
||||
|
||||
@@ -333,6 +333,7 @@ private:
|
||||
LLButton* mEnablePopupBtn = nullptr;
|
||||
LLButton* mDisablePopupBtn = nullptr;
|
||||
LLComboBox* mTimeFormatCombobox = nullptr;
|
||||
LLComboBox* mLanguageCombobox = nullptr;
|
||||
std::unique_ptr< ll::prefs::SearchData > mSearchData;
|
||||
bool mSearchDataDirty;
|
||||
|
||||
|
||||
@@ -377,7 +377,7 @@ bool LLInvFVBridge::cutToClipboard()
|
||||
const LLInventoryObject* obj = gInventory.getObject(mUUID);
|
||||
if (obj && isItemMovable() && isItemRemovable())
|
||||
{
|
||||
const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID &marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
const bool cut_from_marketplacelistings = gInventory.isObjectDescendentOf(mUUID, marketplacelistings_id);
|
||||
|
||||
if (cut_from_marketplacelistings && (LLMarketplaceData::instance().isInActiveFolder(mUUID) ||
|
||||
@@ -1533,7 +1533,7 @@ bool LLInvFVBridge::isInboxFolder() const
|
||||
|
||||
bool LLInvFVBridge::isMarketplaceListingsFolder() const
|
||||
{
|
||||
const LLUUID folder_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID folder_id = gInventory.getMarketplaceListingsUUID();
|
||||
|
||||
if (folder_id.isNull())
|
||||
{
|
||||
@@ -1841,7 +1841,7 @@ bool LLInvFVBridge::canListOnMarketplaceNow() const
|
||||
{
|
||||
std::string error_msg;
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID &marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
if (marketplacelistings_id.notNull())
|
||||
{
|
||||
LLViewerInventoryCategory * master_folder = model->getCategory(marketplacelistings_id);
|
||||
@@ -2000,7 +2000,7 @@ void LLItemBridge::performAction(LLInventoryModel* model, std::string action)
|
||||
{
|
||||
LLInventoryItem* itemp = model->getItem(mUUID);
|
||||
if (!itemp) return;
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
// Note: For a single item, if it's not a copy, then it's a move
|
||||
move_item_to_marketplacelistings(itemp, marketplacelistings_id, ("copy_to_marketplace_listings" == action));
|
||||
}
|
||||
@@ -2960,7 +2960,7 @@ bool LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat,
|
||||
|
||||
const LLUUID &cat_id = inv_cat->getUUID();
|
||||
const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
const LLUUID from_folder_uuid = inv_cat->getParentUUID();
|
||||
|
||||
const bool move_is_into_current_outfit = (mUUID == current_outfit_id);
|
||||
@@ -4083,7 +4083,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action)
|
||||
{
|
||||
LLInventoryCategory * cat = gInventory.getCategory(mUUID);
|
||||
if (!cat) return;
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
move_folder_to_marketplacelistings(cat, marketplacelistings_id, ("move_to_marketplace_listings" != action), (("copy_or_move_to_marketplace_listings" == action)));
|
||||
}
|
||||
else if ("copy_folder_uuid" == action)
|
||||
@@ -4391,7 +4391,7 @@ void LLFolderBridge::pasteFromClipboard()
|
||||
LLInventoryModel* model = getInventoryModel();
|
||||
if (model && isClipboardPasteable())
|
||||
{
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID &marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
const bool paste_into_marketplacelistings = model->isObjectDescendentOf(mUUID, marketplacelistings_id);
|
||||
|
||||
bool cut_from_marketplacelistings = false;
|
||||
@@ -4453,7 +4453,7 @@ void LLFolderBridge::perform_pasteFromClipboard()
|
||||
if (model && isClipboardPasteable())
|
||||
{
|
||||
const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
|
||||
const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
|
||||
@@ -4776,7 +4776,7 @@ void LLFolderBridge::pasteLinkFromClipboard()
|
||||
if(model)
|
||||
{
|
||||
const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
|
||||
|
||||
const bool move_is_into_current_outfit = (mUUID == current_outfit_id);
|
||||
@@ -4876,7 +4876,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
|
||||
const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH);
|
||||
const LLUUID &lost_and_found_id = model->findCategoryUUIDForType(LLFolderType::FT_LOST_AND_FOUND);
|
||||
const LLUUID &favorites = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
const LLUUID &marketplace_listings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplace_listings_id = model->getMarketplaceListingsUUID();
|
||||
const LLUUID &outfits_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
|
||||
|
||||
// <FS:Ansariel> FIRE-11628: Option to delete broken links from AO folder
|
||||
@@ -6281,7 +6281,7 @@ bool LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
|
||||
const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
// <FS:Ansariel> FIRE-1392: Allow dragging all asset types into Landmarks folder
|
||||
//const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
|
||||
const LLUUID from_folder_uuid = inv_item->getParentUUID();
|
||||
|
||||
|
||||
@@ -417,7 +417,7 @@ void update_all_marketplace_count(const LLUUID& cat_id)
|
||||
void update_all_marketplace_count()
|
||||
{
|
||||
// Get the marketplace root and launch the recursive exploration
|
||||
const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID marketplace_listings_uuid = gInventory.getMarketplaceListingsUUID();
|
||||
if (!marketplace_listings_uuid.isNull())
|
||||
{
|
||||
update_all_marketplace_count(marketplace_listings_uuid);
|
||||
@@ -1204,11 +1204,7 @@ void open_marketplace_listings()
|
||||
|
||||
S32 depth_nesting_in_marketplace(LLUUID cur_uuid)
|
||||
{
|
||||
// Get the marketplace listings root, exit with -1 (i.e. not under the marketplace listings root) if none
|
||||
// Todo: findCategoryUUIDForType is somewhat expensive with large
|
||||
// flat root folders yet we use depth_nesting_in_marketplace at
|
||||
// every turn, find a way to correctly cache this id.
|
||||
const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID marketplace_listings_uuid = gInventory.getMarketplaceListingsUUID();
|
||||
if (marketplace_listings_uuid.isNull())
|
||||
{
|
||||
return -1;
|
||||
@@ -3626,7 +3622,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
|
||||
|
||||
if ("delete" == action)
|
||||
{
|
||||
const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID &marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
bool marketplacelistings_item = false;
|
||||
bool has_worn = false;
|
||||
bool needs_replacement = false;
|
||||
@@ -3940,7 +3936,7 @@ void LLInventoryAction::doToSelected(LLInventoryModel* model, LLFolderView* root
|
||||
if (action == "wear" || action == "wear_add")
|
||||
{
|
||||
const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH);
|
||||
const LLUUID mp_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID mp_id = gInventory.getMarketplaceListingsUUID();
|
||||
std::copy_if(selected_uuid_set.begin(),
|
||||
selected_uuid_set.end(),
|
||||
std::back_inserter(ids),
|
||||
@@ -4362,7 +4358,7 @@ void LLInventoryAction::buildMarketplaceFolders(LLFolderView* root)
|
||||
// target listing *and* the original listing. So we need to keep track of both.
|
||||
// Note: do not however put the marketplace listings root itself in this list or the whole marketplace data will be rebuilt.
|
||||
sMarketplaceFolders.clear();
|
||||
const LLUUID &marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (marketplacelistings_id.isNull())
|
||||
{
|
||||
return;
|
||||
|
||||
@@ -1726,7 +1726,7 @@ bool is_category_removable(const LLUUID& folder_id, bool check_worn)
|
||||
}
|
||||
}
|
||||
|
||||
const LLUUID mp_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID mp_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (mp_id.notNull() && gInventory.isObjectDescendentOf(folder_id, mp_id))
|
||||
{
|
||||
return false;
|
||||
@@ -1768,7 +1768,7 @@ void LLInventoryGallery::paste()
|
||||
return;
|
||||
}
|
||||
|
||||
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (mSelectedItemIDs.size() == 1 && gInventory.isObjectDescendentOf(*mSelectedItemIDs.begin(), marketplacelistings_id))
|
||||
{
|
||||
return;
|
||||
@@ -2120,7 +2120,7 @@ void LLInventoryGallery::pasteAsLink()
|
||||
}
|
||||
|
||||
const LLUUID& current_outfit_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
const LLUUID& my_outifts_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
|
||||
|
||||
std::vector<LLUUID> objects;
|
||||
@@ -3339,7 +3339,7 @@ bool dragItemIntoFolder(LLUUID folder_id, LLInventoryItem* inv_item, bool drop,
|
||||
const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE);
|
||||
const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK);
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
|
||||
|
||||
const bool move_is_into_current_outfit = (folder_id == current_outfit_id);
|
||||
@@ -3733,7 +3733,7 @@ bool dragCategoryIntoFolder(LLUUID dest_id, LLInventoryCategory* inv_cat,
|
||||
|
||||
const LLUUID &cat_id = inv_cat->getUUID();
|
||||
const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
|
||||
const LLUUID &marketplacelistings_id = model->findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = model->getMarketplaceListingsUUID();
|
||||
//const LLUUID from_folder_uuid = inv_cat->getParentUUID();
|
||||
const bool move_is_into_current_outfit = (dest_id == current_outfit_id);
|
||||
const bool move_is_into_marketplacelistings = model->isObjectDescendentOf(dest_id, marketplacelistings_id);
|
||||
|
||||
@@ -412,7 +412,7 @@ void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata)
|
||||
|
||||
if (can_copy)
|
||||
{
|
||||
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (itemp)
|
||||
{
|
||||
move_item_to_marketplacelistings(itemp, marketplacelistings_id, copy_operation);
|
||||
@@ -431,7 +431,7 @@ void LLInventoryGalleryContextMenu::doToSelected(const LLSD& userdata)
|
||||
// option == 0 Move no copy item(s)
|
||||
// option == 1 Don't move no copy item(s) (leave them behind)
|
||||
bool copy_and_move = option == 0;
|
||||
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
|
||||
// main inventory only allows one item?
|
||||
LLViewerInventoryItem* itemp = gInventory.getItem(lamdba_list.front());
|
||||
@@ -547,7 +547,7 @@ bool can_list_on_marketplace(const LLUUID &id)
|
||||
if (can_list)
|
||||
{
|
||||
std::string error_msg;
|
||||
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (marketplacelistings_id.notNull())
|
||||
{
|
||||
LLViewerInventoryCategory* master_folder = gInventory.getCategory(marketplacelistings_id);
|
||||
@@ -1045,7 +1045,7 @@ void LLInventoryGalleryContextMenu::updateMenuItemsVisibility(LLContextMenu* men
|
||||
|
||||
// Marketplace
|
||||
bool can_list = false;
|
||||
const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (marketplacelistings_id.notNull() && !is_inbox && !obj->getIsLinkType())
|
||||
{
|
||||
if (is_folder)
|
||||
|
||||
@@ -1043,6 +1043,15 @@ const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::ETyp
|
||||
return findCategoryUUIDForTypeInRoot(preferred_type, gInventory.getLibraryRootFolderID());
|
||||
}
|
||||
|
||||
const LLUUID LLInventoryModel::getMarketplaceListingsUUID()
|
||||
{
|
||||
if (mMarketplaceListingsUUID.isNull())
|
||||
{
|
||||
mMarketplaceListingsUUID = findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
}
|
||||
return mMarketplaceListingsUUID;
|
||||
}
|
||||
|
||||
LLUUID LLInventoryModel::findCategoryByName(std::string_view name)
|
||||
{
|
||||
if (LLUUID root_id = gInventory.getRootFolderID(); root_id.notNull())
|
||||
@@ -1842,7 +1851,7 @@ void LLInventoryModel::updateCategory(const LLViewerInventoryCategory* cat, U32
|
||||
mask |= LLInventoryObserver::LABEL;
|
||||
}
|
||||
// Under marketplace, category labels are quite complex and need extra upate
|
||||
const LLUUID marketplace_id = findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID marketplace_id = getMarketplaceListingsUUID();
|
||||
if (marketplace_id.notNull() && isObjectDescendentOf(cat->getUUID(), marketplace_id))
|
||||
{
|
||||
mask |= LLInventoryObserver::LABEL;
|
||||
|
||||
@@ -359,6 +359,8 @@ public:
|
||||
// user specified one or it does not exist, creates default category if it is missing.
|
||||
const LLUUID findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type) const;
|
||||
|
||||
const LLUUID getMarketplaceListingsUUID();
|
||||
|
||||
// Get whatever special folder this object is a child of, if any.
|
||||
const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
|
||||
|
||||
@@ -399,6 +401,8 @@ public:
|
||||
private:
|
||||
mutable LLPointer<LLViewerInventoryItem> mLastItem; // cache recent lookups
|
||||
|
||||
LLUUID mMarketplaceListingsUUID;
|
||||
|
||||
// <FS:TT> ReplaceWornItemsOnly
|
||||
void wearWearablesOnAvatar(const LLUUID& category_id);
|
||||
void wearAttachmentsOnAvatar(const LLUUID& category_id);
|
||||
|
||||
@@ -993,7 +993,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis()
|
||||
// Intent is for marketplace request to happen after
|
||||
// main inventory is done, unless requested by floater
|
||||
mRecursiveMarketplaceFetchStarted = true;
|
||||
const LLUUID& marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID& marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (marketplacelistings_id.notNull())
|
||||
{
|
||||
mFetchFolderQueue.emplace_front(marketplacelistings_id, FT_FOLDER_AND_CONTENT);
|
||||
|
||||
@@ -851,7 +851,7 @@ void LLMarketplaceData::setDataFetchedSignal(const status_updated_signal_t::slot
|
||||
// Get/Post/Put requests to the SLM Server using the SLM API
|
||||
void LLMarketplaceData::getSLMListings()
|
||||
{
|
||||
const LLUUID marketplaceFolderId = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID marketplaceFolderId = gInventory.getMarketplaceListingsUUID();
|
||||
setUpdating(marketplaceFolderId, true);
|
||||
|
||||
LLCoros::instance().launch("getSLMListings",
|
||||
@@ -1758,7 +1758,7 @@ bool LLMarketplaceData::isUpdating(const LLUUID& folder_id, S32 depth)
|
||||
}
|
||||
else
|
||||
{
|
||||
const LLUUID marketplace_listings_uuid = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID marketplace_listings_uuid = gInventory.getMarketplaceListingsUUID();
|
||||
std::set<LLUUID>::iterator it = mPendingUpdateSet.find(marketplace_listings_uuid);
|
||||
if (it != mPendingUpdateSet.end())
|
||||
{
|
||||
|
||||
@@ -190,7 +190,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
||||
mUsernameLength(0),
|
||||
mPasswordLength(0),
|
||||
mLocationLength(0),
|
||||
mShowFavorites(false)
|
||||
mShowFavorites(false),
|
||||
mAlertNotif(false)
|
||||
{
|
||||
setBackgroundVisible(false);
|
||||
setBackgroundOpaque(true);
|
||||
@@ -299,8 +300,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
||||
|
||||
childSetAction("connect_btn", onClickConnect, this);
|
||||
|
||||
LLButton* def_btn = getChild<LLButton>("connect_btn");
|
||||
setDefaultBtn(def_btn);
|
||||
mLoginBtn = getChild<LLButton>("connect_btn");
|
||||
setDefaultBtn(mLoginBtn);
|
||||
|
||||
std::string channel = LLVersionInfo::instance().getChannel();
|
||||
std::string version = stringize(LLVersionInfo::instance().getShortVersion(), " (",
|
||||
@@ -329,6 +330,8 @@ LLPanelLogin::LLPanelLogin(const LLRect &rect,
|
||||
LLCheckBoxCtrl* remember_name = getChild<LLCheckBoxCtrl>("remember_name");
|
||||
remember_name->setCommitCallback(boost::bind(&LLPanelLogin::onRememberUserCheck, this));
|
||||
getChild<LLCheckBoxCtrl>("remember_password")->setCommitCallback(boost::bind(&LLPanelLogin::onRememberPasswordCheck, this));
|
||||
|
||||
mAlertListener = LLNotifications::instance().getChannel("Alerts")->connectChanged([this](const LLSD& notify){ return onUpdateNotification(notify); });
|
||||
}
|
||||
|
||||
void LLPanelLogin::addFavoritesToStartLocation()
|
||||
@@ -411,7 +414,7 @@ void LLPanelLogin::addFavoritesToStartLocation()
|
||||
gSavedSettings.setBOOL("RememberPassword", save_password);
|
||||
if (!save_password)
|
||||
{
|
||||
getChild<LLButton>("connect_btn")->setEnabled(false);
|
||||
mLoginBtn->setEnabled(false);
|
||||
}
|
||||
update_password_setting = false;
|
||||
}
|
||||
@@ -938,7 +941,7 @@ void LLPanelLogin::handleMediaEvent(LLPluginClassMedia* /*self*/, EMediaEvent ev
|
||||
// static
|
||||
void LLPanelLogin::onClickConnect(bool commit_fields)
|
||||
{
|
||||
if (sInstance && sInstance->mCallback)
|
||||
if (sInstance && sInstance->mCallback && !sInstance->mAlertNotif)
|
||||
{
|
||||
if (commit_fields)
|
||||
{
|
||||
@@ -1195,9 +1198,7 @@ void LLPanelLogin::updateServer()
|
||||
|
||||
void LLPanelLogin::updateLoginButtons()
|
||||
{
|
||||
LLButton* login_btn = getChild<LLButton>("connect_btn");
|
||||
|
||||
login_btn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0);
|
||||
mLoginBtn->setEnabled(mUsernameLength != 0 && mPasswordLength != 0 && !mAlertNotif);
|
||||
|
||||
if (!mFirstLoginThisInstall)
|
||||
{
|
||||
@@ -1368,4 +1369,24 @@ std::string LLPanelLogin::getUserName(LLPointer<LLCredential> &cred)
|
||||
|
||||
return "unknown";
|
||||
}
|
||||
|
||||
bool LLPanelLogin::onUpdateNotification(const LLSD& notify)
|
||||
{
|
||||
// disable Login button while alert notification is displayed
|
||||
LLNotificationPtr notifyp = LLNotifications::instance().find(notify["id"].asUUID());
|
||||
if (notifyp && notifyp->getName() == "PromptOptionalUpdate")
|
||||
{
|
||||
std::string sigtype = notify["sigtype"].asString();
|
||||
if (sigtype == "add")
|
||||
{
|
||||
mAlertNotif = true;
|
||||
}
|
||||
else if (sigtype == "delete")
|
||||
{
|
||||
mAlertNotif = false;
|
||||
}
|
||||
updateLoginButtons();
|
||||
}
|
||||
return false;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -107,8 +107,11 @@ private:
|
||||
static void onRememberPasswordCheck(void*);
|
||||
static void onPassKey(LLLineEditor* caller, void* user_data);
|
||||
|
||||
bool onUpdateNotification(const LLSD& notify);
|
||||
|
||||
private:
|
||||
std::unique_ptr<LLPanelLoginListener> mListener;
|
||||
LLTempBoundListener mAlertListener;
|
||||
|
||||
void updateLoginButtons();
|
||||
void populateUserList(LLPointer<LLCredential> credential);
|
||||
@@ -128,6 +131,9 @@ private:
|
||||
unsigned int mUsernameLength;
|
||||
unsigned int mPasswordLength;
|
||||
unsigned int mLocationLength;
|
||||
|
||||
bool mAlertNotif;
|
||||
LLButton* mLoginBtn;
|
||||
};
|
||||
|
||||
#endif
|
||||
|
||||
@@ -789,7 +789,7 @@ void LLToolDragAndDrop::dragOrDrop( S32 x, S32 y, MASK mask, bool drop,
|
||||
if (!handled)
|
||||
{
|
||||
// Disallow drag and drop to 3D from the marketplace
|
||||
const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (marketplacelistings_id.notNull())
|
||||
{
|
||||
for (S32 item_index = 0; item_index < (S32)mCargoIDs.size(); item_index++)
|
||||
|
||||
@@ -506,7 +506,7 @@ void LLSLMMenuUpdater::setMerchantMenu()
|
||||
LLCommand* command = LLCommandManager::instance().getCommand("marketplacelistings");
|
||||
gToolBarView->enableCommand(command->id(), true);
|
||||
|
||||
const LLUUID marketplacelistings_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
const LLUUID marketplacelistings_id = gInventory.getMarketplaceListingsUUID();
|
||||
if (marketplacelistings_id.isNull())
|
||||
{
|
||||
U32 mkt_status = LLMarketplaceData::instance().getSLMStatus();
|
||||
|
||||
@@ -63,10 +63,10 @@ class FSSettingsCollector : public LLInventoryCollectFunctor
|
||||
public:
|
||||
FSSettingsCollector()
|
||||
{
|
||||
mMarketplaceFolderUUID = gInventory.findCategoryUUIDForType(LLFolderType::FT_MARKETPLACE_LISTINGS);
|
||||
mMarketplaceFolderUUID = gInventory.getMarketplaceListingsUUID();
|
||||
}
|
||||
|
||||
virtual ~FSSettingsCollector() {}
|
||||
virtual ~FSSettingsCollector() = default;
|
||||
|
||||
bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
|
||||
{
|
||||
@@ -85,7 +85,7 @@ public:
|
||||
|
||||
protected:
|
||||
LLUUID mMarketplaceFolderUUID;
|
||||
std::set<LLUUID> mSeen;
|
||||
uuid_set_t mSeen;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -4555,9 +4555,9 @@ Click OK to install.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
icon="alert.tga"
|
||||
name="PromptOptionalUpdate"
|
||||
type="alertmodal">
|
||||
type="alert">
|
||||
Version [VERSION] has been downloaded and is ready to install.
|
||||
Release notes: [URL]
|
||||
|
||||
|
||||
@@ -139,7 +139,7 @@
|
||||
width="70">
|
||||
<combo_box.item
|
||||
enabled="true"
|
||||
label="1:00 AM"
|
||||
label="1:00 PM"
|
||||
name="12H"
|
||||
value="0" />
|
||||
<combo_box.item
|
||||
|
||||
Reference in New Issue
Block a user