From 27046fcc14239d36604790c993a90394361ec873 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 21 Nov 2022 13:48:23 +0000 Subject: SL-18629 - moving createNewCategory to AIS3 --- indra/llmessage/message.cpp | 1 + indra/newview/llappearancemgr.cpp | 7 +++++-- indra/newview/llinventorymodel.cpp | 9 +++++---- 3 files changed, 11 insertions(+), 6 deletions(-) (limited to 'indra') diff --git a/indra/llmessage/message.cpp b/indra/llmessage/message.cpp index 19146c64f4..31acc65642 100644 --- a/indra/llmessage/message.cpp +++ b/indra/llmessage/message.cpp @@ -3402,6 +3402,7 @@ typedef std::map BuilderMap; void LLMessageSystem::newMessageFast(const char *name) { + //LL_DEBUGS("Messaging") << "creating new message: " << name << LL_ENDL; LLMessageConfig::Flavor message_flavor = LLMessageConfig::getMessageFlavor(name); LLMessageConfig::Flavor server_flavor = diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 909f32cd21..ab7adeeedc 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1701,6 +1701,7 @@ void LLAppearanceMgr::shallowCopyCategory(const LLUUID& src_id, const LLUUID& ds { parent_id = gInventory.getRootFolderID(); } + // USES UDP PATH LLUUID subfolder_id = gInventory.createNewCategory( parent_id, LLFolderType::FT_NONE, src_cat->getName()); @@ -2725,7 +2726,8 @@ void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool ap { pid = gInventory.getRootFolderID(); } - + + // UDP PATH LLUUID new_cat_id = gInventory.createNewCategory( pid, LLFolderType::FT_NONE, @@ -3994,7 +3996,8 @@ void LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, boo func); } else - { + { + // UDP PATH LLUUID folder_id = gInventory.createNewCategory( parent_id, LLFolderType::FT_OUTFIT, diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index fab7ae8f1a..36797a3f28 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -664,24 +664,25 @@ const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::ETyp // updateCategory() with a newly generated UUID category, but this // version will take care of details like what the name should be // based on preferred type. Returns the UUID of the new category. +// +// On failure, returns a null UUID. +// FIXME: callers do not check for or handle a null results currently. LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, LLFolderType::EType preferred_type, const std::string& pname, inventory_func_type callback) { - LLUUID id; + LLUUID id; // Initially null. if (!isInventoryUsable()) { LL_WARNS(LOG_INV) << "Inventory is not usable; can't create requested category of type " << preferred_type << LL_ENDL; - // FIXME failing but still returning an id? return id; } if(LLFolderType::lookup(preferred_type) == LLFolderType::badLookup()) { LL_DEBUGS(LOG_INV) << "Attempt to create undefined category." << LL_ENDL; - // FIXME failing but still returning an id? return id; } @@ -708,7 +709,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, std::string url; if ( viewer_region ) url = viewer_region->getCapability("CreateInventoryCategory"); - + if (!url.empty() && callback) { //Let's use the new capability. -- cgit v1.2.3 From f6208020f5b27b84aeb9ca258e8dbddce9c49bce Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 22 Nov 2022 15:46:08 +0000 Subject: SL-18629 - use AISAPI for some paths of new category creation --- indra/newview/llaisapi.cpp | 30 +++++++++++++++++++++++++++--- indra/newview/llaisapi.h | 3 ++- indra/newview/llappearancemgr.cpp | 1 + indra/newview/llinventorymodel.cpp | 35 +++++++++-------------------------- 4 files changed, 39 insertions(+), 30 deletions(-) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 005259bcb8..d2c59cfaba 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -100,7 +100,7 @@ void AISAPI::CreateInventory(const LLUUID& parentId, const LLSD& newInventory, c tid.generate(); std::string url = cap + std::string("/category/") + parentId.asString() + "?tid=" + tid.asString(); - LL_DEBUGS("Inventory") << "url: " << url << LL_ENDL; + LL_DEBUGS("Inventory") << "url: " << url << " parentID " << parentId << " newInventory " << newInventory << LL_ENDL; // I may be suffering from golden hammer here, but the first part of this bind // is actually a static cast for &HttpCoroutineAdapter::postAndSuspend so that @@ -124,7 +124,7 @@ void AISAPI::CreateInventory(const LLUUID& parentId, const LLSD& newInventory, c (&LLCoreHttpUtil::HttpCoroutineAdapter::postAndSuspend), _1, _2, _3, _4, _5, _6); LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro, - _1, postFn, url, parentId, newInventory, callback, COPYINVENTORY)); + _1, postFn, url, parentId, newInventory, callback, CREATEINVENTORY)); EnqueueAISCommand("CreateInventory", proc); } @@ -478,6 +478,7 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht LL_WARNS("Inventory") << ll_pretty_print_sd(result) << LL_ENDL; } + LL_DEBUGS("Inventory") << result << LL_ENDL; gInventory.onAISUpdateReceived("AISCommand", result); if (callback && !callback.empty()) @@ -487,9 +488,32 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht if (result.has("category_id") && (type == COPYLIBRARYCATEGORY)) { id = result["category_id"]; + callback(id); } + if (type == CREATEINVENTORY) + { + if (result.has("_created_categories")) + { + LLSD& cats = result["_created_categories"]; + LLSD::array_const_iterator cat_iter; + for (cat_iter = cats.beginArray(); cat_iter != cats.endArray(); ++cat_iter) + { + LLUUID cat_id = *cat_iter; + callback(cat_id); + } + } + if (result.has("_created_items")) + { + LLSD& items = result["_created_items"]; + LLSD::array_const_iterator item_iter; + for (item_iter = items.beginArray(); item_iter != items.endArray(); ++item_iter) + { + LLUUID item_id = *item_iter; + callback(item_id); + } + } + } - callback(id); } } diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 856f3fc180..6e9cc19baa 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -61,7 +61,8 @@ private: PURGEDESCENDENTS, UPDATECATEGORY, UPDATEITEM, - COPYLIBRARYCATEGORY + COPYLIBRARYCATEGORY, + CREATEINVENTORY } COMMAND_TYPE; static const std::string INVENTORY_CAP_NAME; diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index ab7adeeedc..4fc09c7739 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -3989,6 +3989,7 @@ void LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, boo // existence of AIS as an indicator the fix is present. Does // not actually use AIS to create the category. inventory_func_type func = boost::bind(&LLAppearanceMgr::onOutfitFolderCreated,this,_1,show_panel); + LLUUID folder_id = gInventory.createNewCategory( parent_id, LLFolderType::FT_OUTFIT, diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 36797a3f28..a7b3076e52 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -694,38 +694,20 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, LL_WARNS(LOG_INV) << "Creating new system folder, type " << preferred_type << LL_ENDL; } - id.generate(); std::string name = pname; - if(!pname.empty()) - { - name.assign(pname); - } - else + if (pname.empty()) { name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type)); } - LLViewerRegion* viewer_region = gAgent.getRegion(); - std::string url; - if ( viewer_region ) - url = viewer_region->getCapability("CreateInventoryCategory"); - - if (!url.empty() && callback) + if (callback) { - //Let's use the new capability. - - LLSD request, body; - body["folder_id"] = id; - body["parent_id"] = parent_id; - body["type"] = (LLSD::Integer) preferred_type; - body["name"] = name; - - request["message"] = "CreateInventoryCategory"; - request["payload"] = body; - - LL_DEBUGS(LOG_INV) << "Creating category via request: " << ll_pretty_print_sd(request) << LL_ENDL; - LLCoros::instance().launch("LLInventoryModel::createNewCategoryCoro", - boost::bind(&LLInventoryModel::createNewCategoryCoro, this, url, body, callback)); + LLSD new_inventory = LLSD::emptyMap(); + new_inventory["categories"] = LLSD::emptyArray(); + LLViewerInventoryCategory cat(LLUUID::null, parent_id, preferred_type, name, gAgent.getID()); + LLSD cat_sd = cat.asLLSD(); + new_inventory["categories"].append(cat_sd); + AISAPI::CreateInventory(parent_id, new_inventory, callback); return LLUUID::null; } @@ -740,6 +722,7 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, // assuming instant success. // Add the category to the internal representation + id.generate(); LLPointer cat = new LLViewerInventoryCategory(id, parent_id, preferred_type, name, gAgent.getID()); cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1 -- cgit v1.2.3 From abe62c23d74d5319691a49881719b03cc9b5b090 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 22 Nov 2022 16:21:44 -0500 Subject: SL-18330: Make LLSDSerialize::deserialize() default to notation. LLSDSerialize::serialize() emits a header string, e.g. "" for notation format. Until now, LLSDSerialize::deserialize() has required that header to properly decode the input stream. But none of LLSDBinaryFormatter, LLSDXMLFormatter or LLSDNotationFormatter emit that header themselves. Nor do any of the Python llsd.format_binary(), format_xml() or format_notation() functions. Until now, you could not use LLSD::deserialize() to parse an arbitrary-format LLSD stream serialized by anything but LLSDSerialize::serialize(). Change LLSDSerialize::deserialize() so that if no header is recognized, instead of failing, it attempts to parse as notation. Add tests to exercise this case. The tricky part about this processing is that deserialize() necessarily reads some number of bytes from the input stream first, to try to recognize the header. If it fails to do so, it must prepend the bytes it has already read to the rest of the input stream since they're probably the beginning of the serialized data. To support this use case, introduce cat_streambuf, a std::streambuf subclass that (virtually) concatenates other std::streambuf instances. When read by a std::istream, the sequence of underlying std::streambufs appears to the consumer as a single continuous stream. --- indra/llcommon/llsdserialize.cpp | 87 ++++++++----- indra/llcommon/llstreamtools.cpp | 26 ++++ indra/llcommon/llstreamtools.h | 27 +++- indra/llcommon/tests/llsdserialize_test.cpp | 192 +++++++++++++++++++--------- 4 files changed, 233 insertions(+), 99 deletions(-) (limited to 'indra') diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index 8b4a0ee6d8..9ff4676b95 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -45,6 +45,7 @@ #endif #include "lldate.h" +#include "llmemorystream.h" #include "llsd.h" #include "llstring.h" #include "lluri.h" @@ -61,6 +62,23 @@ const std::string LLSD_NOTATION_HEADER("llsd/notation"); #define windowBits 15 #define ENABLE_ZLIB_GZIP 32 +// If we published this in llsdserialize.h, we could use it in the +// implementation of LLSDOStreamer's operator<<(). +template +void format_using(const LLSD& data, std::ostream& ostr, + LLSDFormatter::EFormatterOptions options=LLSDFormatter::OPTIONS_PRETTY_BINARY) +{ + LLPointer f{ new Formatter }; + f->format(data, ostr, options); +} + +template +S32 parse_using(std::istream& istr, LLSD& data, size_t max_bytes, S32 max_depth=-1) +{ + LLPointer p{ new Parser }; + return p->parse(istr, data, max_bytes, max_depth); +} + /** * LLSDSerialize */ @@ -83,10 +101,10 @@ void LLSDSerialize::serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize f = new LLSDXMLFormatter; break; - case LLSD_NOTATION: - str << "\n"; - f = new LLSDNotationFormatter; - break; + case LLSD_NOTATION: + str << "\n"; + f = new LLSDNotationFormatter; + break; default: LL_WARNS() << "serialize request for unknown ELLSD_Serialize" << LL_ENDL; @@ -101,10 +119,7 @@ void LLSDSerialize::serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize // static bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) { - LLPointer p = NULL; char hdr_buf[MAX_HDR_LEN + 1] = ""; /* Flawfinder: ignore */ - int i; - int inbuf = 0; bool legacy_no_header = false; bool fail_if_not_legacy = false; std::string header; @@ -112,7 +127,10 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) /* * Get the first line before anything. */ - str.get(hdr_buf, MAX_HDR_LEN, '\n'); + // Remember str's original input position: if there's no header, we'll + // want to back up and retry. + str.get(hdr_buf, sizeof(hdr_buf), '\n'); + auto inbuf = str.gcount(); if (str.fail()) { str.clear(); @@ -122,16 +140,18 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) if (!strncasecmp(LEGACY_NON_HEADER, hdr_buf, strlen(LEGACY_NON_HEADER))) /* Flawfinder: ignore */ { legacy_no_header = true; - inbuf = (int)str.gcount(); } else { if (fail_if_not_legacy) - goto fail; + { + LL_WARNS() << "deserialize LLSD parse failure" << LL_ENDL; + return false; + } /* * Remove the newline chars */ - for (i = 0; i < MAX_HDR_LEN; i++) + for (size_t i = 0; i < sizeof(hdr_buf); i++) { if (hdr_buf[i] == 0 || hdr_buf[i] == '\r' || hdr_buf[i] == '\n') @@ -149,50 +169,47 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) { end = header.find_first_of(" ?", start); } - if ((start == std::string::npos) || (end == std::string::npos)) - goto fail; - - header = header.substr(start, end - start); - ws(str); + if (! (start == std::string::npos) || (end == std::string::npos)) + { + header = header.substr(start, end - start); + ws(str); + } } /* * Create the parser as appropriate */ if (legacy_no_header) { // Create a LLSD XML parser, and parse the first chunk read above - LLSDXMLParser* x = new LLSDXMLParser(); - x->parsePart(hdr_buf, inbuf); // Parse the first part that was already read - x->parseLines(str, sd); // Parse the rest of it - delete x; - return true; + LLSDXMLParser x; + x.parsePart(hdr_buf, inbuf); // Parse the first part that was already read + auto parsed = x.parseLines(str, sd); // Parse the rest of it + // Formally we should probably check (parsed != PARSE_FAILURE && + // parsed > 0), but since PARSE_FAILURE is -1, this suffices. + return (parsed > 0); } if (header == LLSD_BINARY_HEADER) { - p = new LLSDBinaryParser; + return (parse_using(str, sd, max_bytes) > 0); } else if (header == LLSD_XML_HEADER) { - p = new LLSDXMLParser; + return (parse_using(str, sd, max_bytes) > 0); } else if (header == LLSD_NOTATION_HEADER) { - p = new LLSDNotationParser; + return (parse_using(str, sd, max_bytes) > 0); } else { - LL_WARNS() << "deserialize request for unknown ELLSD_Serialize" << LL_ENDL; + LL_DEBUGS() << "deserialize request with no header, assuming notation" << LL_ENDL; + // Since we've already read 'inbuf' bytes into 'hdr_buf', prepend that + // data to whatever remains in 'str'. + LLMemoryStreamBuf already(reinterpret_cast(hdr_buf), inbuf); + cat_streambuf prebuff(&already, str.rdbuf()); + std::istream prepend(&prebuff); + return (parse_using(prepend, sd, max_bytes) > 0); } - - if (p.notNull()) - { - p->parse(str, sd, max_bytes); - return true; - } - -fail: - LL_WARNS() << "deserialize LLSD parse failure" << LL_ENDL; - return false; } /** diff --git a/indra/llcommon/llstreamtools.cpp b/indra/llcommon/llstreamtools.cpp index d7a6f47932..1674f6edc2 100644 --- a/indra/llcommon/llstreamtools.cpp +++ b/indra/llcommon/llstreamtools.cpp @@ -523,3 +523,29 @@ std::istream& operator>>(std::istream& str, const char *tocheck) } return str; } + +int cat_streambuf::underflow() +{ + if (gptr() == egptr()) + { + // here because our buffer is empty + std::streamsize size; + // Until we've run out of mInputs, try reading the first of them + // into mBuffer. If that fetches some characters, break the loop. + while (! mInputs.empty() + && ! (size = mInputs.front()->sgetn(mBuffer.data(), mBuffer.size()))) + { + // We tried to read mInputs.front() but got zero characters. + // Discard the first streambuf and try the next one. + mInputs.pop_front(); + } + // Either we ran out of mInputs or we succeeded in reading some + // characters, that is, size != 0. Tell base class what we have. + setg(mBuffer.data(), mBuffer.data(), mBuffer.data() + size); + } + // If we fell out of the above loop with mBuffer still empty, return + // eof(), otherwise return the next character. + return (gptr() == egptr()) + ? std::char_traits::eof() + : std::char_traits::to_int_type(*gptr()); +} diff --git a/indra/llcommon/llstreamtools.h b/indra/llcommon/llstreamtools.h index 1b04bf91d7..997f738840 100644 --- a/indra/llcommon/llstreamtools.h +++ b/indra/llcommon/llstreamtools.h @@ -27,8 +27,10 @@ #ifndef LL_STREAM_TOOLS_H #define LL_STREAM_TOOLS_H +#include #include #include +#include // unless specifed otherwise these all return input_stream.good() @@ -113,6 +115,27 @@ LL_COMMON_API std::streamsize fullread( LL_COMMON_API std::istream& operator>>(std::istream& str, const char *tocheck); -#endif - +/** + * cat_streambuf is a std::streambuf subclass that accepts a variadic number + * of std::streambuf* (e.g. some_istream.rdbuf()) and virtually concatenates + * their contents. + */ +// derived from https://stackoverflow.com/a/49441066/5533635 +class cat_streambuf: public std::streambuf +{ +private: + std::deque mInputs; + std::vector mBuffer; + +public: + // only valid for std::streambuf* arguments + template + cat_streambuf(Inputs... inputs): + mInputs{inputs...}, + mBuffer(1024) + {} + + int underflow(); +}; +#endif diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index c246f5ee56..0334699c7f 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -60,6 +60,7 @@ using namespace boost::phoenix; #include "../test/lltut.h" #include "../test/namedtempfile.h" #include "stringize.h" +#include std::vector string_to_vector(const std::string& str) { @@ -112,7 +113,7 @@ namespace tut mSD = LLUUID::null; expected = "\n"; xml_test("null uuid", expected); - + mSD = LLUUID("c96f9b1e-f589-4100-9774-d98643ce0bed"); expected = "c96f9b1e-f589-4100-9774-d98643ce0bed\n"; xml_test("uuid", expected); @@ -136,7 +137,7 @@ namespace tut expected = "aGVsbG8=\n"; xml_test("binary", expected); } - + template<> template<> void sd_xml_object::test<2>() { @@ -225,7 +226,7 @@ namespace tut expected = "bazfoobar\n"; xml_test("2 element map", expected); } - + template<> template<> void sd_xml_object::test<6>() { @@ -241,7 +242,7 @@ namespace tut expected = "Nnw2fGFzZGZoYXBweWJveHw2MGU0NGVjNS0zMDVjLTQzYzItOWExOS1iNGI4OWIxYWUyYTZ8NjBlNDRlYzUtMzA1Yy00M2MyLTlhMTktYjRiODliMWFlMmE2fDYwZTQ0ZWM1LTMwNWMtNDNjMi05YTE5LWI0Yjg5YjFhZTJhNnwwMDAwMDAwMC0wMDAwLTAwMDAtMDAwMC0wMDAwMDAwMDAwMDB8N2ZmZmZmZmZ8N2ZmZmZmZmZ8MHwwfDgyMDAwfDQ1MGZlMzk0LTI5MDQtYzlhZC0yMTRjLWEwN2ViN2ZlZWMyOXwoTm8gRGVzY3JpcHRpb24pfDB8MTB8MA==\n"; xml_test("binary", expected); } - + class TestLLSDSerializeData { public: @@ -250,9 +251,34 @@ namespace tut void doRoundTripTests(const std::string&); void checkRoundTrip(const std::string&, const LLSD& v); - - LLPointer mFormatter; - LLPointer mParser; + + void setFormatterParser(LLPointer formatter, LLPointer parser) + { + mFormatter = [formatter](const LLSD& data, std::ostream& str) + { + formatter->format(data, str); + }; + // this lambda must be mutable since otherwise the bound 'parser' + // is assumed to point to a const LLSDParser + mParser = [parser](std::istream& istr, LLSD& data, size_t max_bytes) mutable + { + // reset() call is needed since test code re-uses parser object + parser->reset(); + return (parser->parse(istr, data, max_bytes) > 0); + }; + } + + void setParser(bool (*parser)(LLSD&, std::istream&, size_t)) + { + // why does LLSDSerialize::deserialize() reverse the parse() params?? + mParser = [parser](std::istream& istr, LLSD& data, size_t max_bytes) + { + return (parser(data, istr, max_bytes) > 0); + }; + } + + std::function mFormatter; + std::function mParser; }; TestLLSDSerializeData::TestLLSDSerializeData() @@ -265,12 +291,11 @@ namespace tut void TestLLSDSerializeData::checkRoundTrip(const std::string& msg, const LLSD& v) { - std::stringstream stream; - mFormatter->format(v, stream); + std::stringstream stream; + mFormatter(v, stream); //LL_INFOS() << "checkRoundTrip: length " << stream.str().length() << LL_ENDL; LLSD w; - mParser->reset(); // reset() call is needed since test code re-uses mParser - mParser->parse(stream, w, stream.str().size()); + mParser(stream, w, stream.str().size()); try { @@ -299,52 +324,52 @@ namespace tut fillmap(root[key], width, depth - 1); } } - + void TestLLSDSerializeData::doRoundTripTests(const std::string& msg) { LLSD v; checkRoundTrip(msg + " undefined", v); - + v = true; checkRoundTrip(msg + " true bool", v); - + v = false; checkRoundTrip(msg + " false bool", v); - + v = 1; checkRoundTrip(msg + " positive int", v); - + v = 0; checkRoundTrip(msg + " zero int", v); - + v = -1; checkRoundTrip(msg + " negative int", v); - + v = 1234.5f; checkRoundTrip(msg + " positive float", v); - + v = 0.0f; checkRoundTrip(msg + " zero float", v); - + v = -1234.5f; checkRoundTrip(msg + " negative float", v); - + // FIXME: need a NaN test - + v = LLUUID::null; checkRoundTrip(msg + " null uuid", v); - + LLUUID newUUID; newUUID.generate(); v = newUUID; checkRoundTrip(msg + " new uuid", v); - + v = ""; checkRoundTrip(msg + " empty string", v); - + v = "some string"; checkRoundTrip(msg + " non-empty string", v); - + v = "Second Life is a 3-D virtual world entirely built and owned by its residents. " "Since opening to the public in 2003, it has grown explosively and today is " @@ -372,7 +397,7 @@ namespace tut for (U32 block = 0x000000; block <= 0x10ffff; block += block_size) { std::ostringstream out; - + for (U32 c = block; c < block + block_size; ++c) { if (c <= 0x000001f @@ -386,7 +411,7 @@ namespace tut if (0x00fdd0 <= c && c <= 0x00fdef) { continue; } if ((c & 0x00fffe) == 0x00fffe) { continue; } // see Unicode standard, section 15.8 - + if (c <= 0x00007f) { out << (char)(c & 0x7f); @@ -410,55 +435,55 @@ namespace tut out << (char)(0x80 | ((c >> 0) & 0x3f)); } } - + v = out.str(); std::ostringstream blockmsg; blockmsg << msg << " unicode string block 0x" << std::hex << block; checkRoundTrip(blockmsg.str(), v); } - + LLDate epoch; v = epoch; checkRoundTrip(msg + " epoch date", v); - + LLDate aDay("2002-12-07T05:07:15.00Z"); v = aDay; checkRoundTrip(msg + " date", v); - + LLURI path("http://slurl.com/secondlife/Ambleside/57/104/26/"); v = path; checkRoundTrip(msg + " url", v); - + const char source[] = "it must be a blue moon again"; std::vector data; // note, includes terminating '\0' copy(&source[0], &source[sizeof(source)], back_inserter(data)); - + v = data; checkRoundTrip(msg + " binary", v); - + v = LLSD::emptyMap(); checkRoundTrip(msg + " empty map", v); - + v = LLSD::emptyMap(); v["name"] = "luke"; //v.insert("name", "luke"); v["age"] = 3; //v.insert("age", 3); checkRoundTrip(msg + " map", v); - + v.clear(); v["a"]["1"] = true; v["b"]["0"] = false; checkRoundTrip(msg + " nested maps", v); - + v = LLSD::emptyArray(); checkRoundTrip(msg + " empty array", v); - + v = LLSD::emptyArray(); v.append("ali"); v.append(28); checkRoundTrip(msg + " array", v); - + v.clear(); v[0][0] = true; v[1][0] = false; @@ -468,7 +493,7 @@ namespace tut fillmap(v, 10, 3); // 10^6 maps checkRoundTrip(msg + " many nested maps", v); } - + typedef tut::test_group TestLLSDSerializeGroup; typedef TestLLSDSerializeGroup::object TestLLSDSerializeObject; TestLLSDSerializeGroup gTestLLSDSerializeGroup("llsd serialization"); @@ -476,35 +501,78 @@ namespace tut template<> template<> void TestLLSDSerializeObject::test<1>() { - mFormatter = new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_PRETTY_BINARY); - mParser = new LLSDNotationParser(); + setFormatterParser(new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_PRETTY_BINARY), + new LLSDNotationParser()); doRoundTripTests("pretty binary notation serialization"); } template<> template<> void TestLLSDSerializeObject::test<2>() { - mFormatter = new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_NONE); - mParser = new LLSDNotationParser(); + setFormatterParser(new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_NONE), + new LLSDNotationParser()); doRoundTripTests("raw binary notation serialization"); } template<> template<> void TestLLSDSerializeObject::test<3>() { - mFormatter = new LLSDXMLFormatter(); - mParser = new LLSDXMLParser(); + setFormatterParser(new LLSDXMLFormatter(), new LLSDXMLParser()); doRoundTripTests("xml serialization"); } template<> template<> void TestLLSDSerializeObject::test<4>() { - mFormatter = new LLSDBinaryFormatter(); - mParser = new LLSDBinaryParser(); + setFormatterParser(new LLSDBinaryFormatter(), new LLSDBinaryParser()); doRoundTripTests("binary serialization"); } + template<> template<> + void TestLLSDSerializeObject::test<5>() + { + mFormatter = [](const LLSD& sd, std::ostream& str) + { + LLSDSerialize::serialize(sd, str, LLSDSerialize::LLSD_BINARY); + }; + setParser(LLSDSerialize::deserialize); + doRoundTripTests("serialize(LLSD_BINARY)"); + }; + + template<> template<> + void TestLLSDSerializeObject::test<6>() + { + mFormatter = [](const LLSD& sd, std::ostream& str) + { + LLSDSerialize::serialize(sd, str, LLSDSerialize::LLSD_XML); + }; + setParser(LLSDSerialize::deserialize); + doRoundTripTests("serialize(LLSD_XML)"); + }; + + template<> template<> + void TestLLSDSerializeObject::test<7>() + { + mFormatter = [](const LLSD& sd, std::ostream& str) + { + LLSDSerialize::serialize(sd, str, LLSDSerialize::LLSD_NOTATION); + }; + setParser(LLSDSerialize::deserialize); + // In this test, serialize(LLSD_NOTATION) emits a header recognized by + // deserialize(). + doRoundTripTests("serialize(LLSD_NOTATION)"); + }; + + template<> template<> + void TestLLSDSerializeObject::test<8>() + { + setFormatterParser(new LLSDNotationFormatter(false, "", LLSDFormatter::OPTIONS_NONE), + new LLSDNotationParser()); + setParser(LLSDSerialize::deserialize); + // This is an interesting test because LLSDNotationFormatter does not + // emit an llsd/notation header. + doRoundTripTests("LLSDNotationFormatter -> deserialize"); + }; /** * @class TestLLSDParsing @@ -555,7 +623,7 @@ namespace tut public: TestLLSDXMLParsing() {} }; - + typedef tut::test_group TestLLSDXMLParsingGroup; typedef TestLLSDXMLParsingGroup::object TestLLSDXMLParsingObject; TestLLSDXMLParsingGroup gTestLLSDXMLParsingGroup("llsd XML parsing"); @@ -586,8 +654,8 @@ namespace tut LLSD(), LLSDParser::PARSE_FAILURE); } - - + + template<> template<> void TestLLSDXMLParsingObject::test<2>() { @@ -596,7 +664,7 @@ namespace tut v["amy"] = 23; v["bob"] = LLSD(); v["cam"] = 1.23; - + ensureParse( "unknown data type", "" @@ -607,16 +675,16 @@ namespace tut v, v.size() + 1); } - + template<> template<> void TestLLSDXMLParsingObject::test<3>() { // test handling of nested bad data - + LLSD v; v["amy"] = 23; v["cam"] = 1.23; - + ensureParse( "map with html", "" @@ -626,7 +694,7 @@ namespace tut "", v, v.size() + 1); - + v.clear(); v["amy"] = 23; v["cam"] = 1.23; @@ -639,7 +707,7 @@ namespace tut "", v, v.size() + 1); - + v.clear(); v["amy"] = 23; v["bob"] = LLSD::emptyMap(); @@ -661,7 +729,7 @@ namespace tut v[0] = 23; v[1] = LLSD(); v[2] = 1.23; - + ensureParse( "array value of html", "" @@ -671,7 +739,7 @@ namespace tut "", v, v.size() + 1); - + v.clear(); v[0] = 23; v[1] = LLSD::emptyMap(); @@ -1225,7 +1293,7 @@ namespace tut vec[0] = 'a'; vec[1] = 'b'; vec[2] = 'c'; vec[3] = '3'; vec[4] = '2'; vec[5] = '1'; LLSD value = vec; - + vec.resize(11); vec[0] = 'b'; // for binary vec[5] = 'a'; vec[6] = 'b'; vec[7] = 'c'; @@ -1909,6 +1977,6 @@ namespace tut "This string\n" "has several\n" "lines."); - + } } -- cgit v1.2.3 From 42e0787446d35bf967ff088148f8ad5f902e929b Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 23 Nov 2022 17:15:15 -0500 Subject: SL-18330: LLSDSerialize::deserialize() w/o hdr uses XML or notation Absent a header from LLSDSerialize::serialize(), make deserialize() distinguish between XML or notation by recognizing an initial '<'. --- indra/llcommon/llsdserialize.cpp | 87 ++++++++++++++--------------- indra/llcommon/tests/llsdserialize_test.cpp | 28 ++++++++++ 2 files changed, 70 insertions(+), 45 deletions(-) (limited to 'indra') diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index 9ff4676b95..dc8f8f5737 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -120,9 +120,7 @@ void LLSDSerialize::serialize(const LLSD& sd, std::ostream& str, ELLSD_Serialize bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) { char hdr_buf[MAX_HDR_LEN + 1] = ""; /* Flawfinder: ignore */ - bool legacy_no_header = false; bool fail_if_not_legacy = false; - std::string header; /* * Get the first line before anything. @@ -131,6 +129,7 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) // want to back up and retry. str.get(hdr_buf, sizeof(hdr_buf), '\n'); auto inbuf = str.gcount(); + std::string header{ hdr_buf, inbuf }; if (str.fail()) { str.clear(); @@ -138,38 +137,36 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) } if (!strncasecmp(LEGACY_NON_HEADER, hdr_buf, strlen(LEGACY_NON_HEADER))) /* Flawfinder: ignore */ + { // Create a LLSD XML parser, and parse the first chunk read above. + LLSDXMLParser x; + x.parsePart(hdr_buf, inbuf); // Parse the first part that was already read + auto parsed = x.parse(str, sd, max_bytes - inbuf); // Parse the rest of it + // Formally we should probably check (parsed != PARSE_FAILURE && + // parsed > 0), but since PARSE_FAILURE is -1, this suffices. + return (parsed > 0); + } + + if (fail_if_not_legacy) { - legacy_no_header = true; + LL_WARNS() << "deserialize LLSD parse failure" << LL_ENDL; + return false; } - else + + /* + * Remove the newline chars + */ + auto lastchar = header.find_last_not_of("\r\n"); + if (lastchar != std::string::npos) { - if (fail_if_not_legacy) - { - LL_WARNS() << "deserialize LLSD parse failure" << LL_ENDL; - return false; - } - /* - * Remove the newline chars - */ - for (size_t i = 0; i < sizeof(hdr_buf); i++) - { - if (hdr_buf[i] == 0 || hdr_buf[i] == '\r' || - hdr_buf[i] == '\n') - { - hdr_buf[i] = 0; - break; - } - } - header = hdr_buf; + header.erase(lastchar+1); + } - std::string::size_type start = std::string::npos; - std::string::size_type end = std::string::npos; - start = header.find_first_not_of(" header syntax + auto start = header.find_first_not_of(" 0), but since PARSE_FAILURE is -1, this suffices. - return (parsed > 0); - } - if (header == LLSD_BINARY_HEADER) { return (parse_using(str, sd, max_bytes) > 0); @@ -200,15 +187,27 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) { return (parse_using(str, sd, max_bytes) > 0); } - else + else // no header we recognize { - LL_DEBUGS() << "deserialize request with no header, assuming notation" << LL_ENDL; + LLPointer p; + if (inbuf && hdr_buf[0] == '<') + { + // looks like XML + LL_DEBUGS() << "deserialize request with no header, assuming XML" << LL_ENDL; + p = new LLSDXMLParser; + } + else + { + // assume notation + LL_DEBUGS() << "deserialize request with no header, assuming notation" << LL_ENDL; + p = new LLSDNotationParser; + } // Since we've already read 'inbuf' bytes into 'hdr_buf', prepend that // data to whatever remains in 'str'. LLMemoryStreamBuf already(reinterpret_cast(hdr_buf), inbuf); cat_streambuf prebuff(&already, str.rdbuf()); std::istream prepend(&prebuff); - return (parse_using(prepend, sd, max_bytes) > 0); + return (p->parse(prepend, sd, max_bytes) > 0); } } @@ -2411,5 +2410,3 @@ U8* unzip_llsdNavMesh( bool& valid, unsigned int& outsize, std::istream& is, S32 return result; } - - diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index 0334699c7f..bbbc32214b 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -574,6 +574,34 @@ namespace tut doRoundTripTests("LLSDNotationFormatter -> deserialize"); }; + template<> template<> + void TestLLSDSerializeObject::test<9>() + { + setFormatterParser(new LLSDXMLFormatter(false, "", LLSDFormatter::OPTIONS_NONE), + new LLSDXMLParser()); + setParser(LLSDSerialize::deserialize); + // This is an interesting test because LLSDXMLFormatter does not + // emit an LLSD/XML header. + doRoundTripTests("LLSDXMLFormatter -> deserialize"); + }; + +/*==========================================================================*| + // We do not expect this test to succeed. Without a header, neither + // notation LLSD nor binary LLSD reliably start with a distinct character, + // the way XML LLSD starts with '<'. By convention, we default to notation + // rather than binary. + template<> template<> + void TestLLSDSerializeObject::test<10>() + { + setFormatterParser(new LLSDBinaryFormatter(false, "", LLSDFormatter::OPTIONS_NONE), + new LLSDBinaryParser()); + setParser(LLSDSerialize::deserialize); + // This is an interesting test because LLSDBinaryFormatter does not + // emit an LLSD/Binary header. + doRoundTripTests("LLSDBinaryFormatter -> deserialize"); + }; +|*==========================================================================*/ + /** * @class TestLLSDParsing * @brief Base class for of a parse tester. -- cgit v1.2.3 From b180e4de23cb54ec385e2d999fc5fdd4ea804ba4 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 29 Nov 2022 14:03:02 -0500 Subject: SL-18330: WIP: Send LLLeap to child as binary LLSD; generic parser. Since parsing binary LLSD is faster than parsing notation LLSD, send data from the viewer to the LEAP plugin child process's stdin in binary instead of notation. Similarly, instead of parsing the child process's stdout using specifically a notation parser, use the generic LLSDSerialize::deserialize() LLSD parser. Add more LLSDSerialize Python compatibility tests. --- indra/llcommon/llleap.cpp | 28 +-- indra/llcommon/tests/llsdserialize_test.cpp | 286 +++++++++++++++++++--------- 2 files changed, 211 insertions(+), 103 deletions(-) (limited to 'indra') diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp index 2704f8b6de..f71eaf92c4 100644 --- a/indra/llcommon/llleap.cpp +++ b/indra/llcommon/llleap.cpp @@ -204,30 +204,35 @@ public: LLSD packet(LLSDMap("pump", pump)("data", data)); std::ostringstream buffer; - buffer << LLSDNotationStreamer(packet); + // SL-18330: for large data blocks, it's much faster to parse binary + // LLSD than notation LLSD. Use serialize(LLSD_BINARY) rather than + // directly calling LLSDBinaryFormatter because, unlike the latter, + // serialize() prepends the relevant header, needed by a general- + // purpose LLSD parser to distinguish binary from notation. + LLSDSerialize::serialize(packet, buffer, LLSDSerialize::LLSD_BINARY, + LLSDFormatter::OPTIONS_NONE); /*==========================================================================*| // DEBUGGING ONLY: don't copy str() if we can avoid it. std::string strdata(buffer.str()); if (std::size_t(buffer.tellp()) != strdata.length()) { - LL_ERRS("LLLeap") << "tellp() -> " << buffer.tellp() << " != " + LL_ERRS("LLLeap") << "tellp() -> " << static_cast(buffer.tellp()) << " != " << "str().length() -> " << strdata.length() << LL_ENDL; } // DEBUGGING ONLY: reading back is terribly inefficient. std::istringstream readback(strdata); LLSD echo; - LLPointer parser(new LLSDNotationParser()); - S32 parse_status(parser->parse(readback, echo, strdata.length())); - if (parse_status == LLSDParser::PARSE_FAILURE) + bool parse_status(LLSDSerialize::deserialize(echo, readback, strdata.length())); + if (! parse_status) { - LL_ERRS("LLLeap") << "LLSDNotationParser() cannot parse output of " - << "LLSDNotationStreamer()" << LL_ENDL; + LL_ERRS("LLLeap") << "LLSDSerialize::deserialize() cannot parse output of " + << "LLSDSerialize::serialize(LLSD_BINARY)" << LL_ENDL; } if (! llsd_equals(echo, packet)) { - LL_ERRS("LLLeap") << "LLSDNotationParser() produced different LLSD " - << "than passed to LLSDNotationStreamer()" << LL_ENDL; + LL_ERRS("LLLeap") << "LLSDSerialize::deserialize() returned different LLSD " + << "than passed to LLSDSerialize::serialize()" << LL_ENDL; } |*==========================================================================*/ @@ -312,9 +317,8 @@ public: LL_DEBUGS("LLLeap") << "needed " << mExpect << " bytes, got " << childout.size() << ", parsing LLSD" << LL_ENDL; LLSD data; - LLPointer parser(new LLSDNotationParser()); - S32 parse_status(parser->parse(childout.get_istream(), data, mExpect)); - if (parse_status == LLSDParser::PARSE_FAILURE) + bool parse_status(LLSDSerialize::deserialize(data, childout.get_istream(), mExpect)); + if (! parse_status) { bad_protocol("unparseable LLSD data"); } diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index bbbc32214b..601f2c580d 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -46,7 +46,6 @@ typedef U32 uint32_t; #include "boost/range.hpp" #include "boost/foreach.hpp" -#include "boost/function.hpp" #include "boost/bind.hpp" #include "boost/phoenix/bind/bind_function.hpp" #include "boost/phoenix/core/argument.hpp" @@ -62,6 +61,9 @@ using namespace boost::phoenix; #include "stringize.h" #include +typedef std::function FormatterFunction; +typedef std::function ParserFunction; + std::vector string_to_vector(const std::string& str) { return std::vector(str.begin(), str.end()); @@ -277,8 +279,8 @@ namespace tut }; } - std::function mFormatter; - std::function mParser; + FormatterFunction mFormatter; + ParserFunction mParser; }; TestLLSDSerializeData::TestLLSDSerializeData() @@ -1790,85 +1792,83 @@ namespace tut ensureBinaryAndXML("map", test); } - struct TestPythonCompatible + // helper for TestPythonCompatible + static std::string import_llsd("import os.path\n" + "import sys\n" + "try:\n" + // new freestanding llsd package + " import llsd\n" + "except ImportError:\n" + // older llbase.llsd module + " from llbase import llsd\n"); + + // helper for TestPythonCompatible + template + void python(const std::string& desc, const CONTENT& script, int expect=0) { - TestPythonCompatible(): - // Note the peculiar insertion of __FILE__ into this string. Since - // this script is being written into a platform-dependent temp - // directory, we can't locate indra/lib/python relative to - // Python's __file__. Use __FILE__ instead, navigating relative - // to this C++ source file. Use Python raw-string syntax so - // Windows pathname backslashes won't mislead Python's string - // scanner. - import_llsd("import os.path\n" - "import sys\n" - "from llbase import llsd\n") - {} - ~TestPythonCompatible() {} + auto PYTHON(LLStringUtil::getenv("PYTHON")); + ensure("Set $PYTHON to the Python interpreter", !PYTHON.empty()); - std::string import_llsd; + NamedTempFile scriptfile("py", script); - template - void python(const std::string& desc, const CONTENT& script, int expect=0) +#if LL_WINDOWS + std::string q("\""); + std::string qPYTHON(q + PYTHON + q); + std::string qscript(q + scriptfile.getName() + q); + int rc = _spawnl(_P_WAIT, PYTHON.c_str(), qPYTHON.c_str(), qscript.c_str(), NULL); + if (rc == -1) { - auto PYTHON(LLStringUtil::getenv("PYTHON")); - ensure("Set $PYTHON to the Python interpreter", !PYTHON.empty()); - - NamedTempFile scriptfile("py", script); + char buffer[256]; + strerror_s(buffer, errno); // C++ can infer the buffer size! :-O + ensure(STRINGIZE("Couldn't run Python " << desc << "script: " << buffer), false); + } + else + { + ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc), rc, expect); + } -#if LL_WINDOWS - std::string q("\""); - std::string qPYTHON(q + PYTHON + q); - std::string qscript(q + scriptfile.getName() + q); - int rc = _spawnl(_P_WAIT, PYTHON.c_str(), qPYTHON.c_str(), qscript.c_str(), NULL); - if (rc == -1) - { - char buffer[256]; - strerror_s(buffer, errno); // C++ can infer the buffer size! :-O - ensure(STRINGIZE("Couldn't run Python " << desc << "script: " << buffer), false); - } - else +#else // LL_DARWIN, LL_LINUX + LLProcess::Params params; + params.executable = PYTHON; + params.args.add(scriptfile.getName()); + LLProcessPtr py(LLProcess::create(params)); + ensure(STRINGIZE("Couldn't launch " << desc << " script"), bool(py)); + // Implementing timeout would mean messing with alarm() and + // catching SIGALRM... later maybe... + int status(0); + if (waitpid(py->getProcessID(), &status, 0) == -1) + { + int waitpid_errno(errno); + ensure_equals(STRINGIZE("Couldn't retrieve rc from " << desc << " script: " + "waitpid() errno " << waitpid_errno), + waitpid_errno, ECHILD); + } + else + { + if (WIFEXITED(status)) { - ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc), rc, expect); + int rc(WEXITSTATUS(status)); + ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc), + rc, expect); } - -#else // LL_DARWIN, LL_LINUX - LLProcess::Params params; - params.executable = PYTHON; - params.args.add(scriptfile.getName()); - LLProcessPtr py(LLProcess::create(params)); - ensure(STRINGIZE("Couldn't launch " << desc << " script"), bool(py)); - // Implementing timeout would mean messing with alarm() and - // catching SIGALRM... later maybe... - int status(0); - if (waitpid(py->getProcessID(), &status, 0) == -1) + else if (WIFSIGNALED(status)) { - int waitpid_errno(errno); - ensure_equals(STRINGIZE("Couldn't retrieve rc from " << desc << " script: " - "waitpid() errno " << waitpid_errno), - waitpid_errno, ECHILD); + ensure(STRINGIZE(desc << " script terminated by signal " << WTERMSIG(status)), + false); } else { - if (WIFEXITED(status)) - { - int rc(WEXITSTATUS(status)); - ensure_equals(STRINGIZE(desc << " script terminated with rc " << rc), - rc, expect); - } - else if (WIFSIGNALED(status)) - { - ensure(STRINGIZE(desc << " script terminated by signal " << WTERMSIG(status)), - false); - } - else - { - ensure(STRINGIZE(desc << " script produced impossible status " << status), - false); - } + ensure(STRINGIZE(desc << " script produced impossible status " << status), + false); } -#endif } +#endif + } + + struct TestPythonCompatible + { + TestPythonCompatible() {} + ~TestPythonCompatible() {} }; typedef tut::test_group TestPythonCompatibleGroup; @@ -1894,12 +1894,13 @@ namespace tut "print('Running on', sys.platform)\n"); } - // helper for test<3> - static void writeLLSDArray(std::ostream& out, const LLSD& array) + // helper for test<3> - test<7> + static void writeLLSDArray(const FormatterFunction& serialize, + std::ostream& out, const LLSD& array) { BOOST_FOREACH(LLSD item, llsd::inArray(array)) { - LLSDSerialize::toNotation(item, out); + serialize(item, out); // It's important to separate with newlines because Python's llsd // module doesn't support parsing from a file stream, only from a // string, so we have to know how much of the file to read into a @@ -1908,11 +1909,10 @@ namespace tut } } - template<> template<> - void TestPythonCompatibleObject::test<3>() + // helper for test<3> - test<7> + static void toPythonUsing(const std::string& desc, + const FormatterFunction& serialize) { - set_test_name("verify sequence to Python"); - LLSD cdata(LLSDArray(17)(3.14) ("This string\n" "has several\n" @@ -1941,9 +1941,11 @@ namespace tut // takes a callable. To this callable it passes the // std::ostream with which it's writing the // NamedTempFile. - boost::bind(writeLLSDArray, _1, cdata)); + [serialize, cdata] + (std::ostream& out) + { writeLLSDArray(serialize, out, cdata); }); - python("read C++ notation", + python("read C++ " + desc, placeholders::arg1 << import_llsd << "def parse_each(iterable):\n" @@ -1954,17 +1956,70 @@ namespace tut "verify(parse_each(open(r'" << file.getName() << "', 'rb')))\n"); } + template<> template<> + void TestPythonCompatibleObject::test<3>() + { + set_test_name("to Python using LLSDSerialize::serialize(LLSD_XML)"); + toPythonUsing("LLSD_XML", + [](const LLSD& sd, std::ostream& out) + { LLSDSerialize::serialize(sd, out, LLSDSerialize::LLSD_XML); }); + } + template<> template<> void TestPythonCompatibleObject::test<4>() { - set_test_name("verify sequence from Python"); + set_test_name("to Python using LLSDSerialize::serialize(LLSD_NOTATION)"); + toPythonUsing("LLSD_NOTATION", + [](const LLSD& sd, std::ostream& out) + { LLSDSerialize::serialize(sd, out, LLSDSerialize::LLSD_NOTATION); }); + } + + template<> template<> + void TestPythonCompatibleObject::test<5>() + { + set_test_name("to Python using LLSDSerialize::serialize(LLSD_BINARY)"); + toPythonUsing("LLSD_BINARY", + [](const LLSD& sd, std::ostream& out) + { LLSDSerialize::serialize(sd, out, LLSDSerialize::LLSD_BINARY); }); + } + + template<> template<> + void TestPythonCompatibleObject::test<6>() + { + set_test_name("to Python using LLSDSerialize::toXML()"); + toPythonUsing("toXML()", LLSDSerialize::toXML); + } + + template<> template<> + void TestPythonCompatibleObject::test<7>() + { + set_test_name("to Python using LLSDSerialize::toNotation()"); + toPythonUsing("toNotation()", LLSDSerialize::toNotation); + } + +/*==========================================================================*| + template<> template<> + void TestPythonCompatibleObject::test<8>() + { + set_test_name("to Python using LLSDSerialize::toBinary()"); + // We don't expect this to work because, without a header, + // llsd.parse() will assume notation rather than binary. + toPythonUsing("toBinary()", LLSDSerialize::toBinary); + } +|*==========================================================================*/ + // helper for test<8> - test<12> + void fromPythonUsing(const std::string& pyformatter, + const ParserFunction& parse= + [](std::istream& istr, LLSD& data, size_t max_bytes) + { return LLSDSerialize::deserialize(data, istr, max_bytes); }) + { // Create an empty data file. This is just a placeholder for our // script to write into. Create it to establish a unique name that // we know. NamedTempFile file("llsd", ""); - python("write Python notation", + python("Python " + pyformatter, placeholders::arg1 << import_llsd << "DATA = [\n" @@ -1977,9 +2032,9 @@ namespace tut "]\n" // Don't forget raw-string syntax for Windows pathnames. // N.B. Using 'print' implicitly adds newlines. - "with open(r'" << file.getName() << "', 'w') as f:\n" + "with open(r'" << file.getName() << "', 'wb') as f:\n" " for item in DATA:\n" - " print(llsd.format_notation(item).decode(), file=f)\n"); + " print(llsd." << pyformatter << "(item), file=f)\n"); std::ifstream inf(file.getName().c_str()); LLSD item; @@ -1989,22 +2044,71 @@ namespace tut // want to ensure that notation-separated-by-newlines works in both // directions -- since in practice, a given file might be read by // either language. - ensure_equals("Failed to read LLSD::Integer from Python", - LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED), - 1); + ensure("Failed to read LLSD::Integer from Python", + parse(inf, item, LLSDSerialize::SIZE_UNLIMITED)); ensure_equals(item.asInteger(), 17); - ensure_equals("Failed to read LLSD::Real from Python", - LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED), - 1); + ensure("Failed to read LLSD::Real from Python", + parse(inf, item, LLSDSerialize::SIZE_UNLIMITED)); ensure_approximately_equals("Bad LLSD::Real value from Python", item.asReal(), 3.14, 7); // 7 bits ~= 0.01 - ensure_equals("Failed to read LLSD::String from Python", - LLSDSerialize::fromNotation(item, inf, LLSDSerialize::SIZE_UNLIMITED), - 1); + ensure("Failed to read LLSD::String from Python", + parse(inf, item, LLSDSerialize::SIZE_UNLIMITED)); ensure_equals(item.asString(), "This string\n" "has several\n" "lines."); + } + template<> template<> + void TestPythonCompatibleObject::test<8>() + { + set_test_name("from Python XML using LLSDSerialize::deserialize()"); + fromPythonUsing("format_xml"); } + + template<> template<> + void TestPythonCompatibleObject::test<9>() + { + set_test_name("from Python notation using LLSDSerialize::deserialize()"); + fromPythonUsing("format_notation"); + } + + template<> template<> + void TestPythonCompatibleObject::test<10>() + { + set_test_name("from Python binary using LLSDSerialize::deserialize()"); + fromPythonUsing("format_binary"); + } + + template<> template<> + void TestPythonCompatibleObject::test<11>() + { + set_test_name("from Python XML using fromXML()"); + // fromXML()'s optional 3rd param isn't max_bytes, it's emit_errors + fromPythonUsing("format_xml", + [](std::istream& istr, LLSD& data, size_t) + { return LLSDSerialize::fromXML(data, istr) > 0; }); + } + + template<> template<> + void TestPythonCompatibleObject::test<12>() + { + set_test_name("from Python notation using fromNotation()"); + fromPythonUsing("format_notation", + [](std::istream& istr, LLSD& data, size_t max_bytes) + { return LLSDSerialize::fromNotation(data, istr, max_bytes) > 0; }); + } + +/*==========================================================================*| + template<> template<> + void TestPythonCompatibleObject::test<13>() + { + set_test_name("from Python binary using fromBinary()"); + // We don't expect this to work because format_binary() emits a + // header, but fromBinary() won't recognize a header. + fromPythonUsing("format_binary", + [](std::istream& istr, LLSD& data, size_t max_bytes) + { return LLSDSerialize::fromBinary(data, istr, max_bytes) > 0; }); + } +|*==========================================================================*/ } -- cgit v1.2.3 From 2f557cd7faceec36acace1eee4ee38904ff06130 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 2 Dec 2022 15:17:56 -0500 Subject: SL-18330: Fix new C++ <-> Python LLSD compatibility tests. When sending multiple LEAP packets in the same file (for testing convenience), use a length prefix instead of delimiting with '\n'. Now that we allow a serialization format that includes an LLSD format header (e.g. ""), '\n' is part of the packet content. But in fact, testing binary LLSD means we can't pick any delimiter guaranteed not to appear in the packet content. Using a length prefix also lets us pass a specific max_bytes to the subject C++ LLSD parser. Make llleap_test.cpp use new freestanding Python llsd package when available. Update Python-side LEAP protocol code to work directly with encoded bytes stream, avoiding bytes<->str encoding and decoding, which breaks binary LLSD. Make LLSDSerialize::deserialize() recognize LLSD format header case- insensitively. Python emits and checks for "llsd/binary", while LLSDSerialize emits and checks for "LLSD/Binary". Once any of the headers is recognized, pass corrected max_bytes to the specific parser. Make deserialize() more careful about the no-header case: preserve '\n' in content. Introduce debugging code (disabled) because it's a little tricky to recreate. Revert LLLeap child process stdout parser from LLSDSerialize::deserialize() to the specific LLSDNotationParser(), as at present: the generic parser fails one of LLLeap's integration tests for reasons that remain mysterious. --- indra/llcommon/llleap.cpp | 9 +++ indra/llcommon/llsdserialize.cpp | 49 +++++++++--- indra/llcommon/tests/llleap_test.cpp | 32 ++++---- indra/llcommon/tests/llsdserialize_test.cpp | 118 +++++++++++++++++++--------- 4 files changed, 147 insertions(+), 61 deletions(-) (limited to 'indra') diff --git a/indra/llcommon/llleap.cpp b/indra/llcommon/llleap.cpp index f71eaf92c4..e8ccc4300d 100644 --- a/indra/llcommon/llleap.cpp +++ b/indra/llcommon/llleap.cpp @@ -317,8 +317,17 @@ public: LL_DEBUGS("LLLeap") << "needed " << mExpect << " bytes, got " << childout.size() << ", parsing LLSD" << LL_ENDL; LLSD data; +#if 1 + // specifically require notation LLSD from child + LLPointer parser(new LLSDNotationParser()); + S32 parse_status(parser->parse(childout.get_istream(), data, mExpect)); + if (parse_status == LLSDParser::PARSE_FAILURE) +#else + // SL-18330: accept any valid LLSD serialization format from child + // Unfortunately this runs into trouble we have not yet debugged. bool parse_status(LLSDSerialize::deserialize(data, childout.get_istream(), mExpect)); if (! parse_status) +#endif { bad_protocol("unparseable LLSD data"); } diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index dc8f8f5737..97bf51eeaa 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -123,12 +123,26 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) bool fail_if_not_legacy = false; /* - * Get the first line before anything. + * Get the first line before anything. Don't read more than max_bytes: + * this get() overload reads no more than (count-1) bytes into the + * specified buffer. In the usual case when max_bytes exceeds + * sizeof(hdr_buf), get() will read no more than sizeof(hdr_buf)-2. */ - // Remember str's original input position: if there's no header, we'll - // want to back up and retry. - str.get(hdr_buf, sizeof(hdr_buf), '\n'); + str.get(hdr_buf, std::min(max_bytes+1, sizeof(hdr_buf)-1), '\n'); auto inbuf = str.gcount(); + // https://en.cppreference.com/w/cpp/io/basic_istream/get + // When the get() above sees the specified delimiter '\n', it stops there + // without pulling it from the stream. If it turns out that the stream + // does NOT contain a header, and the content includes meaningful '\n', + // it's important to pull that into hdr_buf too. + if (inbuf < max_bytes && str.get(hdr_buf[inbuf])) + { + // got the delimiting '\n' + ++inbuf; + // None of the following requires that hdr_buf contain a final '\0' + // byte. We could store one if needed, since even the incremented + // inbuf won't exceed sizeof(hdr_buf)-1, but there's no need. + } std::string header{ hdr_buf, inbuf }; if (str.fail()) { @@ -175,17 +189,17 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) /* * Create the parser as appropriate */ - if (header == LLSD_BINARY_HEADER) + if (0 == LLStringUtil::compareInsensitive(header, LLSD_BINARY_HEADER)) { - return (parse_using(str, sd, max_bytes) > 0); + return (parse_using(str, sd, max_bytes-inbuf) > 0); } - else if (header == LLSD_XML_HEADER) + else if (0 == LLStringUtil::compareInsensitive(header, LLSD_XML_HEADER)) { - return (parse_using(str, sd, max_bytes) > 0); + return (parse_using(str, sd, max_bytes-inbuf) > 0); } - else if (header == LLSD_NOTATION_HEADER) + else if (0 == LLStringUtil::compareInsensitive(header, LLSD_NOTATION_HEADER)) { - return (parse_using(str, sd, max_bytes) > 0); + return (parse_using(str, sd, max_bytes-inbuf) > 0); } else // no header we recognize { @@ -207,7 +221,22 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) LLMemoryStreamBuf already(reinterpret_cast(hdr_buf), inbuf); cat_streambuf prebuff(&already, str.rdbuf()); std::istream prepend(&prebuff); +#if 1 return (p->parse(prepend, sd, max_bytes) > 0); +#else + // debugging the reconstituted 'prepend' stream + // allocate a buffer that we hope is big enough for the whole thing + std::vector wholemsg((max_bytes == size_t(SIZE_UNLIMITED))? 1024 : max_bytes); + prepend.read(wholemsg.data(), std::min(max_bytes, wholemsg.size())); + LLMemoryStream replay(reinterpret_cast(wholemsg.data()), prepend.gcount()); + auto success{ p->parse(replay, sd, prepend.gcount()) > 0 }; + { + LL_DEBUGS() << (success? "parsed: $$" : "failed: '") + << std::string(wholemsg.data(), llmin(prepend.gcount(), 100)) << "$$" + << LL_ENDL; + } + return success; +#endif } } diff --git a/indra/llcommon/tests/llleap_test.cpp b/indra/llcommon/tests/llleap_test.cpp index 9754353ab0..6c799b7993 100644 --- a/indra/llcommon/tests/llleap_test.cpp +++ b/indra/llcommon/tests/llleap_test.cpp @@ -110,12 +110,12 @@ namespace tut "import os\n" "import sys\n" "\n" - // Don't forget that this Python script is written to some - // temp directory somewhere! Its __file__ is useless in - // finding indra/lib/python. Use our __FILE__, with - // raw-string syntax to deal with Windows pathnames. - "mydir = os.path.dirname(r'" << __FILE__ << "')\n" - "from llbase import llsd\n" + "try:\n" + // new freestanding llsd package + " import llsd\n" + "except ImportError:\n" + // older llbase.llsd module + " from llbase import llsd\n" "\n" "class ProtocolError(Exception):\n" " def __init__(self, msg, data):\n" @@ -126,26 +126,26 @@ namespace tut " pass\n" "\n" "def get():\n" - " hdr = ''\n" - " while ':' not in hdr and len(hdr) < 20:\n" - " hdr += sys.stdin.read(1)\n" + " hdr = []\n" + " while b':' not in hdr and len(hdr) < 20:\n" + " hdr.append(sys.stdin.buffer.read(1))\n" " if not hdr:\n" " sys.exit(0)\n" - " if not hdr.endswith(':'):\n" + " if not hdr[-1] == b':':\n" " raise ProtocolError('Expected len:data, got %r' % hdr, hdr)\n" " try:\n" - " length = int(hdr[:-1])\n" + " length = int(b''.join(hdr[:-1]))\n" " except ValueError:\n" " raise ProtocolError('Non-numeric len %r' % hdr[:-1], hdr[:-1])\n" " parts = []\n" " received = 0\n" " while received < length:\n" - " parts.append(sys.stdin.read(length - received))\n" + " parts.append(sys.stdin.buffer.read(length - received))\n" " received += len(parts[-1])\n" - " data = ''.join(parts)\n" + " data = b''.join(parts)\n" " assert len(data) == length\n" " try:\n" - " return llsd.parse(data.encode())\n" + " return llsd.parse(data)\n" // Seems the old indra.base.llsd module didn't properly // convert IndexError (from running off end of string) to // LLSDParseError. @@ -185,11 +185,11 @@ namespace tut " return _reply\n" "\n" "def put(req):\n" - " sys.stdout.write(':'.join((str(len(req)), req)))\n" + " sys.stdout.buffer.write(b'%d:%b' % (len(req), req))\n" " sys.stdout.flush()\n" "\n" "def send(pump, data):\n" - " put(llsd.format_notation(dict(pump=pump, data=data)).decode())\n" + " put(llsd.format_notation(dict(pump=pump, data=data)))\n" "\n" "def request(pump, data):\n" " # we expect 'data' is a dict\n" diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index 601f2c580d..39b93cf335 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -51,10 +51,11 @@ typedef U32 uint32_t; #include "boost/phoenix/core/argument.hpp" using namespace boost::phoenix; -#include "../llsd.h" -#include "../llsdserialize.h" +#include "llsd.h" +#include "llsdserialize.h" #include "llsdutil.h" -#include "../llformat.h" +#include "llformat.h" +#include "llmemorystream.h" #include "../test/lltut.h" #include "../test/namedtempfile.h" @@ -1898,14 +1899,22 @@ namespace tut static void writeLLSDArray(const FormatterFunction& serialize, std::ostream& out, const LLSD& array) { - BOOST_FOREACH(LLSD item, llsd::inArray(array)) + for (const LLSD& item : llsd::inArray(array)) { - serialize(item, out); - // It's important to separate with newlines because Python's llsd - // module doesn't support parsing from a file stream, only from a - // string, so we have to know how much of the file to read into a - // string. - out << '\n'; + // It's important to delimit the entries in this file somehow + // because, although Python's llsd.parse() can accept a file + // stream, the XML parser expects EOF after a single outer element + // -- it doesn't just stop. So we must extract a sequence of bytes + // strings from the file. But since one of the serialization + // formats we want to test is binary, we can't pick any single + // byte value as a delimiter! Use a binary integer length prefix + // instead. + std::ostringstream buffer; + serialize(item, buffer); + auto buffstr{ buffer.str() }; + int bufflen{ static_cast(buffstr.length()) }; + out.write(reinterpret_cast(&bufflen), sizeof(bufflen)); + out.write(buffstr.c_str(), buffstr.length()); } } @@ -1932,7 +1941,7 @@ namespace tut " except StopIteration:\n" " pass\n" " else:\n" - " assert False, 'Too many data items'\n"; + " raise AssertionError('Too many data items')\n"; // Create an llsdXXXXXX file containing 'data' serialized to // notation. @@ -1948,10 +1957,23 @@ namespace tut python("read C++ " + desc, placeholders::arg1 << import_llsd << - "def parse_each(iterable):\n" - " for item in iterable:\n" - " yield llsd.parse(item)\n" << - pydata << + "from functools import partial\n" + "import struct\n" + "lenformat = struct.Struct('i')\n" + "def parse_each(inf):\n" + " for rawlen in iter(partial(inf.read, lenformat.size), b''):\n" + " len = lenformat.unpack(rawlen)[0]\n" + // Since llsd.parse() has no max_bytes argument, instead of + // passing the input stream directly to parse(), read the item + // into a distinct bytes object and parse that. + " data = inf.read(len)\n" + " try:\n" + " yield llsd.parse(data)\n" + " except llsd.LLSDParseError as err:\n" + " print(f'*** {err}')\n" + " print(f'Bad content:\\n{data!r}')\n" + " raise\n" + << pydata << // Don't forget raw-string syntax for Windows pathnames. "verify(parse_each(open(r'" << file.getName() << "', 'rb')))\n"); } @@ -2008,6 +2030,26 @@ namespace tut } |*==========================================================================*/ + // helper for test<8> - test<12> + bool itemFromStream(std::istream& istr, LLSD& item, const ParserFunction& parse) + { + // reset the output value for debugging clarity + item.clear(); + // We use an int length prefix as a foolproof delimiter even for + // binary serialized streams. + int length{ 0 }; + istr.read(reinterpret_cast(&length), sizeof(length)); +// return parse(istr, item, length); + // Sadly, as of 2022-12-01 it seems we can't really trust our LLSD + // parsers to honor max_bytes: this test works better when we read + // each item into its own distinct LLMemoryStream, instead of passing + // the original istr with a max_bytes constraint. + std::vector buffer(length); + istr.read(reinterpret_cast(buffer.data()), length); + LLMemoryStream stream(buffer.data(), length); + return parse(stream, item, length); + } + // helper for test<8> - test<12> void fromPythonUsing(const std::string& pyformatter, const ParserFunction& parse= @@ -2022,6 +2064,8 @@ namespace tut python("Python " + pyformatter, placeholders::arg1 << import_llsd << + "import struct\n" + "lenformat = struct.Struct('i')\n" "DATA = [\n" " 17,\n" " 3.14,\n" @@ -2034,29 +2078,33 @@ namespace tut // N.B. Using 'print' implicitly adds newlines. "with open(r'" << file.getName() << "', 'wb') as f:\n" " for item in DATA:\n" - " print(llsd." << pyformatter << "(item), file=f)\n"); + " serialized = llsd." << pyformatter << "(item)\n" + " f.write(lenformat.pack(len(serialized)))\n" + " f.write(serialized)\n"); std::ifstream inf(file.getName().c_str()); LLSD item; - // Notice that we're not doing anything special to parse out the - // newlines: LLSDSerialize::fromNotation ignores them. While it would - // seem they're not strictly necessary, going in this direction, we - // want to ensure that notation-separated-by-newlines works in both - // directions -- since in practice, a given file might be read by - // either language. - ensure("Failed to read LLSD::Integer from Python", - parse(inf, item, LLSDSerialize::SIZE_UNLIMITED)); - ensure_equals(item.asInteger(), 17); - ensure("Failed to read LLSD::Real from Python", - parse(inf, item, LLSDSerialize::SIZE_UNLIMITED)); - ensure_approximately_equals("Bad LLSD::Real value from Python", - item.asReal(), 3.14, 7); // 7 bits ~= 0.01 - ensure("Failed to read LLSD::String from Python", - parse(inf, item, LLSDSerialize::SIZE_UNLIMITED)); - ensure_equals(item.asString(), - "This string\n" - "has several\n" - "lines."); + try + { + ensure("Failed to read LLSD::Integer from Python", + itemFromStream(inf, item, parse)); + ensure_equals(item.asInteger(), 17); + ensure("Failed to read LLSD::Real from Python", + itemFromStream(inf, item, parse)); + ensure_approximately_equals("Bad LLSD::Real value from Python", + item.asReal(), 3.14, 7); // 7 bits ~= 0.01 + ensure("Failed to read LLSD::String from Python", + itemFromStream(inf, item, parse)); + ensure_equals(item.asString(), + "This string\n" + "has several\n" + "lines."); + } + catch (const tut::failure& err) + { + std::cout << "for " << err.what() << ", item = " << item << std::endl; + throw; + } } template<> template<> -- cgit v1.2.3 From 761d8337fb70cea9cfb326f06a8b1b35438ed96b Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 2 Dec 2022 17:14:31 -0500 Subject: SL-18330: Test Python llsd.parse() both from bytes and from stream. --- indra/llcommon/tests/llsdserialize_test.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index 39b93cf335..6e5d8a26e1 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -1958,6 +1958,7 @@ namespace tut placeholders::arg1 << import_llsd << "from functools import partial\n" + "import io\n" "import struct\n" "lenformat = struct.Struct('i')\n" "def parse_each(inf):\n" @@ -1968,11 +1969,16 @@ namespace tut // into a distinct bytes object and parse that. " data = inf.read(len)\n" " try:\n" - " yield llsd.parse(data)\n" + " frombytes = llsd.parse(data)\n" " except llsd.LLSDParseError as err:\n" " print(f'*** {err}')\n" " print(f'Bad content:\\n{data!r}')\n" " raise\n" + // Also try parsing from a distinct stream. + " stream = io.BytesIO(data)\n" + " fromstream = llsd.parse(stream)\n" + " assert frombytes == fromstream\n" + " yield frombytes\n" << pydata << // Don't forget raw-string syntax for Windows pathnames. "verify(parse_each(open(r'" << file.getName() << "', 'rb')))\n"); -- cgit v1.2.3 From 590e158cf36b6e6fca07f54837db084fe8a163c6 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Tue, 6 Dec 2022 16:30:35 -0500 Subject: SL-18330: Adapt LLSDSerialize and tests to llssize max_bytes params. --- indra/llcommon/llsdserialize.cpp | 2 +- indra/llcommon/tests/llsdserialize_test.cpp | 16 ++++++++-------- 2 files changed, 9 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index 97bf51eeaa..c1b24d8138 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -128,7 +128,7 @@ bool LLSDSerialize::deserialize(LLSD& sd, std::istream& str, S32 max_bytes) * specified buffer. In the usual case when max_bytes exceeds * sizeof(hdr_buf), get() will read no more than sizeof(hdr_buf)-2. */ - str.get(hdr_buf, std::min(max_bytes+1, sizeof(hdr_buf)-1), '\n'); + str.get(hdr_buf, llmin(max_bytes+1, sizeof(hdr_buf)-1), '\n'); auto inbuf = str.gcount(); // https://en.cppreference.com/w/cpp/io/basic_istream/get // When the get() above sees the specified delimiter '\n', it stops there diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index 6e5d8a26e1..29e3007aff 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -63,7 +63,7 @@ using namespace boost::phoenix; #include typedef std::function FormatterFunction; -typedef std::function ParserFunction; +typedef std::function ParserFunction; std::vector string_to_vector(const std::string& str) { @@ -263,7 +263,7 @@ namespace tut }; // this lambda must be mutable since otherwise the bound 'parser' // is assumed to point to a const LLSDParser - mParser = [parser](std::istream& istr, LLSD& data, size_t max_bytes) mutable + mParser = [parser](std::istream& istr, LLSD& data, llssize max_bytes) mutable { // reset() call is needed since test code re-uses parser object parser->reset(); @@ -271,10 +271,10 @@ namespace tut }; } - void setParser(bool (*parser)(LLSD&, std::istream&, size_t)) + void setParser(bool (*parser)(LLSD&, std::istream&, llssize)) { // why does LLSDSerialize::deserialize() reverse the parse() params?? - mParser = [parser](std::istream& istr, LLSD& data, size_t max_bytes) + mParser = [parser](std::istream& istr, LLSD& data, llssize max_bytes) { return (parser(data, istr, max_bytes) > 0); }; @@ -2059,7 +2059,7 @@ namespace tut // helper for test<8> - test<12> void fromPythonUsing(const std::string& pyformatter, const ParserFunction& parse= - [](std::istream& istr, LLSD& data, size_t max_bytes) + [](std::istream& istr, LLSD& data, llssize max_bytes) { return LLSDSerialize::deserialize(data, istr, max_bytes); }) { // Create an empty data file. This is just a placeholder for our @@ -2140,7 +2140,7 @@ namespace tut set_test_name("from Python XML using fromXML()"); // fromXML()'s optional 3rd param isn't max_bytes, it's emit_errors fromPythonUsing("format_xml", - [](std::istream& istr, LLSD& data, size_t) + [](std::istream& istr, LLSD& data, llssize) { return LLSDSerialize::fromXML(data, istr) > 0; }); } @@ -2149,7 +2149,7 @@ namespace tut { set_test_name("from Python notation using fromNotation()"); fromPythonUsing("format_notation", - [](std::istream& istr, LLSD& data, size_t max_bytes) + [](std::istream& istr, LLSD& data, llssize max_bytes) { return LLSDSerialize::fromNotation(data, istr, max_bytes) > 0; }); } @@ -2161,7 +2161,7 @@ namespace tut // We don't expect this to work because format_binary() emits a // header, but fromBinary() won't recognize a header. fromPythonUsing("format_binary", - [](std::istream& istr, LLSD& data, size_t max_bytes) + [](std::istream& istr, LLSD& data, llssize max_bytes) { return LLSDSerialize::fromBinary(data, istr, max_bytes) > 0; }); } |*==========================================================================*/ -- cgit v1.2.3 From 819eec6f8c3abbf71ec3bdaaf4891068574fdc46 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Mon, 9 Jan 2023 21:14:16 +0000 Subject: SL-18924 - basic get/set functions for thumbnail UUID, removed obsolete binary pack/unpack functions for inventory --- indra/llinventory/llinventory.cpp | 148 ++++--------------------- indra/llinventory/llinventory.h | 6 +- indra/llinventory/tests/inventorymisc_test.cpp | 20 ---- 3 files changed, 22 insertions(+), 152 deletions(-) (limited to 'indra') diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index 81261f0767..b897198d10 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -40,9 +40,11 @@ ///---------------------------------------------------------------------------- /// Exported functions ///---------------------------------------------------------------------------- +// FIXME D567 - what's the point of these, especially if we don't even use them consistently? static const std::string INV_ITEM_ID_LABEL("item_id"); static const std::string INV_FOLDER_ID_LABEL("cat_id"); static const std::string INV_PARENT_ID_LABEL("parent_id"); +static const std::string INV_THUMBNAIL_ID_LABEL("thumbnail_id"); static const std::string INV_ASSET_TYPE_LABEL("type"); static const std::string INV_PREFERRED_TYPE_LABEL("preferred_type"); static const std::string INV_INVENTORY_TYPE_LABEL("inv_type"); @@ -99,6 +101,7 @@ void LLInventoryObject::copyObject(const LLInventoryObject* other) mParentUUID = other->mParentUUID; mType = other->mType; mName = other->mName; + mThumbnailUUID = other->mThumbnailUUID; } const LLUUID& LLInventoryObject::getUUID() const @@ -111,6 +114,11 @@ const LLUUID& LLInventoryObject::getParentUUID() const return mParentUUID; } +const LLUUID& LLInventoryObject::getThumbnailUUID() const +{ + return mThumbnailUUID; +} + const std::string& LLInventoryObject::getName() const { return mName; @@ -160,6 +168,11 @@ void LLInventoryObject::setParent(const LLUUID& new_parent) mParentUUID = new_parent; } +void LLInventoryObject::setThumbnailUUID(const LLUUID& thumbnail_uuid) +{ + mThumbnailUUID = thumbnail_uuid; +} + void LLInventoryObject::setType(LLAssetType::EType type) { mType = type; @@ -972,135 +985,6 @@ fail: } -// Deleted LLInventoryItem::exportFileXML() and LLInventoryItem::importXML() -// because I can't find any non-test code references to it. 2009-05-04 JC - -S32 LLInventoryItem::packBinaryBucket(U8* bin_bucket, LLPermissions* perm_override) const -{ - // Figure out which permissions to use. - LLPermissions perm; - if (perm_override) - { - // Use the permissions override. - perm = *perm_override; - } - else - { - // Use the current permissions. - perm = getPermissions(); - } - - // describe the inventory item - char* buffer = (char*) bin_bucket; - std::string creator_id_str; - - perm.getCreator().toString(creator_id_str); - std::string owner_id_str; - perm.getOwner().toString(owner_id_str); - std::string last_owner_id_str; - perm.getLastOwner().toString(last_owner_id_str); - std::string group_id_str; - perm.getGroup().toString(group_id_str); - std::string asset_id_str; - getAssetUUID().toString(asset_id_str); - S32 size = sprintf(buffer, /* Flawfinder: ignore */ - "%d|%d|%s|%s|%s|%s|%s|%x|%x|%x|%x|%x|%s|%s|%d|%d|%x", - getType(), - getInventoryType(), - getName().c_str(), - creator_id_str.c_str(), - owner_id_str.c_str(), - last_owner_id_str.c_str(), - group_id_str.c_str(), - perm.getMaskBase(), - perm.getMaskOwner(), - perm.getMaskGroup(), - perm.getMaskEveryone(), - perm.getMaskNextOwner(), - asset_id_str.c_str(), - getDescription().c_str(), - getSaleInfo().getSaleType(), - getSaleInfo().getSalePrice(), - getFlags()) + 1; - - return size; -} - -void LLInventoryItem::unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size) -{ - // Early exit on an empty binary bucket. - if (bin_bucket_size <= 1) return; - - if (NULL == bin_bucket) - { - LL_ERRS() << "unpackBinaryBucket failed. bin_bucket is NULL." << LL_ENDL; - return; - } - - // Convert the bin_bucket into a string. - std::vector item_buffer(bin_bucket_size+1); - memcpy(&item_buffer[0], bin_bucket, bin_bucket_size); /* Flawfinder: ignore */ - item_buffer[bin_bucket_size] = '\0'; - std::string str(&item_buffer[0]); - - LL_DEBUGS() << "item buffer: " << str << LL_ENDL; - - // Tokenize the string. - typedef boost::tokenizer > tokenizer; - boost::char_separator sep("|", "", boost::keep_empty_tokens); - tokenizer tokens(str, sep); - tokenizer::iterator iter = tokens.begin(); - - // Extract all values. - LLUUID item_id; - item_id.generate(); - setUUID(item_id); - - LLAssetType::EType type; - type = (LLAssetType::EType)(atoi((*(iter++)).c_str())); - setType( type ); - - LLInventoryType::EType inv_type; - inv_type = (LLInventoryType::EType)(atoi((*(iter++)).c_str())); - setInventoryType( inv_type ); - - std::string name((*(iter++)).c_str()); - rename( name ); - - LLUUID creator_id((*(iter++)).c_str()); - LLUUID owner_id((*(iter++)).c_str()); - LLUUID last_owner_id((*(iter++)).c_str()); - LLUUID group_id((*(iter++)).c_str()); - PermissionMask mask_base = strtoul((*(iter++)).c_str(), NULL, 16); - PermissionMask mask_owner = strtoul((*(iter++)).c_str(), NULL, 16); - PermissionMask mask_group = strtoul((*(iter++)).c_str(), NULL, 16); - PermissionMask mask_every = strtoul((*(iter++)).c_str(), NULL, 16); - PermissionMask mask_next = strtoul((*(iter++)).c_str(), NULL, 16); - LLPermissions perm; - perm.init(creator_id, owner_id, last_owner_id, group_id); - perm.initMasks(mask_base, mask_owner, mask_group, mask_every, mask_next); - setPermissions(perm); - //LL_DEBUGS() << "perm: " << perm << LL_ENDL; - - LLUUID asset_id((*(iter++)).c_str()); - setAssetUUID(asset_id); - - std::string desc((*(iter++)).c_str()); - setDescription(desc); - - LLSaleInfo::EForSale sale_type; - sale_type = (LLSaleInfo::EForSale)(atoi((*(iter++)).c_str())); - S32 price = atoi((*(iter++)).c_str()); - LLSaleInfo sale_info(sale_type, price); - setSaleInfo(sale_info); - - U32 flags = strtoul((*(iter++)).c_str(), NULL, 16); - setFlags(flags); - - time_t now = time(NULL); - setCreationDate(now); -} - ///---------------------------------------------------------------------------- /// Class LLInventoryCategory ///---------------------------------------------------------------------------- @@ -1152,6 +1036,7 @@ LLSD LLInventoryCategory::asLLSD() const LLSD sd = LLSD(); sd["item_id"] = mUUID; sd["parent_id"] = mParentUUID; + sd["thumbnail_id"] = mThumbnailUUID; S8 type = static_cast(mPreferredType); sd["type"] = type; sd["name"] = mName; @@ -1184,6 +1069,11 @@ bool LLInventoryCategory::fromLLSD(const LLSD& sd) { mParentUUID = sd[w]; } + w = INV_THUMBNAIL_ID_LABEL; + if (sd.has(w)) + { + mThumbnailUUID = sd[w]; + } w = INV_ASSET_TYPE_LABEL; if (sd.has(w)) { diff --git a/indra/llinventory/llinventory.h b/indra/llinventory/llinventory.h index 7d9f9704f1..dfe8b7659b 100644 --- a/indra/llinventory/llinventory.h +++ b/indra/llinventory/llinventory.h @@ -70,6 +70,7 @@ public: virtual const LLUUID& getUUID() const; // inventoryID that this item points to virtual const LLUUID& getLinkedUUID() const; // inventoryID that this item points to, else this item's inventoryID const LLUUID& getParentUUID() const; + virtual const LLUUID& getThumbnailUUID() const; virtual const std::string& getName() const; virtual LLAssetType::EType getType() const; LLAssetType::EType getActualType() const; // bypasses indirection for linked items @@ -84,6 +85,7 @@ public: void setUUID(const LLUUID& new_uuid); virtual void rename(const std::string& new_name); void setParent(const LLUUID& new_parent); + virtual void setThumbnailUUID(const LLUUID& thumbnail_uuid); void setType(LLAssetType::EType type); virtual void setCreationDate(time_t creation_date_utc); // only stored for items @@ -108,6 +110,7 @@ public: protected: LLUUID mUUID; LLUUID mParentUUID; // Parent category. Root categories have LLUUID::NULL. + LLUUID mThumbnailUUID; LLAssetType::EType mType; std::string mName; time_t mCreationDate; // seconds from 1/1/1970, UTC @@ -203,9 +206,6 @@ public: // Helper Functions //-------------------------------------------------------------------- public: - // Pack all information needed to reconstruct this item into the given binary bucket. - S32 packBinaryBucket(U8* bin_bucket, LLPermissions* perm_override = NULL) const; - void unpackBinaryBucket(U8* bin_bucket, S32 bin_bucket_size); LLSD asLLSD() const; void asLLSD( LLSD& sd ) const; bool fromLLSD(const LLSD& sd, bool is_new = true); diff --git a/indra/llinventory/tests/inventorymisc_test.cpp b/indra/llinventory/tests/inventorymisc_test.cpp index e8b063bffe..039fa938dd 100644 --- a/indra/llinventory/tests/inventorymisc_test.cpp +++ b/indra/llinventory/tests/inventorymisc_test.cpp @@ -400,27 +400,7 @@ namespace tut // Deleted LLInventoryItem::exportFileXML() and LLInventoryItem::importXML() // because I can't find any non-test code references to it. 2009-05-04 JC } - - template<> template<> - void inventory_object::test<10>() - { - LLPointer src1 = create_random_inventory_item(); - U8* bin_bucket = new U8[300]; - S32 bin_bucket_size = src1->packBinaryBucket(bin_bucket, NULL); - - LLPointer src2 = new LLInventoryItem(); - src2->unpackBinaryBucket(bin_bucket, bin_bucket_size); - ensure_equals("1.sale price::getSalePrice() failed price", src1->getSaleInfo().getSalePrice(), src2->getSaleInfo().getSalePrice()); - ensure_equals("2.sale type::getSaleType() failed type", src1->getSaleInfo().getSaleType(), src2->getSaleInfo().getSaleType()); - ensure_equals("3.type::getType() failed", src1->getType(), src2->getType()); - ensure_equals("4.inventory type::getInventoryType() failed type", src1->getInventoryType(), src2->getInventoryType()); - ensure_equals("5.name::getName() failed", src1->getName(), src2->getName()); - ensure_equals("6.description::getDescription() failed", src1->getDescription(), src2->getDescription()); - ensure_equals("7.flags::getFlags() failed", src1->getFlags(), src2->getFlags()); - - } - template<> template<> void inventory_object::test<11>() { -- cgit v1.2.3 From ce5ac93883b71b6abf8cffa35204541e257c6b02 Mon Sep 17 00:00:00 2001 From: "Brad Payne (Vir Linden)" Date: Tue, 24 Jan 2023 20:15:22 +0000 Subject: SL-18629 - various notes on work for D567 --- indra/newview/llappearancemgr.cpp | 7 ++++++- indra/newview/llfloateropenobject.cpp | 2 ++ indra/newview/llinventoryfunctions.cpp | 1 + indra/newview/llinventorymodel.cpp | 37 +++++++++++++++++++++++++++++++++- 4 files changed, 45 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4fc09c7739..d05c30d722 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1702,6 +1702,7 @@ void LLAppearanceMgr::shallowCopyCategory(const LLUUID& src_id, const LLUUID& ds parent_id = gInventory.getRootFolderID(); } // USES UDP PATH + // D567 needs to carry over thumbnail info LLUUID subfolder_id = gInventory.createNewCategory( parent_id, LLFolderType::FT_NONE, src_cat->getName()); @@ -2728,6 +2729,7 @@ void LLAppearanceMgr::wearCategoryFinal(LLUUID& cat_id, bool copy_items, bool ap } // UDP PATH + // D567 needs to carry over thumbnail info if present LLUUID new_cat_id = gInventory.createNewCategory( pid, LLFolderType::FT_NONE, @@ -3983,6 +3985,7 @@ void LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, boo // First, make a folder in the My Outfits directory. const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS); + // D567 replace with coros if (AISAPI::isAvailable()) { // cap-based category creation was buggy until recently. use @@ -3990,6 +3993,7 @@ void LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, boo // not actually use AIS to create the category. inventory_func_type func = boost::bind(&LLAppearanceMgr::onOutfitFolderCreated,this,_1,show_panel); + // D567 copy thumbnail info from source folder LLUUID folder_id = gInventory.createNewCategory( parent_id, LLFolderType::FT_OUTFIT, @@ -3998,7 +4002,8 @@ void LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name, boo } else { - // UDP PATH + // UDP PATH, should remove + // D567 copy thumbnail info from source folder LLUUID folder_id = gInventory.createNewCategory( parent_id, LLFolderType::FT_OUTFIT, diff --git a/indra/newview/llfloateropenobject.cpp b/indra/newview/llfloateropenobject.cpp index 2a1749bd42..cff42f72b7 100644 --- a/indra/newview/llfloateropenobject.cpp +++ b/indra/newview/llfloateropenobject.cpp @@ -166,6 +166,7 @@ void LLFloaterOpenObject::moveToInventory(bool wear, bool replace) } inventory_func_type func = boost::bind(LLFloaterOpenObject::callbackCreateInventoryCategory,_1,object_id,wear,replace); + // D567 copy thumbnail info LLUUID category_id = gInventory.createNewCategory(parent_category_id, LLFolderType::FT_NONE, name, @@ -173,6 +174,7 @@ void LLFloaterOpenObject::moveToInventory(bool wear, bool replace) //If we get a null category ID, we are using a capability in createNewCategory and we will //handle the following in the callbackCreateInventoryCategory routine. + // D567 review if ( category_id.notNull() ) { LLCatAndWear* data = new LLCatAndWear; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 27edc8148e..145cdf6476 100644 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -403,6 +403,7 @@ void copy_inventory_category(LLInventoryModel* model, bool move_no_copy_items ) { // Create the initial folder + // D567 needs to handle new fields inventory_func_type func = boost::bind(©_inventory_category_content, _1, model, cat, root_copy_id, move_no_copy_items); gInventory.createNewCategory(parent_id, LLFolderType::FT_NONE, cat->getName(), func); } diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index a7b3076e52..b64dd431db 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -700,8 +700,13 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, name.assign(LLViewerFolderType::lookupNewCategoryName(preferred_type)); } +#ifdef USE_AIS_FOR_NC + // D567 currently this doesn't really work due to limitations in + // AIS3, also violates the common caller assumption that we can + // assign the id and return immediately. if (callback) { + // D567 note that we no longer assign the UUID in the viewer, so various workflows need to change. LLSD new_inventory = LLSD::emptyMap(); new_inventory["categories"] = LLSD::emptyArray(); LLViewerInventoryCategory cat(LLUUID::null, parent_id, preferred_type, name, gAgent.getID()); @@ -711,17 +716,47 @@ LLUUID LLInventoryModel::createNewCategory(const LLUUID& parent_id, return LLUUID::null; } +#else + LLViewerRegion* viewer_region = gAgent.getRegion(); + std::string url; + if ( viewer_region ) + url = viewer_region->getCapability("CreateInventoryCategory"); + + if (!url.empty() && callback) + { + //Let's use the new capability. + + id.generate(); + LLSD request, body; + body["folder_id"] = id; + body["parent_id"] = parent_id; + body["type"] = (LLSD::Integer) preferred_type; + body["name"] = name; + + request["message"] = "CreateInventoryCategory"; + request["payload"] = body; + + LL_DEBUGS(LOG_INV) << "Creating category via request: " << ll_pretty_print_sd(request) << LL_ENDL; + LLCoros::instance().launch("LLInventoryModel::createNewCategoryCoro", + boost::bind(&LLInventoryModel::createNewCategoryCoro, this, url, body, callback)); + + return LLUUID::null; + } +#endif + if (!gMessageSystem) { return LLUUID::null; } - // FIXME this UDP code path needs to be removed. Requires + // D567 FIXME this UDP code path needs to be removed. Requires // reworking many of the callers to use callbacks rather than // assuming instant success. // Add the category to the internal representation + LL_WARNS() << "D567 need to remove this usage" << LL_ENDL; + id.generate(); LLPointer cat = new LLViewerInventoryCategory(id, parent_id, preferred_type, name, gAgent.getID()); -- cgit v1.2.3 From 1140ae3489a9e260a0abb808b4152f2d57384d67 Mon Sep 17 00:00:00 2001 From: Kitty Barnett Date: Thu, 29 Dec 2022 19:51:33 +0100 Subject: Add a texture inspector and show it when hovering over an inventory textory (or folder containing - among others - exactly one texture) and when hovering over notecard embedded textures --- indra/llui/llfolderview.cpp | 16 ++ indra/llui/llfolderview.h | 5 + indra/llui/llfolderviewitem.cpp | 12 +- indra/llui/lltooltip.cpp | 36 ++- indra/llui/lltooltip.h | 12 +- indra/newview/CMakeLists.txt | 2 + indra/newview/llinspecttexture.cpp | 301 +++++++++++++++++++++ indra/newview/llinspecttexture.h | 52 ++++ indra/newview/llinventorymodel.cpp | 25 ++ indra/newview/llinventorymodel.h | 1 + indra/newview/llinventorypanel.cpp | 23 ++ indra/newview/llinventorypanel.h | 1 + indra/newview/llviewerfloaterreg.cpp | 2 + indra/newview/llviewertexteditor.cpp | 11 + .../skins/default/xui/en/inspect_texture.xml | 63 +++++ 15 files changed, 548 insertions(+), 14 deletions(-) create mode 100644 indra/newview/llinspecttexture.cpp create mode 100644 indra/newview/llinspecttexture.h create mode 100644 indra/newview/skins/default/xui/en/inspect_texture.xml (limited to 'indra') diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index ea2ca68e47..a6d4a2ae52 100644 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -1506,6 +1506,22 @@ BOOL LLFolderView::handleHover( S32 x, S32 y, MASK mask ) return LLView::handleHover( x, y, mask ); } +LLFolderViewItem* LLFolderView::getHoveredItem() const +{ + return dynamic_cast(mHoveredItem.get()); +} + +void LLFolderView::setHoveredItem(LLFolderViewItem* itemp) +{ + if (mHoveredItem.get() != itemp) + { + if (itemp) + mHoveredItem = itemp->getHandle(); + else + mHoveredItem.markDead(); + } +} + BOOL LLFolderView::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index 6bb5e6c02e..bd38d93b33 100644 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -144,6 +144,10 @@ public: // applies filters to control visibility of items virtual void filter( LLFolderViewFilter& filter); + void clearHoveredItem() { setHoveredItem(nullptr); } + LLFolderViewItem* getHoveredItem() const; + void setHoveredItem(LLFolderViewItem* itemp); + // Get the last selected item virtual LLFolderViewItem* getCurSelectedItem( void ); selected_items_t& getSelectedItems( void ); @@ -273,6 +277,7 @@ protected: protected: LLHandle mPopupMenuHandle; + LLHandle mHoveredItem; selected_items_t mSelectedItems; bool mKeyboardSelection, mAllowMultiSelect, diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index eba93beed9..d10130619a 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -624,11 +624,14 @@ BOOL LLFolderViewItem::handleHover( S32 x, S32 y, MASK mask ) getWindow()->setCursor(UI_CURSOR_NOLOCKED); } + root->clearHoveredItem(); return TRUE; } else { - getRoot()->setShowSelectionContext(FALSE); + LLFolderView* pRoot = getRoot(); + pRoot->setHoveredItem(this); + pRoot->setShowSelectionContext(FALSE); getWindow()->setCursor(UI_CURSOR_ARROW); // let parent handle this then... return FALSE; @@ -683,6 +686,13 @@ BOOL LLFolderViewItem::handleMouseUp( S32 x, S32 y, MASK mask ) void LLFolderViewItem::onMouseLeave(S32 x, S32 y, MASK mask) { mIsMouseOverTitle = false; + + // NOTE: LLViewerWindow::updateUI() calls "enter" before "leave"; if the mouse moved to another item, we can't just outright clear it + LLFolderView* pRoot = getRoot(); + if (this == pRoot->getHoveredItem()) + { + pRoot->clearHoveredItem(); + } } BOOL LLFolderViewItem::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, diff --git a/indra/llui/lltooltip.cpp b/indra/llui/lltooltip.cpp index 2f56a8b1d0..a6552d4ff1 100644 --- a/indra/llui/lltooltip.cpp +++ b/indra/llui/lltooltip.cpp @@ -163,6 +163,7 @@ LLToolTip::LLToolTip(const LLToolTip::Params& p) : LLPanel(p), mHasClickCallback(p.click_callback.isProvided()), mPadding(p.padding), + mMaxWidth(p.max_width), mTextBox(NULL), mInfoButton(NULL), mPlayMediaButton(NULL), @@ -272,7 +273,7 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p) // do this *after* we've had our size set in LLPanel::initFromParams(); const S32 REALLY_LARGE_HEIGHT = 10000; - mTextBox->reshape(p.max_width, REALLY_LARGE_HEIGHT); + mTextBox->reshape(mMaxWidth, REALLY_LARGE_HEIGHT); if (p.styled_message.isProvided()) { @@ -288,16 +289,19 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p) mTextBox->setText(p.message()); } - S32 text_width = llmin(p.max_width(), mTextBox->getTextPixelWidth() + 1); + updateTextBox(); + snapToChildren(); +} + +void LLToolTip::updateTextBox() +{ + S32 text_width = llmin(mMaxWidth, mTextBox->getTextPixelWidth() + 1); S32 text_height = mTextBox->getTextPixelHeight(); mTextBox->reshape(text_width, text_height); - if (mInfoButton) - { - LLRect text_rect = mTextBox->getRect(); - LLRect icon_rect = mInfoButton->getRect(); - mTextBox->translate(0, icon_rect.getCenterY() - text_rect.getCenterY()); - } - +} + +void LLToolTip::snapToChildren() +{ // reshape tooltip panel to fit text box LLRect tooltip_rect = calcBoundingRect(); tooltip_rect.mTop += mPadding; @@ -305,7 +309,14 @@ void LLToolTip::initFromParams(const LLToolTip::Params& p) tooltip_rect.mBottom = 0; tooltip_rect.mLeft = 0; - mTextBox->reshape(mTextBox->getRect().getWidth(), llmax(mTextBox->getRect().getHeight(), tooltip_rect.getHeight() - 2 * mPadding)); + if (mInfoButton) + { + mTextBox->reshape(mTextBox->getRect().getWidth(), llmax(mTextBox->getRect().getHeight(), tooltip_rect.getHeight() - 2 * mPadding)); + + LLRect text_rect = mTextBox->getRect(); + LLRect icon_rect = mInfoButton->getRect(); + mInfoButton->translate(0, text_rect.getCenterY() - icon_rect.getCenterY()); + } setShape(tooltip_rect); } @@ -428,7 +439,10 @@ void LLToolTipMgr::createToolTip(const LLToolTip::Params& params) } tooltip_params.rect = LLRect (0, 1, 1, 0); - mToolTip = LLUICtrlFactory::create (tooltip_params); + if (tooltip_params.create_callback.isProvided()) + mToolTip = tooltip_params.create_callback()(tooltip_params); + else + mToolTip = LLUICtrlFactory::create (tooltip_params); gToolTipView->addChild(mToolTip); diff --git a/indra/llui/lltooltip.h b/indra/llui/lltooltip.h index 0b1fbe5367..86943625ff 100644 --- a/indra/llui/lltooltip.h +++ b/indra/llui/lltooltip.h @@ -68,6 +68,7 @@ public: struct Params : public LLInitParam::Block { typedef boost::function click_callback_t; + typedef boost::function create_callback_t; Optional message; Multiple styled_message; @@ -84,6 +85,8 @@ public: Optional time_based_media, web_based_media, media_playing; + Optional create_callback; + Optional create_params; Optional click_callback, click_playmedia_callback, click_homepage_callback; @@ -103,11 +106,15 @@ public: bool hasClickCallback(); LLToolTip(const Params& p); - void initFromParams(const LLToolTip::Params& params); + virtual void initFromParams(const LLToolTip::Params& params); void getToolTipMessage(std::string & message); -private: +protected: + void updateTextBox(); + void snapToChildren(); + +protected: class LLTextBox* mTextBox; class LLButton* mInfoButton; class LLButton* mPlayMediaButton; @@ -117,6 +124,7 @@ private: LLFrameTimer mVisibleTimer; bool mHasClickCallback; S32 mPadding; // pixels + S32 mMaxWidth; }; // used for the inspector tooltips which need different background images etc. diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 9eee5338ec..b94a1415a2 100644 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -374,6 +374,7 @@ set(viewer_SOURCE_FILES llinspectgroup.cpp llinspectobject.cpp llinspectremoteobject.cpp + llinspecttexture.cpp llinspecttoast.cpp llinventorybridge.cpp llinventoryfilter.cpp @@ -1014,6 +1015,7 @@ set(viewer_HEADER_FILES llinspectgroup.h llinspectobject.h llinspectremoteobject.h + llinspecttexture.h llinspecttoast.h llinventorybridge.h llinventoryfilter.h diff --git a/indra/newview/llinspecttexture.cpp b/indra/newview/llinspecttexture.cpp new file mode 100644 index 0000000000..cd288e9603 --- /dev/null +++ b/indra/newview/llinspecttexture.cpp @@ -0,0 +1,301 @@ +/** + * @file llinspecttexture.cpp + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterreg.h" +#include "llinspect.h" +#include "llinspecttexture.h" +#include "llinventoryfunctions.h" +#include "llinventorymodel.h" +#include "lltexturectrl.h" +#include "lltrans.h" +#include "llviewertexturelist.h" + +// ============================================================================ +// LLInspectTexture class +// + +class LLInspectTexture : public LLInspect +{ + friend class LLFloaterReg; +public: + LLInspectTexture(const LLSD& sdKey); + ~LLInspectTexture(); + +public: + void onOpen(const LLSD& sdData) override; + BOOL postBuild() override; + +public: + const LLUUID& getAssetId() const { return mAssetId; } + const LLUUID& getItemId() const { return mItemId; } + +protected: + LLUUID mAssetId; + LLUUID mItemId; // Item UUID relative to gInventoryModel (or null if not displaying an inventory texture) + LLUUID mNotecardId; + LLTextureCtrl* mTextureCtrl = nullptr; + LLTextBox* mTextureName = nullptr; +}; + +LLInspectTexture::LLInspectTexture(const LLSD& sdKey) + : LLInspect(LLSD()) +{ +} + +LLInspectTexture::~LLInspectTexture() +{ +} + +void LLInspectTexture::onOpen(const LLSD& sdData) +{ + // Start fade animation + LLInspect::onOpen(sdData); + + bool fIsAsset = sdData.has("asset_id"); + bool fIsInventory = sdData.has("item_id"); + + // Skip if we're being asked to display the same thing + const LLUUID idAsset = (fIsAsset) ? sdData["asset_id"].asUUID() : LLUUID::null; + const LLUUID idItem = (fIsInventory) ? sdData["item_id"].asUUID() : LLUUID::null; + if ( (getVisible()) && ( ((fIsAsset) && (idAsset == mAssetId)) || ((fIsInventory) && (idItem == mItemId)) ) ) + { + return; + } + + // Position the inspector relative to the mouse cursor + // Similar to how tooltips are positioned [see LLToolTipMgr::createToolTip()] + if (sdData.has("pos")) + LLUI::instance().positionViewNearMouse(this, sdData["pos"]["x"].asInteger(), sdData["pos"]["y"].asInteger()); + else + LLUI::instance().positionViewNearMouse(this); + + std::string strName = sdData["name"].asString(); + if (fIsAsset) + { + mAssetId = idAsset; + mItemId = idItem; // Will be non-null in the case of a notecard + mNotecardId = sdData["notecard_id"].asUUID(); + } + else if (fIsInventory) + { + const LLViewerInventoryItem* pItem = gInventory.getItem(idItem); + if ( (pItem) && (LLAssetType::AT_TEXTURE == pItem->getType()) ) + { + if (strName.empty()) + strName = pItem->getName(); + mAssetId = pItem->getAssetUUID(); + mItemId = idItem; + } + else + { + mAssetId.setNull(); + mItemId.setNull(); + } + mNotecardId = LLUUID::null; + } + + mTextureCtrl->setImageAssetID(mAssetId); + mTextureName->setText(strName); +} + +BOOL LLInspectTexture::postBuild() +{ + mTextureCtrl = getChild("texture_ctrl"); + mTextureName = getChild("texture_name"); + + return TRUE; +} + +// ============================================================================ +// Helper functions +// + +LLToolTip* LLInspectTextureUtil::createInventoryToolTip(LLToolTip::Params p) +{ + const LLSD& sdTooltip = p.create_params; + + LLInventoryType::EType eInvType = (sdTooltip.has("inv_type")) ? (LLInventoryType::EType)sdTooltip["inv_type"].asInteger() : LLInventoryType::IT_NONE; + switch (eInvType) + { + case LLInventoryType::IT_SNAPSHOT: + case LLInventoryType::IT_TEXTURE: + return LLUICtrlFactory::create(p); + case LLInventoryType::IT_CATEGORY: + { + if (sdTooltip.has("item_id")) + { + const LLUUID idCategory = sdTooltip["item_id"].asUUID(); + + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLIsOfAssetType f(LLAssetType::AT_TEXTURE); + gInventory.getDirectDescendentsOf(idCategory, cats, items, f); + + // Exactly one texture found => show the texture tooltip + if (1 == items.size()) + { + p.create_params.getValue()["asset_id"] = items.front()->getAssetUUID(); + return LLUICtrlFactory::create(p); + } + } + + // No or more than one texture found => show default tooltip + return LLUICtrlFactory::create(p); + } + default: + return LLUICtrlFactory::create(p); + } +} + +void LLInspectTextureUtil::registerFloater() +{ + LLFloaterReg::add("inspect_texture", "inspect_texture.xml", &LLFloaterReg::build); +} + +// ============================================================================ +// LLTexturePreviewView helper class +// + +class LLTexturePreviewView : public LLView +{ +public: + LLTexturePreviewView(const LLView::Params& p); + ~LLTexturePreviewView(); + +public: + void draw() override; + +public: + void setImageFromAssetId(const LLUUID& idAsset); + void setImageFromItemId(const LLUUID& idItem); + +protected: + LLPointer m_Image; + S32 mImageBoostLevel = LLGLTexture::BOOST_NONE; + std::string mLoadingText; +}; + + +LLTexturePreviewView::LLTexturePreviewView(const LLView::Params& p) + : LLView(p) +{ + mLoadingText = LLTrans::getString("texture_loading"); +} + +LLTexturePreviewView::~LLTexturePreviewView() +{ + if (m_Image) + { + m_Image->setBoostLevel(mImageBoostLevel); + m_Image = nullptr; + } +} + +void LLTexturePreviewView::draw() +{ + if (m_Image) + { + LLRect rctClient = getLocalRect(); + + gl_rect_2d(rctClient, LLColor4::black); + rctClient.stretch(-2); + if (4 == m_Image->getComponents()) + gl_rect_2d_checkerboard(rctClient); + gl_draw_scaled_image(rctClient.mLeft, rctClient.mBottom, rctClient.getWidth(), rctClient.getHeight(), m_Image); + + bool isLoading = (!m_Image->isFullyLoaded()) && (m_Image->getDiscardLevel() > 0); + if (isLoading) + LLFontGL::getFontSansSerif()->renderUTF8(mLoadingText, 0, llfloor(rctClient.mLeft + 3), llfloor(rctClient.mTop - 25), LLColor4::white, LLFontGL::LEFT, LLFontGL::BASELINE, LLFontGL::DROP_SHADOW); + m_Image->addTextureStats((isLoading) ? MAX_IMAGE_AREA : (F32)(rctClient.getWidth() * rctClient.getHeight())); + } +} + +void LLTexturePreviewView::setImageFromAssetId(const LLUUID& idAsset) +{ + m_Image = LLViewerTextureManager::getFetchedTexture(idAsset, FTT_DEFAULT, MIPMAP_TRUE, LLGLTexture::BOOST_NONE, LLViewerTexture::LOD_TEXTURE); + if (m_Image) + { + mImageBoostLevel = m_Image->getBoostLevel(); + m_Image->setBoostLevel(LLGLTexture::BOOST_PREVIEW); + m_Image->forceToSaveRawImage(0); + if ( (!m_Image->isFullyLoaded()) && (!m_Image->hasFetcher()) ) + { + if (m_Image->isInFastCacheList()) + { + m_Image->loadFromFastCache(); + } + gTextureList.forceImmediateUpdate(m_Image); + } + } +} + +void LLTexturePreviewView::setImageFromItemId(const LLUUID& idItem) +{ + const LLViewerInventoryItem* pItem = gInventory.getItem(idItem); + setImageFromAssetId( (pItem) ? pItem->getAssetUUID() : LLUUID::null ); +} + +// ============================================================================ +// LLTextureToolTip class +// + +LLTextureToolTip::LLTextureToolTip(const LLToolTip::Params& p) + : LLToolTip(p) + , mPreviewView(nullptr) + , mPreviewSize(256) +{ + mMaxWidth = llmax(mMaxWidth, mPreviewSize); +} + +LLTextureToolTip::~LLTextureToolTip() +{ +} + +void LLTextureToolTip::initFromParams(const LLToolTip::Params& p) +{ + LLToolTip::initFromParams(p); + + // Create and add the preview control + LLView::Params p_preview; + p_preview.name = "texture_preview"; + LLRect rctPreview; + rctPreview.setOriginAndSize(mPadding, mTextBox->getRect().mTop, mPreviewSize, mPreviewSize); + p_preview.rect = rctPreview; + mPreviewView = LLUICtrlFactory::create(p_preview); + addChild(mPreviewView); + + // Parse the control params + const LLSD& sdTextureParams = p.create_params; + if (sdTextureParams.has("asset_id")) + mPreviewView->setImageFromAssetId(sdTextureParams["asset_id"].asUUID()); + else if (sdTextureParams.has("item_id")) + mPreviewView->setImageFromItemId(sdTextureParams["item_id"].asUUID()); + + snapToChildren(); +} + +// ============================================================================ diff --git a/indra/newview/llinspecttexture.h b/indra/newview/llinspecttexture.h new file mode 100644 index 0000000000..192aafc3b4 --- /dev/null +++ b/indra/newview/llinspecttexture.h @@ -0,0 +1,52 @@ +/** + * @file llinspecttexture.h + * + * $LicenseInfo:firstyear=2009&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#pragma once + +#include "lltooltip.h" + +class LLTexturePreviewView; + +namespace LLInspectTextureUtil +{ + LLToolTip* createInventoryToolTip(LLToolTip::Params p); + + // Register with LLFloaterReg + void registerFloater(); +} + +class LLTextureToolTip : public LLToolTip +{ +public: + LLTextureToolTip(const LLToolTip::Params& p); + ~LLTextureToolTip(); + +public: + void initFromParams(const LLToolTip::Params& p) override; + +protected: + LLTexturePreviewView* mPreviewView; + S32 mPreviewSize; +}; diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 8b2a1a14f0..edd489f021 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -451,6 +451,31 @@ void LLInventoryModel::getDirectDescendentsOf(const LLUUID& cat_id, items = get_ptr_in_map(mParentChildItemTree, cat_id); } +void LLInventoryModel::getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t& categories, item_array_t& items, LLInventoryCollectFunctor& f) const +{ + if (cat_array_t* categoriesp = get_ptr_in_map(mParentChildCategoryTree, cat_id)) + { + for (LLViewerInventoryCategory* pFolder : *categoriesp) + { + if (f(pFolder, nullptr)) + { + categories.push_back(pFolder); + } + } + } + + if (item_array_t* itemsp = get_ptr_in_map(mParentChildItemTree, cat_id)) + { + for (LLViewerInventoryItem* pItem : *itemsp) + { + if (f(nullptr, pItem)) + { + items.push_back(pItem); + } + } + } +} + LLMD5 LLInventoryModel::hashDirectDescendentNames(const LLUUID& cat_id) const { LLInventoryModel::cat_array_t* cat_array; diff --git a/indra/newview/llinventorymodel.h b/indra/newview/llinventorymodel.h index c4133ff9bb..b03181d646 100644 --- a/indra/newview/llinventorymodel.h +++ b/indra/newview/llinventorymodel.h @@ -256,6 +256,7 @@ public: void getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t*& categories, item_array_t*& items) const; + void getDirectDescendentsOf(const LLUUID& cat_id, cat_array_t& categories, item_array_t& items, LLInventoryCollectFunctor& f) const; // Compute a hash of direct descendant names (for detecting child name changes) LLMD5 hashDirectDescendentNames(const LLUUID& cat_id) const; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 6b102c7500..dabe633b8c 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -40,6 +40,7 @@ #include "llfolderviewitem.h" #include "llfloaterimcontainer.h" #include "llimview.h" +#include "llinspecttexture.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" #include "llinventorymodelbackgroundfetch.h" @@ -1278,6 +1279,28 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) return TRUE; } +BOOL LLInventoryPanel::handleToolTip(S32 x, S32 y, MASK mask) +{ + if (const LLFolderViewItem* hover_item_p = (!mFolderRoot.isDead()) ? mFolderRoot.get()->getHoveredItem() : nullptr) + { + if (const LLFolderViewModelItemInventory* vm_item_p = static_cast(hover_item_p->getViewModelItem())) + { + // Copy/pasted from LLView::handleToolTip() + F32 nTimeout = LLToolTipMgr::instance().toolTipVisible() + ? LLUI::getInstance()->mSettingGroups["config"]->getF32("ToolTipFastDelay") + : LLUI::getInstance()->mSettingGroups["config"]->getF32("ToolTipDelay"); + LLToolTipMgr::instance().show(LLToolTip::Params() + .message(hover_item_p->getToolTip()) + .sticky_rect(hover_item_p->calcScreenRect()) + .delay_time(nTimeout) + .create_callback(boost::bind(&LLInspectTextureUtil::createInventoryToolTip, _1)) + .create_params(LLSD().with("inv_type", vm_item_p->getInventoryType()).with("item_id", vm_item_p->getUUID()))); + return TRUE; + } + } + return LLPanel::handleToolTip(x, y, mask); +} + BOOL LLInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 552c61b915..d5dc8cdba6 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -168,6 +168,7 @@ public: void* cargo_data, EAcceptance* accept, std::string& tooltip_msg); + BOOL handleToolTip(S32 x, S32 y, MASK mask) override; // LLUICtrl methods /*virtual*/ void onFocusLost(); /*virtual*/ void onFocusReceived(); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 59654350e4..77a7fd21a8 100644 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -153,6 +153,7 @@ #include "llinspectgroup.h" #include "llinspectobject.h" #include "llinspectremoteobject.h" +#include "llinspecttexture.h" #include "llinspecttoast.h" #include "llmoveview.h" #include "llfloaterimnearbychat.h" @@ -281,6 +282,7 @@ void LLViewerFloaterReg::registerFloaters() LLInspectAvatarUtil::registerFloater(); LLInspectGroupUtil::registerFloater(); LLInspectObjectUtil::registerFloater(); + LLInspectTextureUtil::registerFloater(); LLInspectRemoteObjectUtil::registerFloater(); LLFloaterVoiceVolumeUtil::registerFloater(); LLNotificationsUI::registerFloater(); diff --git a/indra/newview/llviewertexteditor.cpp b/indra/newview/llviewertexteditor.cpp index e2de7ac825..299047d91b 100644 --- a/indra/newview/llviewertexteditor.cpp +++ b/indra/newview/llviewertexteditor.cpp @@ -36,6 +36,7 @@ #include "llfloatersidepanelcontainer.h" #include "llfloaterworldmap.h" #include "llfocusmgr.h" +#include "llinspecttexture.h" #include "llinventorybridge.h" #include "llinventorydefines.h" #include "llinventorymodel.h" @@ -245,6 +246,16 @@ public: } virtual BOOL handleToolTip(S32 x, S32 y, MASK mask ) { + if (LLAssetType::AT_TEXTURE == mItem->getType()) + { + LLToolTipMgr::instance().show(LLToolTip::Params() + .message(mToolTip) + .create_callback(boost::bind(&LLInspectTextureUtil::createInventoryToolTip, _1)) + .create_params(LLSD().with("inv_type", mItem->getInventoryType()).with("asset_id", mItem->getAssetUUID()))); + + return TRUE; + } + if (!mToolTip.empty()) { LLToolTipMgr::instance().show(mToolTip); diff --git a/indra/newview/skins/default/xui/en/inspect_texture.xml b/indra/newview/skins/default/xui/en/inspect_texture.xml new file mode 100644 index 0000000000..30be90cfa0 --- /dev/null +++ b/indra/newview/skins/default/xui/en/inspect_texture.xml @@ -0,0 +1,63 @@ + + + + + + + -- cgit v1.2.3 From e7a1ac5db84c6ec77053e5115c997236ae6bf0df Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 24 Apr 2023 21:37:24 +0300 Subject: SL-19503 Deleting a thumbnail for folder does not remove thumbnail in viewer --- indra/llinventory/llinventory.cpp | 6 +----- indra/newview/llviewerinventory.cpp | 5 +---- 2 files changed, 2 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index ef86d2d89b..81ace2a5a8 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -1120,11 +1120,7 @@ LLSD LLInventoryCategory::asAISLLSD() const S8 type = static_cast(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); - } + sd[INV_THUMBNAIL_LABEL] = LLSD().with(INV_ASSET_ID_LABEL, mThumbnailUUID); return sd; } diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 8b0d14b3e9..96f0b500a0 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -1377,11 +1377,8 @@ void update_inventory_category( return; } - LLPointer new_cat = new LLViewerInventoryCategory(obj); - new_cat->fromLLSD(updates); - LLSD new_llsd = new_cat->asLLSD(); AISAPI::completion_t cr = boost::bind(&doInventoryCb, cb, _1); - AISAPI::UpdateCategory(cat_id, new_llsd, cr); + AISAPI::UpdateCategory(cat_id, updates, cr); } } -- cgit v1.2.3 From 4c3a7b106429f3ede827fd28acd25cc00fcb8649 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 25 Apr 2023 00:03:42 +0300 Subject: SL-19503 Fix thumbnails not being restored from cache --- indra/llinventory/llinventory.cpp | 4 ++-- indra/newview/llinventorymodel.cpp | 10 ++++------ 2 files changed, 6 insertions(+), 8 deletions(-) (limited to 'indra') diff --git a/indra/llinventory/llinventory.cpp b/indra/llinventory/llinventory.cpp index 81ace2a5a8..ecd070236f 100644 --- a/indra/llinventory/llinventory.cpp +++ b/indra/llinventory/llinventory.cpp @@ -1345,16 +1345,16 @@ bool LLInventoryCategory::importLLSD(const LLSD& cat_data) { setPreferredType(LLFolderType::lookup(cat_data[INV_PREFERRED_TYPE_LABEL].asString())); } - LLUUID thumbnail_uuid; if (cat_data.has(INV_THUMBNAIL_LABEL)) { + LLUUID thumbnail_uuid; const LLSD &thumbnail_data = cat_data[INV_THUMBNAIL_LABEL]; if (thumbnail_data.has(INV_ASSET_ID_LABEL)) { thumbnail_uuid = thumbnail_data[INV_ASSET_ID_LABEL].asUUID(); } + setThumbnailUUID(thumbnail_uuid); } - setThumbnailUUID(thumbnail_uuid); if (cat_data.has(INV_NAME_LABEL)) { mName = cat_data[INV_NAME_LABEL].asString(); diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 32acd0eb03..873d3e1ccf 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -2638,12 +2638,6 @@ bool LLInventoryModel::loadSkeleton( cat->setUUID(folder_id.asUUID()); cat->setParent(parent_id.asUUID()); - LLSD thumbnail = (*it)["thumbnail"]; - if (thumbnail.isMap()) - { - cat->setThumbnailUUID(thumbnail["asset_id"].asUUID()); - } - LLFolderType::EType preferred_type = LLFolderType::FT_NONE; LLSD type_default = (*it)["type_default"]; if(type_default.isDefined()) @@ -2735,6 +2729,10 @@ bool LLInventoryModel::loadSkeleton( else { cached_ids.insert(tcat->getUUID()); + + // At the moment download does not provide a thumbnail + // uuid, use the one from cache + tcat->setThumbnailUUID(cat->getThumbnailUUID()); } } -- cgit v1.2.3 From 9c2b0c709b3d1cf1a9243853a8df7089e2494057 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 25 Apr 2023 01:34:35 +0300 Subject: SL-19533 Special COF handling --- indra/newview/llaisapi.cpp | 40 +++++++++++++++++++++++ indra/newview/llaisapi.h | 2 ++ indra/newview/llinventorymodelbackgroundfetch.cpp | 6 ++++ indra/newview/llinventorymodelbackgroundfetch.h | 1 + indra/newview/llstartup.cpp | 1 + 5 files changed, 50 insertions(+) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index d39bb57304..117a596cd2 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -592,6 +592,40 @@ void AISAPI::FetchCategoryCategories(const LLUUID &catId, ITEM_TYPE type, bool r EnqueueAISCommand("FetchCategoryCategories", proc); } +/*static*/ +// Will get COF folder, links in it and items those links point to +void AISAPI::FetchCOF(completion_t callback) +{ + std::string cap = getInvCap(); + if (cap.empty()) + { + LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL; + if (callback) + { + callback(LLUUID::null); + } + return; + } + std::string url = cap + std::string("/category/current/links"); + + invokationFn_t getFn = boost::bind( + // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload. + static_cast + //---- + // _1 -> httpAdapter + // _2 -> httpRequest + // _3 -> url + // _4 -> body + // _5 -> httpOptions + // _6 -> httpHeaders + (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6); + + LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro, + _1, getFn, url, LLUUID::null, LLSD(), callback, FETCHCOF)); + + EnqueueAISCommand("FetchCOF", proc); +} + /*static*/ void AISAPI::FetchOrphans(completion_t callback) { @@ -687,6 +721,7 @@ void AISAPI::onUpdateReceived(const std::string& context, const LLSD& update, CO bool is_fetch = (type == FETCHITEM) || (type == FETCHCATEGORYCHILDREN) || (type == FETCHCATEGORYCATEGORIES) + || (type == FETCHCOF) || (type == FETCHORPHANS); // parse update llsd into stuff to do or parse received items. S32 depth = 0; @@ -1095,6 +1130,11 @@ void AISUpdate::parseLink(const LLSD& link_map) mCatDescendentDeltas[parent_id]++; new_link->setComplete(true); } + + if (link_map.has("_embedded")) + { + parseEmbedded(link_map["_embedded"], S32_MAX); + } } else { diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 4e1c6e5a7d..0ca0144d7b 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -59,6 +59,7 @@ public: static void FetchCategoryChildren(const LLUUID &catId, ITEM_TYPE type = AISAPI::ITEM_TYPE::INVENTORY, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0); static void FetchCategoryChildren(const std::string &identifier, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0); static void FetchCategoryCategories(const LLUUID &catId, ITEM_TYPE type = AISAPI::ITEM_TYPE::INVENTORY, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0); + static void FetchCOF(completion_t callback = completion_t()); static void FetchOrphans(completion_t callback = completion_t() ); static void CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, bool copySubfolders, completion_t callback = completion_t()); @@ -76,6 +77,7 @@ private: FETCHITEM, FETCHCATEGORYCHILDREN, FETCHCATEGORYCATEGORIES, + FETCHCOF, FETCHORPHANS, } COMMAND_TYPE; diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index bfb5ad9d12..f56532ff8c 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -391,6 +391,12 @@ void LLInventoryModelBackgroundFetch::findLostItems() gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); } +void LLInventoryModelBackgroundFetch::fetchCOF() +{ + // Will get COF folder, links in it and items those links point to + AISAPI::FetchCOF(); +} + void LLInventoryModelBackgroundFetch::setAllFoldersFetched() { if (mRecursiveInventoryFetchStarted && diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index 1881322e7a..db2d6db323 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -65,6 +65,7 @@ public: bool inventoryFetchInProgress() const; void findLostItems(); + void fetchCOF(); void incrFetchCount(S32 fetching); void incrFetchFolderCount(S32 fetching); diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index a1f2753ada..161beaff19 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1898,6 +1898,7 @@ bool idle_startup() } LLInventoryModelBackgroundFetch::instance().start(); + LLInventoryModelBackgroundFetch::instance().fetchCOF(); gInventory.createCommonSystemCategories(); // It's debatable whether this flag is a good idea - sets all -- cgit v1.2.3 From 154ab03bf8a5dacc3128718d1f15160f0cbe2b33 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 25 Apr 2023 03:38:26 +0300 Subject: SL-19533 Special COF handling #2 --- indra/newview/llappearancemgr.cpp | 33 ++++++++++++++++------- indra/newview/llappearancemgr.h | 1 + indra/newview/llinventorymodelbackgroundfetch.cpp | 18 +------------ indra/newview/llinventorymodelbackgroundfetch.h | 5 ++-- indra/newview/llstartup.cpp | 3 +-- 5 files changed, 28 insertions(+), 32 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 9115d7e5c2..297403fc6c 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -4561,18 +4561,31 @@ protected: nullary_func_t mCallable; }; +void callAfterCOFFetch(nullary_func_t cb) +{ + if (AISAPI::isAvailable()) + { + AISAPI::FetchCOF([cb](const LLUUID& id) { cb(); }); + } + else + { + LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); + callAfterCategoryFetch(cat_id, cb); + } +} + void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb) { - CallAfterCategoryFetchStage1 *stage1 = new CallAfterCategoryFetchStage1(cat_id, cb); - stage1->startFetch(); - if (stage1->isFinished()) - { - stage1->done(); - } - else - { - gInventory.addObserver(stage1); - } + CallAfterCategoryFetchStage1* stage1 = new CallAfterCategoryFetchStage1(cat_id, cb); + stage1->startFetch(); + if (stage1->isFinished()) + { + stage1->done(); + } + else + { + gInventory.addObserver(stage1); + } } void add_wearable_type_counts(const uuid_vec_t& ids, diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h index cf953d21ac..f6aa30d865 100644 --- a/indra/newview/llappearancemgr.h +++ b/indra/newview/llappearancemgr.h @@ -338,6 +338,7 @@ public: LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id,const std::string& name); // Invoke a given callable after category contents are fully fetched. +void callAfterCOFFetch(nullary_func_t cb); void callAfterCategoryFetch(const LLUUID& cat_id, nullary_func_t cb); // Wear all items in a uuid vector. diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index f56532ff8c..277ddb16ba 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -354,17 +354,7 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& id, bool recursive) void LLInventoryModelBackgroundFetch::scheduleFolderFetch(const LLUUID& cat_id, bool forced) { - if (AISAPI::isAvailable()) - { - if (mFetchFolderQueue.empty() || mFetchFolderQueue.back().mUUID != cat_id) - { - // On AIS make sure root goes to the top and follow up recursive - // fetches, not individual requests - mFetchFolderQueue.push_back(FetchQueueInfo(cat_id, forced ? FT_FORCED : FT_DEFAULT)); - gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); - } - } - else if (mFetchFolderQueue.empty() || mFetchFolderQueue.front().mUUID != cat_id) + if (mFetchFolderQueue.empty() || mFetchFolderQueue.front().mUUID != cat_id) { // Specific folder requests go to front of queue. mFetchFolderQueue.push_front(FetchQueueInfo(cat_id, forced ? FT_FORCED : FT_DEFAULT)); @@ -391,12 +381,6 @@ void LLInventoryModelBackgroundFetch::findLostItems() gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); } -void LLInventoryModelBackgroundFetch::fetchCOF() -{ - // Will get COF folder, links in it and items those links point to - AISAPI::FetchCOF(); -} - void LLInventoryModelBackgroundFetch::setAllFoldersFetched() { if (mRecursiveInventoryFetchStarted && diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index db2d6db323..363d04486d 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -64,9 +64,8 @@ public: bool inventoryFetchCompleted() const; bool inventoryFetchInProgress() const; - void findLostItems(); - void fetchCOF(); - void incrFetchCount(S32 fetching); + void findLostItems(); + void incrFetchCount(S32 fetching); void incrFetchFolderCount(S32 fetching); bool isBulkFetchProcessingComplete() const; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 161beaff19..3a96a7bced 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1898,7 +1898,6 @@ bool idle_startup() } LLInventoryModelBackgroundFetch::instance().start(); - LLInventoryModelBackgroundFetch::instance().fetchCOF(); gInventory.createCommonSystemCategories(); // It's debatable whether this flag is a good idea - sets all @@ -2161,7 +2160,7 @@ bool idle_startup() gAgentWearables.notifyLoadingStarted(); gAgent.setOutfitChosen(TRUE); gAgentWearables.sendDummyAgentWearablesUpdate(); - callAfterCategoryFetch(LLAppearanceMgr::instance().getCOF(), set_flags_and_update_appearance); + callAfterCOFFetch(set_flags_and_update_appearance); } display_startup(); -- cgit v1.2.3 From c008d3e030ca4019e24de9a4831dc36727555fd2 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 25 Apr 2023 12:25:15 +0300 Subject: SL-19533 Reduce inventory fetch stalls --- indra/newview/llaisapi.cpp | 11 ++++++++++- indra/newview/llaisapi.h | 6 ++++++ indra/newview/llinventoryfilter.cpp | 12 ++++++------ indra/newview/llinventorymodel.cpp | 3 ++- indra/newview/llinventorymodelbackgroundfetch.cpp | 9 +++++++-- 5 files changed, 31 insertions(+), 10 deletions(-) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 117a596cd2..7c293fcf63 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -771,7 +771,7 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht LL_DEBUGS("Inventory") << "Request type: " << (S32)type << " \nRequest target: " << targetId - << " \nElapsed time ince request: " << elapsed_time + << " \nElapsed time since request: " << elapsed_time << " \nstatus: " << status.toULong() << LL_ENDL; } else @@ -904,6 +904,8 @@ AISUpdate::AISUpdate(const LLSD& update, bool fetch, S32 depth) : mFetch(fetch) , mFetchDepth(depth) { + mTimer.setTimerExpirySec(debugLoggingEnabled("Inventory") ? EXPIRY_SECONDS_DEBUG : EXPIRY_SECONDS_LIVE); + mTimer.start(); parseUpdate(update); } @@ -1279,6 +1281,13 @@ void AISUpdate::parseDescendentCount(const LLUUID& category_id, const LLSD& embe void AISUpdate::parseEmbedded(const LLSD& embedded, S32 depth) { + if (mTimer.hasExpired()) + { + llcoro::suspend(); + LLCoros::checkStop(); + mTimer.setTimerExpirySec(debugLoggingEnabled("Inventory") ? EXPIRY_SECONDS_DEBUG : EXPIRY_SECONDS_LIVE); + } + if (embedded.has("links")) // _embedded in a category { parseEmbeddedLinks(embedded["links"]); diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 0ca0144d7b..1969448627 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -124,6 +124,11 @@ public: private: void clearParseResults(); + // Debug is very log-heavy, give it more time or it will take forever to process + // Todo: find a way to make throttle static isntead of per-request + const F32 EXPIRY_SECONDS_DEBUG = 1.f; + const F32 EXPIRY_SECONDS_LIVE = 0.01f; + typedef std::map uuid_int_map_t; uuid_int_map_t mCatDescendentDeltas; uuid_int_map_t mCatDescendentsKnown; @@ -144,6 +149,7 @@ private: uuid_list_t mCategoryIds; bool mFetch; S32 mFetchDepth; + LLTimer mTimer; }; #endif diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index d8e7b8ca67..5d6c3be168 100644 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -195,11 +195,6 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const return true; } - if(!checkAgainstFilterThumbnails(folder_id)) - { - return false; - } - // when applying a filter, matching folders get their contents downloaded first // but make sure we are not interfering with pre-download if (isNotDefault() @@ -207,7 +202,7 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const && !LLInventoryModelBackgroundFetch::instance().inventoryFetchInProgress()) { LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id); - if (!cat || (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)) + if ((!cat && folder_id.notNull()) || (cat && cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN)) { // At the moment background fetch only cares about VERSION_UNKNOWN, // so do not check isCategoryComplete that compares descendant count @@ -215,6 +210,11 @@ bool LLInventoryFilter::checkFolder(const LLUUID& folder_id) const } } + if (!checkAgainstFilterThumbnails(folder_id)) + { + return false; + } + // Marketplace folder filtering const U32 filterTypes = mFilterOps.mFilterTypes; const U32 marketplace_filter = FILTERTYPE_MARKETPLACE_ACTIVE | FILTERTYPE_MARKETPLACE_INACTIVE | diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 873d3e1ccf..48539f4748 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -4681,7 +4681,6 @@ LLPointer LLInventoryModel::validate() const } else if (count_under_root > 1) { - LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL; validation_info->mDuplicateRequiredSystemFolders.insert(folder_type); if (!is_automatic && folder_type != LLFolderType::FT_SETTINGS) { @@ -4689,6 +4688,7 @@ LLPointer LLInventoryModel::validate() const // outfits, trash and other non-automatic folders. validation_info->mFatalSystemDuplicate++; fatal_errs++; + LL_WARNS("Inventory") << "Fatal inventory corruption: system folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL; } else { @@ -4697,6 +4697,7 @@ LLPointer LLInventoryModel::validate() const // Exception: FT_SETTINGS is not automatic, but only deserves a warning. validation_info->mWarnings["non_fatal_system_duplicate_under_root"]++; warning_count++; + LL_WARNS("Inventory") << "System folder type has excess copies under root, type " << ft << " count " << count_under_root << LL_ENDL; } } if (count_elsewhere > 0) diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 277ddb16ba..c5fb40409f 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -555,6 +555,8 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() } static LLCachedControl ais_pool(gSavedSettings, "PoolSizeAIS", 20); + // Don't have too many requests at once + // Reserve one request for actions outside of fetch (like renames) const U32 max_concurrent_fetches = llmax(1, ais_pool - 1); if (mFetchCount >= max_concurrent_fetches) @@ -562,6 +564,9 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() return; } + // Don't fire all requests at once + const U32 max_requests_this_run = llmin(mFetchCount + 5, max_concurrent_fetches); + // Don't loop for too long (in case of large, fully loaded inventory) F64 curent_time = LLTimer::getTotalSeconds(); const F64 max_time = LLStartUp::getStartupState() > STATE_WEARABLES_WAIT @@ -570,7 +575,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() const F64 end_time = curent_time + max_time; S32 last_fetch_count = mFetchCount; - while (!mFetchFolderQueue.empty() && mFetchCount < max_concurrent_fetches && curent_time < end_time) + while (!mFetchFolderQueue.empty() && mFetchCount < max_requests_this_run && curent_time < end_time) { const FetchQueueInfo & fetch_info(mFetchFolderQueue.front()); bulkFetchViaAis(fetch_info); @@ -581,7 +586,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() // Ideally we shouldn't fetch items if recursive fetch isn't done, // but there is a chance some request will start timeouting and recursive // fetch will get stuck on a signle folder, don't block item fetch in such case - while (!mFetchItemQueue.empty() && mFetchCount < max_concurrent_fetches && curent_time < end_time) + while (!mFetchItemQueue.empty() && mFetchCount < max_requests_this_run && curent_time < end_time) { const FetchQueueInfo& fetch_info(mFetchItemQueue.front()); bulkFetchViaAis(fetch_info); -- cgit v1.2.3 From 8166a8d8d480d63c645ead7cd81b1b0afda225b4 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 25 Apr 2023 13:10:51 +0300 Subject: SL-19533 Fix a fetch blunder --- indra/newview/llaisapi.cpp | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 7c293fcf63..e16029f063 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -462,7 +462,7 @@ void AISAPI::FetchCategoryChildren(const LLUUID &catId, ITEM_TYPE type, bool rec } else { - depth = llmax(depth, 50); + depth = llmin(depth, 50); } url += "?depth=" + std::to_string(depth); @@ -515,7 +515,7 @@ void AISAPI::FetchCategoryChildren(const std::string &identifier, bool recursive } else { - depth = llmax(depth, 50); + depth = llmin(depth, 50); } url += "?depth=" + std::to_string(depth); @@ -566,7 +566,7 @@ void AISAPI::FetchCategoryCategories(const LLUUID &catId, ITEM_TYPE type, bool r } else { - depth = llmax(depth, 50); + depth = llmin(depth, 50); } url += "?depth=" + std::to_string(depth); -- cgit v1.2.3 From c1a3c7b239dcde347403c818d4ad1eeedf45d280 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 25 Apr 2023 13:51:23 +0300 Subject: SL-19533 Special COF handling #3 --- indra/newview/llappearancemgr.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 297403fc6c..d79525ec62 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -4563,13 +4563,16 @@ protected: void callAfterCOFFetch(nullary_func_t cb) { - if (AISAPI::isAvailable()) + LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN && AISAPI::isAvailable()) { + // Assume that we have no relevant cache. Fetch cof, and items cof's links point to. AISAPI::FetchCOF([cb](const LLUUID& id) { cb(); }); } else { - LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); + // Assume that cache is present. Process like a normal folder. callAfterCategoryFetch(cat_id, cb); } } -- cgit v1.2.3 From 7c3452fe44eb6a1a0b7a8b927d0b9620142e88d1 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 25 Apr 2023 17:29:46 +0300 Subject: SL-19409 FIXED Received items panel in multiple inventory windows does not sync New tag status between windows --- indra/newview/llpanelmarketplaceinboxinventory.cpp | 34 +++++++++++++++++++++- indra/newview/llpanelmarketplaceinboxinventory.h | 11 ++++++- 2 files changed, 43 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llpanelmarketplaceinboxinventory.cpp b/indra/newview/llpanelmarketplaceinboxinventory.cpp index 7a6631448b..e13bd0412d 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.cpp +++ b/indra/newview/llpanelmarketplaceinboxinventory.cpp @@ -62,10 +62,13 @@ LLInboxInventoryPanel::LLInboxInventoryPanel(const LLInboxInventoryPanel::Params : LLInventoryPanel(p) { LLInboxNewItemsStorage::getInstance()->load(); + LLInboxNewItemsStorage::getInstance()->addInboxPanel(this); } LLInboxInventoryPanel::~LLInboxInventoryPanel() -{} +{ + LLInboxNewItemsStorage::getInstance()->removeInboxPanel(this); +} void LLInboxInventoryPanel::initFromParams(const LLInventoryPanel::Params& params) { @@ -108,6 +111,21 @@ LLFolderViewItem * LLInboxInventoryPanel::createFolderViewItem(LLInvFVBridge * b return LLUICtrlFactory::create(params); } +void LLInboxInventoryPanel::onRemoveItemFreshness(const LLUUID& item_id) +{ + LLInboxFolderViewFolder* inbox_folder_view = dynamic_cast(getFolderByID(item_id)); + if(inbox_folder_view) + { + inbox_folder_view->setFresh(false); + } + + LLInboxFolderViewItem* inbox_item_view = dynamic_cast(getItemByID(item_id)); + if(inbox_item_view) + { + inbox_item_view->setFresh(false); + } +} + // // LLInboxFolderViewFolder Implementation // @@ -340,4 +358,18 @@ void LLInboxNewItemsStorage::load() } } } + +void LLInboxNewItemsStorage::removeItem(const LLUUID& id) +{ + mNewItemsIDs.erase(id); + + //notify inbox panels + for (auto inbox : mInboxPanels) + { + if(inbox) + { + inbox->onRemoveItemFreshness(id); + } + } +} // eof diff --git a/indra/newview/llpanelmarketplaceinboxinventory.h b/indra/newview/llpanelmarketplaceinboxinventory.h index 3e508e801b..9eef5f209c 100644 --- a/indra/newview/llpanelmarketplaceinboxinventory.h +++ b/indra/newview/llpanelmarketplaceinboxinventory.h @@ -49,6 +49,8 @@ public: void initFromParams(const LLInventoryPanel::Params&); LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop); LLFolderViewItem * createFolderViewItem(LLInvFVBridge * bridge); + + void onRemoveItemFreshness(const LLUUID& item_id); }; @@ -77,6 +79,7 @@ public: void deFreshify(); bool isFresh() const { return mFresh; } + void setFresh(bool is_fresh) { mFresh = is_fresh; } protected: bool mFresh; @@ -108,6 +111,7 @@ public: void deFreshify(); bool isFresh() const { return mFresh; } + void setFresh(bool is_fresh) { mFresh = is_fresh; } protected: bool mFresh; @@ -125,11 +129,16 @@ public: void load(); void addFreshItem(const LLUUID& id) { mNewItemsIDs.insert(id); } - void removeItem(const LLUUID& id) { mNewItemsIDs.erase(id); } + void removeItem(const LLUUID& id); bool isItemFresh(const LLUUID& id) { return (mNewItemsIDs.find(id) != mNewItemsIDs.end()); } + void addInboxPanel(LLInboxInventoryPanel* inbox) { mInboxPanels.insert(inbox); } + void removeInboxPanel(LLInboxInventoryPanel* inbox) { mInboxPanels.erase(inbox); } + private: std::set mNewItemsIDs; + + std::set mInboxPanels; }; #endif //LL_INBOXINVENTORYPANEL_H -- cgit v1.2.3 From 1491eea28c9355ba3d69ce566ae5263e69db3daf Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 25 Apr 2023 22:47:31 +0300 Subject: SL-19652 Folder fetch dupplicate protection and over limit handling --- indra/newview/llinventorymodelbackgroundfetch.cpp | 44 ++++++++++++++++++++++- 1 file changed, 43 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 4a9b471a47..0bb56c7d0c 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -408,6 +408,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() // *TODO: Think I'd like to get a shared pointer to this and share it // among all the folder requests. uuid_vec_t recursive_cats; + uuid_vec_t all_cats; // dupplicate avoidance LLSD folder_request_body; LLSD folder_request_body_lib; @@ -436,7 +437,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() { const LLViewerInventoryCategory * cat(gInventory.getCategory(cat_id)); - if (cat) + if (cat && std::find(all_cats.begin(), all_cats.end(), cat_id) == all_cats.end()) { if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) { @@ -477,6 +478,7 @@ void LLInventoryModelBackgroundFetch::bulkFetch() { recursive_cats.push_back(cat_id); } + all_cats.push_back(cat_id); } else { @@ -796,6 +798,46 @@ void BGFolderHttpHandler::processFailure(LLCore::HttpStatus status, LLCore::Http << LLCoreHttpUtil::responseToString(response) << "]" << LL_ENDL; // Could use a 404 test here to try to detect revoked caps... + + if(status == LLCore::HttpStatus(HTTP_FORBIDDEN)) + { + // too large, split into two, assume that this isn't the library + const std::string url(gAgent.getRegionCapability("FetchInventoryDescendents2")); + S32 size = mRequestSD["folders"].size(); + + if (!gDisconnected && !LLApp::isExiting() && !url.empty() && size > 1) + { + LLSD folders; + uuid_vec_t recursive_cats; + LLSD::array_iterator iter = mRequestSD["folders"].beginArray(); + LLSD::array_iterator end = mRequestSD["folders"].endArray(); + while (iter != end) + { + folders.append(*iter); + LLUUID fodler_id = iter->get("folder_id").asUUID(); + if (std::find(mRecursiveCatUUIDs.begin(), mRecursiveCatUUIDs.end(), fodler_id) != mRecursiveCatUUIDs.end()) + { + recursive_cats.push_back(fodler_id); + } + if (folders.size() == (S32)(size / 2)) + { + LLSD request_body; + request_body["folders"] = folders; + LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(request_body, recursive_cats)); + gInventory.requestPost(false, url, request_body, handler, "Inventory Folder"); + recursive_cats.clear(); + folders.clear(); + } + iter++; + } + + LLSD request_body; + request_body["folders"] = folders; + LLCore::HttpHandler::ptr_t handler(new BGFolderHttpHandler(request_body, recursive_cats)); + gInventory.requestPost(false, url, request_body, handler, "Inventory Folder"); + return; + } + } // This was originally the request retry logic for the inventory // request which tested on HTTP_INTERNAL_ERROR status. This -- cgit v1.2.3 From 895ce616ea71b2001ec4e826b80310da80db9a0e Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 6 Apr 2023 21:19:44 +0300 Subject: SL-19652 Fixed 'working' cursor flicker --- indra/llwindow/llwindow.h | 3 ++- indra/newview/llinventorypanel.cpp | 6 ++++-- 2 files changed, 6 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/llwindow/llwindow.h b/indra/llwindow/llwindow.h index 0edf39f6ef..802a3b5213 100644 --- a/indra/llwindow/llwindow.h +++ b/indra/llwindow/llwindow.h @@ -118,7 +118,8 @@ public: // Sets cursor, may set to arrow+hourglass virtual void setCursor(ECursorType cursor) { mNextCursor = cursor; }; - virtual ECursorType getCursor() const; + virtual ECursorType getCursor() const; + virtual ECursorType getNextCursor() const { return mNextCursor; }; virtual void updateCursor() = 0; virtual void captureMouse() = 0; diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 8029486d6f..2799cb4cdf 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1268,8 +1268,10 @@ BOOL LLInventoryPanel::handleHover(S32 x, S32 y, MASK mask) { BOOL handled = LLView::handleHover(x, y, mask); if(handled) - { - ECursorType cursor = getWindow()->getCursor(); + { + // getCursor gets current cursor, setCursor sets next cursor + // check that children didn't set own 'next' cursor + ECursorType cursor = getWindow()->getNextCursor(); if (LLInventoryModelBackgroundFetch::instance().folderFetchActive() && cursor == UI_CURSOR_ARROW) { // replace arrow cursor with arrow and hourglass cursor -- cgit v1.2.3 From 0091fa0cbaba034da09d42d49f68c63f2cc7df14 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 26 Apr 2023 03:53:05 +0300 Subject: SL-19583 Uniform risizing for combination inventory view --- indra/newview/llaisapi.cpp | 21 ++-- indra/newview/llaisapi.h | 1 + indra/newview/llinventorygallery.h | 1 + indra/newview/llpanelmaininventory.cpp | 47 +++++++-- indra/newview/llpanelmaininventory.h | 3 +- .../skins/default/xui/en/panel_main_inventory.xml | 114 ++++++++------------- 6 files changed, 98 insertions(+), 89 deletions(-) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index e16029f063..6d13a06c54 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -924,6 +924,16 @@ void AISUpdate::clearParseResults() mCategoryIds.clear(); } +void AISUpdate::checkTimeout() +{ + if (mTimer.hasExpired()) + { + llcoro::suspend(); + LLCoros::checkStop(); + mTimer.setTimerExpirySec(debugLoggingEnabled("Inventory") ? EXPIRY_SECONDS_DEBUG : EXPIRY_SECONDS_LIVE); + } +} + void AISUpdate::parseUpdate(const LLSD& update) { clearParseResults(); @@ -1281,12 +1291,7 @@ void AISUpdate::parseDescendentCount(const LLUUID& category_id, const LLSD& embe void AISUpdate::parseEmbedded(const LLSD& embedded, S32 depth) { - if (mTimer.hasExpired()) - { - llcoro::suspend(); - LLCoros::checkStop(); - mTimer.setTimerExpirySec(debugLoggingEnabled("Inventory") ? EXPIRY_SECONDS_DEBUG : EXPIRY_SECONDS_LIVE); - } + checkTimeout(); if (embedded.has("links")) // _embedded in a category { @@ -1408,6 +1413,8 @@ void AISUpdate::parseEmbeddedCategories(const LLSD& categories, S32 depth) void AISUpdate::doUpdate() { + checkTimeout(); + // Do version/descendant accounting. for (std::map::const_iterator catit = mCatDescendentDeltas.begin(); catit != mCatDescendentDeltas.end(); ++catit) @@ -1571,6 +1578,8 @@ void AISUpdate::doUpdate() } } + checkTimeout(); + gInventory.notifyObservers(); } diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 1969448627..6afbbbd16e 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -123,6 +123,7 @@ public: void doUpdate(); private: void clearParseResults(); + void checkTimeout(); // Debug is very log-heavy, give it more time or it will take forever to process // Todo: find a way to make throttle static isntead of per-request diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index 1760535524..2cf038b7d8 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -128,6 +128,7 @@ public: bool hasDescendents(const LLUUID& cat_id); bool hasVisibleItems(); void handleModifiedFilter(); + LLScrollContainer* getScrollableContainer() { return mScrollPanel; } protected: diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 98099dd407..7cd6d7cb82 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -266,6 +266,8 @@ BOOL LLPanelMainInventory::postBuild() comb_gallery_filter.markDefault(); mCombinationGalleryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, true)); + mCombinationScroller = getChild("combination_scroller"); + initListCommandsHandlers(); const std::string texture_upload_cost_str = std::to_string(LLAgentBenefitsMgr::current().getTextureUploadCost()); @@ -928,6 +930,7 @@ void LLPanelMainInventory::draw() mActivePanel->setSortOrder(order); mResortActivePanel = false; } + LLPanel::draw(); updateItemcountText(); updateCombinationVisibility(); @@ -1503,7 +1506,7 @@ void LLPanelMainInventory::toggleViewMode() getChild("default_inventory_panel")->setVisible(!mSingleFolderMode); getChild("single_folder_inventory")->setVisible(mSingleFolderMode && isListViewMode()); getChild("gallery_view_inventory")->setVisible(mSingleFolderMode && isGalleryViewMode()); - getChild("combination_view_inventory")->setVisible(mSingleFolderMode && isCombinationViewMode()); + getChild("combination_view_inventory")->setVisible(mSingleFolderMode && isCombinationViewMode()); getChild("nav_buttons")->setVisible(mSingleFolderMode); getChild("view_mode_btn")->setImageOverlay(mSingleFolderMode ? getString("default_mode_btn") : getString("single_folder_mode_btn")); @@ -2214,19 +2217,41 @@ void LLPanelMainInventory::updateCombinationVisibility() { if(mSingleFolderMode && isCombinationViewMode()) { - bool is_gallery_empty = !mCombinationGalleryPanel->hasVisibleItems(); - bool show_inv_pane = mCombinationInventoryPanel->hasVisibleItems() || is_gallery_empty || mForceShowInvLayout; - getChild("comb_gallery_layout")->setVisible(!is_gallery_empty); - getChild("comb_inventory_layout")->setVisible(show_inv_pane); - mCombinationInventoryPanel->getRootFolder()->setForceArrange(!show_inv_pane); - if(mCombinationInventoryPanel->hasVisibleItems()) + LLRect inner_rect = mCombinationInventoryPanel->getScrollableContainer()->getScrolledViewRect(); + LLRect inv_rect = mCombinationInventoryPanel->getRect(); + inv_rect.mBottom = 0; + inv_rect.mRight = inv_rect.mLeft + inner_rect.getWidth(); + if (!mCombinationGalleryPanel->hasVisibleItems() || mCombinationInventoryPanel->hasVisibleItems()) + { + inv_rect.mTop = inv_rect.mBottom + inner_rect.getHeight(); + } + else { - mForceShowInvLayout = false; + inv_rect.mTop = inv_rect.mBottom; } - if(is_gallery_empty) + + inner_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect(); + LLRect galery_rect = mCombinationGalleryPanel->getRect(); + galery_rect.mBottom = inv_rect.mTop; + if (mCombinationGalleryPanel->hasVisibleItems()) { - mCombinationGalleryPanel->handleModifiedFilter(); + mCombinationGalleryPanel->setVisible(true); + galery_rect.mTop = galery_rect.mBottom + inner_rect.getHeight(); } + else + { + mCombinationGalleryPanel->setVisible(false); + galery_rect.mTop = galery_rect.mBottom; + } + + LLRect scroller_rect = mCombinationScroller->getRect(); + scroller_rect.mBottom = 0; + scroller_rect.mTop = scroller_rect.mBottom + inv_rect.getHeight() + galery_rect.getHeight(); + scroller_rect.mRight = scroller_rect.mLeft + llmax(inv_rect.getWidth(), galery_rect.getWidth()); + + mCombinationScroller->setRect(scroller_rect); + mCombinationGalleryPanel->handleReshape(galery_rect, false); + mCombinationInventoryPanel->handleReshape(inv_rect, false); getActivePanel()->getRootFolder(); } @@ -2293,7 +2318,7 @@ void LLPanelMainInventory::setViewMode(EViewModeType mode) getChild("single_folder_inventory")->setVisible(mSingleFolderMode && isListViewMode()); getChild("gallery_view_inventory")->setVisible(mSingleFolderMode && isGalleryViewMode()); - getChild("combination_view_inventory")->setVisible(mSingleFolderMode && isCombinationViewMode()); + getChild("combination_view_inventory")->setVisible(mSingleFolderMode && isCombinationViewMode()); if(isListViewMode()) { diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index e5b9ba929d..8e7ad776b0 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -143,8 +143,6 @@ protected: static BOOL filtersVisible(void* user_data); void onClearSearch(); - static void onFoldersByName(void *user_data); - static BOOL checkFoldersByName(void *user_data); static BOOL incrementalFind(LLFolderViewItem* first_item, const char *find_text, BOOL backward); void onFilterSelected(); @@ -196,6 +194,7 @@ private: LLInventorySingleFolderPanel* mCombinationInventoryPanel; LLInventoryGallery* mCombinationGalleryPanel; + LLView* mCombinationScroller; boost::signals2::connection mListViewRootUpdatedConnection; boost::signals2::connection mGalleryRootUpdatedConnection; diff --git a/indra/newview/skins/default/xui/en/panel_main_inventory.xml b/indra/newview/skins/default/xui/en/panel_main_inventory.xml index 5bc0113367..f772c1fde2 100644 --- a/indra/newview/skins/default/xui/en/panel_main_inventory.xml +++ b/indra/newview/skins/default/xui/en/panel_main_inventory.xml @@ -327,7 +327,7 @@ follows="all" layout="topleft" /> - - - - + + + + + + + - - - - - - - - - + -- cgit v1.2.3 From 697d3be3c9906a6d578a961710fc43816b6adeae Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 27 Apr 2023 01:30:57 +0300 Subject: SL-19533 Implement subset variant of children request --- indra/newview/llaisapi.cpp | 158 ++++++++++++++---- indra/newview/llaisapi.h | 13 +- indra/newview/llappearancemgr.cpp | 13 +- indra/newview/llinventorymodelbackgroundfetch.cpp | 195 +++++++++++++++++++--- indra/newview/llinventorymodelbackgroundfetch.h | 6 +- 5 files changed, 320 insertions(+), 65 deletions(-) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 6d13a06c54..c17b246ef1 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -51,6 +51,10 @@ std::list AISAPI::sPostponedQuery; const S32 MAX_SIMULTANEOUS_COROUTINES = 2048; +// AIS3 allows '*' requests, but in reality those will be cut at some point +// Specify own depth to be able to anticipate it and mark folders as incomplete +const S32 MAX_FOLDER_DEPTH_REQUEST = 50; + //------------------------------------------------------------------------- /*static*/ bool AISAPI::isAvailable() @@ -458,11 +462,11 @@ void AISAPI::FetchCategoryChildren(const LLUUID &catId, ITEM_TYPE type, bool rec { // can specify depth=*, but server side is going to cap requests // and reject everything 'over the top',. - depth = 50; + depth = MAX_FOLDER_DEPTH_REQUEST; } else { - depth = llmin(depth, 50); + depth = llmin(depth, MAX_FOLDER_DEPTH_REQUEST); } url += "?depth=" + std::to_string(depth); @@ -511,11 +515,11 @@ void AISAPI::FetchCategoryChildren(const std::string &identifier, bool recursive { // can specify depth=*, but server side is going to cap requests // and reject everything 'over the top',. - depth = 50; + depth = MAX_FOLDER_DEPTH_REQUEST; } else { - depth = llmin(depth, 50); + depth = llmin(depth, MAX_FOLDER_DEPTH_REQUEST); } url += "?depth=" + std::to_string(depth); @@ -562,11 +566,11 @@ void AISAPI::FetchCategoryCategories(const LLUUID &catId, ITEM_TYPE type, bool r { // can specify depth=*, but server side is going to cap requests // and reject everything 'over the top',. - depth = 50; + depth = MAX_FOLDER_DEPTH_REQUEST; } else { - depth = llmin(depth, 50); + depth = llmin(depth, MAX_FOLDER_DEPTH_REQUEST); } url += "?depth=" + std::to_string(depth); @@ -592,6 +596,83 @@ void AISAPI::FetchCategoryCategories(const LLUUID &catId, ITEM_TYPE type, bool r EnqueueAISCommand("FetchCategoryCategories", proc); } +void AISAPI::FetchCategorySubset(const LLUUID& catId, + const uuid_vec_t specificChildren, + ITEM_TYPE type, + bool recursive, + completion_t callback, + S32 depth) +{ + std::string cap = (type == INVENTORY) ? getInvCap() : getLibCap(); + if (cap.empty()) + { + LL_WARNS("Inventory") << "Inventory cap not found!" << LL_ENDL; + if (callback) + { + callback(LLUUID::null); + } + return; + } + if (specificChildren.empty()) + { + LL_WARNS("Inventory") << "Empty request!" << LL_ENDL; + if (callback) + { + callback(LLUUID::null); + } + return; + } + // category/any_folder_id/children?depth=*&children=child_id1,child_id2,child_id3 + std::string url = cap + std::string("/category/") + catId.asString() + "/children"; + + if (recursive) + { + depth = MAX_FOLDER_DEPTH_REQUEST; + } + else + { + depth = llmin(depth, MAX_FOLDER_DEPTH_REQUEST); + } + + uuid_vec_t::const_iterator iter = specificChildren.begin(); + uuid_vec_t::const_iterator end = specificChildren.end(); + + url += "?depth=" + std::to_string(depth) + "&children=" + iter->asString(); + iter++; + + while (iter != end) + { + url += "," + iter->asString(); + iter++; + } + + const S32 MAX_URL_LENGH = 2000; // RFC documentation specifies a maximum length of 2048 + if (url.length() > MAX_URL_LENGH) + { + LL_WARNS("Inventory") << "Request url is too long, url: " << url << LL_ENDL; + } + + invokationFn_t getFn = boost::bind( + // Humans ignore next line. It is just a cast to specify which LLCoreHttpUtil::HttpCoroutineAdapter routine overload. + static_cast + //---- + // _1 -> httpAdapter + // _2 -> httpRequest + // _3 -> url + // _4 -> body + // _5 -> httpOptions + // _6 -> httpHeaders + (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6); + + // get doesn't use body, can pass additional data + LLSD body; + body["depth"] = depth; + LLCoprocedureManager::CoProcedure_t proc(boost::bind(&AISAPI::InvokeAISCommandCoro, + _1, getFn, url, catId, body, callback, FETCHCATEGORYSUBSET)); + + EnqueueAISCommand("FetchCategorySubset", proc); +} + /*static*/ // Will get COF folder, links in it and items those links point to void AISAPI::FetchCOF(completion_t callback) @@ -710,7 +791,7 @@ void AISAPI::onIdle(void *userdata) } /*static*/ -void AISAPI::onUpdateReceived(const std::string& context, const LLSD& update, COMMAND_TYPE type, const LLSD& request_body) +void AISAPI::onUpdateReceived(const LLSD& update, COMMAND_TYPE type, const LLSD& request_body) { LLTimer timer; if ( (type == UPDATECATEGORY || type == UPDATEITEM) @@ -718,18 +799,8 @@ void AISAPI::onUpdateReceived(const std::string& context, const LLSD& update, CO { dump_sequential_xml(gAgentAvatarp->getFullname() + "_ais_update", update); } - bool is_fetch = (type == FETCHITEM) - || (type == FETCHCATEGORYCHILDREN) - || (type == FETCHCATEGORYCATEGORIES) - || (type == FETCHCOF) - || (type == FETCHORPHANS); - // parse update llsd into stuff to do or parse received items. - S32 depth = 0; - if (is_fetch && request_body.has("depth")) - { - depth = request_body["depth"].asInteger(); - } - AISUpdate ais_update(update, is_fetch, depth); + + AISUpdate ais_update(update, type, request_body); ais_update.doUpdate(); // execute the updates in the appropriate order. LL_DEBUGS("Inventory", "AIS3") << "Elapsed processing: " << timer.getElapsedTimeF32() << LL_ENDL; } @@ -833,7 +904,7 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht } LL_DEBUGS("Inventory", "AIS3") << "Result: " << result << LL_ENDL; - onUpdateReceived("AISCommand", result, type, body); + onUpdateReceived(result, type, body); if (callback && !callback.empty()) { @@ -900,10 +971,22 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht } //------------------------------------------------------------------------- -AISUpdate::AISUpdate(const LLSD& update, bool fetch, S32 depth) -: mFetch(fetch) -, mFetchDepth(depth) +AISUpdate::AISUpdate(const LLSD& update, AISAPI::COMMAND_TYPE type, const LLSD& request_body) +: mType(type) { + mFetch = (type == AISAPI::FETCHITEM) + || (type == AISAPI::FETCHCATEGORYCHILDREN) + || (type == AISAPI::FETCHCATEGORYCATEGORIES) + || (type == AISAPI::FETCHCATEGORYSUBSET) + || (type == AISAPI::FETCHCOF) + || (type == AISAPI::FETCHORPHANS); + // parse update llsd into stuff to do or parse received items. + mFetchDepth = MAX_FOLDER_DEPTH_REQUEST; + if (mFetch && request_body.has("depth")) + { + mFetchDepth = request_body["depth"].asInteger(); + } + mTimer.setTimerExpirySec(debugLoggingEnabled("Inventory") ? EXPIRY_SECONDS_DEBUG : EXPIRY_SECONDS_LIVE); mTimer.start(); parseUpdate(update); @@ -1023,17 +1106,26 @@ void AISUpdate::parseContent(const LLSD& update) { if (update.has("linked_id")) { - parseLink(update); + parseLink(update, mFetchDepth); } else if (update.has("item_id")) { parseItem(update); } - if (update.has("category_id")) - { - parseCategory(update, mFetchDepth); - } + if (mType == AISAPI::FETCHCATEGORYSUBSET) + { + // initial category is incomplete, don't process it, + // go for content instead + if (update.has("_embedded")) + { + parseEmbedded(update["_embedded"], mFetchDepth - 1); + } + } + else if (update.has("category_id")) + { + parseCategory(update, mFetchDepth); + } else { if (update.has("_embedded")) @@ -1089,7 +1181,7 @@ void AISUpdate::parseItem(const LLSD& item_map) } } -void AISUpdate::parseLink(const LLSD& link_map) +void AISUpdate::parseLink(const LLSD& link_map, S32 depth) { LLUUID item_id = link_map["item_id"].asUUID(); LLPointer new_link(new LLViewerInventoryItem); @@ -1145,7 +1237,7 @@ void AISUpdate::parseLink(const LLSD& link_map) if (link_map.has("_embedded")) { - parseEmbedded(link_map["_embedded"], S32_MAX); + parseEmbedded(link_map["_embedded"], depth); } } else @@ -1295,7 +1387,7 @@ void AISUpdate::parseEmbedded(const LLSD& embedded, S32 depth) if (embedded.has("links")) // _embedded in a category { - parseEmbeddedLinks(embedded["links"]); + parseEmbeddedLinks(embedded["links"], depth); } if (embedded.has("items")) // _embedded in a category { @@ -1328,7 +1420,7 @@ void AISUpdate::parseUUIDArray(const LLSD& content, const std::string& name, uui } } -void AISUpdate::parseEmbeddedLinks(const LLSD& links) +void AISUpdate::parseEmbeddedLinks(const LLSD& links, S32 depth) { for(LLSD::map_const_iterator linkit = links.beginMap(), linkend = links.endMap(); @@ -1342,7 +1434,7 @@ void AISUpdate::parseEmbeddedLinks(const LLSD& links) } else { - parseLink(link_map); + parseLink(link_map, depth); } } } diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 6afbbbd16e..691c5db592 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -59,11 +59,11 @@ public: static void FetchCategoryChildren(const LLUUID &catId, ITEM_TYPE type = AISAPI::ITEM_TYPE::INVENTORY, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0); static void FetchCategoryChildren(const std::string &identifier, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0); static void FetchCategoryCategories(const LLUUID &catId, ITEM_TYPE type = AISAPI::ITEM_TYPE::INVENTORY, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0); + static void FetchCategorySubset(const LLUUID& catId, const uuid_vec_t specificChildren, ITEM_TYPE type = AISAPI::ITEM_TYPE::INVENTORY, bool recursive = false, completion_t callback = completion_t(), S32 depth = 0); static void FetchCOF(completion_t callback = completion_t()); static void FetchOrphans(completion_t callback = completion_t() ); static void CopyLibraryCategory(const LLUUID& sourceId, const LLUUID& destId, bool copySubfolders, completion_t callback = completion_t()); -private: typedef enum { COPYINVENTORY, SLAMFOLDER, @@ -77,10 +77,12 @@ private: FETCHITEM, FETCHCATEGORYCHILDREN, FETCHCATEGORYCATEGORIES, + FETCHCATEGORYSUBSET, FETCHCOF, FETCHORPHANS, } COMMAND_TYPE; +private: static const std::string INVENTORY_CAP_NAME; static const std::string LIBRARY_CAP_NAME; @@ -89,7 +91,7 @@ private: static void EnqueueAISCommand(const std::string &procName, LLCoprocedureManager::CoProcedure_t proc); static void onIdle(void *userdata); // launches postponed AIS commands - static void onUpdateReceived(const std::string& context, const LLSD& update, COMMAND_TYPE type, const LLSD& request_body); + static void onUpdateReceived(const LLSD& update, COMMAND_TYPE type, const LLSD& request_body); static std::string getInvCap(); static std::string getLibCap(); @@ -105,17 +107,17 @@ private: class AISUpdate { public: - AISUpdate(const LLSD& update, bool fetch, S32 depth); + AISUpdate(const LLSD& update, AISAPI::COMMAND_TYPE type, const LLSD& request_body); void parseUpdate(const LLSD& update); void parseMeta(const LLSD& update); void parseContent(const LLSD& update); void parseUUIDArray(const LLSD& content, const std::string& name, uuid_list_t& ids); - void parseLink(const LLSD& link_map); + void parseLink(const LLSD& link_map, S32 depth); void parseItem(const LLSD& link_map); void parseCategory(const LLSD& link_map, S32 depth); void parseDescendentCount(const LLUUID& category_id, const LLSD& embedded); void parseEmbedded(const LLSD& embedded, S32 depth); - void parseEmbeddedLinks(const LLSD& links); + void parseEmbeddedLinks(const LLSD& links, S32 depth); void parseEmbeddedItems(const LLSD& items); void parseEmbeddedCategories(const LLSD& categories, S32 depth); void parseEmbeddedItem(const LLSD& item); @@ -151,6 +153,7 @@ private: bool mFetch; S32 mFetchDepth; LLTimer mTimer; + AISAPI::COMMAND_TYPE mType; }; #endif diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index d79525ec62..4133470973 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -4568,7 +4568,18 @@ void callAfterCOFFetch(nullary_func_t cb) if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN && AISAPI::isAvailable()) { // Assume that we have no relevant cache. Fetch cof, and items cof's links point to. - AISAPI::FetchCOF([cb](const LLUUID& id) { cb(); }); + AISAPI::FetchCOF([cb](const LLUUID& id) + { + cb(); + LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); + LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); + if (cat) + { + cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); + } + }); + // Mark it so that background fetch won't request it if it didn't already + cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); } else { diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index c5fb40409f..b8fdfab98a 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -299,7 +299,7 @@ void LLInventoryModelBackgroundFetch::start(const LLUUID& id, bool recursive) // Not only root folder can be massive, but // most system folders will be requested independently // so request root folder and content separately - mFetchFolderQueue.push_front(FetchQueueInfo(gInventory.getRootFolderID(), FT_CONTENT_RECURSIVE)); + mFetchFolderQueue.push_front(FetchQueueInfo(gInventory.getRootFolderID(), FT_FOLDER_AND_CONTENT)); } else { @@ -455,10 +455,67 @@ void ais_simple_item_callback(const LLUUID& inv_id) LLInventoryModelBackgroundFetch::instance().incrFetchCount(-1); } -void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_id, const LLUUID &response_id, EFetchType recursion) +void LLInventoryModelBackgroundFetch::onAISContentCalback( + const LLUUID& request_id, + const uuid_vec_t& content_ids, + const LLUUID& response_id, + EFetchType fetch_type) { + // Don't push_front on failure - there is a chance it was fired from inside bulkFetchViaAis incrFetchFolderCount(-1); - std::list::const_iterator found = std::find(mExpectedFolderIds.begin() , mExpectedFolderIds.end(), request_id); + + uuid_vec_t::const_iterator folder_iter = content_ids.begin(); + uuid_vec_t::const_iterator folder_end = content_ids.end(); + while (folder_iter != folder_end) + { + std::list::const_iterator found = std::find(mExpectedFolderIds.begin(), mExpectedFolderIds.end(), *folder_iter); + if (found != mExpectedFolderIds.end()) + { + mExpectedFolderIds.erase(found); + } + + LLViewerInventoryCategory* cat(gInventory.getCategory(*folder_iter)); + if (cat) + { + cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); + } + if (response_id.isNull()) + { + // Failed to fetch, get it individually + mFetchFolderQueue.push_back(FetchQueueInfo(*folder_iter, FT_RECURSIVE)); + } + else + { + // push descendant back to verify they are fetched fully (ex: didn't encounter depth limit) + LLInventoryModel::cat_array_t* categories(NULL); + LLInventoryModel::item_array_t* items(NULL); + gInventory.getDirectDescendentsOf(*folder_iter, categories, items); + if (categories) + { + for (LLInventoryModel::cat_array_t::const_iterator it = categories->begin(); + it != categories->end(); + ++it) + { + mFetchFolderQueue.push_back(FetchQueueInfo((*it)->getUUID(), FT_RECURSIVE)); + } + } + } + + folder_iter++; + } + + if (!mFetchFolderQueue.empty()) + { + mBackgroundFetchActive = true; + mFolderFetchActive = true; + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + } +} +void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_id, const LLUUID &response_id, EFetchType fetch_type) +{ + // Don't push_front on failure - there is a chance it was fired from inside bulkFetchViaAis + incrFetchFolderCount(-1); + std::list::const_iterator found = std::find(mExpectedFolderIds.begin(), mExpectedFolderIds.end(), request_id); if (found != mExpectedFolderIds.end()) { mExpectedFolderIds.erase(found); @@ -480,32 +537,34 @@ void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_i if (response_id.isNull()) // Failure { LL_DEBUGS(LOG_INV , "AIS3") << "Failure response for folder " << request_id << LL_ENDL; - if (recursion == FT_RECURSIVE) + if (fetch_type == FT_RECURSIVE) { // A full recursive request failed. // Try requesting folder and nested content separately - mBackgroundFetchActive = true; - mFolderFetchActive = true; - mFetchFolderQueue.push_front(FetchQueueInfo(request_id, FT_CONTENT_RECURSIVE)); - gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + mFetchFolderQueue.push_back(FetchQueueInfo(request_id, FT_FOLDER_AND_CONTENT)); } - else if (recursion == FT_CONTENT_RECURSIVE) + else if (fetch_type == FT_FOLDER_AND_CONTENT) { LL_WARNS() << "Failed to download folder: " << request_id << " Requesting known content separately" << LL_ENDL; - request_descendants = true; + mFetchFolderQueue.push_back(FetchQueueInfo(request_id, FT_CONTENT_RECURSIVE)); } } else { - if (recursion == FT_CONTENT_RECURSIVE || recursion == FT_RECURSIVE) + if (fetch_type == FT_RECURSIVE) { - // Got the folder, now recursively request content + // Got the folder and content, now verify content // Request content even for FT_RECURSIVE in case of changes, failures // or if depth limit gets imlemented. // This shouldn't redownload folders if they already have version request_descendants = true; LL_DEBUGS(LOG_INV, "AIS3") << "Got folder " << request_id << ". Requesting content" << LL_ENDL; } + else if (fetch_type == FT_FOLDER_AND_CONTENT) + { + // readd folder for content request + mFetchFolderQueue.push_front(FetchQueueInfo(request_id, FT_CONTENT_RECURSIVE)); + } else { LL_DEBUGS(LOG_INV, "AIS3") << "Got folder " << request_id << "." << LL_ENDL; @@ -524,17 +583,18 @@ void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_i it != categories->end(); ++it) { - mFetchFolderQueue.push_front(FetchQueueInfo((*it)->getUUID(), FT_RECURSIVE)); - } - if (!mFetchFolderQueue.empty()) - { - mBackgroundFetchActive = true; - mFolderFetchActive = true; - gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + mFetchFolderQueue.push_back(FetchQueueInfo((*it)->getUUID(), FT_RECURSIVE)); } } } + if (!mFetchFolderQueue.empty()) + { + mBackgroundFetchActive = true; + mFolderFetchActive = true; + gIdleCallbacks.addFunction(&LLInventoryModelBackgroundFetch::backgroundFetchCB, NULL); + } + // done LLViewerInventoryCategory * cat(gInventory.getCategory(request_id)); if (cat) @@ -555,9 +615,9 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() } static LLCachedControl ais_pool(gSavedSettings, "PoolSizeAIS", 20); - // Don't have too many requests at once + // Don't have too many requests at once, AIS throttles // Reserve one request for actions outside of fetch (like renames) - const U32 max_concurrent_fetches = llmax(1, ais_pool - 1); + const U32 max_concurrent_fetches = llclamp(ais_pool - 1, 1, 50); if (mFetchCount >= max_concurrent_fetches) { @@ -663,10 +723,97 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc LLViewerInventoryCategory * cat(gInventory.getCategory(cat_id)); if (cat) { - if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion() || fetch_info.mFetchType == FT_FORCED) + if (fetch_info.mFetchType == FT_CONTENT_RECURSIVE) + { + // fetch content only, ignore cat itself + uuid_vec_t children; + LLInventoryModel::cat_array_t* categories(NULL); + LLInventoryModel::item_array_t* items(NULL); + gInventory.getDirectDescendentsOf(cat_id, categories, items); + + LLViewerInventoryCategory::EFetchType target_state = + fetch_info.mFetchType > FT_CONTENT_RECURSIVE + ? LLViewerInventoryCategory::FETCH_RECURSIVE + : LLViewerInventoryCategory::FETCH_NORMAL; + // technically limit is 'as many as you can put into url', but for now stop at 10 + const S32 batch_limit = 10; + bool content_done = true; + + for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); + it != categories->end(); + ++it) + { + LLViewerInventoryCategory* child_cat = (*it); + if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion() + || child_cat->getFetching() >= target_state) + { + // push it back to verify everything inside is fetched + mFetchFolderQueue.push_back(FetchQueueInfo((*it)->getUUID(), FT_RECURSIVE)); + continue; + } + + if (child_cat->getPreferredType() == LLFolderType::FT_MARKETPLACE_LISTINGS) + { + // special case + content_done = false; + if (children.empty()) + { + // fetch marketplace alone + children.push_back(child_cat->getUUID()); + mExpectedFolderIds.push_back(child_cat->getUUID()); + child_cat->setFetching(target_state); + break; + } + else + { + // fetch marketplace alone next run + continue; + } + } + + children.push_back(child_cat->getUUID()); + mExpectedFolderIds.push_back(child_cat->getUUID()); + child_cat->setFetching(target_state); + + if (children.size() >= batch_limit) + { + content_done = false; + break; + } + } + + if (!children.empty()) + { + // increment before call in case of immediate callback + incrFetchFolderCount(1); + + EFetchType type = fetch_info.mFetchType; + LLUUID cat_id = cat->getUUID(); // need a copy for lambda + AISAPI::completion_t cb = [cat_id, children, type](const LLUUID& response_id) + { + LLInventoryModelBackgroundFetch::instance().onAISContentCalback(cat_id, children, response_id, type); + }; + + AISAPI::ITEM_TYPE item_type = AISAPI::INVENTORY; + if (ALEXANDRIA_LINDEN_ID == cat->getOwnerID()) + { + item_type = AISAPI::LIBRARY; + } + + AISAPI::FetchCategorySubset(cat_id, children, item_type, true, cb, 0); + } + + if (!content_done) + { + // send it back to get the rest + mFetchFolderQueue.push_back(FetchQueueInfo(cat_id, FT_CONTENT_RECURSIVE)); + } + } + else if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion() + || fetch_info.mFetchType == FT_FORCED) { LLViewerInventoryCategory::EFetchType target_state = - fetch_info.mFetchType >= FT_CONTENT_RECURSIVE + fetch_info.mFetchType > FT_CONTENT_RECURSIVE ? LLViewerInventoryCategory::FETCH_RECURSIVE : LLViewerInventoryCategory::FETCH_NORMAL; // start again if we did a non-recursive fetch before @@ -711,7 +858,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc } } } - } // else? + } // else try to fetch folder either way? } } else diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index 363d04486d..1fd7426312 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -82,8 +82,9 @@ protected: typedef enum { FT_DEFAULT = 0, - FT_FORCED, // request even if already loaded + FT_FORCED, // request non-recursively even if already loaded FT_CONTENT_RECURSIVE, // request content recursively + FT_FOLDER_AND_CONTENT, // request content recursively FT_RECURSIVE, // request everything recursively } EFetchType; struct FetchQueueInfo @@ -100,7 +101,8 @@ protected: }; typedef std::deque fetch_queue_t; - void onAISFolderCalback(const LLUUID &request_id, const LLUUID &response_id, EFetchType recursion); + void onAISContentCalback(const LLUUID& request_id, const uuid_vec_t &content_ids, const LLUUID& response_id, EFetchType fetch_type); + void onAISFolderCalback(const LLUUID &request_id, const LLUUID &response_id, EFetchType fetch_type); void bulkFetchViaAis(); void bulkFetchViaAis(const FetchQueueInfo& fetch_info); void bulkFetch(); -- cgit v1.2.3 From 30b87c11e92f1917aec95662f95a8e5a136c937e Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 27 Apr 2023 18:23:56 +0300 Subject: SL-19583 WIP fixed the issue with item selection and restored filter handling for gallery panel --- indra/newview/llpanelmaininventory.cpp | 26 ++++++++++++-------------- 1 file changed, 12 insertions(+), 14 deletions(-) (limited to 'indra') diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 7cd6d7cb82..b9099bbebf 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -2217,26 +2217,31 @@ void LLPanelMainInventory::updateCombinationVisibility() { if(mSingleFolderMode && isCombinationViewMode()) { - LLRect inner_rect = mCombinationInventoryPanel->getScrollableContainer()->getScrolledViewRect(); + if (!mCombinationGalleryPanel->hasVisibleItems()) + { + mCombinationGalleryPanel->handleModifiedFilter(); + } LLRect inv_rect = mCombinationInventoryPanel->getRect(); + LLRect inv_inner_rect = mCombinationInventoryPanel->getScrollableContainer()->getScrolledViewRect(); + LLRect galery_rect = mCombinationGalleryPanel->getRect(); + LLRect inner_galery_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect(); + inv_rect.mBottom = 0; - inv_rect.mRight = inv_rect.mLeft + inner_rect.getWidth(); + inv_rect.mRight = inv_rect.mLeft + inv_inner_rect.getWidth(); if (!mCombinationGalleryPanel->hasVisibleItems() || mCombinationInventoryPanel->hasVisibleItems()) { - inv_rect.mTop = inv_rect.mBottom + inner_rect.getHeight(); + inv_rect.mTop = inv_rect.mBottom + inv_inner_rect.getHeight(); } else { inv_rect.mTop = inv_rect.mBottom; } - inner_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect(); - LLRect galery_rect = mCombinationGalleryPanel->getRect(); galery_rect.mBottom = inv_rect.mTop; if (mCombinationGalleryPanel->hasVisibleItems()) { mCombinationGalleryPanel->setVisible(true); - galery_rect.mTop = galery_rect.mBottom + inner_rect.getHeight(); + galery_rect.mTop = galery_rect.mBottom + inner_galery_rect.getHeight(); } else { @@ -2244,16 +2249,9 @@ void LLPanelMainInventory::updateCombinationVisibility() galery_rect.mTop = galery_rect.mBottom; } - LLRect scroller_rect = mCombinationScroller->getRect(); - scroller_rect.mBottom = 0; - scroller_rect.mTop = scroller_rect.mBottom + inv_rect.getHeight() + galery_rect.getHeight(); - scroller_rect.mRight = scroller_rect.mLeft + llmax(inv_rect.getWidth(), galery_rect.getWidth()); - - mCombinationScroller->setRect(scroller_rect); + mCombinationScroller->reshape(llmax(inv_rect.getWidth(), galery_rect.getWidth()), inv_rect.getHeight() + galery_rect.getHeight(), true); mCombinationGalleryPanel->handleReshape(galery_rect, false); mCombinationInventoryPanel->handleReshape(inv_rect, false); - - getActivePanel()->getRootFolder(); } } -- cgit v1.2.3 From 7bb564496997e26a4c9770cb509955d0a22d1617 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 27 Apr 2023 20:23:13 +0300 Subject: SL-19533 Subset fetch fixes --- indra/newview/llaisapi.cpp | 2 ++ indra/newview/llinventorymodelbackgroundfetch.cpp | 28 ++++++++++++++++------- indra/newview/llinventorymodelbackgroundfetch.h | 2 +- 3 files changed, 23 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index c17b246ef1..e63d77cea3 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -916,6 +916,8 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht case COPYLIBRARYCATEGORY: case FETCHCATEGORYCATEGORIES: case FETCHCATEGORYCHILDREN: + case FETCHCATEGORYSUBSET: + case FETCHCOF: if (result.has("category_id")) { id = result["category_id"]; diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index b8fdfab98a..3a2120750b 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -731,10 +731,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc LLInventoryModel::item_array_t* items(NULL); gInventory.getDirectDescendentsOf(cat_id, categories, items); - LLViewerInventoryCategory::EFetchType target_state = - fetch_info.mFetchType > FT_CONTENT_RECURSIVE - ? LLViewerInventoryCategory::FETCH_RECURSIVE - : LLViewerInventoryCategory::FETCH_NORMAL; + LLViewerInventoryCategory::EFetchType target_state = LLViewerInventoryCategory::FETCH_RECURSIVE; // technically limit is 'as many as you can put into url', but for now stop at 10 const S32 batch_limit = 10; bool content_done = true; @@ -747,8 +744,6 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion() || child_cat->getFetching() >= target_state) { - // push it back to verify everything inside is fetched - mFetchFolderQueue.push_back(FetchQueueInfo((*it)->getUUID(), FT_RECURSIVE)); continue; } @@ -759,6 +754,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc if (children.empty()) { // fetch marketplace alone + // Should it actually be fetched as FT_FOLDER_AND_CONTENT? children.push_back(child_cat->getUUID()); mExpectedFolderIds.push_back(child_cat->getUUID()); child_cat->setFetching(target_state); @@ -803,7 +799,23 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc AISAPI::FetchCategorySubset(cat_id, children, item_type, true, cb, 0); } - if (!content_done) + if (content_done) + { + // This will have a bit of overlap with onAISContentCalback, + // but something else might have dowloaded folders, so verify + // every child that is complete has it's children done as well + for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); + it != categories->end(); + ++it) + { + LLViewerInventoryCategory* child_cat = (*it); + if (LLViewerInventoryCategory::VERSION_UNKNOWN != child_cat->getVersion()) + { + mFetchFolderQueue.push_back(FetchQueueInfo(child_cat->getUUID(), FT_RECURSIVE)); + } + } + } + else { // send it back to get the rest mFetchFolderQueue.push_back(FetchQueueInfo(cat_id, FT_CONTENT_RECURSIVE)); @@ -844,7 +856,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc else { // Already fetched, check if anything inside needs fetching - if (fetch_info.mFetchType >= FT_CONTENT_RECURSIVE) + if (fetch_info.mFetchType == FT_RECURSIVE) { LLInventoryModel::cat_array_t * categories(NULL); LLInventoryModel::item_array_t * items(NULL); diff --git a/indra/newview/llinventorymodelbackgroundfetch.h b/indra/newview/llinventorymodelbackgroundfetch.h index 1fd7426312..e7be265a3d 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.h +++ b/indra/newview/llinventorymodelbackgroundfetch.h @@ -84,7 +84,7 @@ protected: FT_DEFAULT = 0, FT_FORCED, // request non-recursively even if already loaded FT_CONTENT_RECURSIVE, // request content recursively - FT_FOLDER_AND_CONTENT, // request content recursively + FT_FOLDER_AND_CONTENT, // request folder, then content recursively FT_RECURSIVE, // request everything recursively } EFetchType; struct FetchQueueInfo -- cgit v1.2.3 From 377f177a8667702eee12414fb5534fd6732da1d2 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 27 Apr 2023 21:32:17 +0300 Subject: SL-19533 Removed per-run limit Doesn't seem to work like expected and I never get more than 7-9 requests running total --- indra/newview/llinventorymodelbackgroundfetch.cpp | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 3a2120750b..5b8ee6e244 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -624,9 +624,6 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() return; } - // Don't fire all requests at once - const U32 max_requests_this_run = llmin(mFetchCount + 5, max_concurrent_fetches); - // Don't loop for too long (in case of large, fully loaded inventory) F64 curent_time = LLTimer::getTotalSeconds(); const F64 max_time = LLStartUp::getStartupState() > STATE_WEARABLES_WAIT @@ -635,7 +632,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() const F64 end_time = curent_time + max_time; S32 last_fetch_count = mFetchCount; - while (!mFetchFolderQueue.empty() && mFetchCount < max_requests_this_run && curent_time < end_time) + while (!mFetchFolderQueue.empty() && mFetchCount < max_concurrent_fetches && curent_time < end_time) { const FetchQueueInfo & fetch_info(mFetchFolderQueue.front()); bulkFetchViaAis(fetch_info); @@ -646,7 +643,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis() // Ideally we shouldn't fetch items if recursive fetch isn't done, // but there is a chance some request will start timeouting and recursive // fetch will get stuck on a signle folder, don't block item fetch in such case - while (!mFetchItemQueue.empty() && mFetchCount < max_requests_this_run && curent_time < end_time) + while (!mFetchItemQueue.empty() && mFetchCount < max_concurrent_fetches && curent_time < end_time) { const FetchQueueInfo& fetch_info(mFetchItemQueue.front()); bulkFetchViaAis(fetch_info); -- cgit v1.2.3 From 9349a9b5d4ccb21f195e5c156d897836399fd11b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 28 Apr 2023 00:18:46 +0300 Subject: SL-19533 More children per subset fetch request --- indra/newview/llinventorymodelbackgroundfetch.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 5b8ee6e244..5f7950df08 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -730,7 +730,7 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc LLViewerInventoryCategory::EFetchType target_state = LLViewerInventoryCategory::FETCH_RECURSIVE; // technically limit is 'as many as you can put into url', but for now stop at 10 - const S32 batch_limit = 10; + const S32 batch_limit = 20; bool content_done = true; for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); -- cgit v1.2.3 From 4bfcf182d7a961d8ebfe17b453e54cfac26347ce Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 28 Apr 2023 19:34:26 +0300 Subject: SL-19533 Fetch stall prevention #2 --- indra/newview/llaisapi.cpp | 15 +++++++++++++++ indra/newview/llaisapi.h | 2 +- 2 files changed, 16 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index e63d77cea3..951860e39d 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -1550,6 +1550,7 @@ void AISUpdate::doUpdate() } // CREATE CATEGORIES + const S32 MAX_UPDATE_BACKLOG = 50; // stall prevention for (deferred_category_map_t::const_iterator create_it = mCategoriesCreated.begin(); create_it != mCategoriesCreated.end(); ++create_it) { @@ -1558,6 +1559,13 @@ void AISUpdate::doUpdate() gInventory.updateCategory(new_category, LLInventoryObserver::CREATE); LL_DEBUGS("Inventory") << "created category " << category_id << LL_ENDL; + + // fetching can receive massive amount of items and fodlers + if (gInventory.getChangedIDs().size() > MAX_UPDATE_BACKLOG) + { + gInventory.notifyObservers(); + checkTimeout(); + } } // UPDATE CATEGORIES @@ -1612,6 +1620,13 @@ void AISUpdate::doUpdate() // case this is create. LL_DEBUGS("Inventory") << "created item " << item_id << LL_ENDL; gInventory.updateItem(new_item, LLInventoryObserver::CREATE); + + // fetching can receive massive amount of items and fodlers + if (gInventory.getChangedIDs().size() > MAX_UPDATE_BACKLOG) + { + gInventory.notifyObservers(); + checkTimeout(); + } } // UPDATE ITEMS diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 691c5db592..6270a34081 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -130,7 +130,7 @@ private: // Debug is very log-heavy, give it more time or it will take forever to process // Todo: find a way to make throttle static isntead of per-request const F32 EXPIRY_SECONDS_DEBUG = 1.f; - const F32 EXPIRY_SECONDS_LIVE = 0.01f; + const F32 EXPIRY_SECONDS_LIVE = 0.008f; typedef std::map uuid_int_map_t; uuid_int_map_t mCatDescendentDeltas; -- cgit v1.2.3 From 80bfc56ff070614fee5b353056076ebed90f9039 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 28 Apr 2023 19:51:00 +0300 Subject: SL-19583 force reshape inventory panel when changing root in combination view --- indra/newview/llpanelmaininventory.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index b9099bbebf..4d6ff63f94 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -2211,6 +2211,9 @@ void LLPanelMainInventory::onCombinationRootChanged(bool gallery_clicked) } mForceShowInvLayout = false; updateTitle(); + + //force update scroll container + mCombinationInventoryPanel->reshape(getChild("combination_view_inventory")->getRect().getWidth(), 1, true); } void LLPanelMainInventory::updateCombinationVisibility() @@ -2250,8 +2253,8 @@ void LLPanelMainInventory::updateCombinationVisibility() } mCombinationScroller->reshape(llmax(inv_rect.getWidth(), galery_rect.getWidth()), inv_rect.getHeight() + galery_rect.getHeight(), true); - mCombinationGalleryPanel->handleReshape(galery_rect, false); - mCombinationInventoryPanel->handleReshape(inv_rect, false); + mCombinationGalleryPanel->setShape(galery_rect, false); + mCombinationInventoryPanel->setShape(inv_rect, false); } } -- cgit v1.2.3 From 03c263a1cdd88ec5967e751cba8640edf9896e51 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 28 Apr 2023 23:37:34 +0300 Subject: SL-19533 Fix 'fetching' state timeout --- indra/newview/app_settings/settings.xml | 11 +++++++++++ indra/newview/llaisapi.cpp | 3 ++- indra/newview/llaisapi.h | 1 + indra/newview/llinventorymodelbackgroundfetch.cpp | 6 ++++-- indra/newview/llviewerinventory.cpp | 11 +++++++++-- 5 files changed, 27 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index a2a1b3f117..43d3f63a34 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -15283,6 +15283,17 @@ Value 1 + BatchSizeAIS3 + + Comment + Amount of folder ais packs into category subset request + Persist + 1 + Type + S32 + Value + 20 + PoolSizeAIS Comment diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index 951860e39d..b09b8ec517 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -46,6 +46,7 @@ //========================================================================= const std::string AISAPI::INVENTORY_CAP_NAME("InventoryAPIv3"); const std::string AISAPI::LIBRARY_CAP_NAME("LibraryAPIv3"); +const S32 AISAPI::HTTP_TIMEOUT = 180; std::list AISAPI::sPostponedQuery; @@ -823,7 +824,7 @@ void AISAPI::InvokeAISCommandCoro(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t ht LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest()); LLCore::HttpHeaders::ptr_t httpHeaders; - httpOptions->setTimeout(180); + httpOptions->setTimeout(HTTP_TIMEOUT); LL_DEBUGS("Inventory") << "Request url: " << url << LL_ENDL; diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 6270a34081..973c82a847 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -38,6 +38,7 @@ class AISAPI { public: + static const S32 HTTP_TIMEOUT; typedef enum { INVENTORY, LIBRARY diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 5f7950df08..8f1012868f 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -729,10 +729,12 @@ void LLInventoryModelBackgroundFetch::bulkFetchViaAis(const FetchQueueInfo& fetc gInventory.getDirectDescendentsOf(cat_id, categories, items); LLViewerInventoryCategory::EFetchType target_state = LLViewerInventoryCategory::FETCH_RECURSIVE; - // technically limit is 'as many as you can put into url', but for now stop at 10 - const S32 batch_limit = 20; bool content_done = true; + // Top limit is 'as many as you can put into url' + static LLCachedControl ais_batch(gSavedSettings, "BatchSizeAIS3", 20); + S32 batch_limit = llclamp(ais_batch(), 1, 40); + for (LLInventoryModel::cat_array_t::iterator it = categories->begin(); it != categories->end(); ++it) diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp index 96f0b500a0..80e4f5f6d5 100644 --- a/indra/newview/llviewerinventory.cpp +++ b/indra/newview/llviewerinventory.cpp @@ -690,9 +690,16 @@ void LLViewerInventoryCategory::setFetching(LLViewerInventoryCategory::EFetchTyp { if (mDescendentsRequested.hasExpired() || (mFetching == FETCH_NONE)) { - const F32 FETCH_TIMER_EXPIRY = 30.0f; mDescendentsRequested.reset(); - mDescendentsRequested.setTimerExpirySec(FETCH_TIMER_EXPIRY); + if (AISAPI::isAvailable()) + { + mDescendentsRequested.setTimerExpirySec(AISAPI::HTTP_TIMEOUT); + } + else + { + const F32 FETCH_TIMER_EXPIRY = 30.0f; + mDescendentsRequested.setTimerExpirySec(FETCH_TIMER_EXPIRY); + } } mFetching = fetching; } -- cgit v1.2.3 From 002ff88a130b16f03e26e159f7ea5f38782b16b6 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 2 May 2023 15:22:21 +0300 Subject: SL-19650 don't rebuild views right after initialising panel --- indra/newview/llinventorypanel.cpp | 14 +++++++++----- indra/newview/llinventorypanel.h | 2 ++ 2 files changed, 11 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 2c7c6d2056..c8c9d6c351 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -907,7 +907,10 @@ void LLInventoryPanel::initializeViews(F64 max_time) gIdleCallbacks.addFunction(idle, this); - openStartFolderOrMyInventory(); + if(mParams.open_first_folder) + { + openStartFolderOrMyInventory(); + } // Special case for new user login if (gAgent.isFirstLogin()) @@ -2098,10 +2101,11 @@ void LLInventorySingleFolderPanel::setSelectCallback(const boost::function folder_view; Optional folder; Optional item; + Optional open_first_folder; // All item and folder views will be initialized on init if true (default) // Will initialize on visibility change otherwise. @@ -126,6 +127,7 @@ public: show_root_folder("show_root_folder", false), allow_drop_on_root("allow_drop_on_root", true), use_marketplace_folders("use_marketplace_folders", false), + open_first_folder("open_first_folder", true), scroll("scroll"), accepts_drag_and_drop("accepts_drag_and_drop"), folder_view("folder_view"), -- cgit v1.2.3 From d1e3959fef60d70c5f928422b9895b11e36ef343 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Pantera=20P=C3=B3=C5=82nocy?= Date: Tue, 2 May 2023 19:19:03 +0200 Subject: Update floater_scene_load_stats.xml Reducing the packet loss... --- .../skins/default/xui/en/floater_scene_load_stats.xml | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) (limited to 'indra') diff --git a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml index 37efbe654e..b757f4eab8 100644 --- a/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_scene_load_stats.xml @@ -414,7 +414,7 @@ name="frame_stats" label="Frame breakdown" show_label="true"> - - - - - - Date: Tue, 2 May 2023 19:35:14 +0200 Subject: Fixing a small typo in llviewerstats.cpp --- indra/newview/llviewerstats.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llviewerstats.cpp b/indra/newview/llviewerstats.cpp index 519166af63..1607296194 100644 --- a/indra/newview/llviewerstats.cpp +++ b/indra/newview/llviewerstats.cpp @@ -124,7 +124,7 @@ SimMeasurement<> SIM_TIME_DILATION("simtimedilation", "Simulator time scale", SIM_MAIN_AGENTS("simmainagents", "Number of avatars in current region", LL_SIM_STAT_NUMAGENTMAIN), SIM_CHILD_AGENTS("simchildagents", "Number of avatars in neighboring regions", LL_SIM_STAT_NUMAGENTCHILD), SIM_OBJECTS("simobjects", "", LL_SIM_STAT_NUMTASKS), - SIM_ACTIVE_OBJECTS("simactiveobjects", "Number of scripted and/or mocing objects", LL_SIM_STAT_NUMTASKSACTIVE), + SIM_ACTIVE_OBJECTS("simactiveobjects", "Number of scripted and/or moving objects", LL_SIM_STAT_NUMTASKSACTIVE), SIM_ACTIVE_SCRIPTS("simactivescripts", "Number of scripted objects", LL_SIM_STAT_NUMSCRIPTSACTIVE), SIM_IN_PACKETS_PER_SEC("siminpps", "", LL_SIM_STAT_INPPS), SIM_OUT_PACKETS_PER_SEC("simoutpps", "", LL_SIM_STAT_OUTPPS), -- cgit v1.2.3 From 171b8dbeb32e49d43f40189ae55df05693804fbf Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 2 May 2023 23:07:46 +0300 Subject: SL-19583 Fix rename's width and update frequency This way of calculating scroll turns out to be one large hack. Probably needs a proper combination view instead of combining two different views that have own scrolls or those views need to support not having personal scroll. --- indra/newview/llagentwearables.cpp | 5 ++-- indra/newview/llpanelmaininventory.cpp | 45 +++++++++++++++++++++++++++------- indra/newview/llpanelmaininventory.h | 5 +++- indra/newview/lltoolbarview.cpp | 2 +- 4 files changed, 44 insertions(+), 13 deletions(-) (limited to 'indra') diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 2e769dc737..24c6d82b0d 100644 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1307,8 +1307,9 @@ void LLAgentWearables::findAttachmentsAddRemoveInfo(LLInventoryModel::item_array } // Build up list of objects to be removed and items currently attached. - for (LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); - iter != gAgentAvatarp->mAttachmentPoints.end();) + LLVOAvatar::attachment_map_t::iterator iter = gAgentAvatarp->mAttachmentPoints.begin(); + LLVOAvatar::attachment_map_t::iterator end = gAgentAvatarp->mAttachmentPoints.end(); + while (iter != end) { LLVOAvatar::attachment_map_t::iterator curiter = iter++; LLViewerJointAttachment* attachment = curiter->second; diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 4d6ff63f94..fc4cc124b8 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -120,6 +120,7 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p) mSingleFolderMode(false), mForceShowInvLayout(false), mViewMode(MODE_COMBINATION), + mCombinationShapeDirty(true), mListViewRootUpdatedConnection(), mGalleryRootUpdatedConnection() { @@ -253,6 +254,8 @@ BOOL LLPanelMainInventory::postBuild() mInventoryGalleryPanel = getChild("gallery_view_inv"); mGalleryRootUpdatedConnection = mInventoryGalleryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::updateTitle, this)); + mCombinationScrollPanel = getChild("combination_view_inventory"); + mCombinationInventoryPanel = getChild("comb_single_folder_inv"); LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter(); comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_EXCLUDE_THUMBNAILS); @@ -899,9 +902,18 @@ BOOL LLPanelMainInventory::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, } // virtual -void LLPanelMainInventory::changed(U32) +void LLPanelMainInventory::changed(U32 mask) { updateItemcountText(); + if ((mask & LLInventoryObserver::REBUILD) + || (mask & LLInventoryObserver::STRUCTURE) + || (mask & LLInventoryObserver::REMOVE) + || (mask & LLInventoryObserver::ADD) + || (mask & LLInventoryObserver::LABEL)) + { + // todo: can be limited to just observed folder + mCombinationShapeDirty = true; + } } void LLPanelMainInventory::setFocusFilterEditor() @@ -912,6 +924,13 @@ void LLPanelMainInventory::setFocusFilterEditor() } } + +void LLPanelMainInventory::reshape(S32 width, S32 height, BOOL called_from_parent) +{ + mCombinationShapeDirty = true; + LLPanel::reshape(width, height, called_from_parent); +} + // virtual void LLPanelMainInventory::draw() { @@ -1506,9 +1525,9 @@ void LLPanelMainInventory::toggleViewMode() getChild("default_inventory_panel")->setVisible(!mSingleFolderMode); getChild("single_folder_inventory")->setVisible(mSingleFolderMode && isListViewMode()); getChild("gallery_view_inventory")->setVisible(mSingleFolderMode && isGalleryViewMode()); - getChild("combination_view_inventory")->setVisible(mSingleFolderMode && isCombinationViewMode()); getChild("nav_buttons")->setVisible(mSingleFolderMode); getChild("view_mode_btn")->setImageOverlay(mSingleFolderMode ? getString("default_mode_btn") : getString("single_folder_mode_btn")); + mCombinationScrollPanel->setVisible(mSingleFolderMode && isCombinationViewMode()); setActivePanel(); updateTitle(); @@ -2213,13 +2232,15 @@ void LLPanelMainInventory::onCombinationRootChanged(bool gallery_clicked) updateTitle(); //force update scroll container - mCombinationInventoryPanel->reshape(getChild("combination_view_inventory")->getRect().getWidth(), 1, true); + mCombinationShapeDirty = true; } void LLPanelMainInventory::updateCombinationVisibility() { - if(mSingleFolderMode && isCombinationViewMode()) + if(mSingleFolderMode && isCombinationViewMode() && mCombinationShapeDirty) { + mCombinationShapeDirty = false; + mCombinationInventoryPanel->reshape(1,1); // force reduce visible area if (!mCombinationGalleryPanel->hasVisibleItems()) { mCombinationGalleryPanel->handleModifiedFilter(); @@ -2228,12 +2249,17 @@ void LLPanelMainInventory::updateCombinationVisibility() LLRect inv_inner_rect = mCombinationInventoryPanel->getScrollableContainer()->getScrolledViewRect(); LLRect galery_rect = mCombinationGalleryPanel->getRect(); LLRect inner_galery_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect(); + LLScrollContainer* scroll = static_cast(mCombinationScrollPanel); + LLRect scroller_window_rect = scroll->getContentWindowRect(); + + const S32 BORDER_PAD = 1; + S32 desired_width = llmax(inv_inner_rect.getWidth(), scroller_window_rect.getWidth()) + BORDER_PAD; inv_rect.mBottom = 0; - inv_rect.mRight = inv_rect.mLeft + inv_inner_rect.getWidth(); + inv_rect.mRight = inv_rect.mLeft + desired_width; if (!mCombinationGalleryPanel->hasVisibleItems() || mCombinationInventoryPanel->hasVisibleItems()) { - inv_rect.mTop = inv_rect.mBottom + inv_inner_rect.getHeight(); + inv_rect.mTop = inv_rect.mBottom + inv_inner_rect.getHeight() + BORDER_PAD; } else { @@ -2241,10 +2267,11 @@ void LLPanelMainInventory::updateCombinationVisibility() } galery_rect.mBottom = inv_rect.mTop; + galery_rect.mRight = galery_rect.mLeft + scroller_window_rect.getWidth(); if (mCombinationGalleryPanel->hasVisibleItems()) { mCombinationGalleryPanel->setVisible(true); - galery_rect.mTop = galery_rect.mBottom + inner_galery_rect.getHeight(); + galery_rect.mTop = galery_rect.mBottom + inner_galery_rect.getHeight() + BORDER_PAD; } else { @@ -2252,7 +2279,7 @@ void LLPanelMainInventory::updateCombinationVisibility() galery_rect.mTop = galery_rect.mBottom; } - mCombinationScroller->reshape(llmax(inv_rect.getWidth(), galery_rect.getWidth()), inv_rect.getHeight() + galery_rect.getHeight(), true); + mCombinationScroller->reshape(desired_width, inv_rect.getHeight() + galery_rect.getHeight() + BORDER_PAD, true); mCombinationGalleryPanel->setShape(galery_rect, false); mCombinationInventoryPanel->setShape(inv_rect, false); } @@ -2319,7 +2346,7 @@ void LLPanelMainInventory::setViewMode(EViewModeType mode) getChild("single_folder_inventory")->setVisible(mSingleFolderMode && isListViewMode()); getChild("gallery_view_inventory")->setVisible(mSingleFolderMode && isGalleryViewMode()); - getChild("combination_view_inventory")->setVisible(mSingleFolderMode && isCombinationViewMode()); + mCombinationScrollPanel->setVisible(mSingleFolderMode && isCombinationViewMode()); if(isListViewMode()) { diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 8e7ad776b0..4f792878a5 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -83,8 +83,9 @@ public: EAcceptance* accept, std::string& tooltip_msg); /*virtual*/ void changed(U32); + /*virtual*/ void reshape(S32 width, S32 height, BOOL called_from_parent = TRUE); /*virtual*/ void draw(); - /*virtual*/ void onVisibilityChange ( BOOL new_visibility ); + /*virtual*/ void onVisibilityChange ( BOOL new_visibility ); LLInventoryPanel* getPanel() { return mActivePanel; } LLInventoryPanel* getActivePanel() { return mActivePanel; } @@ -192,6 +193,7 @@ private: LLInventorySingleFolderPanel* mSingleFolderPanelInventory; LLInventoryGallery* mInventoryGalleryPanel; + LLUICtrl* mCombinationScrollPanel; LLInventorySingleFolderPanel* mCombinationInventoryPanel; LLInventoryGallery* mCombinationGalleryPanel; LLView* mCombinationScroller; @@ -232,6 +234,7 @@ private: bool mNeedUploadCost; bool mForceShowInvLayout; + bool mCombinationShapeDirty; // List Commands // //////////////////////////////////////////////////////////////////////////////// }; diff --git a/indra/newview/lltoolbarview.cpp b/indra/newview/lltoolbarview.cpp index 4f47c465c4..f6628293ee 100644 --- a/indra/newview/lltoolbarview.cpp +++ b/indra/newview/lltoolbarview.cpp @@ -322,9 +322,9 @@ bool LLToolBarView::loadToolbars(bool force_default) } // SL-18581: Don't show the starter avatar toolbar button for NUX users - LLViewerInventoryCategory* my_outfits_cat = gInventory.getCategory(gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS)); if (gAgent.isFirstLogin()) { + LLViewerInventoryCategory* my_outfits_cat = gInventory.getCategory(gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS)); LL_WARNS() << "First login: checking for NUX user." << LL_ENDL; if (my_outfits_cat != NULL && my_outfits_cat->getDescendentCount() > 0) { -- cgit v1.2.3 From 1866368673f06084860c30cbd78446f55f600a1e Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 3 May 2023 02:06:09 +0300 Subject: SL-19583 Fix height not accounting for borders properly --- indra/newview/llpanelmaininventory.cpp | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index fc4cc124b8..0a6ac5f92e 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -287,6 +287,7 @@ BOOL LLPanelMainInventory::postBuild() // Trigger callback for focus received so we can deselect items in inbox/outbox LLFocusableElement::setFocusReceivedCallback(boost::bind(&LLPanelMainInventory::onFocusReceived, this)); + mCombinationShapeDirty = true; return TRUE; } @@ -1964,6 +1965,7 @@ void LLPanelMainInventory::onVisibilityChange( BOOL new_visibility ) } getActivePanel()->getRootFolder()->finishRenamingItem(); } + mCombinationShapeDirty = true; } bool LLPanelMainInventory::isSaveTextureEnabled(const LLSD& userdata) @@ -2240,7 +2242,7 @@ void LLPanelMainInventory::updateCombinationVisibility() if(mSingleFolderMode && isCombinationViewMode() && mCombinationShapeDirty) { mCombinationShapeDirty = false; - mCombinationInventoryPanel->reshape(1,1); // force reduce visible area + mCombinationInventoryPanel->reshape(1,1); // HACK: force reduce visible area if (!mCombinationGalleryPanel->hasVisibleItems()) { mCombinationGalleryPanel->handleModifiedFilter(); @@ -2251,9 +2253,8 @@ void LLPanelMainInventory::updateCombinationVisibility() LLRect inner_galery_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect(); LLScrollContainer* scroll = static_cast(mCombinationScrollPanel); LLRect scroller_window_rect = scroll->getContentWindowRect(); - - const S32 BORDER_PAD = 1; - S32 desired_width = llmax(inv_inner_rect.getWidth(), scroller_window_rect.getWidth()) + BORDER_PAD; + S32 desired_width = llmax(inv_inner_rect.getWidth(), scroller_window_rect.getWidth()); + const S32 BORDER_PAD = 2; // two sides inv_rect.mBottom = 0; inv_rect.mRight = inv_rect.mLeft + desired_width; @@ -2279,7 +2280,7 @@ void LLPanelMainInventory::updateCombinationVisibility() galery_rect.mTop = galery_rect.mBottom; } - mCombinationScroller->reshape(desired_width, inv_rect.getHeight() + galery_rect.getHeight() + BORDER_PAD, true); + mCombinationScroller->reshape(desired_width, inv_rect.getHeight() + galery_rect.getHeight(), true); mCombinationGalleryPanel->setShape(galery_rect, false); mCombinationInventoryPanel->setShape(inv_rect, false); } -- cgit v1.2.3 From b3e02c4264a8a3b9d189b347d0faddf3ac21e87b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 3 May 2023 18:46:18 +0300 Subject: SL-19583 Scroll fixes --- indra/newview/llinventorypanel.cpp | 7 +++++++ indra/newview/llinventorypanel.h | 3 ++- indra/newview/llpanelmaininventory.cpp | 20 ++++++++++++++++---- 3 files changed, 25 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index c8c9d6c351..6d739c909c 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -2246,6 +2246,13 @@ void LLInventorySingleFolderPanel::doCreate(const LLSD& userdata) /* Asset Pre-Filtered Inventory Panel related class */ /************************************************************************/ +LLAssetFilteredInventoryPanel::LLAssetFilteredInventoryPanel(const Params& p) + : LLInventoryPanel(p) + , mAssetType(LLAssetType::AT_NONE) +{ +} + + void LLAssetFilteredInventoryPanel::initFromParams(const Params& p) { mAssetType = LLAssetType::lookup(p.filter_asset_type.getValue()); diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index d334d55611..f2eab4a642 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -214,6 +214,7 @@ public: LLUUID getRootFolderID(); LLScrollContainer* getScrollableContainer() { return mScroller; } bool getAllowDropOnRoot() { return mParams.allow_drop_on_root; } + bool areViewsInitialized() { return mViewsInitialized == VIEWS_INITIALIZED && !mFolderRoot.get()->needsArrange(); } void onSelectionChange(const std::deque &items, BOOL user_action); @@ -455,7 +456,7 @@ public: void initFromParams(const Params& p); protected: - LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {} + LLAssetFilteredInventoryPanel(const Params& p); friend class LLUICtrlFactory; public: ~LLAssetFilteredInventoryPanel() {} diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 0a6ac5f92e..3110adff15 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -736,6 +736,8 @@ void LLPanelMainInventory::onClearSearch() inbox_panel->onClearSearch(); } } + + mCombinationShapeDirty = true; } void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) @@ -793,6 +795,8 @@ void LLPanelMainInventory::onFilterEdit(const std::string& search_string ) inbox_panel->onFilterEdit(search_string); } } + + mCombinationShapeDirty = true; } @@ -1681,6 +1685,8 @@ void LLPanelMainInventory::setSingleFolderViewRoot(const LLUUID& folder_id, bool mCombinationInventoryPanel->changeFolderRoot(folder_id); } updateNavButtons(); + + mCombinationShapeDirty = true; } LLUUID LLPanelMainInventory::getSingleFolderViewRoot() @@ -2235,14 +2241,20 @@ void LLPanelMainInventory::onCombinationRootChanged(bool gallery_clicked) //force update scroll container mCombinationShapeDirty = true; + mCombinationInventoryPanel->reshape(1, 1); } void LLPanelMainInventory::updateCombinationVisibility() { - if(mSingleFolderMode && isCombinationViewMode() && mCombinationShapeDirty) + if(mSingleFolderMode + && isCombinationViewMode() + && mCombinationShapeDirty) { - mCombinationShapeDirty = false; - mCombinationInventoryPanel->reshape(1,1); // HACK: force reduce visible area + if (mCombinationInventoryPanel->areViewsInitialized()) + { + mCombinationShapeDirty = false; + mCombinationInventoryPanel->reshape(1,1); // HACK: force reduce visible area + } if (!mCombinationGalleryPanel->hasVisibleItems()) { mCombinationGalleryPanel->handleModifiedFilter(); @@ -2253,8 +2265,8 @@ void LLPanelMainInventory::updateCombinationVisibility() LLRect inner_galery_rect = mCombinationGalleryPanel->getScrollableContainer()->getScrolledViewRect(); LLScrollContainer* scroll = static_cast(mCombinationScrollPanel); LLRect scroller_window_rect = scroll->getContentWindowRect(); - S32 desired_width = llmax(inv_inner_rect.getWidth(), scroller_window_rect.getWidth()); const S32 BORDER_PAD = 2; // two sides + S32 desired_width = llmax(inv_inner_rect.getWidth(), scroller_window_rect.getWidth() - BORDER_PAD); inv_rect.mBottom = 0; inv_rect.mRight = inv_rect.mLeft + desired_width; -- cgit v1.2.3 From 22a07b1121bb429e6bfe10b5a5e859bcea1262b6 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Wed, 3 May 2023 12:48:22 -0400 Subject: SL-18330: fix strip_deprecated_header(cur_size) param to llssize. --- indra/llcommon/llsdserialize.cpp | 2 +- indra/llcommon/llsdserialize.h | 2 +- indra/newview/llmeshrepository.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/llcommon/llsdserialize.cpp b/indra/llcommon/llsdserialize.cpp index a510b73096..32d0847141 100644 --- a/indra/llcommon/llsdserialize.cpp +++ b/indra/llcommon/llsdserialize.cpp @@ -2388,7 +2388,7 @@ U8* unzip_llsdNavMesh( bool& valid, unsigned int& outsize, std::istream& is, S32 return result; } -char* strip_deprecated_header(char* in, U32& cur_size, U32* header_size) +char* strip_deprecated_header(char* in, llssize& cur_size, U32* header_size) { const char* deprecated_header = ""; constexpr size_t deprecated_header_size = 17; diff --git a/indra/llcommon/llsdserialize.h b/indra/llcommon/llsdserialize.h index d33d2b6f34..4f596856de 100644 --- a/indra/llcommon/llsdserialize.h +++ b/indra/llcommon/llsdserialize.h @@ -873,5 +873,5 @@ LL_COMMON_API std::string zip_llsd(LLSD& data); LL_COMMON_API U8* unzip_llsdNavMesh( bool& valid, unsigned int& outsize,std::istream& is, S32 size); // returns a pointer to the array or past the array if the deprecated header exists -LL_COMMON_API char* strip_deprecated_header(char* in, U32& cur_size, U32* header_size = nullptr); +LL_COMMON_API char* strip_deprecated_header(char* in, llssize& cur_size, U32* header_size = nullptr); #endif // LL_LLSDSERIALIZE_H diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index f937754368..18420a2356 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -1865,7 +1865,7 @@ EMeshProcessingResult LLMeshRepoThread::headerReceived(const LLVolumeParams& mes U32 header_size = 0; if (data_size > 0) { - U32 dsize = data_size; + llssize dsize = data_size; char* result_ptr = strip_deprecated_header((char*)data, dsize, &header_size); data_size = dsize; -- cgit v1.2.3 From 971e851157da688b480d6ada188daec532e4b682 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Thu, 4 May 2023 16:44:23 +0300 Subject: SL-19647 OSX buildfix --- indra/llcommon/tests/llsdserialize_test.cpp | 2 -- 1 file changed, 2 deletions(-) (limited to 'indra') diff --git a/indra/llcommon/tests/llsdserialize_test.cpp b/indra/llcommon/tests/llsdserialize_test.cpp index 85791e2979..acb2953b5b 100644 --- a/indra/llcommon/tests/llsdserialize_test.cpp +++ b/indra/llcommon/tests/llsdserialize_test.cpp @@ -1922,8 +1922,6 @@ namespace tut static void toPythonUsing(const std::string& desc, const FormatterFunction& serialize) { - set_test_name("verify sequence to Python"); - LLSD cdata(llsd::array(17, 3.14, "This string\n" "has several\n" -- cgit v1.2.3 From e8c1a18105bddc29951d4c4b1700dc0af37c83c2 Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 4 May 2023 16:52:35 +0100 Subject: First work on sl-19676 - Stats on updates --- indra/newview/app_settings/settings.xml | 33 +++ indra/newview/llappviewer.cpp | 7 +- indra/newview/llfloater360capture.cpp | 18 +- indra/newview/lltexturefetch.cpp | 5 - indra/newview/llviewermenu.cpp | 143 ++++++----- indra/newview/llviewerobjectlist.cpp | 42 ++-- indra/newview/llviewerregion.cpp | 17 +- indra/newview/llviewerregion.h | 12 +- indra/newview/llviewerstatsrecorder.cpp | 267 +++++++++++++-------- indra/newview/llviewerstatsrecorder.h | 117 +++++---- indra/newview/skins/default/xui/en/menu_viewer.xml | 24 +- 11 files changed, 409 insertions(+), 276 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 9fffab70f4..3d1a384793 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -17085,5 +17085,38 @@ Value 0 + StatsReportMaxDuration + + Comment + Maximum seconds for viewer stats file data, prevents huge file + Persist + 1 + Type + F32 + Value + 300 + + StatsReportFileInterval + + Comment + Interval to save viewer stats file data + Persist + 1 + Type + F32 + Value + 0.2 + + StatsReportSkipZeroDataSaves + + Comment + In viewer stats data file, skip saving entry if there is no data + Persist + 0 + Type + Boolean + Value + 0 + diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 8d77a39c74..9c194562f9 100644 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -1536,7 +1536,12 @@ bool LLAppViewer::doFrame() LLFloaterSimpleOutfitSnapshot::update(); gGLActive = FALSE; } - } + + if (LLViewerStatsRecorder::instanceExists()) + { + LLViewerStatsRecorder::instance().idle(); + } + } } { diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp index 23f86e2361..9c25cdbc7d 100644 --- a/indra/newview/llfloater360capture.cpp +++ b/indra/newview/llfloater360capture.cpp @@ -197,21 +197,18 @@ void LLFloater360Capture::changeInterestListMode(bool send_everything) if (gAgent.requestPostCapability("InterestList", body, [](const LLSD & response) { - LL_INFOS("360Capture") << - "InterestList capability responded: \n" << + LL_DEBUGS("360Capture") << "InterestList capability responded: \n" << ll_pretty_print_sd(response) << LL_ENDL; })) { - LL_INFOS("360Capture") << - "Successfully posted an InterestList capability request with payload: \n" << + LL_DEBUGS("360Capture") << "Successfully posted an InterestList capability request with payload: \n" << ll_pretty_print_sd(body) << LL_ENDL; } else { - LL_INFOS("360Capture") << - "Unable to post an InterestList capability request with payload: \n" << + LL_WARNS("360Capture") << "Unable to post an InterestList capability request with payload: \n" << ll_pretty_print_sd(body) << LL_ENDL; } @@ -632,11 +629,8 @@ void LLFloater360Capture::capture360Images() // display time to encode all 6 images. It tends to be a fairly linear // time for each so we don't need to worry about displaying the time // for each - this gives us plenty to use for optimizing - LL_INFOS("360Capture") << - "Time to encode and save 6 images was " << - encode_time_total << - " seconds" << - LL_ENDL; + LL_INFOS("360Capture") << "Time to encode and save 6 images was " << + encode_time_total << " seconds" << LL_ENDL; // Write the JavaScript file footer (the bottom of the file after the // declarations of the actual data URLs array). The footer comprises of @@ -668,7 +662,7 @@ void LLFloater360Capture::capture360Images() // as a change - only the subsequent 5 are if (camera_changed_times < 5) { - LL_INFOS("360Capture") << "Warning: we only captured " << camera_changed_times << " images." << LL_ENDL; + LL_WARNS("360Capture") << "360 image capture expected 5 or more images, only captured " << camera_changed_times << " images." << LL_ENDL; } // now we have the 6 shots saved in a well specified location, diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index a7dcb1a9bb..b0d6a5d466 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -2258,11 +2258,6 @@ S32 LLTextureFetchWorker::callbackHttpGet(LLCore::HttpResponse * response, mLoaded = TRUE; setPriority(LLWorkerThread::PRIORITY_HIGH | mWorkPriority); - if (LLViewerStatsRecorder::instanceExists()) - { - // Do not create this instance inside thread - LLViewerStatsRecorder::instance().log(0.2f); - } return data_size ; } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 998f5c020e..77cb5f86af 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -119,6 +119,7 @@ #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llviewerstats.h" +#include "llviewerstatsrecorder.h" #include "llvoavatarself.h" #include "llvoicevivox.h" #include "llworldmap.h" @@ -1295,49 +1296,99 @@ class LLAdvancedDumpRegionObjectCache : public view_listener_t } }; -class LLAdvancedInterestListFullUpdate : public view_listener_t +class LLAdvancedToggleInterestList360Mode : public view_listener_t { - bool handleEvent(const LLSD& userdata) - { - LLSD request; - LLSD body; - static bool using_360 = false; - - if (using_360) - { - body["mode"] = LLSD::String("default"); - } - else - { - body["mode"] = LLSD::String("360"); - } - using_360 = !using_360; +public: + bool handleEvent(const LLSD &userdata) + { + LLSD request; + LLSD body; + + // First do a GET to report on current mode and update stats + if (gAgent.requestGetCapability("InterestList", + [](const LLSD &response) { + LL_DEBUGS("360Capture") << "InterestList capability GET responded: \n" + << ll_pretty_print_sd(response) << LL_ENDL; + })) + { + LL_DEBUGS("360Capture") << "Successful GET InterestList capability request with return body: \n" + << ll_pretty_print_sd(body) << LL_ENDL; + } + else + { + LL_WARNS("360Capture") << "Unable to GET InterestList capability request with return body: \n" + << ll_pretty_print_sd(body) << LL_ENDL; + } - if (gAgent.requestPostCapability("InterestList", body, [](const LLSD& response) + // Now do a POST to change the mode + if (sUsing360) { - LL_INFOS("360Capture") << - "InterestList capability responded: \n" << - ll_pretty_print_sd(response) << - LL_ENDL; - })) + body["mode"] = LLSD::String("default"); + } + else { - LL_INFOS("360Capture") << - "Successfully posted an InterestList capability request with payload: \n" << - ll_pretty_print_sd(body) << - LL_ENDL; + body["mode"] = LLSD::String("360"); + } + sUsing360 = !sUsing360; + LL_INFOS("360Capture") << "Setting InterestList capability mode to " << body["mode"].asString() << LL_ENDL; + + if (gAgent.requestPostCapability("InterestList", body, + [](const LLSD &response) { + LL_DEBUGS("360Capture") << "InterestList capability responded: \n" + << ll_pretty_print_sd(response) << LL_ENDL; + })) + { + LL_DEBUGS("360Capture") << "Successfully posted an InterestList capability request with payload: \n" + << ll_pretty_print_sd(body) << LL_ENDL; return true; } else { - LL_INFOS("360Capture") << - "Unable to post an InterestList capability request with payload: \n" << - ll_pretty_print_sd(body) << - LL_ENDL; + LL_DEBUGS("360Capture") << "Unable to post an InterestList capability request with payload: \n" + << ll_pretty_print_sd(body) << LL_ENDL; return false; } + }; + + static bool sUsing360; +}; + +bool LLAdvancedToggleInterestList360Mode::sUsing360 = false; + +class LLAdvancedCheckInterestList360Mode : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + return LLAdvancedToggleInterestList360Mode::sUsing360; } }; +class LLAdvancedToggleStatsRecorder : public view_listener_t +{ + bool handleEvent(const LLSD &userdata) + { + if (LLViewerStatsRecorder::instance().isEnabled()) + { // Turn off both recording and logging + LLViewerStatsRecorder::instance().enableObjectStatsRecording(false); + } + else + { // Turn on both recording and logging + LLViewerStatsRecorder::instance().enableObjectStatsRecording(true, true); + } + return true; + } +}; + +class LLAdvancedCheckStatsRecorder : public view_listener_t +{ + bool handleEvent(const LLSD &userdata) + { // Use the logging state as the indicator of whether the stats recorder is on + return LLViewerStatsRecorder::instance().isLogging(); + } +}; + + + class LLAdvancedBuyCurrencyTest : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -4492,33 +4543,6 @@ void handle_duplicate_in_place(void*) LLSelectMgr::getInstance()->selectDuplicate(offset, TRUE); } -/* dead code 30-apr-2008 -void handle_deed_object_to_group(void*) -{ - LLUUID group_id; - - LLSelectMgr::getInstance()->selectGetGroup(group_id); - LLSelectMgr::getInstance()->sendOwner(LLUUID::null, group_id, FALSE); - LLViewerStats::getInstance()->incStat(LLViewerStats::ST_RELEASE_COUNT); -} - -BOOL enable_deed_object_to_group(void*) -{ - if(LLSelectMgr::getInstance()->getSelection()->isEmpty()) return FALSE; - LLPermissions perm; - LLUUID group_id; - - if (LLSelectMgr::getInstance()->selectGetGroup(group_id) && - gAgent.hasPowerInGroup(group_id, GP_OBJECT_DEED) && - LLSelectMgr::getInstance()->selectGetPermissions(perm) && - perm.deedToGroup(gAgent.getID(), group_id)) - { - return TRUE; - } - return FALSE; -} - -*/ /* @@ -9448,7 +9472,10 @@ void initialize_menus() // Advanced > World view_listener_t::addMenu(new LLAdvancedDumpScriptedCamera(), "Advanced.DumpScriptedCamera"); view_listener_t::addMenu(new LLAdvancedDumpRegionObjectCache(), "Advanced.DumpRegionObjectCache"); - view_listener_t::addMenu(new LLAdvancedInterestListFullUpdate(), "Advanced.InterestListFullUpdate"); + view_listener_t::addMenu(new LLAdvancedToggleInterestList360Mode(), "Advanced.ToggleInterestList360Mode"); + view_listener_t::addMenu(new LLAdvancedCheckInterestList360Mode(), "Advanced.CheckInterestList360Mode"); + view_listener_t::addMenu(new LLAdvancedToggleStatsRecorder(), "Advanced.ToggleStatsRecorder"); + view_listener_t::addMenu(new LLAdvancedCheckStatsRecorder(), "Advanced.CheckStatsRecorder"); // Advanced > UI commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index efc4ded79e..0c9e929cf3 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -369,7 +369,7 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry* if (!objectp) { LL_INFOS() << "createObject failure for object: " << fullid << LL_ENDL; - recorder.objectUpdateFailure(entry->getLocalID(), OUT_FULL_CACHED, 0); + recorder.objectUpdateFailure(0); return NULL; } justCreated = true; @@ -393,7 +393,6 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry* objectp->setLastUpdateType(OUT_FULL_COMPRESSED); //newly cached objectp->setLastUpdateCached(TRUE); } - recorder.log(0.2f); LLVOAvatar::cullAvatarsByPixelArea(); return objectp; @@ -472,18 +471,15 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, for (i = 0; i < num_objects; i++) { - // timer is unused? - LLTimer update_timer; BOOL justCreated = FALSE; S32 msg_size = 0; bool update_cache = false; //update object cache if it is a full-update or terse update if (compressed) { - S32 uncompressed_length = 2048; compressed_dp.reset(); - uncompressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data); + S32 uncompressed_length = mesgsys->getSizeFast(_PREHASH_ObjectData, i, _PREHASH_Data); LL_DEBUGS("ObjectUpdate") << "got binary data from message to compressed_dpbuffer" << LL_ENDL; mesgsys->getBinaryDataFast(_PREHASH_ObjectData, _PREHASH_Data, compressed_dpbuffer, 0, i, 2048); compressed_dp.assignBuffer(compressed_dpbuffer, uncompressed_length); @@ -505,7 +501,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, << " Flags: " << flags << " Region: " << regionp->getName() << " Region id: " << regionp->getRegionID() << LL_ENDL; - recorder.objectUpdateFailure(local_id, update_type, msg_size); + recorder.objectUpdateFailure(msg_size); continue; } else if ((flags & FLAGS_TEMPORARY_ON_REZ) == 0) @@ -616,7 +612,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (update_type == OUT_TERSE_IMPROVED) { // LL_INFOS() << "terse update for an unknown object (compressed):" << fullid << LL_ENDL; - recorder.objectUpdateFailure(local_id, update_type, msg_size); + recorder.objectUpdateFailure(msg_size); continue; } } @@ -625,7 +621,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (update_type != OUT_FULL) { //LL_INFOS() << "terse update for an unknown object:" << fullid << LL_ENDL; - recorder.objectUpdateFailure(local_id, update_type, msg_size); + recorder.objectUpdateFailure(msg_size); continue; } @@ -638,7 +634,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { mNumDeadObjectUpdates++; //LL_INFOS() << "update for a dead object:" << fullid << LL_ENDL; - recorder.objectUpdateFailure(local_id, update_type, msg_size); + recorder.objectUpdateFailure(msg_size); continue; } #endif @@ -651,7 +647,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (!objectp) { LL_INFOS() << "createObject failure for object: " << fullid << LL_ENDL; - recorder.objectUpdateFailure(local_id, update_type, msg_size); + recorder.objectUpdateFailure(msg_size); continue; } @@ -681,11 +677,11 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if(!(flags & FLAGS_TEMPORARY_ON_REZ)) { - bCached = true; + bCached = true; LLViewerRegion::eCacheUpdateResult result = objectp->mRegionp->cacheFullUpdate(objectp, compressed_dp, flags); - recorder.cacheFullUpdate(local_id, update_type, result, objectp, msg_size); + recorder.cacheFullUpdate(result); + } } - } #endif } else @@ -696,12 +692,10 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } processUpdateCore(objectp, user_data, i, update_type, NULL, justCreated); } - recorder.objectUpdateEvent(local_id, update_type, objectp, msg_size); + recorder.objectUpdateEvent(update_type); objectp->setLastUpdateType(update_type); } - recorder.log(0.2f); - LLVOAvatar::cullAvatarsByPixelArea(); } @@ -748,14 +742,14 @@ void LLViewerObjectList::processCachedObjectUpdate(LLMessageSystem *mesgsys, // Lookup data packer and add this id to cache miss lists if necessary. U8 cache_miss_type = LLViewerRegion::CACHE_MISS_TYPE_NONE; - if(!regionp->probeCache(id, crc, flags, cache_miss_type)) - { - // Cache Miss. + if (regionp->probeCache(id, crc, flags, cache_miss_type)) + { // Cache Hit + recorder.cacheHitEvent(); + } + else + { // Cache Miss LL_DEBUGS("ObjectUpdate") << "cache miss for id " << id << " crc " << crc << " miss type " << (S32) cache_miss_type << LL_ENDL; - - recorder.cacheMissEvent(id, update_type, cache_miss_type, msg_size); - - continue; // no data packer, skip this object + recorder.cacheMissEvent(cache_miss_type); } } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index ad7321ca4b..3d1a81694a 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -2618,14 +2618,10 @@ LLVOCacheEntry* LLViewerRegion::getCacheEntry(U32 local_id, bool valid) return NULL; } -void LLViewerRegion::addCacheMiss(U32 id, LLViewerRegion::eCacheMissType miss_type) +void LLViewerRegion::addCacheMiss(U32 id, LLViewerRegion::eCacheMissType cache_miss_type) { mRegionCacheMissCount++; -#if 0 - mCacheMissList.insert(CacheMissItem(id, miss_type)); -#else - mCacheMissList.push_back(CacheMissItem(id, miss_type)); -#endif + mCacheMissList.push_back(CacheMissItem(id, cache_miss_type)); } //check if a non-cacheable object is already created. @@ -2701,10 +2697,10 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss } } else - { + { // Total miss, don't have the object in cache // LL_INFOS() << "Cache miss for " << local_id << LL_ENDL; - addCacheMiss(local_id, CACHE_MISS_TYPE_FULL); - cache_miss_type = CACHE_MISS_TYPE_FULL; + addCacheMiss(local_id, CACHE_MISS_TYPE_TOTAL); + cache_miss_type = CACHE_MISS_TYPE_TOTAL; } return false; @@ -2712,7 +2708,7 @@ bool LLViewerRegion::probeCache(U32 local_id, U32 crc, U32 flags, U8 &cache_miss void LLViewerRegion::addCacheMissFull(const U32 local_id) { - addCacheMiss(local_id, CACHE_MISS_TYPE_FULL); + addCacheMiss(local_id, CACHE_MISS_TYPE_TOTAL); } void LLViewerRegion::requestCacheMisses() @@ -2763,7 +2759,6 @@ void LLViewerRegion::requestCacheMisses() mCacheDirty = TRUE ; // LL_INFOS() << "KILLDEBUG Sent cache miss full " << full_count << " crc " << crc_count << LL_ENDL; LLViewerStatsRecorder::instance().requestCacheMissesEvent(mCacheMissList.size()); - LLViewerStatsRecorder::instance().log(0.2f); mCacheMissList.clear(); } diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 6548e8d372..81371b7f30 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -332,9 +332,9 @@ public: typedef enum { - CACHE_MISS_TYPE_FULL = 0, - CACHE_MISS_TYPE_CRC, - CACHE_MISS_TYPE_NONE + CACHE_MISS_TYPE_TOTAL = 0, // total cache miss - object not in cache + CACHE_MISS_TYPE_CRC, // object in cache, but CRC doesn't match + CACHE_MISS_TYPE_NONE // not a miss: cache hit } eCacheMissType; typedef enum @@ -551,10 +551,10 @@ private: class CacheMissItem { public: - CacheMissItem(U32 id, LLViewerRegion::eCacheMissType miss_type) : mID(id), mType(miss_type){} + CacheMissItem(U32 id, LLViewerRegion::eCacheMissType miss_type) : mID(id), mType(miss_type) {} - U32 mID; //local object id - LLViewerRegion::eCacheMissType mType; //cache miss type + U32 mID; //local object id + LLViewerRegion::eCacheMissType mType; // cache miss type typedef std::list cache_miss_list_t; }; diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index b5ccf4ffa0..64167135ac 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -28,24 +28,25 @@ #include "llviewerstatsrecorder.h" +#include "llcontrol.h" #include "llfile.h" #include "llviewerregion.h" #include "llviewerobject.h" +#include "llworld.h" - -// To do - something using region name or global position -#if LL_WINDOWS - static const std::string STATS_FILE_NAME("C:\\ViewerObjectCacheStats.csv"); -#else - static const std::string STATS_FILE_NAME("/tmp/viewerstats.csv"); -#endif +extern LLControlGroup gSavedSettings; LLViewerStatsRecorder* LLViewerStatsRecorder::sInstance = NULL; LLViewerStatsRecorder::LLViewerStatsRecorder() : - mObjectCacheFile(NULL), + mStatsFile(NULL), mTimer(), - mStartTime(0.0), - mLastSnapshotTime(0.0) + mFileOpenTime(0.0), + mLastSnapshotTime(0.0), + mEnableStatsRecording(false), + mEnableStatsLogging(false), + mInterval(0.2), + mMaxDuration(300.f), + mSkipSaveIfZeros(false) { if (NULL != sInstance) { @@ -57,30 +58,22 @@ LLViewerStatsRecorder::LLViewerStatsRecorder() : LLViewerStatsRecorder::~LLViewerStatsRecorder() { - if (mObjectCacheFile != NULL) + if (mStatsFile) { - // last chance snapshot - writeToLog(0.f); - LLFile::close(mObjectCacheFile); - mObjectCacheFile = NULL; + writeToLog(0.f); // Save last data + closeStatsFile(); } } void LLViewerStatsRecorder::clearStats() { mObjectCacheHitCount = 0; - mObjectCacheHitSize = 0; mObjectCacheMissFullCount = 0; - mObjectCacheMissFullSize = 0; mObjectCacheMissCrcCount = 0; - mObjectCacheMissCrcSize = 0; mObjectFullUpdates = 0; - mObjectFullUpdatesSize = 0; mObjectTerseUpdates = 0; - mObjectTerseUpdatesSize = 0; mObjectCacheMissRequests = 0; mObjectCacheMissResponses = 0; - mObjectCacheMissResponsesSize = 0; mObjectCacheUpdateDupes = 0; mObjectCacheUpdateChanges = 0; mObjectCacheUpdateAdds = 0; @@ -91,45 +84,57 @@ void LLViewerStatsRecorder::clearStats() } -void LLViewerStatsRecorder::recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size) +void LLViewerStatsRecorder::enableObjectStatsRecording(bool enable, bool logging /* false */) +{ + mEnableStatsRecording = enable; + + // if logging is stopping, close the file + if (mStatsFile && !logging) + { + writeToLog(0.f); // Save last data + closeStatsFile(); + } + mEnableStatsLogging = logging; +} + + + +void LLViewerStatsRecorder::recordObjectUpdateFailure(S32 msg_size) { mObjectUpdateFailures++; mObjectUpdateFailuresSize += msg_size; } -void LLViewerStatsRecorder::recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size) +void LLViewerStatsRecorder::recordCacheMissEvent(U8 cache_miss_type) { - if (LLViewerRegion::CACHE_MISS_TYPE_FULL == cache_miss_type) + if (LLViewerRegion::CACHE_MISS_TYPE_TOTAL == cache_miss_type) { mObjectCacheMissFullCount++; - mObjectCacheMissFullSize += msg_size; } else { mObjectCacheMissCrcCount++; - mObjectCacheMissCrcSize += msg_size; } } -void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size) + +void LLViewerStatsRecorder::recordCacheHitEvent() +{ + mObjectCacheHitCount++; +} + +void LLViewerStatsRecorder::recordObjectUpdateEvent(const EObjectUpdateType update_type) { - switch (update_type) + switch (update_type) { case OUT_FULL: mObjectFullUpdates++; - mObjectFullUpdatesSize += msg_size; break; case OUT_TERSE_IMPROVED: mObjectTerseUpdates++; - mObjectTerseUpdatesSize += msg_size; break; case OUT_FULL_COMPRESSED: mObjectCacheMissResponses++; - mObjectCacheMissResponsesSize += msg_size; - break; - case OUT_FULL_CACHED: - mObjectCacheHitCount++; - mObjectCacheHitSize += msg_size; break; default: LL_WARNS() << "Unknown update_type" << LL_ENDL; @@ -137,9 +142,9 @@ void LLViewerStatsRecorder::recordObjectUpdateEvent(U32 local_id, const EObjectU }; } -void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size) +void LLViewerStatsRecorder::recordCacheFullUpdate(LLViewerRegion::eCacheUpdateResult update_result) { - switch (update_result) + switch (update_result) { case LLViewerRegion::CACHE_UPDATE_DUPE: mObjectCacheUpdateDupes++; @@ -154,7 +159,7 @@ void LLViewerStatsRecorder::recordCacheFullUpdate(U32 local_id, const EObjectUpd mObjectCacheUpdateReplacements++; break; default: - LL_WARNS() << "Unknown update_result type" << LL_ENDL; + LL_WARNS() << "Unknown update_result type " << (S32) update_result << LL_ENDL; break; }; } @@ -166,14 +171,30 @@ void LLViewerStatsRecorder::recordRequestCacheMissesEvent(S32 count) void LLViewerStatsRecorder::writeToLog( F32 interval ) { + if (!mEnableStatsLogging || !mEnableStatsRecording) + { + return; + } + size_t data_size = 0; - F64 delta_time = LLTimer::getTotalSeconds() - mLastSnapshotTime; - S32 total_objects = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures; + F64 delta_time = LLFrameTimer::getTotalSeconds() - mLastSnapshotTime; + if (delta_time < interval) + return; - if ( delta_time < interval || total_objects == 0) return; + if (mSkipSaveIfZeros) + { + S32 total_events = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures; + if (total_events == 0) + { + LL_DEBUGS("ILXZeroData") << "ILX: not saving zero data" << LL_ENDL; + return; + } + } - mLastSnapshotTime = LLTimer::getTotalSeconds(); - LL_DEBUGS() << "ILX: " + mLastSnapshotTime = LLFrameTimer::getTotalSeconds(); + LL_DEBUGS("ILX") << "ILX: " << mObjectCacheHitCount << " hits, " << mObjectCacheMissFullCount << " full misses, " << mObjectCacheMissCrcCount << " crc misses, " @@ -188,84 +209,124 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << mObjectUpdateFailures << " update failures" << LL_ENDL; - if (mObjectCacheFile == NULL) + if (mStatsFile == NULL) { - mStartTime = LLTimer::getTotalSeconds(); - mObjectCacheFile = LLFile::fopen(STATS_FILE_NAME, "wb"); - if (mObjectCacheFile) - { // Write column headers - std::ostringstream data_msg; - data_msg << "EventTime(ms)\t" - << "Cache Hits\t" - << "Cache Full Misses\t" - << "Cache Crc Misses\t" - << "Full Updates\t" - << "Terse Updates\t" - << "Cache Miss Requests\t" - << "Cache Miss Responses\t" - << "Cache Update Dupes\t" - << "Cache Update Changes\t" - << "Cache Update Adds\t" - << "Cache Update Replacements\t" - << "Update Failures\t" - << "Cache Hits bps\t" - << "Cache Full Misses bps\t" - << "Cache Crc Misses bps\t" - << "Full Updates bps\t" - << "Terse Updates bps\t" - << "Cache Miss Responses bps\t" - << "Texture Fetch bps\t" - << "\n"; - - data_size = data_msg.str().size(); - if (fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile ) != data_size) + // Refresh settings + mInterval = gSavedSettings.getF32("StatsReportFileInterval"); + mSkipSaveIfZeros = gSavedSettings.getBOOL("StatsReportSkipZeroDataSaves"); + mMaxDuration = gSavedSettings.getF32("StatsReportMaxDuration"); + + // Open the data file + makeStatsFileName(); + mStatsFile = LLFile::fopen(mStatsFileName, "wb"); + + if (mStatsFile) + { + LL_INFOS("ILX") << "ILX: Writing update information to " << mStatsFileName << LL_ENDL; + + mFileOpenTime = LLFrameTimer::getTotalSeconds(); + + // Write column headers + std::ostringstream col_headers; + col_headers << "Time (sec)," + << "Regions," + << "Active Cached Objects," + << "Cache Hits," + << "Cache Full Misses," + << "Cache Crc Misses," + << "Full Updates," + << "Terse Updates," + << "Cache Miss Requests," + << "Cache Miss Responses," + << "Cache Update Dupes," + << "Cache Update Changes," + << "Cache Update Adds," + << "Cache Update Replacements," + << "Update Failures," + << "Texture Fetch bps," + << "\n"; + + data_size = col_headers.str().size(); + if (fwrite(col_headers.str().c_str(), 1, data_size, mStatsFile ) != data_size) { - LL_WARNS() << "failed to write full headers to " << STATS_FILE_NAME << LL_ENDL; + LL_WARNS() << "failed to write full headers to " << mStatsFileName << LL_ENDL; } } else - { - //LL_WARNS() << "Couldn't open " << STATS_FILE_NAME << " for logging." << LL_ENDL; + { // Failed to open file + LL_WARNS() << "Couldn't open " << mStatsFileName << " for logging, turning off stats recording." << LL_ENDL; + mEnableStatsLogging = false; return; } } - std::ostringstream data_msg; - - data_msg << getTimeSinceStart() - << "\t " << mObjectCacheHitCount - << "\t" << mObjectCacheMissFullCount - << "\t" << mObjectCacheMissCrcCount - << "\t" << mObjectFullUpdates - << "\t" << mObjectTerseUpdates - << "\t" << mObjectCacheMissRequests - << "\t" << mObjectCacheMissResponses - << "\t" << mObjectCacheUpdateDupes - << "\t" << mObjectCacheUpdateChanges - << "\t" << mObjectCacheUpdateAdds - << "\t" << mObjectCacheUpdateReplacements - << "\t" << mObjectUpdateFailures - << "\t" << (mObjectCacheHitSize * 8 / delta_time) - << "\t" << (mObjectCacheMissFullSize * 8 / delta_time) - << "\t" << (mObjectCacheMissCrcSize * 8 / delta_time) - << "\t" << (mObjectFullUpdatesSize * 8 / delta_time) - << "\t" << (mObjectTerseUpdatesSize * 8 / delta_time) - << "\t" << (mObjectCacheMissResponsesSize * 8 / delta_time) - << "\t" << (mTextureFetchSize * 8 / delta_time) + std::ostringstream stats_data; + + stats_data << getTimeSinceStart() + << "," << LLWorld::getInstance()->getRegionList().size() + << "," << LLWorld::getInstance()->getNumOfActiveCachedObjects() + << "," << mObjectCacheHitCount + << "," << mObjectCacheMissFullCount + << "," << mObjectCacheMissCrcCount + << "," << mObjectFullUpdates + << "," << mObjectTerseUpdates + << "," << mObjectCacheMissRequests + << "," << mObjectCacheMissResponses + << "," << mObjectCacheUpdateDupes + << "," << mObjectCacheUpdateChanges + << "," << mObjectCacheUpdateAdds + << "," << mObjectCacheUpdateReplacements + << "," << mObjectUpdateFailures + << "," << (mTextureFetchSize * 8 / delta_time) << "\n"; - data_size = data_msg.str().size(); - if ( data_size != fwrite(data_msg.str().c_str(), 1, data_size, mObjectCacheFile )) + data_size = stats_data.str().size(); + if ( data_size != fwrite(stats_data.str().c_str(), 1, data_size, mStatsFile )) { - LL_WARNS() << "Unable to write complete column data to " << STATS_FILE_NAME << LL_ENDL; - } + LL_WARNS() << "Unable to write complete column data to " << mStatsFileName << LL_ENDL; + closeStatsFile(); + } clearStats(); + + if (getTimeSinceStart() >= mMaxDuration) + { // If file recording has been running for too long, stop it. + closeStatsFile(); + } +} + +void LLViewerStatsRecorder::closeStatsFile() +{ + if (mStatsFile) + { + LL_INFOS("ILX") << "ILX: Stopped writing update information to " << mStatsFileName << " after " << getTimeSinceStart() + << " seconds." << LL_ENDL; + LLFile::close(mStatsFile); + mStatsFile = NULL; + } + mEnableStatsLogging = false; +} + +void LLViewerStatsRecorder::makeStatsFileName() +{ + // Create filename - tbd: use pid? +#if LL_WINDOWS + std::string stats_file_name("SLViewerStats-"); +#else + std::string stats_file_name("slviewerstats-"); +#endif + + F64 now = LLFrameTimer::getTotalSeconds(); + std::string date_str = LLDate(now).asString(); + std::replace(date_str.begin(), date_str.end(), ':', '-'); // Make it valid for a filename + stats_file_name.append(date_str); + stats_file_name.append(".csv"); + mStatsFileName = gDirUtilp->getExpandedFilename(LL_PATH_LOGS, stats_file_name); } F32 LLViewerStatsRecorder::getTimeSinceStart() { - return (F32) (LLTimer::getTotalSeconds() - mStartTime); + return (F32) (LLFrameTimer::getTotalSeconds() - mFileOpenTime); } void LLViewerStatsRecorder::recordTextureFetch( S32 msg_size ) diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h index c974bea49d..90f8ca8742 100644 --- a/indra/newview/llviewerstatsrecorder.h +++ b/indra/newview/llviewerstatsrecorder.h @@ -31,10 +31,6 @@ // This is a diagnostic class used to record information from the viewer // for analysis. -// This is normally 0. Set to 1 to enable viewer stats recording -#define LL_RECORD_VIEWER_STATS 0 - - #include "llframetimer.h" #include "llviewerobject.h" #include "llviewerregion.h" @@ -49,86 +45,111 @@ class LLViewerStatsRecorder : public LLSingleton ~LLViewerStatsRecorder(); public: - void objectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size) - { -#if LL_RECORD_VIEWER_STATS - recordObjectUpdateFailure(local_id, update_type, msg_size); -#endif + // Enable/disable stats recording. This is broken down into two + // flags so we can record stats without writing them to the log + // file. This is useful to analyzing updates for scene loading. + void enableObjectStatsRecording(bool enable, bool logging = false); + + bool isEnabled() const { return mEnableStatsRecording; } + bool isLogging() const { return mEnableStatsLogging; } + + void objectUpdateFailure(S32 msg_size) + { + if (mEnableStatsRecording) + { + recordObjectUpdateFailure(msg_size); + } } - void cacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size) + void cacheMissEvent(U8 cache_miss_type) { -#if LL_RECORD_VIEWER_STATS - recordCacheMissEvent(local_id, update_type, cache_miss_type, msg_size); -#endif + if (mEnableStatsRecording) + { + recordCacheMissEvent(cache_miss_type); + } + } + + void cacheHitEvent() + { + if (mEnableStatsRecording) + { + recordCacheHitEvent(); + } + } + + void objectUpdateEvent(const EObjectUpdateType update_type) + { + if (mEnableStatsRecording) + { + recordObjectUpdateEvent(update_type); + } } - void objectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size) - { -#if LL_RECORD_VIEWER_STATS - recordObjectUpdateEvent(local_id, update_type, objectp, msg_size); -#endif - } - - void cacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size) - { -#if LL_RECORD_VIEWER_STATS - recordCacheFullUpdate(local_id, update_type, update_result, objectp, msg_size); -#endif + void cacheFullUpdate(LLViewerRegion::eCacheUpdateResult update_result) + { + if (mEnableStatsRecording) + { + recordCacheFullUpdate(update_result); + } } void requestCacheMissesEvent(S32 count) { -#if LL_RECORD_VIEWER_STATS - recordRequestCacheMissesEvent(count); -#endif + if (mEnableStatsRecording) + { + recordRequestCacheMissesEvent(count); + } } void textureFetch(S32 msg_size) { -#if LL_RECORD_VIEWER_STATS - recordTextureFetch(msg_size); -#endif + if (mEnableStatsRecording) + { + recordTextureFetch(msg_size); + } } - void log(F32 interval) + void idle() { -#if LL_RECORD_VIEWER_STATS - writeToLog(interval); -#endif + writeToLog(mInterval); } F32 getTimeSinceStart(); private: - void recordObjectUpdateFailure(U32 local_id, const EObjectUpdateType update_type, S32 msg_size); - void recordCacheMissEvent(U32 local_id, const EObjectUpdateType update_type, U8 cache_miss_type, S32 msg_size); - void recordObjectUpdateEvent(U32 local_id, const EObjectUpdateType update_type, LLViewerObject * objectp, S32 msg_size); - void recordCacheFullUpdate(U32 local_id, const EObjectUpdateType update_type, LLViewerRegion::eCacheUpdateResult update_result, LLViewerObject* objectp, S32 msg_size); + void recordObjectUpdateFailure(S32 msg_size); + void recordCacheMissEvent(U8 cache_miss_type); + void recordCacheHitEvent(); + void recordObjectUpdateEvent(const EObjectUpdateType update_type); + void recordCacheFullUpdate(LLViewerRegion::eCacheUpdateResult update_result); void recordRequestCacheMissesEvent(S32 count); void recordTextureFetch(S32 msg_size); void writeToLog(F32 interval); + void closeStatsFile(); + void makeStatsFileName(); static LLViewerStatsRecorder* sInstance; - LLFILE * mObjectCacheFile; // File to write data into + LLFILE * mStatsFile; // File to write data into + std::string mStatsFileName; + LLFrameTimer mTimer; - F64 mStartTime; + F64 mFileOpenTime; F64 mLastSnapshotTime; + F32 mInterval; // Interval between data log writes + F32 mMaxDuration; // Time limit on file + + bool mEnableStatsRecording; // Set to true to enable recording stats data + bool mEnableStatsLogging; // Set true to write stats to log file + bool mSkipSaveIfZeros; // Set true to skip saving stats if all values are zero S32 mObjectCacheHitCount; - S32 mObjectCacheHitSize; S32 mObjectCacheMissFullCount; - S32 mObjectCacheMissFullSize; S32 mObjectCacheMissCrcCount; - S32 mObjectCacheMissCrcSize; S32 mObjectFullUpdates; - S32 mObjectFullUpdatesSize; S32 mObjectTerseUpdates; - S32 mObjectTerseUpdatesSize; S32 mObjectCacheMissRequests; S32 mObjectCacheMissResponses; - S32 mObjectCacheMissResponsesSize; S32 mObjectCacheUpdateDupes; S32 mObjectCacheUpdateChanges; S32 mObjectCacheUpdateAdds; @@ -137,9 +158,7 @@ private: S32 mObjectUpdateFailuresSize; S32 mTextureFetchSize; - void clearStats(); }; #endif // LLVIEWERSTATSRECORDER_H - diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index f72d1f0bf9..d78ebf17e3 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3463,14 +3463,24 @@ function="World.EnvPreset" - - - - + + + + + + + Date: Thu, 4 May 2023 19:19:32 +0300 Subject: SL-19683 Add menu items should be disabled for some folders in single-folder view --- indra/newview/llpanelmaininventory.cpp | 50 ++++++++++++++++++++++++++++++++++ indra/newview/llpanelmaininventory.h | 1 + 2 files changed, 51 insertions(+) (limited to 'indra') diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 3110adff15..b0422b7bd9 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -1494,6 +1494,7 @@ void LLPanelMainInventory::onAddButtonClick() LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get(); if (menu) { + disableAddIfNeeded(); menu->getChild("New Folder")->setEnabled(!isRecentItemsPanelSelected()); setUploadCostIfNeeded(); @@ -2199,6 +2200,55 @@ void LLPanelMainInventory::setUploadCostIfNeeded() } } +bool is_add_allowed(LLUUID folder_id) +{ + if(!gInventory.isObjectDescendentOf(folder_id, gInventory.getRootFolderID())) + { + return false; + } + + std::vector not_allowed_types; + not_allowed_types.push_back(LLFolderType::FT_LOST_AND_FOUND); + not_allowed_types.push_back(LLFolderType::FT_FAVORITE); + not_allowed_types.push_back(LLFolderType::FT_MARKETPLACE_LISTINGS); + not_allowed_types.push_back(LLFolderType::FT_TRASH); + not_allowed_types.push_back(LLFolderType::FT_CURRENT_OUTFIT); + not_allowed_types.push_back(LLFolderType::FT_INBOX); + + for (std::vector::const_iterator it = not_allowed_types.begin(); + it != not_allowed_types.end(); ++it) + { + if(gInventory.isObjectDescendentOf(folder_id, gInventory.findCategoryUUIDForType(*it))) + { + return false; + } + } + + LLViewerInventoryCategory* cat = gInventory.getCategory(folder_id); + if (cat && (cat->getPreferredType() == LLFolderType::FT_OUTFIT)) + { + return false; + } + return true; +} + +void LLPanelMainInventory::disableAddIfNeeded() +{ + LLMenuGL* menu = (LLMenuGL*)mMenuAddHandle.get(); + if (menu) + { + bool enable = !mSingleFolderMode || is_add_allowed(getCurrentSFVRoot()); + + menu->getChild("New Folder")->setEnabled(enable); + menu->getChild("New Script")->setEnabled(enable); + menu->getChild("New Note")->setEnabled(enable); + menu->getChild("New Gesture")->setEnabled(enable); + menu->setItemEnabled("New Clothes", enable); + menu->setItemEnabled("New Body Parts", enable); + menu->setItemEnabled("New Settings", enable); + } +} + bool LLPanelMainInventory::hasSettingsInventory() { return LLEnvironment::instance().isInventoryEnabled(); diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 4f792878a5..21e08bbac8 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -222,6 +222,7 @@ protected: * Set upload cost in "Upload" sub menu. */ void setUploadCostIfNeeded(); + void disableAddIfNeeded(); private: LLToggleableMenu* mMenuGearDefault; LLToggleableMenu* mMenuViewDefault; -- cgit v1.2.3 From 98681ef73ff33e0c0ff321e839a8e79b2cb334de Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 5 May 2023 15:56:21 +0300 Subject: SL-19533 Prevent COF dupplicate request --- indra/newview/llappearancemgr.cpp | 20 +++++++++++++++----- indra/newview/llinventorymodel.cpp | 13 +++++++++++-- indra/newview/llstartup.cpp | 14 +++++++++++++- 3 files changed, 39 insertions(+), 8 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 4133470973..454ac5d88c 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -4565,10 +4565,14 @@ void callAfterCOFFetch(nullary_func_t cb) { LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); - if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN && AISAPI::isAvailable()) + if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) { - // Assume that we have no relevant cache. Fetch cof, and items cof's links point to. - AISAPI::FetchCOF([cb](const LLUUID& id) + if (AISAPI::isAvailable()) + { + // Mark cof (update timer) so that background fetch won't request it + cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); + // Assume that we have no relevant cache. Fetch cof, and items cof's links point to. + AISAPI::FetchCOF([cb](const LLUUID& id) { cb(); LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); @@ -4578,8 +4582,14 @@ void callAfterCOFFetch(nullary_func_t cb) cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); } }); - // Mark it so that background fetch won't request it if it didn't already - cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); + } + else + { + LL_WARNS() << "AIS API v3 not available, can't use AISAPI::FetchCOF" << LL_ENDL; + // startup should have marked folder as fetching, remove that + cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); + callAfterCategoryFetch(cat_id, cb); + } } else { diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 48539f4748..c65901a754 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -853,8 +853,17 @@ void LLInventoryModel::ensureCategoryForTypeExists(LLFolderType::EType preferred LLStringUtil::null, [preferred_type](const LLUUID &new_cat_id) { - LL_DEBUGS("Inventory") << "Created category: " << new_cat_id - << " for type: " << preferred_type << LL_ENDL; + if (new_cat_id.isNull()) + { + LL_WARNS("Inventory") + << "Failed to create folder of type " << preferred_type + << LL_ENDL; + } + else + { + LL_DEBUGS("Inventory") << "Created category: " << new_cat_id + << " for type: " << preferred_type << LL_ENDL; + } } ); } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 5d1df21c9b..10ddd59f34 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -1900,9 +1900,21 @@ bool idle_startup() LLNotificationsUtil::add("InventoryUnusable"); } - LLInventoryModelBackgroundFetch::instance().start(); gInventory.createCommonSystemCategories(); + LLInventoryModelBackgroundFetch::instance().start(); + LLUUID cof_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); + LLViewerInventoryCategory* cof = gInventory.getCategory(cof_id); + if (cof + && cof->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) + { + // Special case, dupplicate request prevention. + // Cof folder will be requested via FetchCOF + // in appearance manager, prevent recursive fetch + cof->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); + } + + // It's debatable whether this flag is a good idea - sets all // bits, and in general it isn't true that inventory // initialization generates all types of changes. Maybe add an -- cgit v1.2.3 From 61818417d619c8d17cf861f0d72b314a14269e2f Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 5 May 2023 18:17:00 +0300 Subject: SL-19641 FIXED Gallery item is not selected after using 'Find original' --- indra/newview/llinventorygallery.cpp | 5 +++ indra/newview/llinventorygallery.h | 1 + indra/newview/llpanelmaininventory.cpp | 70 +++++++++++++++++++++++++++++++--- indra/newview/llpanelmaininventory.h | 7 +++- 4 files changed, 76 insertions(+), 7 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index a078d6c81d..37801c8dd5 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -882,6 +882,11 @@ void LLInventoryGallery::scrollToShowItem(const LLUUID& item_id) } } +LLInventoryGalleryItem* LLInventoryGallery::getSelectedItem() +{ + return mItemMap[mSelectedItemID]; +} + void LLInventoryGallery::updateMessageVisibility() { diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index 2cf038b7d8..dfb7be6a86 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -129,6 +129,7 @@ public: bool hasVisibleItems(); void handleModifiedFilter(); LLScrollContainer* getScrollableContainer() { return mScrollPanel; } + LLInventoryGalleryItem* getSelectedItem(); protected: diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index b0422b7bd9..2f6276ff77 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -122,7 +122,9 @@ LLPanelMainInventory::LLPanelMainInventory(const LLPanel::Params& p) mViewMode(MODE_COMBINATION), mCombinationShapeDirty(true), mListViewRootUpdatedConnection(), - mGalleryRootUpdatedConnection() + mGalleryRootUpdatedConnection(), + mDelayedCombGalleryScroll(false), + mDelayedCombInvPanelScroll(false) { // Menu Callbacks (non contex menus) mCommitCallbackRegistrar.add("Inventory.DoToSelected", boost::bind(&LLPanelMainInventory::doToSelected, this, _2)); @@ -466,7 +468,7 @@ void LLPanelMainInventory::newFolderWindow(LLUUID folder_id, LLUUID item_to_sele main_inventory->setFocus(true); if(item_to_select.notNull()) { - sidepanel_inventory->getActivePanel()->setSelection(item_to_select, TAKE_FOCUS_YES); + main_inventory->setGallerySelection(item_to_select); } return; } @@ -491,7 +493,7 @@ void LLPanelMainInventory::newFolderWindow(LLUUID folder_id, LLUUID item_to_sele main_inventory->setSingleFolderViewRoot(folder_id); if(item_to_select.notNull()) { - sidepanel_inventory->getActivePanel()->setSelection(item_to_select, TAKE_FOCUS_YES); + main_inventory->setGallerySelection(item_to_select, true); } } } @@ -2345,6 +2347,15 @@ void LLPanelMainInventory::updateCombinationVisibility() mCombinationScroller->reshape(desired_width, inv_rect.getHeight() + galery_rect.getHeight(), true); mCombinationGalleryPanel->setShape(galery_rect, false); mCombinationInventoryPanel->setShape(inv_rect, false); + + if(mDelayedCombGalleryScroll) + { + scrollToGallerySelection(); + } + else if(mDelayedCombInvPanelScroll) + { + scrollToInvPanelSelection(); + } } } @@ -2478,7 +2489,7 @@ LLInventoryFilter& LLPanelMainInventory::getCurrentFilter() } } -void LLPanelMainInventory::setGallerySelection(const LLUUID& item_id) +void LLPanelMainInventory::setGallerySelection(const LLUUID& item_id, bool new_window) { if(mSingleFolderMode && isGalleryViewMode()) { @@ -2488,13 +2499,60 @@ void LLPanelMainInventory::setGallerySelection(const LLUUID& item_id) { if(mCombinationGalleryPanel->getFilter().checkAgainstFilterThumbnails(item_id)) { - mCombinationGalleryPanel->changeItemSelection(item_id, true); + mCombinationGalleryPanel->changeItemSelection(item_id, false); + if(new_window) + { + mDelayedCombGalleryScroll = new_window; + } + else + { + scrollToGallerySelection(); + } } else { - mCombinationInventoryPanel->setSelection(item_id, false); + mCombinationInventoryPanel->setSelection(item_id, true); + if(new_window) + { + mDelayedCombInvPanelScroll = new_window; + } + else + { + scrollToInvPanelSelection(); + } } } + else if (mSingleFolderMode && isListViewMode()) + { + mSingleFolderPanelInventory->setSelection(item_id, true); + } +} + +void LLPanelMainInventory::scrollToGallerySelection() +{ + LLInventoryGalleryItem* item = mCombinationGalleryPanel->getSelectedItem(); + LLScrollContainer* scroll_panel = getChild("combination_view_inventory"); + + if(item) + { + LLRect item_rect; + item->localRectToOtherView(item->getLocalRect(), &item_rect, mCombinationScroller); + scroll_panel->scrollToShowRect(item_rect); + } } + +void LLPanelMainInventory::scrollToInvPanelSelection() +{ + LLFolderViewItem* item = mCombinationInventoryPanel->getRootFolder()->getCurSelectedItem(); + LLScrollContainer* scroll_panel = getChild("combination_view_inventory"); + + if(item) + { + LLRect item_rect; + item->localRectToOtherView(item->getLocalRect(), &item_rect, mCombinationScroller); + scroll_panel->scrollToShowRect(item_rect); + } +} + // List Commands // //////////////////////////////////////////////////////////////////////////////// diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 21e08bbac8..44beba6b4f 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -120,10 +120,13 @@ public: void onBackFolderClicked(); void onForwardFolderClicked(); void setSingleFolderViewRoot(const LLUUID& folder_id, bool clear_nav_history = true); - void setGallerySelection(const LLUUID& item_id); + void setGallerySelection(const LLUUID& item_id, bool new_window = false); LLUUID getSingleFolderViewRoot(); bool isSingleFolderMode() { return mSingleFolderMode; } + void scrollToGallerySelection(); + void scrollToInvPanelSelection(); + void setViewMode(EViewModeType mode); bool isListViewMode() { return (mViewMode == MODE_LIST); } bool isGalleryViewMode() { return (mViewMode == MODE_GALLERY); } @@ -236,6 +239,8 @@ private: bool mForceShowInvLayout; bool mCombinationShapeDirty; + bool mDelayedCombGalleryScroll; + bool mDelayedCombInvPanelScroll; // List Commands // //////////////////////////////////////////////////////////////////////////////// }; -- cgit v1.2.3 From 03ed823e5993acf874289e6439e6df31732e4743 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Sat, 6 May 2023 02:33:39 +0300 Subject: SL-19688 Fix combined view not updating on thumbnail change --- indra/newview/llpanelmaininventory.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra') diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 2f6276ff77..c57ff26b91 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -916,6 +916,7 @@ void LLPanelMainInventory::changed(U32 mask) || (mask & LLInventoryObserver::STRUCTURE) || (mask & LLInventoryObserver::REMOVE) || (mask & LLInventoryObserver::ADD) + || (mask & LLInventoryObserver::INTERNAL) // Thumbnail || (mask & LLInventoryObserver::LABEL)) { // todo: can be limited to just observed folder -- cgit v1.2.3 From eaf95d084a585c8a0a9ac086679487fa40e1db71 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Sat, 6 May 2023 03:17:45 +0300 Subject: SL-19689 In combination view 'raname' field doesn't update position properly --- indra/llui/llfolderview.h | 2 +- indra/newview/llpanelmaininventory.cpp | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index f19df1d0dc..22b8c475ec 100644 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -255,13 +255,13 @@ public: virtual void updateMenu(); void finishRenamingItem( void ); + void updateRenamerPosition(); // Note: We may eventually have to move that method up the hierarchy to LLFolderViewItem. LLHandle getHandle() const { return getDerivedHandle(); } private: void updateMenuOptions(LLMenuGL* menu); - void updateRenamerPosition(); protected: LLScrollContainer* mScrollContainer; // NULL if this is not a child of a scroll container. diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index c57ff26b91..06b71d0f7a 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -2357,6 +2357,12 @@ void LLPanelMainInventory::updateCombinationVisibility() { scrollToInvPanelSelection(); } + + LLFolderView* root_folder = mCombinationInventoryPanel->getRootFolder(); + if (root_folder) + { + root_folder->updateRenamerPosition(); + } } } -- cgit v1.2.3 From 90631fccef6ab1596655b18fb7dbdc87a4cb80ac Mon Sep 17 00:00:00 2001 From: simon Date: Tue, 9 May 2023 17:16:26 +0100 Subject: SL-19676 - more update and scene loading stats. Added texture and mesh count --- indra/newview/llmeshrepository.cpp | 3 +++ indra/newview/lltexturefetch.cpp | 8 +++++++- indra/newview/llviewerstatsrecorder.cpp | 19 +++++++++++++------ indra/newview/llviewerstatsrecorder.h | 18 ++++++++++++++---- 4 files changed, 37 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/newview/llmeshrepository.cpp b/indra/newview/llmeshrepository.cpp index f937754368..e2fb218b1b 100644 --- a/indra/newview/llmeshrepository.cpp +++ b/indra/newview/llmeshrepository.cpp @@ -56,6 +56,7 @@ #include "llviewermessage.h" #include "llviewerobjectlist.h" #include "llviewerregion.h" +#include "llviewerstatsrecorder.h" #include "llviewertexturelist.h" #include "llvolume.h" #include "llvolumemgr.h" @@ -4089,6 +4090,8 @@ void LLMeshRepository::notifyMeshLoaded(const LLVolumeParams& mesh_params, LLVol } mLoadingMeshes[detail].erase(obj_iter); + + LLViewerStatsRecorder::instance().meshLoaded(); } } diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp index b0d6a5d466..eea56af0ae 100644 --- a/indra/newview/lltexturefetch.cpp +++ b/indra/newview/lltexturefetch.cpp @@ -2183,7 +2183,6 @@ S32 LLTextureFetchWorker::callbackHttpGet(LLCore::HttpResponse * response, LL_DEBUGS(LOG_TXT) << "HTTP RECEIVED: " << mID.asString() << " Bytes: " << data_size << LL_ENDL; if (data_size > 0) { - LLViewerStatsRecorder::instance().textureFetch(data_size); // *TODO: set the formatted image data here directly to avoid the copy // Hold on to body for later copy @@ -2249,6 +2248,13 @@ S32 LLTextureFetchWorker::callbackHttpGet(LLCore::HttpResponse * response, mHaveAllData = TRUE; } mRequestedSize = data_size; + + if (mHaveAllData) + { + LLViewerStatsRecorder::instance().textureFetch(); + } + + // *TODO: set the formatted image data here directly to avoid the copy } else { diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index 64167135ac..f95a960186 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -80,7 +80,8 @@ void LLViewerStatsRecorder::clearStats() mObjectCacheUpdateReplacements = 0; mObjectUpdateFailures = 0; mObjectUpdateFailuresSize = 0; - mTextureFetchSize = 0; + mTextureFetchCount = 0; + mMeshLoadedCount = 0; } @@ -243,8 +244,9 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "Cache Update Adds," << "Cache Update Replacements," << "Update Failures," - << "Texture Fetch bps," - << "\n"; + << "Texture Count," + << "Mesh Load Count," + << "\n"; data_size = col_headers.str().size(); if (fwrite(col_headers.str().c_str(), 1, data_size, mStatsFile ) != data_size) @@ -277,7 +279,8 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "," << mObjectCacheUpdateAdds << "," << mObjectCacheUpdateReplacements << "," << mObjectUpdateFailures - << "," << (mTextureFetchSize * 8 / delta_time) + << "," << mTextureFetchCount + << "," << mMeshLoadedCount << "\n"; data_size = stats_data.str().size(); @@ -329,10 +332,14 @@ F32 LLViewerStatsRecorder::getTimeSinceStart() return (F32) (LLFrameTimer::getTotalSeconds() - mFileOpenTime); } -void LLViewerStatsRecorder::recordTextureFetch( S32 msg_size ) +void LLViewerStatsRecorder::recordTextureFetch() { - mTextureFetchSize += msg_size; + mTextureFetchCount += 1; } +void LLViewerStatsRecorder::recordMeshLoaded() +{ + mMeshLoadedCount += 1; +} diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h index 90f8ca8742..37c08a51cf 100644 --- a/indra/newview/llviewerstatsrecorder.h +++ b/indra/newview/llviewerstatsrecorder.h @@ -101,14 +101,22 @@ class LLViewerStatsRecorder : public LLSingleton } } - void textureFetch(S32 msg_size) + void textureFetch() { if (mEnableStatsRecording) { - recordTextureFetch(msg_size); + recordTextureFetch(); } } + void meshLoaded() + { + if (mEnableStatsRecording) + { + recordMeshLoaded(); + } + } + void idle() { writeToLog(mInterval); @@ -123,7 +131,8 @@ private: void recordObjectUpdateEvent(const EObjectUpdateType update_type); void recordCacheFullUpdate(LLViewerRegion::eCacheUpdateResult update_result); void recordRequestCacheMissesEvent(S32 count); - void recordTextureFetch(S32 msg_size); + void recordTextureFetch(); + void recordMeshLoaded(); void writeToLog(F32 interval); void closeStatsFile(); void makeStatsFileName(); @@ -156,7 +165,8 @@ private: S32 mObjectCacheUpdateReplacements; S32 mObjectUpdateFailures; S32 mObjectUpdateFailuresSize; - S32 mTextureFetchSize; + S32 mTextureFetchCount; + S32 mMeshLoadedCount; void clearStats(); }; -- cgit v1.2.3 From 06f63d9b871458f71340ba7d0126bf964d17048f Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 10 May 2023 12:02:09 +0300 Subject: SL-19683 'New folder' menu item should be disable for the listed folders in sfv --- indra/newview/llpanelmaininventory.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 06b71d0f7a..4577c1defa 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -1498,7 +1498,6 @@ void LLPanelMainInventory::onAddButtonClick() if (menu) { disableAddIfNeeded(); - menu->getChild("New Folder")->setEnabled(!isRecentItemsPanelSelected()); setUploadCostIfNeeded(); @@ -2242,7 +2241,7 @@ void LLPanelMainInventory::disableAddIfNeeded() { bool enable = !mSingleFolderMode || is_add_allowed(getCurrentSFVRoot()); - menu->getChild("New Folder")->setEnabled(enable); + menu->getChild("New Folder")->setEnabled(enable && !isRecentItemsPanelSelected()); menu->getChild("New Script")->setEnabled(enable); menu->getChild("New Note")->setEnabled(enable); menu->getChild("New Gesture")->setEnabled(enable); -- cgit v1.2.3 From 8a1cb8c00cf75ff1e09c72c2fb487728ec77c66b Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 10 May 2023 12:51:08 +0300 Subject: SL-19697 FIXED Clicking on inventory item in list view does not unselect item in gallery view --- indra/newview/llinventorygallery.cpp | 8 ++++++++ indra/newview/llinventorygallery.h | 1 + indra/newview/llpanelmaininventory.cpp | 21 ++++++++++++++++++++- indra/newview/llpanelmaininventory.h | 2 ++ 4 files changed, 31 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 37801c8dd5..9c7e96e97e 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -1056,6 +1056,14 @@ void LLInventoryGallery::deselectItem(const LLUUID& category_id) } } +void LLInventoryGallery::clearSelection() +{ + if(mSelectedItemID != LLUUID::null) + { + changeItemSelection(LLUUID::null); + } +} + void LLInventoryGallery::signalSelectionItemID(const LLUUID& category_id) { mSelectionChangeSignal(category_id); diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index dfb7be6a86..f7065afdae 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -116,6 +116,7 @@ public: void computeDifference(const LLInventoryModel::cat_array_t vcats, const LLInventoryModel::item_array_t vitems, uuid_vec_t& vadded, uuid_vec_t& vremoved); void deselectItem(const LLUUID& category_id); + void clearSelection(); void changeItemSelection(const LLUUID& item_id, bool scroll_to_selection = false); void scrollToShowItem(const LLUUID& item_id); void signalSelectionItemID(const LLUUID& category_id); diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index 4577c1defa..a8c8ce994d 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -262,7 +262,7 @@ BOOL LLPanelMainInventory::postBuild() LLInventoryFilter& comb_inv_filter = mCombinationInventoryPanel->getFilter(); comb_inv_filter.setFilterThumbnails(LLInventoryFilter::FILTER_EXCLUDE_THUMBNAILS); comb_inv_filter.markDefault(); - mCombinationInventoryPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onSelectionChange, this, mCombinationInventoryPanel, _1, _2)); + mCombinationInventoryPanel->setSelectCallback(boost::bind(&LLPanelMainInventory::onCombinationInventorySelectionChanged, this, _1, _2)); mCombinationInventoryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, false)); mCombinationGalleryPanel = getChild("comb_gallery_view_inv"); @@ -270,6 +270,7 @@ BOOL LLPanelMainInventory::postBuild() comb_gallery_filter.setFilterThumbnails(LLInventoryFilter::FILTER_ONLY_THUMBNAILS); comb_gallery_filter.markDefault(); mCombinationGalleryPanel->setRootChangedCallback(boost::bind(&LLPanelMainInventory::onCombinationRootChanged, this, true)); + mCombinationGalleryPanel->setSelectionChangeCallback(boost::bind(&LLPanelMainInventory::onCombinationGallerySelectionChanged, this, _1)); mCombinationScroller = getChild("combination_scroller"); @@ -2296,6 +2297,24 @@ void LLPanelMainInventory::onCombinationRootChanged(bool gallery_clicked) mCombinationInventoryPanel->reshape(1, 1); } +void LLPanelMainInventory::onCombinationGallerySelectionChanged(const LLUUID& category_id) +{ + if(category_id != LLUUID::null) + { + mCombinationInventoryPanel->unSelectAll(); + } +} + +void LLPanelMainInventory::onCombinationInventorySelectionChanged(const std::deque& items, BOOL user_action) +{ + onSelectionChange(mCombinationInventoryPanel, items, user_action); + + if(!items.empty()) + { + mCombinationGalleryPanel->clearSelection(); + } +} + void LLPanelMainInventory::updateCombinationVisibility() { if(mSingleFolderMode diff --git a/indra/newview/llpanelmaininventory.h b/indra/newview/llpanelmaininventory.h index 44beba6b4f..bc010ff37f 100644 --- a/indra/newview/llpanelmaininventory.h +++ b/indra/newview/llpanelmaininventory.h @@ -221,6 +221,8 @@ protected: void updateNavButtons(); void onCombinationRootChanged(bool gallery_clicked); + void onCombinationGallerySelectionChanged(const LLUUID& category_id); + void onCombinationInventorySelectionChanged(const std::deque& items, BOOL user_action); /** * Set upload cost in "Upload" sub menu. */ -- cgit v1.2.3 From 4a09f190d55483857ad70b7d2ddb75a98f0f57d7 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 10 May 2023 16:02:14 +0300 Subject: SL-19650 don't build anything except direct children views for single-folder panel --- indra/newview/llinventorypanel.cpp | 28 ++++++++++++++++++++-------- indra/newview/llinventorypanel.h | 5 ++++- 2 files changed, 24 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index 6d739c909c..d6eee523f4 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -161,7 +161,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) : mInvFVBridgeBuilder(NULL), mInventoryViewModel(p.name), mGroupedItemBridge(new LLFolderViewGroupedItemBridge), - mFocusSelection(false) + mFocusSelection(false), + mBuildChildrenViews(true) { mInvFVBridgeBuilder = &INVENTORY_BRIDGE_BUILDER; @@ -1016,8 +1017,11 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id, LLInventoryObject const* objectp, LLFolderViewItem *folder_view_item, LLFolderViewFolder *parent_folder, - const EBuildModes &mode) + const EBuildModes &mode, + S32 depth) { + depth++; + // Force the creation of an extra root level folder item if required by the inventory panel (default is "false") bool allow_drop = true; bool create_root = false; @@ -1117,7 +1121,8 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id, } } - bool create_children = folder_view_item && objectp->getType() == LLAssetType::AT_CATEGORY; + bool create_children = folder_view_item && objectp->getType() == LLAssetType::AT_CATEGORY + && (mBuildChildrenViews || depth == 0); if (create_children) { @@ -1137,7 +1142,10 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id, { create_children = false; // run it again for the sake of creating children - mBuildViewsQueue.push_back(id); + if (mBuildChildrenViews || depth == 0) + { + mBuildViewsQueue.push_back(id); + } } else { @@ -1150,7 +1158,10 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id, { create_children = false; // run it to create children, current caller is only interested in current view - mBuildViewsQueue.push_back(id); + if (mBuildChildrenViews || depth == 0) + { + mBuildViewsQueue.push_back(id); + } break; } case BUILD_ONE_FOLDER: @@ -1198,11 +1209,11 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id, // each time, especially since content is growing, we can just // iter over copy of mItemMap in some way LLFolderViewItem* view_itemp = getItemByID(cat->getUUID()); - buildViewsTree(cat->getUUID(), id, cat, view_itemp, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode)); + buildViewsTree(cat->getUUID(), id, cat, view_itemp, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode), depth); } else { - buildViewsTree(cat->getUUID(), id, cat, NULL, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode)); + buildViewsTree(cat->getUUID(), id, cat, NULL, parentp, (mode == BUILD_ONE_FOLDER ? BUILD_NO_CHILDREN : mode), depth); } } } @@ -1222,7 +1233,7 @@ LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id, // each time, especially since content is growing, we can just // iter over copy of mItemMap in some way LLFolderViewItem* view_itemp = getItemByID(item->getUUID()); - buildViewsTree(item->getUUID(), id, item, view_itemp, parentp, mode); + buildViewsTree(item->getUUID(), id, item, view_itemp, parentp, mode, depth); } } } @@ -2078,6 +2089,7 @@ static LLDefaultChildRegistry::Register t_single_f LLInventorySingleFolderPanel::LLInventorySingleFolderPanel(const Params& params) : LLInventoryPanel(params) { + mBuildChildrenViews = false; getFilter().setSingleFolderMode(true); getFilter().setEmptyLookupMessage("InventorySingleFolderNoMatches"); getFilter().setDefaultEmptyLookupMessage("InventorySingleFolderEmpty"); diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index f2eab4a642..1476194195 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -305,6 +305,8 @@ protected: */ const LLInventoryFolderViewModelBuilder* mInvFVBridgeBuilder; + bool mBuildChildrenViews; + //-------------------------------------------------------------------- // Sorting @@ -372,7 +374,8 @@ private: LLInventoryObject const* objectp, LLFolderViewItem *target_view, LLFolderViewFolder *parent_folder_view, - const EBuildModes &mode); + const EBuildModes &mode, + S32 depth = -1); typedef enum e_views_initialization_state { -- cgit v1.2.3 From 42f16180a985fc0e4704a4e25489ada9d662631a Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 10 May 2023 18:41:55 +0300 Subject: SL-19536 SL-19652 Fix inventory fetching --- indra/newview/llinventorymodelbackgroundfetch.cpp | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 0bb56c7d0c..6b88d0aaf7 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -437,9 +437,10 @@ void LLInventoryModelBackgroundFetch::bulkFetch() { const LLViewerInventoryCategory * cat(gInventory.getCategory(cat_id)); - if (cat && std::find(all_cats.begin(), all_cats.end(), cat_id) == all_cats.end()) + if (cat) { - if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion()) + if (LLViewerInventoryCategory::VERSION_UNKNOWN == cat->getVersion() + && std::find(all_cats.begin(), all_cats.end(), cat_id) == all_cats.end()) { LLSD folder_sd; folder_sd["folder_id"] = cat->getUUID(); -- cgit v1.2.3 From 4173cae02165e36d96638761f29bd6d00ac24ddc Mon Sep 17 00:00:00 2001 From: simon Date: Thu, 11 May 2023 01:16:42 +0100 Subject: sl-19676 - more loading stats and 360 Interest List mode work --- indra/newview/app_settings/settings.xml | 11 ----- indra/newview/llagent.cpp | 76 +++++++++++++++++++----------- indra/newview/llagent.h | 5 ++ indra/newview/llfloater360capture.cpp | 66 +++++--------------------- indra/newview/llfloater360capture.h | 4 +- indra/newview/llviewermenu.cpp | 59 +++--------------------- indra/newview/llviewermessage.cpp | 36 ++++++++------- indra/newview/llviewerobjectlist.cpp | 12 ++--- indra/newview/llviewerregion.cpp | 82 ++++++++++++++++++++++++++++++++- indra/newview/llviewerregion.h | 18 ++++++++ indra/newview/llviewerstatsrecorder.cpp | 56 +++++++--------------- indra/newview/llviewerstatsrecorder.h | 28 +++++------ 12 files changed, 231 insertions(+), 222 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 9f2d6f746d..775ddb0571 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -16964,17 +16964,6 @@ Value 0 - 360CaptureUseInterestListCap - - Comment - Flag if set, uses the new InterestList cap to ask the simulator for full content - Persist - 1 - Type - Boolean - Value - 1 - 360CaptureJPEGEncodeQuality Comment diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 8cc9be7244..89d4df7caa 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -401,6 +401,7 @@ LLAgent::LLAgent() : mHttpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID), mTeleportState(TELEPORT_NONE), mRegionp(NULL), + mUse360Mode(false), mAgentOriginGlobal(), mPositionGlobal(), @@ -894,11 +895,20 @@ boost::signals2::connection LLAgent::addParcelChangedCallback(parcel_changed_cal // static void LLAgent::capabilityReceivedCallback(const LLUUID ®ion_id, LLViewerRegion *regionp) -{ - if (regionp && regionp->getRegionID() == region_id) +{ // Changed regions and now have the region capabilities + if (regionp) { - regionp->requestSimulatorFeatures(); - LLAppViewer::instance()->updateNameLookupUrl(regionp); + if (regionp->getRegionID() == region_id) + { + regionp->requestSimulatorFeatures(); + LLAppViewer::instance()->updateNameLookupUrl(regionp); + } + + if (gAgent.getInterestList360Mode()) + { + const bool use_360_mode = true; + gAgent.changeInterestListMode(use_360_mode); + } } } @@ -2910,39 +2920,53 @@ void LLAgent::processMaturityPreferenceFromServer(const LLSD &result, U8 perferr handlePreferredMaturityResult(maturity); } - -bool LLAgent::requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess, httpCallback_t cbFailure) -{ - if (!getRegion()) +// Using a new capability, tell the simulator that we want it to send everything +// it knows about and not just what is in front of the camera, in its view +// frustum. We need this feature so that the contents of the region that appears +// in the 6 snapshots which we cannot see and is normally not "considered", is +// also rendered. Typically, this is turned on when the 360 capture floater is +// opened and turned off when it is closed. +// Note: for this version, we do not have a way to determine when "everything" +// has arrived and has been rendered so for now, the proposal is that users +// will need to experiment with the low resolution version and wait for some +// (hopefully) small period of time while the full contents resolves. +// Pass in a flag to ask the simulator/interest list to "send everything" or +// not (the default mode) +void LLAgent::changeInterestListMode(bool use_360_mode) +{ + mUse360Mode = use_360_mode; + + // Change interest list mode for all regions. If they are already set for the current mode, + // the setting will have no effect. + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); + ++iter) { - return false; + LLViewerRegion *regionp = *iter; + if (regionp && regionp->isAlive() && regionp->capabilitiesReceived()) + { + regionp->setInterestList360Mode(mUse360Mode); + } } - std::string url = getRegion()->getCapability(capName); +} - if (url.empty()) + +bool LLAgent::requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess, httpCallback_t cbFailure) +{ + if (getRegion()) { - LL_WARNS("Agent") << "Could not retrieve region capability \"" << capName << "\"" << LL_ENDL; - return false; + return getRegion()->requestPostCapability(capName, postData, cbSuccess, cbFailure); } - - LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, mHttpPolicy, postData, cbSuccess, cbFailure); - return true; + return false; } bool LLAgent::requestGetCapability(const std::string &capName, httpCallback_t cbSuccess, httpCallback_t cbFailure) { - std::string url; - - url = getRegionCapability(capName); - - if (url.empty()) + if (getRegion()) { - LL_WARNS("Agent") << "Could not retrieve region capability \"" << capName << "\"" << LL_ENDL; - return false; + return getRegion()->requestGetCapability(capName, cbSuccess, cbFailure); } - - LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpGet(url, mHttpPolicy, cbSuccess, cbFailure); - return true; + return false; } BOOL LLAgent::getAdminOverride() const diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index 498bea3c07..ef8df13fc6 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -294,9 +294,14 @@ public: boost::signals2::connection addRegionChangedCallback(const region_changed_signal_t::slot_type& cb); void removeRegionChangedCallback(boost::signals2::connection callback); + + void changeInterestListMode(bool use_360_mode); + bool getInterestList360Mode() const { return mUse360Mode; } + private: LLViewerRegion *mRegionp; region_changed_signal_t mRegionChangedSignal; + bool mUse360Mode; //-------------------------------------------------------------------- // History diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp index 9c25cdbc7d..a0889abe2d 100644 --- a/indra/newview/llfloater360capture.cpp +++ b/indra/newview/llfloater360capture.cpp @@ -64,12 +64,11 @@ LLFloater360Capture::LLFloater360Capture(const LLSD& key) // such time as we ask it not to (the dtor). If we crash or // otherwise, exit before this is turned off, the Simulator // will take care of cleaning up for us. - if (gSavedSettings.getBOOL("360CaptureUseInterestListCap")) - { - // send everything to us for as long as this floater is open - const bool send_everything = true; - changeInterestListMode(send_everything); - } + mWasIn360Mode = gAgent.getInterestList360Mode(); + + // send everything to us for as long as this floater is open + const bool use_360_mode = true; + gAgent.changeInterestListMode(use_360_mode); } LLFloater360Capture::~LLFloater360Capture() @@ -81,13 +80,15 @@ LLFloater360Capture::~LLFloater360Capture() mWebBrowser->unloadMediaSource(); } - // Tell the Simulator not to send us everything anymore - // and revert to the regular "keyhole" frustum of interest + // Restore interest list mode to the state when started + // Normally LLFloater360Capture tells the Simulator send everything + // and now reverts to the regular "keyhole" frustum of interest // list updates. - if (!LLApp::isExiting() && gSavedSettings.getBOOL("360CaptureUseInterestListCap")) + if (!LLApp::isExiting() && + gSavedSettings.getBOOL("360CaptureUseInterestListCap") && + mWasIn360Mode != gAgent.getInterestList360Mode()) { - const bool send_everything = false; - changeInterestListMode(send_everything); + gAgent.changeInterestListMode(mWasIn360Mode); } } @@ -170,49 +171,6 @@ void LLFloater360Capture::onChooseQualityRadioGroup() setSourceImageSize(); } -// Using a new capability, tell the simulator that we want it to send everything -// it knows about and not just what is in front of the camera, in its view -// frustum. We need this feature so that the contents of the region that appears -// in the 6 snapshots which we cannot see and is normally not "considered", is -// also rendered. Typically, this is turned on when the 360 capture floater is -// opened and turned off when it is closed. -// Note: for this version, we do not have a way to determine when "everything" -// has arrived and has been rendered so for now, the proposal is that users -// will need to experiment with the low resolution version and wait for some -// (hopefully) small period of time while the full contents resolves. -// Pass in a flag to ask the simulator/interest list to "send everything" or -// not (the default mode) -void LLFloater360Capture::changeInterestListMode(bool send_everything) -{ - LLSD body; - - if (send_everything) - { - body["mode"] = LLSD::String("360"); - } - else - { - body["mode"] = LLSD::String("default"); - } - - if (gAgent.requestPostCapability("InterestList", body, [](const LLSD & response) - { - LL_DEBUGS("360Capture") << "InterestList capability responded: \n" << - ll_pretty_print_sd(response) << - LL_ENDL; - })) - { - LL_DEBUGS("360Capture") << "Successfully posted an InterestList capability request with payload: \n" << - ll_pretty_print_sd(body) << - LL_ENDL; - } - else - { - LL_WARNS("360Capture") << "Unable to post an InterestList capability request with payload: \n" << - ll_pretty_print_sd(body) << - LL_ENDL; - } -} // There is is a setting (360CaptureSourceImageSize) that holds the size // (width == height since it's a square) of each of the 6 source snapshots. diff --git a/indra/newview/llfloater360capture.h b/indra/newview/llfloater360capture.h index 8f765c0b1b..61316c65f3 100644 --- a/indra/newview/llfloater360capture.h +++ b/indra/newview/llfloater360capture.h @@ -50,8 +50,6 @@ class LLFloater360Capture: void onOpen(const LLSD& key) override; void handleMediaEvent(LLPluginClassMedia* self, EMediaEvent event) override; - void changeInterestListMode(bool send_everything); - const std::string getHTMLBaseFolder(); void capture360Images(); @@ -93,6 +91,8 @@ class LLFloater360Capture: std::string mImageSaveDir; LLPointer mRawImages[6]; + + bool mWasIn360Mode; }; #endif // LL_FLOATER_360CAPTURE_H diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index d1b240d2c4..23abd0fe16 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1301,65 +1301,18 @@ class LLAdvancedToggleInterestList360Mode : public view_listener_t public: bool handleEvent(const LLSD &userdata) { - LLSD request; - LLSD body; - - // First do a GET to report on current mode and update stats - if (gAgent.requestGetCapability("InterestList", - [](const LLSD &response) { - LL_DEBUGS("360Capture") << "InterestList capability GET responded: \n" - << ll_pretty_print_sd(response) << LL_ENDL; - })) - { - LL_DEBUGS("360Capture") << "Successful GET InterestList capability request with return body: \n" - << ll_pretty_print_sd(body) << LL_ENDL; - } - else - { - LL_WARNS("360Capture") << "Unable to GET InterestList capability request with return body: \n" - << ll_pretty_print_sd(body) << LL_ENDL; - } - - // Now do a POST to change the mode - if (sUsing360) - { - body["mode"] = LLSD::String("default"); - } - else - { - body["mode"] = LLSD::String("360"); - } - sUsing360 = !sUsing360; - LL_INFOS("360Capture") << "Setting InterestList capability mode to " << body["mode"].asString() << LL_ENDL; - - if (gAgent.requestPostCapability("InterestList", body, - [](const LLSD &response) { - LL_DEBUGS("360Capture") << "InterestList capability responded: \n" - << ll_pretty_print_sd(response) << LL_ENDL; - })) - { - LL_DEBUGS("360Capture") << "Successfully posted an InterestList capability request with payload: \n" - << ll_pretty_print_sd(body) << LL_ENDL; - return true; - } - else - { - LL_DEBUGS("360Capture") << "Unable to post an InterestList capability request with payload: \n" - << ll_pretty_print_sd(body) << LL_ENDL; - return false; - } - }; - - static bool sUsing360; + // Toggle the mode - regions will get updated + bool new_mode = !gAgent.getInterestList360Mode(); + gAgent.changeInterestListMode(new_mode); + return true; + } }; -bool LLAdvancedToggleInterestList360Mode::sUsing360 = false; - class LLAdvancedCheckInterestList360Mode : public view_listener_t { bool handleEvent(const LLSD& userdata) { - return LLAdvancedToggleInterestList360Mode::sUsing360; + return gAgent.getInterestList360Mode(); } }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index a60f11d97b..ef83fa161b 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -99,6 +99,7 @@ #include "llviewerobjectlist.h" #include "llviewerparcelmgr.h" #include "llviewerstats.h" +#include "llviewerstatsrecorder.h" #include "llviewertexteditor.h" #include "llviewerthrottle.h" #include "llviewerwindow.h" @@ -3759,31 +3760,34 @@ void process_kill_object(LLMessageSystem *mesgsys, void **user_data) continue; } - LLViewerObject *objectp = gObjectList.findObject(id); - if (objectp) + LLViewerObject *objectp = gObjectList.findObject(id); + if (objectp) + { + // Display green bubble on kill + if ( gShowObjectUpdates ) { - // Display green bubble on kill - if ( gShowObjectUpdates ) - { - LLColor4 color(0.f,1.f,0.f,1.f); - gPipeline.addDebugBlip(objectp->getPositionAgent(), color); - LL_DEBUGS("MessageBlip") << "Kill blip for local " << local_id << " at " << objectp->getPositionAgent() << LL_ENDL; - } - - // Do the kill - gObjectList.killObject(objectp); + LLColor4 color(0.f,1.f,0.f,1.f); + gPipeline.addDebugBlip(objectp->getPositionAgent(), color); + LL_DEBUGS("MessageBlip") << "Kill blip for local " << local_id << " at " << objectp->getPositionAgent() << LL_ENDL; } - if(delete_object) - { - regionp->killCacheEntry(local_id); + // Do the kill + gObjectList.killObject(objectp); + } + + if(delete_object) + { + regionp->killCacheEntry(local_id); } // We should remove the object from selection after it is marked dead by gObjectList to make LLToolGrab, // which is using the object, release the mouse capture correctly when the object dies. // See LLToolGrab::handleHoverActive() and LLToolGrab::handleHoverNonPhysical(). LLSelectMgr::getInstance()->removeObjectFromSelections(id); - } + + } // end for loop + + LLViewerStatsRecorder::instance().recordObjectKills(num_objects); } void process_time_synch(LLMessageSystem *mesgsys, void **user_data) diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 0c9e929cf3..5f0e331baa 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -369,7 +369,7 @@ LLViewerObject* LLViewerObjectList::processObjectUpdateFromCache(LLVOCacheEntry* if (!objectp) { LL_INFOS() << "createObject failure for object: " << fullid << LL_ENDL; - recorder.objectUpdateFailure(0); + recorder.objectUpdateFailure(); return NULL; } justCreated = true; @@ -501,7 +501,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, << " Flags: " << flags << " Region: " << regionp->getName() << " Region id: " << regionp->getRegionID() << LL_ENDL; - recorder.objectUpdateFailure(msg_size); + recorder.objectUpdateFailure(); continue; } else if ((flags & FLAGS_TEMPORARY_ON_REZ) == 0) @@ -612,7 +612,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (update_type == OUT_TERSE_IMPROVED) { // LL_INFOS() << "terse update for an unknown object (compressed):" << fullid << LL_ENDL; - recorder.objectUpdateFailure(msg_size); + recorder.objectUpdateFailure(); continue; } } @@ -621,7 +621,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (update_type != OUT_FULL) { //LL_INFOS() << "terse update for an unknown object:" << fullid << LL_ENDL; - recorder.objectUpdateFailure(msg_size); + recorder.objectUpdateFailure(); continue; } @@ -634,7 +634,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, { mNumDeadObjectUpdates++; //LL_INFOS() << "update for a dead object:" << fullid << LL_ENDL; - recorder.objectUpdateFailure(msg_size); + recorder.objectUpdateFailure(); continue; } #endif @@ -647,7 +647,7 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, if (!objectp) { LL_INFOS() << "createObject failure for object: " << fullid << LL_ENDL; - recorder.objectUpdateFailure(msg_size); + recorder.objectUpdateFailure(); continue; } diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 54d787366f..7abd77505d 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -646,7 +646,8 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mInvisibilityCheckHistory(-1), mPaused(FALSE), mRegionCacheHitCount(0), - mRegionCacheMissCount(0) + mRegionCacheMissCount(0), + mUse360Mode(false) { mWidth = region_width_meters; mImpl->mOriginGlobal = from_region_handle(handle); @@ -3283,6 +3284,9 @@ void LLViewerRegion::setCapabilitiesReceived(bool received) // This is a single-shot signal. Forget callbacks to save resources. mCapabilitiesReceivedSignal.disconnect_all_slots(); + + // Set the region to the desired interest list mode + setInterestList360Mode(gAgent.getInterestList360Mode()); } } @@ -3301,6 +3305,82 @@ void LLViewerRegion::logActiveCapabilities() const log_capabilities(mImpl->mCapabilities); } + +bool LLViewerRegion::requestPostCapability(const std::string &capName, LLSD &postData, httpCallback_t cbSuccess, httpCallback_t cbFailure) +{ + std::string url = getCapability(capName); + + if (url.empty()) + { + LL_WARNS("Region") << "Could not retrieve region " << getRegionID() + << " POST capability \"" << capName << "\"" << LL_ENDL; + return false; + } + + LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpPost(url, gAgent.getAgentPolicy(), postData, cbSuccess, cbFailure); + return true; +} + +bool LLViewerRegion::requestGetCapability(const std::string &capName, httpCallback_t cbSuccess, httpCallback_t cbFailure) +{ + std::string url; + + url = getCapability(capName); + + if (url.empty()) + { + LL_WARNS("Region") << "Could not retrieve region " << getRegionID() + << " GET capability \"" << capName << "\"" << LL_ENDL; + return false; + } + + LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpGet(url, gAgent.getAgentPolicy(), cbSuccess, cbFailure); + return true; +} + + +void LLViewerRegion::setInterestList360Mode(bool use_360_mode) +{ + if (use_360_mode != mUse360Mode) + { + LLSD body; + mUse360Mode = use_360_mode; + + if (mUse360Mode) + { + body["mode"] = LLSD::String("360"); + } + else + { + body["mode"] = LLSD::String("default"); + } + + if (requestPostCapability("InterestList", body, + [](const LLSD &response) { + LL_DEBUGS("360Capture") << "InterestList capability responded: \n" + << ll_pretty_print_sd(response) << LL_ENDL; + })) + { + LL_DEBUGS("360Capture") << "Region " << getRegionID() + << " Successfully posted an InterestList capability request with payload: \n" + << ll_pretty_print_sd(body) << LL_ENDL; + } + else + { + LL_WARNS("360Capture") << "Region " << getRegionID() + << " Unable to post an InterestList capability request with payload: \n" + << ll_pretty_print_sd(body) << LL_ENDL; + } + } + else + { + LL_DEBUGS("360Capture") << "Region " << getRegionID() << "No change, skipping Interest List mode POST to " + << (use_360_mode ? "360" : "default") << " mode" << LL_ENDL; + } +} + + + LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type) { if (type < mImpl->mObjectPartition.size() && type < PARTITION_VO_CACHE) diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 81371b7f30..3da0c376d3 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -32,6 +32,7 @@ #include #include +#include "llcorehttputil.h" #include "llwind.h" #include "v3dmath.h" #include "llstring.h" @@ -278,6 +279,15 @@ public: static bool isSpecialCapabilityName(const std::string &name); void logActiveCapabilities() const; + // Utilities to post and get via + // HTTP using the agent's policy settings and headers. + typedef LLCoreHttpUtil::HttpCoroutineAdapter::completionCallback_t httpCallback_t; + bool requestPostCapability(const std::string &capName, + LLSD &postData, + httpCallback_t cbSuccess = NULL, + httpCallback_t cbFailure = NULL); + bool requestGetCapability(const std::string &capName, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL); + /// implements LLCapabilityProvider /*virtual*/ const LLHost& getHost() const; const U64 &getHandle() const { return mHandle; } @@ -477,6 +487,11 @@ public: }; typedef std::set region_priority_list_t; + void setInterestList360Mode(bool use_360_mode); + bool getInterestList360Mode() const { return mUse360Mode; } + + + private: static S32 sNewObjectCreationThrottle; LLViewerRegionImpl * mImpl; @@ -574,6 +589,9 @@ private: LLFrameTimer mMaterialsCapThrottleTimer; LLFrameTimer mRenderInfoRequestTimer; LLFrameTimer mRenderInfoReportTimer; + + // how the server interest list works + bool mUse360Mode; }; inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const diff --git a/indra/newview/llviewerstatsrecorder.cpp b/indra/newview/llviewerstatsrecorder.cpp index f95a960186..6372679a07 100644 --- a/indra/newview/llviewerstatsrecorder.cpp +++ b/indra/newview/llviewerstatsrecorder.cpp @@ -73,15 +73,14 @@ void LLViewerStatsRecorder::clearStats() mObjectFullUpdates = 0; mObjectTerseUpdates = 0; mObjectCacheMissRequests = 0; - mObjectCacheMissResponses = 0; mObjectCacheUpdateDupes = 0; mObjectCacheUpdateChanges = 0; mObjectCacheUpdateAdds = 0; mObjectCacheUpdateReplacements = 0; mObjectUpdateFailures = 0; - mObjectUpdateFailuresSize = 0; mTextureFetchCount = 0; mMeshLoadedCount = 0; + mObjectKills = 0; } @@ -100,12 +99,6 @@ void LLViewerStatsRecorder::enableObjectStatsRecording(bool enable, bool logging -void LLViewerStatsRecorder::recordObjectUpdateFailure(S32 msg_size) -{ - mObjectUpdateFailures++; - mObjectUpdateFailuresSize += msg_size; -} - void LLViewerStatsRecorder::recordCacheMissEvent(U8 cache_miss_type) { if (LLViewerRegion::CACHE_MISS_TYPE_TOTAL == cache_miss_type) @@ -119,24 +112,17 @@ void LLViewerStatsRecorder::recordCacheMissEvent(U8 cache_miss_type) } -void LLViewerStatsRecorder::recordCacheHitEvent() -{ - mObjectCacheHitCount++; -} - void LLViewerStatsRecorder::recordObjectUpdateEvent(const EObjectUpdateType update_type) { switch (update_type) { case OUT_FULL: - mObjectFullUpdates++; + case OUT_FULL_COMPRESSED: + mObjectFullUpdates++; break; case OUT_TERSE_IMPROVED: mObjectTerseUpdates++; break; - case OUT_FULL_COMPRESSED: - mObjectCacheMissResponses++; - break; default: LL_WARNS() << "Unknown update_type" << LL_ENDL; break; @@ -165,11 +151,6 @@ void LLViewerStatsRecorder::recordCacheFullUpdate(LLViewerRegion::eCacheUpdateRe }; } -void LLViewerStatsRecorder::recordRequestCacheMissesEvent(S32 count) -{ - mObjectCacheMissRequests += count; -} - void LLViewerStatsRecorder::writeToLog( F32 interval ) { if (!mEnableStatsLogging || !mEnableStatsRecording) @@ -185,7 +166,7 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) if (mSkipSaveIfZeros) { S32 total_events = mObjectCacheHitCount + mObjectCacheMissCrcCount + mObjectCacheMissFullCount + mObjectFullUpdates + - mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheMissResponses + mObjectCacheUpdateDupes + + mObjectTerseUpdates + mObjectCacheMissRequests + mObjectCacheUpdateDupes + mObjectCacheUpdateChanges + mObjectCacheUpdateAdds + mObjectCacheUpdateReplacements + mObjectUpdateFailures; if (total_events == 0) { @@ -202,14 +183,16 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << mObjectFullUpdates << " full updates, " << mObjectTerseUpdates << " terse updates, " << mObjectCacheMissRequests << " cache miss requests, " - << mObjectCacheMissResponses << " cache miss responses, " << mObjectCacheUpdateDupes << " cache update dupes, " << mObjectCacheUpdateChanges << " cache update changes, " << mObjectCacheUpdateAdds << " cache update adds, " - << mObjectCacheUpdateReplacements << " cache update replacements, " - << mObjectUpdateFailures << " update failures" + << mObjectCacheUpdateReplacements << " cache update replacements," + << mObjectUpdateFailures << " update failures," + << mTextureFetchCount << " texture fetches, " + << mMeshLoadedCount << " mesh loads, " + << mObjectKills << " object kills" << LL_ENDL; - + if (mStatsFile == NULL) { // Refresh settings @@ -237,8 +220,7 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "Cache Crc Misses," << "Full Updates," << "Terse Updates," - << "Cache Miss Requests," - << "Cache Miss Responses," + << "Cache Miss Requests," // Normally results in a Full Update from simulator << "Cache Update Dupes," << "Cache Update Changes," << "Cache Update Adds," @@ -246,12 +228,16 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "Update Failures," << "Texture Count," << "Mesh Load Count," + << "Object Kills" << "\n"; data_size = col_headers.str().size(); if (fwrite(col_headers.str().c_str(), 1, data_size, mStatsFile ) != data_size) { LL_WARNS() << "failed to write full headers to " << mStatsFileName << LL_ENDL; + // Close the file and turn off stats logging + closeStatsFile(); + return; } } else @@ -273,7 +259,6 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "," << mObjectFullUpdates << "," << mObjectTerseUpdates << "," << mObjectCacheMissRequests - << "," << mObjectCacheMissResponses << "," << mObjectCacheUpdateDupes << "," << mObjectCacheUpdateChanges << "," << mObjectCacheUpdateAdds @@ -281,6 +266,7 @@ void LLViewerStatsRecorder::writeToLog( F32 interval ) << "," << mObjectUpdateFailures << "," << mTextureFetchCount << "," << mMeshLoadedCount + << "," << mObjectKills << "\n"; data_size = stats_data.str().size(); @@ -332,14 +318,4 @@ F32 LLViewerStatsRecorder::getTimeSinceStart() return (F32) (LLFrameTimer::getTotalSeconds() - mFileOpenTime); } -void LLViewerStatsRecorder::recordTextureFetch() -{ - mTextureFetchCount += 1; -} - -void LLViewerStatsRecorder::recordMeshLoaded() -{ - mMeshLoadedCount += 1; -} - diff --git a/indra/newview/llviewerstatsrecorder.h b/indra/newview/llviewerstatsrecorder.h index 37c08a51cf..b9fe02e54d 100644 --- a/indra/newview/llviewerstatsrecorder.h +++ b/indra/newview/llviewerstatsrecorder.h @@ -53,11 +53,11 @@ class LLViewerStatsRecorder : public LLSingleton bool isEnabled() const { return mEnableStatsRecording; } bool isLogging() const { return mEnableStatsLogging; } - void objectUpdateFailure(S32 msg_size) + void objectUpdateFailure() { if (mEnableStatsRecording) { - recordObjectUpdateFailure(msg_size); + mObjectUpdateFailures++; } } @@ -73,7 +73,7 @@ class LLViewerStatsRecorder : public LLSingleton { if (mEnableStatsRecording) { - recordCacheHitEvent(); + mObjectCacheHitCount++; } } @@ -97,7 +97,7 @@ class LLViewerStatsRecorder : public LLSingleton { if (mEnableStatsRecording) { - recordRequestCacheMissesEvent(count); + mObjectCacheMissRequests += count; } } @@ -105,7 +105,7 @@ class LLViewerStatsRecorder : public LLSingleton { if (mEnableStatsRecording) { - recordTextureFetch(); + mTextureFetchCount += 1; } } @@ -113,10 +113,18 @@ class LLViewerStatsRecorder : public LLSingleton { if (mEnableStatsRecording) { - recordMeshLoaded(); + mMeshLoadedCount += 1; } } + void recordObjectKills(S32 num_objects) + { + if (mEnableStatsRecording) + { + mObjectKills += num_objects; + } + } + void idle() { writeToLog(mInterval); @@ -125,14 +133,9 @@ class LLViewerStatsRecorder : public LLSingleton F32 getTimeSinceStart(); private: - void recordObjectUpdateFailure(S32 msg_size); void recordCacheMissEvent(U8 cache_miss_type); - void recordCacheHitEvent(); void recordObjectUpdateEvent(const EObjectUpdateType update_type); void recordCacheFullUpdate(LLViewerRegion::eCacheUpdateResult update_result); - void recordRequestCacheMissesEvent(S32 count); - void recordTextureFetch(); - void recordMeshLoaded(); void writeToLog(F32 interval); void closeStatsFile(); void makeStatsFileName(); @@ -158,15 +161,14 @@ private: S32 mObjectFullUpdates; S32 mObjectTerseUpdates; S32 mObjectCacheMissRequests; - S32 mObjectCacheMissResponses; S32 mObjectCacheUpdateDupes; S32 mObjectCacheUpdateChanges; S32 mObjectCacheUpdateAdds; S32 mObjectCacheUpdateReplacements; S32 mObjectUpdateFailures; - S32 mObjectUpdateFailuresSize; S32 mTextureFetchCount; S32 mMeshLoadedCount; + S32 mObjectKills; void clearStats(); }; -- cgit v1.2.3 From f7872f7ed1aaf42a6dc4a7999a554f428f6dfe60 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 11 May 2023 17:54:35 +0300 Subject: SL-19701 Clicking on 'Show' in inventory offering does not open inventory in Single folder --- indra/newview/llinventorypanel.cpp | 11 ++++++++--- indra/newview/llinventorypanel.h | 2 +- indra/newview/llviewermessage.cpp | 20 +++++++++++++++++++- 3 files changed, 28 insertions(+), 5 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index d6eee523f4..ca5abfd661 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1798,14 +1798,14 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open) } //static -void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL main_panel, BOOL take_keyboard_focus, BOOL reset_filter) +void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, BOOL use_main_panel, BOOL take_keyboard_focus, BOOL reset_filter) { LLSidepanelInventory* sidepanel_inventory = LLFloaterSidePanelContainer::getPanel("inventory"); sidepanel_inventory->showInventoryPanel(); bool in_inbox = (gInventory.isObjectDescendentOf(obj_id, gInventory.findCategoryUUIDForType(LLFolderType::FT_INBOX))); - if (!in_inbox && (main_panel || !sidepanel_inventory->getMainInventoryPanel()->isRecentItemsPanelSelected())) + if (!in_inbox && (use_main_panel || !sidepanel_inventory->getMainInventoryPanel()->isRecentItemsPanelSelected())) { sidepanel_inventory->selectAllItemsPanel(); } @@ -1822,7 +1822,12 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L } } - + LLPanelMainInventory* main_inventory = sidepanel_inventory->getMainInventoryPanel(); + if (main_inventory && main_inventory->isSingleFolderMode() + && use_main_panel) + { + main_inventory->toggleViewMode(); + } LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); if (active_panel) diff --git a/indra/newview/llinventorypanel.h b/indra/newview/llinventorypanel.h index 1476194195..f323a6c6d7 100644 --- a/indra/newview/llinventorypanel.h +++ b/indra/newview/llinventorypanel.h @@ -246,7 +246,7 @@ public: static void openInventoryPanelAndSetSelection(BOOL auto_open, const LLUUID& obj_id, - BOOL main_panel = FALSE, + BOOL use_main_panel = FALSE, BOOL take_keyboard_focus = TAKE_FOCUS_YES, BOOL reset_filter = FALSE); static void setSFViewAndOpenFolder(const LLInventoryPanel* panel, const LLUUID& folder_id); diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 065e3ab3ad..78241a7c71 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -76,6 +76,7 @@ #include "llnotifications.h" #include "llnotificationsutil.h" #include "llpanelgrouplandmoney.h" +#include "llpanelmaininventory.h" #include "llrecentpeople.h" #include "llscriptfloater.h" #include "llscriptruntimeperms.h" @@ -1536,11 +1537,28 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam } //////////////////////////////////////////////////////////////////////////////// + static LLUICachedControl find_original_new_floater("FindOriginalOpenWindow", false); + //show in a new single-folder window + if(find_original_new_floater) + { + const LLInventoryObject *obj = gInventory.getObject(obj_id); + if (obj && obj->getParentUUID().notNull()) + { + LLPanelMainInventory::newFolderWindow(obj->getParentUUID(), obj_id); + } + } + else + { // Highlight item const BOOL auto_open = gSavedSettings.getBOOL("ShowInInventory") && // don't open if showininventory is false !from_name.empty(); // don't open if it's not from anyone. - LLInventoryPanel::openInventoryPanelAndSetSelection(auto_open, obj_id); + if(auto_open) + { + LLFloaterReg::showInstance("inventory"); + } + LLInventoryPanel::openInventoryPanelAndSetSelection(auto_open, obj_id, true); + } } } -- cgit v1.2.3 From 077841420cb1264b3a096f473f5005d83de94519 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 12 May 2023 16:35:27 +0300 Subject: SL-19649 reduce logging out time for larger inventories --- indra/llui/llview.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 10e4755cd3..a2f18daa12 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -576,8 +576,10 @@ void LLView::deleteAllChildren() while (!mChildList.empty()) { - LLView* viewp = mChildList.front(); - delete viewp; // will remove the child from mChildList + LLView* viewp = mChildList.front(); + viewp->mParentView = NULL; + delete viewp; + mChildList.pop_front(); } } -- cgit v1.2.3 From 17e18aa9bfa095e8b41c1c0e45c5757101a3f710 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 12 May 2023 16:55:12 +0300 Subject: SL-19649 add missing update --- indra/llui/llview.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra') diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index a2f18daa12..7720c4ad14 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -581,6 +581,7 @@ void LLView::deleteAllChildren() delete viewp; mChildList.pop_front(); } + updateBoundingRect(); } void LLView::setAllChildrenEnabled(BOOL b) -- cgit v1.2.3 From 6e2e9d5904b3cc89deb755f3552d915104065aa0 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 12 May 2023 18:26:02 +0300 Subject: SL-19649 Adjust other classes for new deleteAllChildren mechanics --- indra/llui/lllayoutstack.cpp | 19 ++++++++++++++++--- indra/llui/lllayoutstack.h | 1 + indra/llui/llmenugl.cpp | 7 +++++++ indra/llui/llmenugl.h | 1 + indra/newview/llinspecttoast.cpp | 7 +++++++ indra/newview/llinventorymodel.cpp | 5 ++++- indra/newview/lltooldraganddrop.cpp | 4 ++-- 7 files changed, 38 insertions(+), 6 deletions(-) (limited to 'indra') diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 8a011b4890..08ce31ffc5 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -284,6 +284,17 @@ void LLLayoutStack::draw() } } +void LLLayoutStack::deleteAllChildren() +{ + mPanels.clear(); + LLView::deleteAllChildren(); + + // Not really needed since nothing is left to + // display, but for the sake of consistency + updateFractionalSizes(); + mNeedsLayout = true; +} + void LLLayoutStack::removeChild(LLView* view) { LLLayoutPanel* embedded_panelp = findEmbeddedPanel(dynamic_cast(view)); @@ -291,12 +302,14 @@ void LLLayoutStack::removeChild(LLView* view) if (embedded_panelp) { mPanels.erase(std::find(mPanels.begin(), mPanels.end(), embedded_panelp)); - delete embedded_panelp; + LLView::removeChild(view); updateFractionalSizes(); mNeedsLayout = true; } - - LLView::removeChild(view); + else + { + LLView::removeChild(view); + } } BOOL LLLayoutStack::postBuild() diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index 9a53a7f787..02685281ef 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -69,6 +69,7 @@ public: virtual ~LLLayoutStack(); /*virtual*/ void draw(); + /*virtual*/ void deleteAllChildren(); /*virtual*/ void removeChild(LLView*); /*virtual*/ BOOL postBuild(); /*virtual*/ bool addChild(LLView* child, S32 tab_group = 0); diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 35f2930800..1666ff8c98 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1891,6 +1891,13 @@ bool LLMenuGL::addContextChild(LLView* view, S32 tab_group) return false; } + +void LLMenuGL::deleteAllChildren() +{ + mItems.clear(); + LLUICtrl::deleteAllChildren(); +} + void LLMenuGL::removeChild( LLView* ctrl) { // previously a dynamic_cast with if statement to check validity diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index 47a46510b3..87e3f18ebc 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -449,6 +449,7 @@ public: /*virtual*/ void drawBackground(LLMenuItemGL* itemp, F32 alpha); /*virtual*/ void setVisible(BOOL visible); /*virtual*/ bool addChild(LLView* view, S32 tab_group = 0); + /*virtual*/ void deleteAllChildren(); /*virtual*/ void removeChild( LLView* ctrl); /*virtual*/ BOOL postBuild(); diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp index 68801b0895..6f93a78ca6 100644 --- a/indra/newview/llinspecttoast.cpp +++ b/indra/newview/llinspecttoast.cpp @@ -47,6 +47,7 @@ public: /*virtual*/ void onOpen(const LLSD& notification_id); /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask); + /*virtual*/ void deleteAllChildren(); /*virtual*/ void removeChild(LLView* child); private: void onToastDestroy(LLToast * toast); @@ -122,6 +123,12 @@ BOOL LLInspectToast::handleToolTip(S32 x, S32 y, MASK mask) return LLFloater::handleToolTip(x, y, mask); } +void LLInspectToast::deleteAllChildren() +{ + mPanel = NULL; + LLInspect::deleteAllChildren(); +} + // virtual void LLInspectToast::removeChild(LLView* child) { diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index c65901a754..bc0d523bd2 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -906,7 +906,10 @@ const LLUUID LLInventoryModel::findCategoryUUIDForTypeInRoot( } } - if(rv.isNull() && root_id.notNull() && preferred_type != LLFolderType::FT_MARKETPLACE_LISTINGS) + if(rv.isNull() + && root_id.notNull() + && preferred_type != LLFolderType::FT_MARKETPLACE_LISTINGS + && preferred_type != LLFolderType::FT_OUTBOX) { // if it does not exists, it should either be added // to createCommonSystemCategories or server should diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index d10b999220..78e068f808 100644 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -1733,7 +1733,7 @@ EAcceptance LLToolDragAndDrop::dad3dRezAttachmentFromInv( } const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX); - if(gInventory.isObjectDescendentOf(item->getUUID(), outbox_id)) + if(outbox_id.notNull() && gInventory.isObjectDescendentOf(item->getUUID(), outbox_id)) { // Legacy return ACCEPT_NO; @@ -2160,7 +2160,7 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( } const LLUUID &outbox_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_OUTBOX); - if(gInventory.isObjectDescendentOf(category->getUUID(), outbox_id)) + if(outbox_id.notNull() && gInventory.isObjectDescendentOf(category->getUUID(), outbox_id)) { // Legacy return ACCEPT_NO; -- cgit v1.2.3 From b4d0aeee37973525589223842e149caa28dea2af Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 12 May 2023 19:17:31 +0300 Subject: SL-19712 Folders and items shouldn't be both called items --- indra/newview/llfloaterchangeitemthumbnail.cpp | 2 ++ .../skins/default/xui/en/floater_change_item_thumbnail.xml | 8 ++++++++ 2 files changed, 10 insertions(+) (limited to 'indra') diff --git a/indra/newview/llfloaterchangeitemthumbnail.cpp b/indra/newview/llfloaterchangeitemthumbnail.cpp index 4249ae9305..3070c437bd 100644 --- a/indra/newview/llfloaterchangeitemthumbnail.cpp +++ b/indra/newview/llfloaterchangeitemthumbnail.cpp @@ -335,6 +335,7 @@ void LLFloaterChangeItemThumbnail::refreshFromObject(LLInventoryObject* obj) LLViewerInventoryItem* item = dynamic_cast(obj); if (item) { + setTitle(getString("title_item_thumbnail")); // This floater probably shouldn't be possible to open // for imcomplete items llassert(item->isFinished()); @@ -348,6 +349,7 @@ void LLFloaterChangeItemThumbnail::refreshFromObject(LLInventoryObject* obj) if (cat) { + setTitle(getString("title_folder_thumbnail")); icon_img = LLUI::getUIImage(LLViewerFolderType::lookupIconName(cat->getPreferredType(), true)); if (thumbnail_id.isNull() && (cat->getPreferredType() == LLFolderType::FT_OUTFIT)) diff --git a/indra/newview/skins/default/xui/en/floater_change_item_thumbnail.xml b/indra/newview/skins/default/xui/en/floater_change_item_thumbnail.xml index f3f8ee0daa..ec2961b0f3 100644 --- a/indra/newview/skins/default/xui/en/floater_change_item_thumbnail.xml +++ b/indra/newview/skins/default/xui/en/floater_change_item_thumbnail.xml @@ -8,6 +8,14 @@ title="CHANGE ITEM IMAGE" width="319"> + + CHANGE ITEM IMAGE + + + CHANGE FOLDER IMAGE + Upload from computer -- cgit v1.2.3 From a6d867bccea37467d51cd037d6a58aca02a27e97 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 12 May 2023 21:14:14 +0300 Subject: SL-19583 Fix scrollbars flashing when resizing floater --- indra/newview/llpanelmaininventory.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index a8c8ce994d..5a8565b5aa 100644 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -938,6 +938,7 @@ void LLPanelMainInventory::reshape(S32 width, S32 height, BOOL called_from_paren { mCombinationShapeDirty = true; LLPanel::reshape(width, height, called_from_parent); + updateCombinationVisibility(); } // virtual @@ -959,9 +960,9 @@ void LLPanelMainInventory::draw() mResortActivePanel = false; } + updateCombinationVisibility(); LLPanel::draw(); updateItemcountText(); - updateCombinationVisibility(); } void LLPanelMainInventory::updateItemcountText() -- cgit v1.2.3 From 4d3a8f4a6cd2bef58bc95854af0325ca0190351f Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 12 May 2023 22:15:56 +0300 Subject: SL-19649 Don't update bounding rect excesively --- indra/llui/llview.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 7720c4ad14..da7868d804 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -311,7 +311,13 @@ bool LLView::addChild(LLView* child, S32 tab_group) } child->mParentView = this; - updateBoundingRect(); + if (getVisible() && child->getVisible()) + { + // if child isn't visible it won't affect bounding rect + // if current view is not visible it will be recalculated + // on visibility change + updateBoundingRect(); + } mLastTabGroup = tab_group; return true; } -- cgit v1.2.3 From 81f1be67109885f98f649974022aa6d444dd633d Mon Sep 17 00:00:00 2001 From: simon Date: Sat, 13 May 2023 04:10:28 +0100 Subject: sl-19676 - 360 Intereset list mode. Changed mode to be a string for future expansion instead of a bool toggle --- indra/newview/llagent.cpp | 36 ++++++++++++++++++++--------------- indra/newview/llagent.h | 7 ++++--- indra/newview/llfloater360capture.cpp | 9 ++++----- indra/newview/llfloater360capture.h | 2 +- indra/newview/llviewermenu.cpp | 12 +++++++++--- indra/newview/llviewerregion.cpp | 34 +++++++++++++++++---------------- indra/newview/llviewerregion.h | 11 ++++++----- 7 files changed, 63 insertions(+), 48 deletions(-) (limited to 'indra') diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 89d4df7caa..307f73fab4 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -401,7 +401,7 @@ LLAgent::LLAgent() : mHttpPolicy(LLCore::HttpRequest::DEFAULT_POLICY_ID), mTeleportState(TELEPORT_NONE), mRegionp(NULL), - mUse360Mode(false), + mInterestListMode(LLViewerRegion::IL_MODE_DEFAULT), mAgentOriginGlobal(), mPositionGlobal(), @@ -904,10 +904,9 @@ void LLAgent::capabilityReceivedCallback(const LLUUID ®ion_id, LLViewerRegion LLAppViewer::instance()->updateNameLookupUrl(regionp); } - if (gAgent.getInterestList360Mode()) + if (gAgent.getInterestListMode() == LLViewerRegion::IL_MODE_360) { - const bool use_360_mode = true; - gAgent.changeInterestListMode(use_360_mode); + gAgent.changeInterestListMode(LLViewerRegion::IL_MODE_360); } } } @@ -2932,22 +2931,29 @@ void LLAgent::processMaturityPreferenceFromServer(const LLSD &result, U8 perferr // (hopefully) small period of time while the full contents resolves. // Pass in a flag to ask the simulator/interest list to "send everything" or // not (the default mode) -void LLAgent::changeInterestListMode(bool use_360_mode) +void LLAgent::changeInterestListMode(const std::string &new_mode) { - mUse360Mode = use_360_mode; - - // Change interest list mode for all regions. If they are already set for the current mode, - // the setting will have no effect. - for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); - iter != LLWorld::getInstance()->getRegionList().end(); - ++iter) + if (new_mode != mInterestListMode) { - LLViewerRegion *regionp = *iter; - if (regionp && regionp->isAlive() && regionp->capabilitiesReceived()) + mInterestListMode = new_mode; + + // Change interest list mode for all regions. If they are already set for the current mode, + // the setting will have no effect. + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); + ++iter) { - regionp->setInterestList360Mode(mUse360Mode); + LLViewerRegion *regionp = *iter; + if (regionp && regionp->isAlive() && regionp->capabilitiesReceived()) + { + regionp->setInterestListMode(mInterestListMode); + } } } + else + { + LL_DEBUGS("360Capture") << "Agent interest list mode is already set to " << mInterestListMode << LL_ENDL; + } } diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h index ef8df13fc6..b8ac47827a 100644 --- a/indra/newview/llagent.h +++ b/indra/newview/llagent.h @@ -295,13 +295,14 @@ public: void removeRegionChangedCallback(boost::signals2::connection callback); - void changeInterestListMode(bool use_360_mode); - bool getInterestList360Mode() const { return mUse360Mode; } + void changeInterestListMode(const std::string & new_mode); + const std::string & getInterestListMode() const { return mInterestListMode; } private: LLViewerRegion *mRegionp; region_changed_signal_t mRegionChangedSignal; - bool mUse360Mode; + + std::string mInterestListMode; // How agent wants regions to send updates //-------------------------------------------------------------------- // History diff --git a/indra/newview/llfloater360capture.cpp b/indra/newview/llfloater360capture.cpp index a0889abe2d..2c638fa959 100644 --- a/indra/newview/llfloater360capture.cpp +++ b/indra/newview/llfloater360capture.cpp @@ -64,11 +64,10 @@ LLFloater360Capture::LLFloater360Capture(const LLSD& key) // such time as we ask it not to (the dtor). If we crash or // otherwise, exit before this is turned off, the Simulator // will take care of cleaning up for us. - mWasIn360Mode = gAgent.getInterestList360Mode(); + mStartILMode = gAgent.getInterestListMode(); // send everything to us for as long as this floater is open - const bool use_360_mode = true; - gAgent.changeInterestListMode(use_360_mode); + gAgent.changeInterestListMode(LLViewerRegion::IL_MODE_360); } LLFloater360Capture::~LLFloater360Capture() @@ -86,9 +85,9 @@ LLFloater360Capture::~LLFloater360Capture() // list updates. if (!LLApp::isExiting() && gSavedSettings.getBOOL("360CaptureUseInterestListCap") && - mWasIn360Mode != gAgent.getInterestList360Mode()) + mStartILMode != gAgent.getInterestListMode()) { - gAgent.changeInterestListMode(mWasIn360Mode); + gAgent.changeInterestListMode(mStartILMode); } } diff --git a/indra/newview/llfloater360capture.h b/indra/newview/llfloater360capture.h index 61316c65f3..3fb2c7f3c7 100644 --- a/indra/newview/llfloater360capture.h +++ b/indra/newview/llfloater360capture.h @@ -92,7 +92,7 @@ class LLFloater360Capture: LLPointer mRawImages[6]; - bool mWasIn360Mode; + std::string mStartILMode; }; #endif // LL_FLOATER_360CAPTURE_H diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 23abd0fe16..fe6676759d 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -1302,8 +1302,14 @@ public: bool handleEvent(const LLSD &userdata) { // Toggle the mode - regions will get updated - bool new_mode = !gAgent.getInterestList360Mode(); - gAgent.changeInterestListMode(new_mode); + if (gAgent.getInterestListMode() == LLViewerRegion::IL_MODE_360) + { + gAgent.changeInterestListMode(LLViewerRegion::IL_MODE_DEFAULT); + } + else + { + gAgent.changeInterestListMode(LLViewerRegion::IL_MODE_360); + } return true; } }; @@ -1312,7 +1318,7 @@ class LLAdvancedCheckInterestList360Mode : public view_listener_t { bool handleEvent(const LLSD& userdata) { - return gAgent.getInterestList360Mode(); + return (gAgent.getInterestListMode() == LLViewerRegion::IL_MODE_360); } }; diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 7abd77505d..9c2dc3c761 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -104,6 +104,9 @@ S32 LLViewerRegion::sLastCameraUpdated = 0; S32 LLViewerRegion::sNewObjectCreationThrottle = -1; LLViewerRegion::vocache_entry_map_t LLViewerRegion::sRegionCacheCleanup; +const std::string LLViewerRegion::IL_MODE_DEFAULT = "default"; +const std::string LLViewerRegion::IL_MODE_360 = "360"; + typedef std::map CapabilityMap; static void log_capabilities(const CapabilityMap &capmap); @@ -647,7 +650,7 @@ LLViewerRegion::LLViewerRegion(const U64 &handle, mPaused(FALSE), mRegionCacheHitCount(0), mRegionCacheMissCount(0), - mUse360Mode(false) + mInterestListMode(IL_MODE_DEFAULT) { mWidth = region_width_meters; mImpl->mOriginGlobal = from_region_handle(handle); @@ -3286,7 +3289,7 @@ void LLViewerRegion::setCapabilitiesReceived(bool received) mCapabilitiesReceivedSignal.disconnect_all_slots(); // Set the region to the desired interest list mode - setInterestList360Mode(gAgent.getInterestList360Mode()); + setInterestListMode(gAgent.getInterestListMode()); } } @@ -3339,22 +3342,21 @@ bool LLViewerRegion::requestGetCapability(const std::string &capName, httpCallba } -void LLViewerRegion::setInterestList360Mode(bool use_360_mode) +void LLViewerRegion::setInterestListMode(const std::string &new_mode) { - if (use_360_mode != mUse360Mode) + if (new_mode != mInterestListMode) { - LLSD body; - mUse360Mode = use_360_mode; + mInterestListMode = new_mode; - if (mUse360Mode) - { - body["mode"] = LLSD::String("360"); - } - else - { - body["mode"] = LLSD::String("default"); - } + if (mInterestListMode != std::string(IL_MODE_DEFAULT) && mInterestListMode != std::string(IL_MODE_360)) + { + LL_WARNS("360Capture") << "Region " << getRegionID() << " setInterestListMode() invalid interest list mode: " + << mInterestListMode << ", setting to default" << LL_ENDL; + mInterestListMode = IL_MODE_DEFAULT; + } + LLSD body; + body["mode"] = mInterestListMode; if (requestPostCapability("InterestList", body, [](const LLSD &response) { LL_DEBUGS("360Capture") << "InterestList capability responded: \n" @@ -3375,13 +3377,13 @@ void LLViewerRegion::setInterestList360Mode(bool use_360_mode) else { LL_DEBUGS("360Capture") << "Region " << getRegionID() << "No change, skipping Interest List mode POST to " - << (use_360_mode ? "360" : "default") << " mode" << LL_ENDL; + << new_mode << " mode" << LL_ENDL; } } -LLSpatialPartition* LLViewerRegion::getSpatialPartition(U32 type) +LLSpatialPartition *LLViewerRegion::getSpatialPartition(U32 type) { if (type < mImpl->mObjectPartition.size() && type < PARTITION_VO_CACHE) { diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 3da0c376d3..6308058f63 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -487,12 +487,13 @@ public: }; typedef std::set region_priority_list_t; - void setInterestList360Mode(bool use_360_mode); - bool getInterestList360Mode() const { return mUse360Mode; } + void setInterestListMode(const std::string & new_mode); + const std::string & getInterestListMode() const { return mInterestListMode; } + static const std::string IL_MODE_DEFAULT; + static const std::string IL_MODE_360; - -private: + private: static S32 sNewObjectCreationThrottle; LLViewerRegionImpl * mImpl; LLFrameTimer mRegionTimer; @@ -591,7 +592,7 @@ private: LLFrameTimer mRenderInfoReportTimer; // how the server interest list works - bool mUse360Mode; + std::string mInterestListMode; }; inline BOOL LLViewerRegion::getRegionProtocol(U64 protocol) const -- cgit v1.2.3 From 74687f270545ededb77f29a7409f64303dcb2e2d Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 15 May 2023 23:05:39 +0300 Subject: SL-19643 Shutdown and startup should not warn about attachments. Initial attachments usually are not 'expected', shutdown is expected to detach everything --- indra/newview/llattachmentsmgr.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/newview/llattachmentsmgr.cpp b/indra/newview/llattachmentsmgr.cpp index d43048a8b6..1feefc3ef8 100644 --- a/indra/newview/llattachmentsmgr.cpp +++ b/indra/newview/llattachmentsmgr.cpp @@ -31,6 +31,7 @@ #include "llagent.h" #include "llappearancemgr.h" #include "llinventorymodel.h" +#include "llstartup.h" #include "lltooldraganddrop.h" // pack_permissions_slam #include "llviewerinventory.h" #include "llviewerregion.h" @@ -372,7 +373,7 @@ void LLAttachmentsMgr::onAttachmentArrived(const LLUUID& inv_item_id) { LLTimer timer; bool expected = mAttachmentRequests.getTime(inv_item_id, timer); - if (!expected) + if (!expected && LLStartUp::getStartupState() > STATE_WEARABLES_WAIT) { LLInventoryItem *item = gInventory.getItem(inv_item_id); LL_WARNS() << "ATT Attachment was unexpected or arrived after " << MAX_ATTACHMENT_REQUEST_LIFETIME << " seconds: " @@ -411,11 +412,15 @@ void LLAttachmentsMgr::onDetachCompleted(const LLUUID& inv_item_id) LL_DEBUGS("Avatar") << "ATT all detach requests have completed" << LL_ENDL; } } - else + else if (!LLApp::isExiting()) { LL_WARNS() << "ATT unexpected detach for " << (item ? item->getName() : "UNKNOWN") << " id " << inv_item_id << LL_ENDL; } + else + { + LL_DEBUGS("Avatar") << "ATT detach on shutdown for " << (item ? item->getName() : "UNKNOWN") << " " << inv_item_id << LL_ENDL; + } LL_DEBUGS("Avatar") << "ATT detached item flagging as questionable for COF link checking " << (item ? item->getName() : "UNKNOWN") << " id " << inv_item_id << LL_ENDL; -- cgit v1.2.3 From 2dca661b6a7b40c1dcf94a08f5304df277542597 Mon Sep 17 00:00:00 2001 From: simon Date: Mon, 15 May 2023 23:24:00 +0100 Subject: SL-19676 - more IL control, added Reset Interest List Debug menu command --- indra/llmessage/llcorehttputil.cpp | 42 ++++++++++++++++++++++ indra/llmessage/llcorehttputil.h | 4 +++ indra/newview/llviewermenu.cpp | 31 ++++++++++++++-- indra/newview/llviewerregion.cpp | 29 +++++++++++++++ indra/newview/llviewerregion.h | 3 ++ indra/newview/skins/default/xui/en/menu_viewer.xml | 27 ++++++++------ 6 files changed, 123 insertions(+), 13 deletions(-) (limited to 'indra') diff --git a/indra/llmessage/llcorehttputil.cpp b/indra/llmessage/llcorehttputil.cpp index c8c9280029..6b9ce54c92 100644 --- a/indra/llmessage/llcorehttputil.cpp +++ b/indra/llmessage/llcorehttputil.cpp @@ -1336,6 +1336,48 @@ void HttpCoroutineAdapter::trivialPostCoro(std::string url, LLCore::HttpRequest: } +/*static*/ +void HttpCoroutineAdapter::callbackHttpDel(const std::string &url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success, + completionCallback_t failure) +{ + LLCoros::instance().launch("HttpCoroutineAdapter::genericDelCoro", + boost::bind(&HttpCoroutineAdapter::trivialDelCoro, url, policyId, success, failure)); +} + +/*static*/ +void HttpCoroutineAdapter::trivialDelCoro(std::string url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success, + completionCallback_t failure) +{ + LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t httpAdapter(new LLCoreHttpUtil::HttpCoroutineAdapter("genericDelCoro", policyId)); + LLCore::HttpRequest::ptr_t httpRequest(new LLCore::HttpRequest); + LLCore::HttpOptions::ptr_t httpOpts(new LLCore::HttpOptions); + + httpOpts->setWantHeaders(true); + + LL_INFOS("HttpCoroutineAdapter", "genericDelCoro") << "Generic DEL for " << url << LL_ENDL; + + LLSD result = httpAdapter->deleteAndSuspend(httpRequest, url, httpOpts); + + LLSD httpResults = result[LLCoreHttpUtil::HttpCoroutineAdapter::HTTP_RESULTS]; + LLCore::HttpStatus status = LLCoreHttpUtil::HttpCoroutineAdapter::getStatusFromLLSD(httpResults); + + if (!status) + { + if (failure) + { + failure(httpResults); + } + } + else + { + if (success) + { + success(result); + } + } +} + + } // end namespace LLCoreHttpUtil diff --git a/indra/llmessage/llcorehttputil.h b/indra/llmessage/llcorehttputil.h index 6f0b865f83..8df1425f2a 100644 --- a/indra/llmessage/llcorehttputil.h +++ b/indra/llmessage/llcorehttputil.h @@ -608,6 +608,9 @@ public: callbackHttpPost(url, LLCore::HttpRequest::DEFAULT_POLICY_ID, postData, success, failure); } + static void callbackHttpDel(const std::string &url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success = NULL, + completionCallback_t failure = NULL); + /// Generic Get and post routines for HTTP via coroutines. /// These static methods do all required setup for the GET or POST operation. /// When the operation completes successfully they will put the success message in the log at INFO level, @@ -669,6 +672,7 @@ private: static void trivialGetCoro(std::string url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success, completionCallback_t failure); static void trivialPostCoro(std::string url, LLCore::HttpRequest::policy_t policyId, LLSD postData, completionCallback_t success, completionCallback_t failure); + static void trivialDelCoro(std::string url, LLCore::HttpRequest::policy_t policyId, completionCallback_t success, completionCallback_t failure); void checkDefaultHeaders(LLCore::HttpHeaders::ptr_t &headers); diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index fe6676759d..c762e796aa 100644 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -122,6 +122,7 @@ #include "llviewerstatsrecorder.h" #include "llvoavatarself.h" #include "llvoicevivox.h" +#include "llworld.h" #include "llworldmap.h" #include "pipeline.h" #include "llviewerjoystick.h" @@ -333,6 +334,7 @@ void handle_debug_avatar_textures(void*); void handle_grab_baked_texture(void*); BOOL enable_grab_baked_texture(void*); void handle_dump_region_object_cache(void*); +void handle_reset_interest_lists(void *); BOOL enable_save_into_task_inventory(void*); @@ -1346,6 +1348,14 @@ class LLAdvancedCheckStatsRecorder : public view_listener_t } }; +class LLAdvancedResetInterestLists : public view_listener_t +{ + bool handleEvent(const LLSD &userdata) + { // Reset all region interest lists + handle_reset_interest_lists(NULL); + return true; + } +}; class LLAdvancedBuyCurrencyTest : public view_listener_t @@ -3892,6 +3902,22 @@ void handle_dump_region_object_cache(void*) } } +void handle_reset_interest_lists(void *) +{ + // Check all regions and reset their interest list + for (LLWorld::region_list_t::const_iterator iter = LLWorld::getInstance()->getRegionList().begin(); + iter != LLWorld::getInstance()->getRegionList().end(); + ++iter) + { + LLViewerRegion *regionp = *iter; + if (regionp && regionp->isAlive() && regionp->capabilitiesReceived()) + { + regionp->resetInterestList(); + } + } +} + + void handle_dump_focus() { LLUICtrl *ctrl = dynamic_cast(gFocusMgr.getKeyboardFocus()); @@ -9452,10 +9478,11 @@ void initialize_menus() // Advanced > World view_listener_t::addMenu(new LLAdvancedDumpScriptedCamera(), "Advanced.DumpScriptedCamera"); view_listener_t::addMenu(new LLAdvancedDumpRegionObjectCache(), "Advanced.DumpRegionObjectCache"); - view_listener_t::addMenu(new LLAdvancedToggleInterestList360Mode(), "Advanced.ToggleInterestList360Mode"); - view_listener_t::addMenu(new LLAdvancedCheckInterestList360Mode(), "Advanced.CheckInterestList360Mode"); view_listener_t::addMenu(new LLAdvancedToggleStatsRecorder(), "Advanced.ToggleStatsRecorder"); view_listener_t::addMenu(new LLAdvancedCheckStatsRecorder(), "Advanced.CheckStatsRecorder"); + view_listener_t::addMenu(new LLAdvancedToggleInterestList360Mode(), "Advanced.ToggleInterestList360Mode"); + view_listener_t::addMenu(new LLAdvancedCheckInterestList360Mode(), "Advanced.CheckInterestList360Mode"); + view_listener_t::addMenu(new LLAdvancedResetInterestLists(), "Advanced.ResetInterestLists"); // Advanced > UI commit.add("Advanced.WebBrowserTest", boost::bind(&handle_web_browser_test, _2)); // sigh! this one opens the MEDIA browser diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp index 9c2dc3c761..5254d766a8 100755 --- a/indra/newview/llviewerregion.cpp +++ b/indra/newview/llviewerregion.cpp @@ -3341,6 +3341,21 @@ bool LLViewerRegion::requestGetCapability(const std::string &capName, httpCallba return true; } +bool LLViewerRegion::requestDelCapability(const std::string &capName, httpCallback_t cbSuccess, httpCallback_t cbFailure) +{ + std::string url; + + url = getCapability(capName); + + if (url.empty()) + { + LL_WARNS("Region") << "Could not retrieve region " << getRegionID() << " DEL capability \"" << capName << "\"" << LL_ENDL; + return false; + } + + LLCoreHttpUtil::HttpCoroutineAdapter::callbackHttpDel(url, gAgent.getAgentPolicy(), cbSuccess, cbFailure); + return true; +} void LLViewerRegion::setInterestListMode(const std::string &new_mode) { @@ -3382,6 +3397,20 @@ void LLViewerRegion::setInterestListMode(const std::string &new_mode) } +void LLViewerRegion::resetInterestList() +{ + if (requestDelCapability("InterestList", [](const LLSD &response) { + LL_DEBUGS("360Capture") << "InterestList capability DEL responded: \n" << ll_pretty_print_sd(response) << LL_ENDL; + })) + { + LL_DEBUGS("360Capture") << "Region " << getRegionID() << " Successfully reset InterestList capability" << LL_ENDL; + } + else + { + LL_WARNS("360Capture") << "Region " << getRegionID() << " Unable to DEL InterestList capability request" << LL_ENDL; + } +} + LLSpatialPartition *LLViewerRegion::getSpatialPartition(U32 type) { diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h index 6308058f63..6956e9eb08 100644 --- a/indra/newview/llviewerregion.h +++ b/indra/newview/llviewerregion.h @@ -287,6 +287,7 @@ public: httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL); bool requestGetCapability(const std::string &capName, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL); + bool requestDelCapability(const std::string &capName, httpCallback_t cbSuccess = NULL, httpCallback_t cbFailure = NULL); /// implements LLCapabilityProvider /*virtual*/ const LLHost& getHost() const; @@ -490,6 +491,8 @@ public: void setInterestListMode(const std::string & new_mode); const std::string & getInterestListMode() const { return mInterestListMode; } + void resetInterestList(); + static const std::string IL_MODE_DEFAULT; static const std::string IL_MODE_360; diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 07471ed5bb..51ac3d17ab 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3485,16 +3485,6 @@ function="World.EnvPreset" - - - - - @@ -3503,7 +3493,22 @@ function="World.EnvPreset" - + + + + + + + + Date: Tue, 16 May 2023 02:00:51 +0300 Subject: SL-19602 Alt-Zoom overcompensates for z pelvis fixup Alt zoom was pointing near ground instead of agent's actual position --- indra/newview/llagentcamera.cpp | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 77131efd75..2cf86cb001 100644 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -401,10 +401,15 @@ LLVector3 LLAgentCamera::calcFocusOffset(LLViewerObject *object, LLVector3 origi // if is avatar - don't do any funk heuristics to position the focal point // see DEV-30589 - if (object->isAvatar() || (object->isAnimatedObject() && object->getControlAvatar())) + if ((object->isAvatar() && !object->isRoot()) || (object->isAnimatedObject() && object->getControlAvatar())) { return original_focus_point - obj_pos; } + if (object->isAvatar()) + { + LLVOAvatar* av = object->asAvatar(); + return original_focus_point - av->getCharacterPosition(); + } LLQuaternion inv_obj_rot = ~obj_rot; // get inverse of rotation LLVector3 object_extents = object->getScale(); -- cgit v1.2.3 From 474012abd603f7e7963344fcd9d14cdc7db7bb9a Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 16 May 2023 18:03:57 +0300 Subject: SL-19686 reduce delay when switching between folders --- indra/llui/llfolderviewitem.cpp | 5 +++++ indra/llui/llfolderviewitem.h | 1 + indra/newview/llinventorypanel.cpp | 4 ++-- 3 files changed, 8 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 227f1d79e4..bc7a2cc3f0 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -1769,6 +1769,11 @@ BOOL LLFolderViewFolder::isRemovable() return TRUE; } +void LLFolderViewFolder::destroyRoot() +{ + delete this; +} + // this is an internal method used for adding items to folders. void LLFolderViewFolder::addItem(LLFolderViewItem* item) { diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index b6437ab61d..232780ccae 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -394,6 +394,7 @@ public: // destroys this folder, and all children virtual void destroyView(); + void destroyRoot(); // whether known children are fully loaded (arrange sets to true) virtual bool isFolderComplete() { return mIsFolderComplete; } diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index ca5abfd661..edcd45db79 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -2195,8 +2195,8 @@ void LLInventorySingleFolderPanel::updateSingleFolderRoot() LLUUID root_id = mFolderID; if (mFolderRoot.get()) { - removeItemID(getRootFolderID()); - mFolderRoot.get()->destroyView(); + mItemMap.clear(); + mFolderRoot.get()->destroyRoot(); } mCommitCallbackRegistrar.pushScope(); -- cgit v1.2.3 From 55fb718598b474680ab66cdc667a9e779fb7807a Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 16 May 2023 18:34:32 +0300 Subject: SL-19701 open shared folder instead of just selecting it --- indra/newview/llviewermessage.cpp | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 78241a7c71..b359ef6df4 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1544,7 +1544,14 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam const LLInventoryObject *obj = gInventory.getObject(obj_id); if (obj && obj->getParentUUID().notNull()) { - LLPanelMainInventory::newFolderWindow(obj->getParentUUID(), obj_id); + if (obj->getActualType() == LLAssetType::AT_CATEGORY) + { + LLPanelMainInventory::newFolderWindow(obj_id); + } + else + { + LLPanelMainInventory::newFolderWindow(obj->getParentUUID(), obj_id); + } } } else -- cgit v1.2.3 From 86fc10f710ced7d2e7b1ddf01eef945aafd60e8b Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Tue, 16 May 2023 22:36:26 +0300 Subject: SL-19717 don't open new floater when taking an object from in-world or copying content --- indra/newview/llviewermessage.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index b359ef6df4..3adb5db3bc 100644 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -1539,7 +1539,7 @@ void open_inventory_offer(const uuid_vec_t& objects, const std::string& from_nam //////////////////////////////////////////////////////////////////////////////// static LLUICachedControl find_original_new_floater("FindOriginalOpenWindow", false); //show in a new single-folder window - if(find_original_new_floater) + if(find_original_new_floater && !from_name.empty()) { const LLInventoryObject *obj = gInventory.getObject(obj_id); if (obj && obj->getParentUUID().notNull()) -- cgit v1.2.3 From 07dc391ab76a8860d04bfb001cdc686cd576663d Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 17 May 2023 00:00:44 +0300 Subject: SL-19720 Fix missing buttons for replacing body parts --- indra/newview/llwearableitemslist.cpp | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp index 89b74ae962..8681f7c14e 100644 --- a/indra/newview/llwearableitemslist.cpp +++ b/indra/newview/llwearableitemslist.cpp @@ -104,8 +104,6 @@ BOOL LLPanelWearableOutfitItem::postBuild() { LLPanelWearableListItem::postBuild(); - LLViewerInventoryItem* inv_item = getItem(); - mShowWidgets &= (inv_item->getType() != LLAssetType::AT_BODYPART); if(mShowWidgets) { addWidgetToRightSide("add_wearable"); @@ -208,7 +206,12 @@ void LLPanelWearableOutfitItem::updateItem(const std::string& name, if(mShowWidgets) { setShowWidget("add_wearable", !is_worn); - setShowWidget("remove_wearable", is_worn); + + // Body parts can't be removed, only replaced + LLViewerInventoryItem* inv_item = getItem(); + bool show_remove = is_worn && inv_item && (inv_item->getType() != LLAssetType::AT_BODYPART); + setShowWidget("remove_wearable", show_remove); + if(mHovered) { setWidgetsVisible(true); -- cgit v1.2.3 From 784436a5b89062df69251c9ac28904f06a018011 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Wed, 17 May 2023 18:38:23 +0300 Subject: SL-19721 use LLOutfitObserver to handle cof changes --- indra/newview/llinventorygallery.cpp | 4 ++-- indra/newview/lloutfitslist.cpp | 3 +-- indra/newview/llpanelwearing.cpp | 13 ++----------- indra/newview/llpanelwearing.h | 1 - 4 files changed, 5 insertions(+), 16 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 9c7e96e97e..f97cb9dbf4 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -45,6 +45,7 @@ #include "llfriendcard.h" #include "llgesturemgr.h" #include "llmarketplacefunctions.h" +#include "lloutfitobserver.h" #include "lltrans.h" #include "llviewerassettype.h" #include "llviewermessage.h" @@ -244,8 +245,7 @@ void LLInventoryGallery::updateRootFolder() } } - const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); - mCategoriesObserver->addCategory(cof, boost::bind(&LLInventoryGallery::onCOFChanged, this)); + LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLInventoryGallery::onCOFChanged, this)); if (!mGalleryCreated) { diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp index fe15d21e36..5c7792b0df 100644 --- a/indra/newview/lloutfitslist.cpp +++ b/indra/newview/lloutfitslist.cpp @@ -122,9 +122,8 @@ void LLOutfitsList::onOpen(const LLSD& info) { if (!mIsInitialized) { - const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT); // Start observing changes in Current Outfit category. - mCategoriesObserver->addCategory(cof, boost::bind(&LLOutfitsList::onCOFChanged, this)); + LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLOutfitsList::onCOFChanged, this)); } LLOutfitListBase::onOpen(info); diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp index 3347c40687..062150dc56 100644 --- a/indra/newview/llpanelwearing.cpp +++ b/indra/newview/llpanelwearing.cpp @@ -40,6 +40,7 @@ #include "llinventorymodel.h" #include "llinventoryobserver.h" #include "llmenubutton.h" +#include "lloutfitobserver.h" #include "llscrolllistctrl.h" #include "llviewermenu.h" #include "llviewerregion.h" @@ -218,8 +219,6 @@ LLPanelWearing::LLPanelWearing() , mIsInitialized(false) , mAttachmentsChangedConnection() { - mCategoriesObserver = new LLInventoryCategoriesObserver(); - mGearMenu = new LLWearingGearMenu(this); mContextMenu = new LLWearingContextMenu(); mAttachmentsMenu = new LLTempAttachmentsContextMenu(this); @@ -231,12 +230,6 @@ LLPanelWearing::~LLPanelWearing() delete mContextMenu; delete mAttachmentsMenu; - if (gInventory.containsObserver(mCategoriesObserver)) - { - gInventory.removeObserver(mCategoriesObserver); - } - delete mCategoriesObserver; - if (mAttachmentsChangedConnection.connected()) { mAttachmentsChangedConnection.disconnect(); @@ -281,10 +274,8 @@ void LLPanelWearing::onOpen(const LLSD& /*info*/) if (!category) return; - gInventory.addObserver(mCategoriesObserver); - // Start observing changes in Current Outfit category. - mCategoriesObserver->addCategory(cof, boost::bind(&LLWearableItemsList::updateList, mCOFItemsList, cof)); + LLOutfitObserver::instance().addCOFChangedCallback(boost::bind(&LLWearableItemsList::updateList, mCOFItemsList, cof)); // Fetch Current Outfit contents and refresh the list to display // initially fetched items. If not all items are fetched now diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h index 715404a457..18e543eec6 100644 --- a/indra/newview/llpanelwearing.h +++ b/indra/newview/llpanelwearing.h @@ -90,7 +90,6 @@ private: void getAttachmentLimitsCoro(std::string url); - LLInventoryCategoriesObserver* mCategoriesObserver; LLWearableItemsList* mCOFItemsList; LLScrollListCtrl* mTempItemsList; LLWearingGearMenu* mGearMenu; -- cgit v1.2.3 From c40ee46eb19c67d139e535ae262acc59c05ee315 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 17 May 2023 21:20:41 +0300 Subject: SL-19719 Fix packaging related warnings --- .../installers/windows/installer_template.nsi | 17 +---------------- indra/newview/installers/windows/lang_zh.nsi | Bin 10144 -> 10154 bytes 2 files changed, 1 insertion(+), 16 deletions(-) (limited to 'indra') diff --git a/indra/newview/installers/windows/installer_template.nsi b/indra/newview/installers/windows/installer_template.nsi index 60e26274cb..ed37f541c8 100644 --- a/indra/newview/installers/windows/installer_template.nsi +++ b/indra/newview/installers/windows/installer_template.nsi @@ -507,7 +507,7 @@ Call un.UserSettingsFiles SectionEnd ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Make sure the user can install +;; Make sure the user can install/uninstall ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; Function CheckIfAdministrator DetailPrint $(CheckAdministratorInstDP) @@ -521,21 +521,6 @@ lbl_is_admin: FunctionEnd -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -;; Make sure the user can uninstall -;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; -Function un.CheckIfAdministrator - DetailPrint $(CheckAdministratorUnInstDP) - UserInfo::GetAccountType - Pop $R0 - StrCmp $R0 "Admin" lbl_is_admin - MessageBox MB_OK $(CheckAdministratorUnInstMB) - Quit -lbl_is_admin: - Return - -FunctionEnd - ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;; Function CheckWillUninstallV2 ;; diff --git a/indra/newview/installers/windows/lang_zh.nsi b/indra/newview/installers/windows/lang_zh.nsi index 7922d9df52..0985663041 100755 Binary files a/indra/newview/installers/windows/lang_zh.nsi and b/indra/newview/installers/windows/lang_zh.nsi differ -- cgit v1.2.3 From 706d8f17273f4718a2adf5a43c1de5a1dc08abad Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 18 May 2023 22:22:07 +0300 Subject: SL-19732 Fix folder's thumbnail from sticking over folder's content --- indra/llui/llfolderview.cpp | 2 +- indra/llui/llfolderview.h | 2 +- indra/llui/llfolderviewitem.cpp | 2 +- indra/llui/llfolderviewitem.h | 8 ++++---- indra/newview/llinventorypanel.cpp | 12 ++++++++++-- 5 files changed, 17 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 9fa8a84fa4..bf6f2436b1 100644 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -2064,7 +2064,7 @@ LLFolderViewItem* LLFolderView::getNextUnselectedItem() return new_selection; } -S32 LLFolderView::getItemHeight() +S32 LLFolderView::getItemHeight() const { if(!hasVisibleChildren()) { diff --git a/indra/llui/llfolderview.h b/indra/llui/llfolderview.h index 22b8c475ec..73028f31b1 100644 --- a/indra/llui/llfolderview.h +++ b/indra/llui/llfolderview.h @@ -136,7 +136,7 @@ public: // Find width and height of this object and its children. Also // makes sure that this view and its children are the right size. virtual S32 arrange( S32* width, S32* height ); - virtual S32 getItemHeight(); + virtual S32 getItemHeight() const; void arrangeAll() { mArrangeGeneration++; } S32 getArrangeGeneration() { return mArrangeGeneration; } diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index bc7a2cc3f0..4fbfa7ed79 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -416,7 +416,7 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height ) return *height; } -S32 LLFolderViewItem::getItemHeight() +S32 LLFolderViewItem::getItemHeight() const { return mItemHeight; } diff --git a/indra/llui/llfolderviewitem.h b/indra/llui/llfolderviewitem.h index c8d44de474..5c2a1ecff0 100644 --- a/indra/llui/llfolderviewitem.h +++ b/indra/llui/llfolderviewitem.h @@ -178,7 +178,7 @@ public: // Finds width and height of this object and it's children. Also // makes sure that this view and it's children are the right size. virtual S32 arrange( S32* width, S32* height ); - virtual S32 getItemHeight(); + virtual S32 getItemHeight() const; virtual S32 getLabelXPos(); S32 getIconPad(); S32 getTextPad(); @@ -217,9 +217,9 @@ public: void setIsCurSelection(BOOL select) { mIsCurSelection = select; } - BOOL getIsCurSelection() { return mIsCurSelection; } + BOOL getIsCurSelection() const { return mIsCurSelection; } - BOOL hasVisibleChildren() { return mHasVisibleChildren; } + BOOL hasVisibleChildren() const { return mHasVisibleChildren; } // true if object can't have children virtual bool isFolderComplete() { return true; } @@ -268,7 +268,7 @@ public: virtual LLFolderView* getRoot(); virtual const LLFolderView* getRoot() const; BOOL isDescendantOf( const LLFolderViewFolder* potential_ancestor ); - S32 getIndentation() { return mIndentation; } + S32 getIndentation() const { return mIndentation; } virtual BOOL passedFilter(S32 filter_generation = -1); virtual BOOL isPotentiallyVisible(S32 filter_generation = -1); diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index edcd45db79..c5d3fa3f7a 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1311,10 +1311,18 @@ BOOL LLInventoryPanel::handleToolTip(S32 x, S32 y, MASK mask) params["inv_type"] = vm_item_p->getInventoryType(); params["thumbnail_id"] = vm_item_p->getThumbnailUUID(); params["item_id"] = vm_item_p->getUUID(); - + + // tooltip should only show over folder, but screen + // rect includes items under folder as well + LLRect actionable_rect = hover_item_p->calcScreenRect(); + if (hover_item_p->isOpen() && hover_item_p->hasVisibleChildren()) + { + actionable_rect.mBottom = actionable_rect.mTop - hover_item_p->getItemHeight(); + } + LLToolTipMgr::instance().show(LLToolTip::Params() .message(hover_item_p->getToolTip()) - .sticky_rect(hover_item_p->calcScreenRect()) + .sticky_rect(actionable_rect) .delay_time(LLView::getTooltipTimeout()) .create_callback(boost::bind(&LLInspectTextureUtil::createInventoryToolTip, _1)) .create_params(params)); -- cgit v1.2.3 From 100ace48f1cd64a364179c06900465209aac4945 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Thu, 18 May 2023 23:22:58 +0300 Subject: SL-19686 don't build gallery items without thumbnails in combination view --- indra/newview/llinventorygallery.cpp | 65 ++++++++++++++++++++++++++++++++++-- indra/newview/llinventorygallery.h | 4 +++ 2 files changed, 66 insertions(+), 3 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index f97cb9dbf4..18a7068b66 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -200,6 +200,14 @@ void LLInventoryGallery::updateRootFolder() delete mCategoriesObserver; mCategoriesObserver = new LLInventoryCategoriesObserver(); + + if (gInventory.containsObserver(mThumbnailsObserver)) + { + gInventory.removeObserver(mThumbnailsObserver); + } + delete mThumbnailsObserver; + mThumbnailsObserver = new LLThumbnailsObserver(); + gInventory.addObserver(mThumbnailsObserver); } { mRootChangedSignal(); @@ -699,7 +707,11 @@ void LLInventoryGallery::updateAddedItem(LLUUID item_id) LL_WARNS("InventoryGallery") << "Failed to find item: " << item_id << LL_ENDL; return; } - + if(!mFilter->checkAgainstFilterThumbnails(item_id)) + { + mThumbnailsObserver->addSkippedItem(item_id, boost::bind(&LLInventoryGallery::onThumbnailAdded, this, item_id)); + return; + } std::string name = obj->getName(); LLUUID thumbnail_id = obj->getThumbnailUUID();; LLInventoryType::EType inventory_type(LLInventoryType::IT_CATEGORY); @@ -816,6 +828,15 @@ void LLInventoryGallery::updateItemThumbnail(LLUUID item_id) } } +void LLInventoryGallery::onThumbnailAdded(LLUUID item_id) +{ + if((mItemMap.count(item_id) == 0) && mFilter->checkAgainstFilterThumbnails(item_id)) + { + updateAddedItem(item_id); + reArrangeRows(); + } +} + void LLInventoryGallery::showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& item_id) { if (mInventoryGalleryMenu && item_id.notNull()) @@ -1525,9 +1546,33 @@ void LLInventoryGalleryItem::updateNameText() void LLThumbnailsObserver::changed(U32 mask) { - if (!mItemMap.size()) - return; std::vector deleted_ids; + for (item_map_t::iterator iter = mSkippedItems.begin(); + iter != mSkippedItems.end(); + ++iter) + { + const LLUUID& obj_id = (*iter).first; + LLItemData& data = (*iter).second; + + LLInventoryObject* obj = gInventory.getObject(obj_id); + if (!obj) + { + deleted_ids.push_back(obj_id); + continue; + } + + const LLUUID thumbnail_id = obj->getThumbnailUUID(); + if (data.mThumbnailID != thumbnail_id) + { + data.mThumbnailID = thumbnail_id; + data.mCallback(); + } + } + for (std::vector::iterator deleted_id = deleted_ids.begin(); deleted_id != deleted_ids.end(); ++deleted_id) + { + removeSkippedItem(*deleted_id); + } + deleted_ids.clear(); for (item_map_t::iterator iter = mItemMap.begin(); iter != mItemMap.end(); @@ -1569,11 +1614,25 @@ bool LLThumbnailsObserver::addItem(const LLUUID& obj_id, callback_t cb) return false; } +void LLThumbnailsObserver::addSkippedItem(const LLUUID& obj_id, callback_t cb) +{ + LLInventoryObject* obj = gInventory.getObject(obj_id); + if (obj) + { + mSkippedItems.insert(item_map_value_t(obj_id, LLItemData(obj_id, obj->getThumbnailUUID(), cb))); + } +} + void LLThumbnailsObserver::removeItem(const LLUUID& obj_id) { mItemMap.erase(obj_id); } +void LLThumbnailsObserver::removeSkippedItem(const LLUUID& obj_id) +{ + mSkippedItems.erase(obj_id); +} + //----------------------------- // Helper drag&drop functions //----------------------------- diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index f7065afdae..473d1a1db4 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -89,6 +89,7 @@ public: void updateRemovedItem(LLUUID item_id); void updateChangedItemName(LLUUID item_id, std::string name); void updateItemThumbnail(LLUUID item_id); + void onThumbnailAdded(LLUUID item_id); void updateWornItem(LLUUID item_id, bool is_worn); void updateMessageVisibility(); @@ -308,7 +309,9 @@ public: virtual void changed(U32 mask); bool addItem(const LLUUID& obj_id, callback_t cb); + void addSkippedItem(const LLUUID& obj_id, callback_t cb); void removeItem(const LLUUID& obj_id); + void removeSkippedItem(const LLUUID& obj_id); protected: @@ -328,6 +331,7 @@ protected: typedef std::map item_map_t; typedef item_map_t::value_type item_map_value_t; item_map_t mItemMap; + item_map_t mSkippedItems; }; class LLGalleryGestureObserver : public LLGestureManagerObserver -- cgit v1.2.3 From d28e2c03a76151b7e6ba47fc892fb7c2c164c1e2 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 12 May 2023 16:35:27 +0300 Subject: SL-19649 reduce logging out time for larger inventories --- indra/llui/llview.cpp | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) (limited to 'indra') diff --git a/indra/llui/llview.cpp b/indra/llui/llview.cpp index 9ba71913d0..3344300635 100644 --- a/indra/llui/llview.cpp +++ b/indra/llui/llview.cpp @@ -576,8 +576,10 @@ void LLView::deleteAllChildren() while (!mChildList.empty()) { - LLView* viewp = mChildList.front(); - delete viewp; // will remove the child from mChildList + LLView* viewp = mChildList.front(); + viewp->mParentView = NULL; + delete viewp; + mChildList.pop_front(); } } -- cgit v1.2.3 From cc8af5f37df1e200bc0b55740887a99157066e35 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 12 May 2023 18:26:02 +0300 Subject: SL-19649 Adjust other classes for new deleteAllChildren mechanics --- indra/llui/lllayoutstack.cpp | 19 ++++++++++++++++--- indra/llui/lllayoutstack.h | 1 + indra/llui/llmenugl.cpp | 7 +++++++ indra/llui/llmenugl.h | 1 + indra/newview/llinspecttoast.cpp | 7 +++++++ indra/newview/llinventorymodel.cpp | 6 +++++- 6 files changed, 37 insertions(+), 4 deletions(-) (limited to 'indra') diff --git a/indra/llui/lllayoutstack.cpp b/indra/llui/lllayoutstack.cpp index 77938edf27..ae9dba5945 100644 --- a/indra/llui/lllayoutstack.cpp +++ b/indra/llui/lllayoutstack.cpp @@ -282,6 +282,17 @@ void LLLayoutStack::draw() } } +void LLLayoutStack::deleteAllChildren() +{ + mPanels.clear(); + LLView::deleteAllChildren(); + + // Not really needed since nothing is left to + // display, but for the sake of consistency + updateFractionalSizes(); + mNeedsLayout = true; +} + void LLLayoutStack::removeChild(LLView* view) { LLLayoutPanel* embedded_panelp = findEmbeddedPanel(dynamic_cast(view)); @@ -289,12 +300,14 @@ void LLLayoutStack::removeChild(LLView* view) if (embedded_panelp) { mPanels.erase(std::find(mPanels.begin(), mPanels.end(), embedded_panelp)); - delete embedded_panelp; + LLView::removeChild(view); updateFractionalSizes(); mNeedsLayout = true; } - - LLView::removeChild(view); + else + { + LLView::removeChild(view); + } } BOOL LLLayoutStack::postBuild() diff --git a/indra/llui/lllayoutstack.h b/indra/llui/lllayoutstack.h index f772dbc6b4..22f11eb20f 100644 --- a/indra/llui/lllayoutstack.h +++ b/indra/llui/lllayoutstack.h @@ -67,6 +67,7 @@ public: virtual ~LLLayoutStack(); /*virtual*/ void draw(); + /*virtual*/ void deleteAllChildren(); /*virtual*/ void removeChild(LLView*); /*virtual*/ BOOL postBuild(); /*virtual*/ bool addChild(LLView* child, S32 tab_group = 0); diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 5cb840fd61..33c4b6ec73 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -1882,6 +1882,13 @@ bool LLMenuGL::addContextChild(LLView* view, S32 tab_group) return false; } + +void LLMenuGL::deleteAllChildren() +{ + mItems.clear(); + LLUICtrl::deleteAllChildren(); +} + void LLMenuGL::removeChild( LLView* ctrl) { // previously a dynamic_cast with if statement to check validity diff --git a/indra/llui/llmenugl.h b/indra/llui/llmenugl.h index f84c4d41eb..9d3be8d94f 100644 --- a/indra/llui/llmenugl.h +++ b/indra/llui/llmenugl.h @@ -442,6 +442,7 @@ public: /*virtual*/ void drawBackground(LLMenuItemGL* itemp, F32 alpha); /*virtual*/ void setVisible(BOOL visible); /*virtual*/ bool addChild(LLView* view, S32 tab_group = 0); + /*virtual*/ void deleteAllChildren(); /*virtual*/ void removeChild( LLView* ctrl); /*virtual*/ BOOL postBuild(); diff --git a/indra/newview/llinspecttoast.cpp b/indra/newview/llinspecttoast.cpp index 68801b0895..6f93a78ca6 100644 --- a/indra/newview/llinspecttoast.cpp +++ b/indra/newview/llinspecttoast.cpp @@ -47,6 +47,7 @@ public: /*virtual*/ void onOpen(const LLSD& notification_id); /*virtual*/ BOOL handleToolTip(S32 x, S32 y, MASK mask); + /*virtual*/ void deleteAllChildren(); /*virtual*/ void removeChild(LLView* child); private: void onToastDestroy(LLToast * toast); @@ -122,6 +123,12 @@ BOOL LLInspectToast::handleToolTip(S32 x, S32 y, MASK mask) return LLFloater::handleToolTip(x, y, mask); } +void LLInspectToast::deleteAllChildren() +{ + mPanel = NULL; + LLInspect::deleteAllChildren(); +} + // virtual void LLInspectToast::removeChild(LLView* child) { diff --git a/indra/newview/llinventorymodel.cpp b/indra/newview/llinventorymodel.cpp index 0bbf201dc6..b4727de77f 100644 --- a/indra/newview/llinventorymodel.cpp +++ b/indra/newview/llinventorymodel.cpp @@ -594,7 +594,11 @@ const LLUUID LLInventoryModel::findCategoryUUIDForTypeInRoot( } } - if(rv.isNull() && create_folder && root_id.notNull()) + if(rv.isNull() + && root_id.notNull() + && create_folder + && preferred_type != LLFolderType::FT_MARKETPLACE_LISTINGS + && preferred_type != LLFolderType::FT_OUTBOX) { if (isInventoryUsable()) -- cgit v1.2.3 From a10c876ae4db901ab60f58f0df82663b855b3d45 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Fri, 19 May 2023 02:20:48 +0300 Subject: DRTVWR-580 Post-merge fix --- indra/llcharacter/llkeyframemotion.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llcharacter/llkeyframemotion.cpp b/indra/llcharacter/llkeyframemotion.cpp index 9cb30882dd..3cef382bbf 100644 --- a/indra/llcharacter/llkeyframemotion.cpp +++ b/indra/llcharacter/llkeyframemotion.cpp @@ -2054,7 +2054,7 @@ BOOL LLKeyframeMotion::serialize(LLDataPacker& dp) const LL_DEBUGS("BVH") << " rot: t " << rot_key.mTime << " angles " << rot_angles.mV[VX] <<","<< rot_angles.mV[VY] <<","<< rot_angles.mV[VZ] << LL_ENDL; } - success &= dp.packS32(joint_motionp->mPositionCurve.mNumKeys, "num_pos_keys"); + success &= dp.packS32(joint_motionp->mPositionCurve.mKeys.size(), "num_pos_keys"); for (PositionCurve::key_map_t::value_type& pos_pair : joint_motionp->mPositionCurve.mKeys) { PositionKey& pos_key = pos_pair.second; -- cgit v1.2.3 From 7140640b6963dacfa012dfec679798fc4dd13a17 Mon Sep 17 00:00:00 2001 From: Andrey Lihatskiy Date: Fri, 19 May 2023 02:31:28 +0300 Subject: DRTVWR-580 Post-merge fix - unused code --- indra/newview/llfilepicker.cpp | 8 -------- 1 file changed, 8 deletions(-) (limited to 'indra') diff --git a/indra/newview/llfilepicker.cpp b/indra/newview/llfilepicker.cpp index ab5f88e210..f1f156c2e0 100644 --- a/indra/newview/llfilepicker.cpp +++ b/indra/newview/llfilepicker.cpp @@ -745,14 +745,6 @@ void set_nav_save_data(LLFilePicker::ESaveFilter filter, std::string &extension, creator = "\?\?\?\?"; extension = "xaf"; break; - -#ifdef _CORY_TESTING - case LLFilePicker::FFSAVE_GEOMETRY: - type = "\?\?\?\?"; - creator = "\?\?\?\?"; - extension = "slg"; - break; -#endif case LLFilePicker::FFSAVE_XML: type = "\?\?\?\?"; -- cgit v1.2.3 From d53c8a7d65cabaab303c21db7bb6d2ce4370c331 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Fri, 19 May 2023 18:09:35 +0300 Subject: SL-19738 don't switch the view when creating an item --- indra/newview/llinventorypanel.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index c5d3fa3f7a..604bffb96e 100644 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -1834,7 +1834,13 @@ void LLInventoryPanel::openInventoryPanelAndSetSelection(BOOL auto_open, const L if (main_inventory && main_inventory->isSingleFolderMode() && use_main_panel) { - main_inventory->toggleViewMode(); + const LLInventoryObject *obj = gInventory.getObject(obj_id); + if (obj) + { + main_inventory->setSingleFolderViewRoot(obj->getParentUUID(), false); + main_inventory->setGallerySelection(obj_id); + return; + } } LLInventoryPanel *active_panel = LLInventoryPanel::getActiveInventoryPanel(auto_open); -- cgit v1.2.3 From b61ea595b5f2cac0f108b05526f0a371f512bfd4 Mon Sep 17 00:00:00 2001 From: Nat Goodspeed Date: Fri, 19 May 2023 17:33:27 -0400 Subject: SL-18837: Clean up more set-but-unused variables for Xcode 14.3 --- indra/llui/llbutton.cpp | 3 --- indra/llui/llmenugl.cpp | 3 --- indra/newview/llagent.cpp | 2 -- indra/newview/llmodelpreview.cpp | 5 ----- indra/newview/llpanelnearbymedia.cpp | 6 +----- indra/newview/llsceneview.cpp | 5 +---- indra/newview/llselectmgr.cpp | 12 ++++++------ indra/newview/llsprite.cpp | 5 ----- indra/newview/llstartup.cpp | 2 +- indra/newview/lltextureview.cpp | 4 ++-- indra/newview/llviewerobjectlist.cpp | 3 --- indra/newview/llvosurfacepatch.cpp | 7 ------- indra/newview/llvovolume.cpp | 13 +------------ 13 files changed, 12 insertions(+), 58 deletions(-) (limited to 'indra') diff --git a/indra/llui/llbutton.cpp b/indra/llui/llbutton.cpp index 8028f397f3..3354cb2db3 100644 --- a/indra/llui/llbutton.cpp +++ b/indra/llui/llbutton.cpp @@ -942,11 +942,8 @@ void LLButton::draw() break; } - S32 y_offset = 2 + (getRect().getHeight() - 20)/2; - if (pressed && mDisplayPressedState) { - y_offset--; x++; } diff --git a/indra/llui/llmenugl.cpp b/indra/llui/llmenugl.cpp index 5cb840fd61..d29781cf33 100644 --- a/indra/llui/llmenugl.cpp +++ b/indra/llui/llmenugl.cpp @@ -487,9 +487,6 @@ void LLMenuItemGL::draw( void ) // let disabled items be highlighted, just don't draw them as such if( getEnabled() && getHighlight() && !mBriefItem) { - int debug_count = 0; - if (dynamic_cast(this)) - debug_count++; gGL.color4fv( mHighlightBackground.get().mV ); gl_rect_2d( 0, getRect().getHeight(), getRect().getWidth(), 0 ); diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index 9018a5f168..f158d312ff 100644 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3707,7 +3707,6 @@ void LLAgent::processScriptControlChange(LLMessageSystem *msg, void **) // take controls msg->getU32("Data", "Controls", controls, block_index ); msg->getBOOL("Data", "PassToAgent", passon, block_index ); - U32 total_count = 0; for (i = 0; i < TOTAL_CONTROLS; i++) { if (controls & ( 1 << i)) @@ -3720,7 +3719,6 @@ void LLAgent::processScriptControlChange(LLMessageSystem *msg, void **) { gAgent.mControlsTakenCount[i]++; } - total_count++; } } } diff --git a/indra/newview/llmodelpreview.cpp b/indra/newview/llmodelpreview.cpp index e1a5b22490..495153981b 100644 --- a/indra/newview/llmodelpreview.cpp +++ b/indra/newview/llmodelpreview.cpp @@ -2685,9 +2685,6 @@ void LLModelPreview::clearBuffers() void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights) { - U32 mesh_count = 0; - - LLModelLoader::model_list* model = NULL; if (lod < 0 || lod > 4) @@ -2818,8 +2815,6 @@ void LLModelPreview::genBuffers(S32 lod, bool include_skin_weights) vb->flush(); mVertexBuffer[lod][mdl].push_back(vb); - - ++mesh_count; } } } diff --git a/indra/newview/llpanelnearbymedia.cpp b/indra/newview/llpanelnearbymedia.cpp index 02911313ed..3c3cd5d522 100644 --- a/indra/newview/llpanelnearbymedia.cpp +++ b/indra/newview/llpanelnearbymedia.cpp @@ -619,7 +619,6 @@ void LLPanelNearByMedia::refreshList() LLViewerMedia::impl_list impls = media_inst->getPriorityList(); LLViewerMedia::impl_list::iterator priority_iter; - U32 enabled_count = 0; U32 disabled_count = 0; // iterate over the impl list, creating rows as necessary. @@ -662,13 +661,10 @@ void LLPanelNearByMedia::refreshList() { disabled_count++; } - else { - enabled_count++; } } - } mDisableAllCtrl->setEnabled((gSavedSettings.getBOOL("AudioStreamingMusic") || - gSavedSettings.getBOOL("AudioStreamingMedia")) && + gSavedSettings.getBOOL("AudioStreamingMedia")) && (media_inst->isAnyMediaShowing() || media_inst->isParcelMediaPlaying() || media_inst->isParcelAudioPlaying())); diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp index 5e339a52bf..9b1d2d48c6 100644 --- a/indra/newview/llsceneview.cpp +++ b/indra/newview/llsceneview.cpp @@ -100,8 +100,6 @@ void LLSceneView::draw() F32 total_physics[] = { 0.f, 0.f }; - U32 object_count = 0; - LLViewerRegion* region = gAgent.getRegion(); if (region) { @@ -116,8 +114,7 @@ void LLSceneView::draw() U32 idx = object->isAttachment() ? 1 : 0; LLVolume* volume = object->getVolume(); - object_count++; - + F32 radius = object->getScale().magVec(); size[idx].push_back(radius); diff --git a/indra/newview/llselectmgr.cpp b/indra/newview/llselectmgr.cpp index 86f7d2bf25..195b172102 100644 --- a/indra/newview/llselectmgr.cpp +++ b/indra/newview/llselectmgr.cpp @@ -5274,8 +5274,8 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle, LLViewerRegion* last_region; LLViewerRegion* current_region; - S32 objects_sent = 0; - S32 packets_sent = 0; +// S32 objects_sent = 0; +// S32 packets_sent = 0; S32 objects_in_this_packet = 0; bool link_operation = message_name == "ObjectLink"; @@ -5407,7 +5407,7 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle, (*pack_body)(node, user_data); // do any related logging (*log_func)(node, user_data); - ++objects_sent; +// ++objects_sent; ++objects_in_this_packet; // and on to the next object @@ -5425,7 +5425,7 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle, { // otherwise send current message and start new one gMessageSystem->sendReliable( last_region->getHost()); - packets_sent++; +// packets_sent++; objects_in_this_packet = 0; gMessageSystem->newMessage(message_name.c_str()); @@ -5442,7 +5442,7 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle, { // add root instance into new message (*pack_body)(linkset_root, user_data); - ++objects_sent; +// ++objects_sent; ++objects_in_this_packet; } } @@ -5456,7 +5456,7 @@ void LLSelectMgr::sendListToRegions(LLObjectSelectionHandle selected_handle, if (gMessageSystem->getCurrentSendTotal() > 0) { gMessageSystem->sendReliable( current_region->getHost()); - packets_sent++; +// packets_sent++; } else { diff --git a/indra/newview/llsprite.cpp b/indra/newview/llsprite.cpp index c3eb70f850..fd41cdf0d7 100644 --- a/indra/newview/llsprite.cpp +++ b/indra/newview/llsprite.cpp @@ -79,7 +79,6 @@ void LLSprite::updateFace(LLFace &face) // First, figure out how many vertices/indices we need. U32 num_vertices, num_indices; - U32 vertex_count = 0; // Get the total number of vertices and indices if (mFollow) @@ -203,25 +202,21 @@ void LLSprite::updateFace(LLFace &face) *verticesp = mC; tex_coordsp++; verticesp++; - vertex_count++; *tex_coordsp = LLVector2(0.f, 1.f); *verticesp = mB; tex_coordsp++; verticesp++; - vertex_count++; *tex_coordsp = LLVector2(1.f, 1.f); *verticesp = mA; tex_coordsp++; verticesp++; - vertex_count++; *tex_coordsp = LLVector2(1.f, 0.0f); *verticesp = mD; tex_coordsp++; verticesp++; - vertex_count++; // Generate indices, since they're easy. // Just a series of quads. diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 6883ead5ee..70ca41c821 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3244,7 +3244,7 @@ LLSD transform_cert_args(LLPointer cert) // are actually arrays, and we want to format them as comma separated // strings, so special case those. LLSDSerialize::toXML(cert_info[iter->first], std::cout); - if((iter->first== std::string(CERT_KEY_USAGE)) | + if((iter->first == std::string(CERT_KEY_USAGE)) || (iter->first == std::string(CERT_EXTENDED_KEY_USAGE))) { value = ""; diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index cf9211767e..84b61fc612 100644 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -845,8 +845,8 @@ void LLTextureView::draw() if (imagep->getID() == LLAppViewer::getTextureFetch()->mDebugID) { - static S32 debug_count = 0; - ++debug_count; // for breakpoints +// static S32 debug_count = 0; +// ++debug_count; // for breakpoints } F32 pri; diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index efc4ded79e..9666533db8 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -773,7 +773,6 @@ void LLViewerObjectList::dirtyAllObjectInventory() void LLViewerObjectList::updateApparentAngles(LLAgent &agent) { S32 i; - S32 num_objects = 0; LLViewerObject *objectp; S32 num_updates, max_value; @@ -830,8 +829,6 @@ void LLViewerObjectList::updateApparentAngles(LLAgent &agent) objectp = mObjects[i]; if (!objectp->isDead()) { - num_objects++; - // Update distance & gpw objectp->setPixelAreaAndAngle(agent); // Also sets the approx. pixel area objectp->updateTextures(); // Update the image levels of textures for this object. diff --git a/indra/newview/llvosurfacepatch.cpp b/indra/newview/llvosurfacepatch.cpp index b0af565867..5cb7e7478b 100644 --- a/indra/newview/llvosurfacepatch.cpp +++ b/indra/newview/llvosurfacepatch.cpp @@ -408,7 +408,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, LLStrider &indicesp, U32 &index_offset) { - S32 vertex_count = 0; S32 i, x, y; S32 num_vertices; @@ -443,7 +442,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, normalsp++; texCoords0p++; texCoords1p++; - vertex_count++; } // North patch @@ -456,7 +454,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, normalsp++; texCoords0p++; texCoords1p++; - vertex_count++; } @@ -493,7 +490,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, normalsp++; texCoords0p++; texCoords1p++; - vertex_count++; } // Iterate through the north patch's points @@ -507,7 +503,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, normalsp++; texCoords0p++; texCoords1p++; - vertex_count++; } @@ -551,7 +546,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, normalsp++; texCoords0p++; texCoords1p++; - vertex_count++; } // Iterate through the north patch's points @@ -565,7 +559,6 @@ void LLVOSurfacePatch::updateNorthGeometry(LLFace *facep, normalsp++; texCoords0p++; texCoords1p++; - vertex_count++; } for (i = 0; i < length; i++) diff --git a/indra/newview/llvovolume.cpp b/indra/newview/llvovolume.cpp index 2e7ccc8334..97b129db18 100644 --- a/indra/newview/llvovolume.cpp +++ b/indra/newview/llvovolume.cpp @@ -6287,7 +6287,6 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace LLSpatialGroup::buffer_map_t buffer_map; LLViewerTexture* last_tex = NULL; - S32 buffer_index = 0; S32 texture_index_channels = 1; @@ -6300,11 +6299,6 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace { texture_index_channels = gDeferredAlphaProgram.mFeatures.mIndexedTextureChannels; } - - if (distance_sort) - { - buffer_index = -1; - } static LLCachedControl max_texture_index(gSavedSettings, "RenderMaxTextureIndex", 16); texture_index_channels = llmin(texture_index_channels, (S32) max_texture_index); @@ -6328,14 +6322,9 @@ U32 LLVolumeGeometryManager::genDrawInfo(LLSpatialGroup* group, U32 mask, LLFace tex = NULL; } - if (last_tex == tex) - { - buffer_index++; - } - else + if (last_tex != tex) { last_tex = tex; - buffer_index = 0; } bool bake_sunlight = LLPipeline::sBakeSunlight && facep->getDrawable()->isStatic(); -- cgit v1.2.3 From f366853f22ec6914471d7b265adf53736f080527 Mon Sep 17 00:00:00 2001 From: Maxim Nikolenko Date: Mon, 22 May 2023 14:42:31 +0300 Subject: SL-19735 Remove FB Connect Test; remove unused variable --- indra/newview/llviewerobjectlist.cpp | 7 ------- indra/newview/skins/default/xui/en/menu_viewer.xml | 7 ------- 2 files changed, 14 deletions(-) (limited to 'indra') diff --git a/indra/newview/llviewerobjectlist.cpp b/indra/newview/llviewerobjectlist.cpp index 5f0e331baa..61f0e05825 100644 --- a/indra/newview/llviewerobjectlist.cpp +++ b/indra/newview/llviewerobjectlist.cpp @@ -472,7 +472,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, for (i = 0; i < num_objects; i++) { BOOL justCreated = FALSE; - S32 msg_size = 0; bool update_cache = false; //update object cache if it is a full-update or terse update if (compressed) @@ -529,7 +528,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, else if (update_type != OUT_FULL) // !compressed, !OUT_FULL ==> OUT_FULL_CACHED only? { mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i); - msg_size += sizeof(U32); getUUIDFromLocal(fullid, local_id, @@ -550,8 +548,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, update_cache = true; mesgsys->getUUIDFast(_PREHASH_ObjectData, _PREHASH_FullID, fullid, i); mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, local_id, i); - msg_size += sizeof(LLUUID); - msg_size += sizeof(U32); LL_DEBUGS("ObjectUpdate") << "Full Update, obj " << local_id << ", global ID " << fullid << " from " << mesgsys->getSender() << LL_ENDL; } objectp = findObject(fullid); @@ -626,7 +622,6 @@ void LLViewerObjectList::processObjectUpdate(LLMessageSystem *mesgsys, } mesgsys->getU8Fast(_PREHASH_ObjectData, _PREHASH_PCode, pcode, i); - msg_size += sizeof(U8); } #ifdef IGNORE_DEAD @@ -728,14 +723,12 @@ void LLViewerObjectList::processCachedObjectUpdate(LLMessageSystem *mesgsys, for (S32 i = 0; i < num_objects; i++) { - S32 msg_size = 0; U32 id; U32 crc; U32 flags; mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_ID, id, i); mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_CRC, crc, i); mesgsys->getU32Fast(_PREHASH_ObjectData, _PREHASH_UpdateFlags, flags, i); - msg_size += sizeof(U32) * 2; LL_DEBUGS("ObjectUpdate") << "got probe for id " << id << " crc " << crc << LL_ENDL; dumpStack("ObjectUpdateStack"); diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index 51ac3d17ab..810d3fddd5 100644 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -3522,13 +3522,6 @@ function="World.EnvPreset" function="Advanced.WebContentTest" parameter="http://duckduckgo.com"/> - - - -- cgit v1.2.3 From 1d1a63abe4a3d3a6191172c1693ffbdb0ffb2d71 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Fri, 19 May 2023 19:56:57 +0300 Subject: SL-19635 Implement DeepL tranlation support --- indra/newview/app_settings/settings.xml | 11 + indra/newview/llfloatertranslationsettings.cpp | 132 +++++++-- indra/newview/llfloatertranslationsettings.h | 10 +- indra/newview/lltranslate.cpp | 311 ++++++++++++++++++++- indra/newview/lltranslate.h | 1 + .../xui/en/floater_translation_settings.xml | 97 ++++++- 6 files changed, 527 insertions(+), 35 deletions(-) (limited to 'indra') diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index fa241dc30c..ca1b1e2f20 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -13014,6 +13014,17 @@ Value + DeepLTranslateAPIKey + + Comment + DeepL Translation service data to use with the DeepL Translator API + Persist + 1 + Type + LLSD + Value + + TutorialURL Comment diff --git a/indra/newview/llfloatertranslationsettings.cpp b/indra/newview/llfloatertranslationsettings.cpp index e14227f490..d29ecbbf95 100644 --- a/indra/newview/llfloatertranslationsettings.cpp +++ b/indra/newview/llfloatertranslationsettings.cpp @@ -47,6 +47,7 @@ LLFloaterTranslationSettings::LLFloaterTranslationSettings(const LLSD& key) , mMachineTranslationCB(NULL) , mAzureKeyVerified(false) , mGoogleKeyVerified(false) +, mDeepLKeyVerified(false) { } @@ -60,8 +61,11 @@ BOOL LLFloaterTranslationSettings::postBuild() mAzureAPIKeyEditor = getChild("azure_api_key"); mAzureAPIRegionEditor = getChild("azure_api_region"); mGoogleAPIKeyEditor = getChild("google_api_key"); + mDeepLAPIDomainCombo = getChild("deepl_api_domain_combo"); + mDeepLAPIKeyEditor = getChild("deepl_api_key"); mAzureVerifyBtn = getChild("verify_azure_api_key_btn"); mGoogleVerifyBtn = getChild("verify_google_api_key_btn"); + mDeepLVerifyBtn = getChild("verify_deepl_api_key_btn"); mOKBtn = getChild("ok_btn"); mMachineTranslationCB->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::updateControlsEnabledState, this)); @@ -70,18 +74,37 @@ BOOL LLFloaterTranslationSettings::postBuild() getChild("cancel_btn")->setClickedCallback(boost::bind(&LLFloater::closeFloater, this, false)); mAzureVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnAzureVerify, this)); mGoogleVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnGoogleVerify, this)); + mDeepLVerifyBtn->setClickedCallback(boost::bind(&LLFloaterTranslationSettings::onBtnDeepLVerify, this)); mAzureAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1)); mAzureAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onAzureKeyEdited, this), NULL); mAzureAPIRegionEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1)); mAzureAPIRegionEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onAzureKeyEdited, this), NULL); - mAzureAPIEndpointEditor->setFocusLostCallback(boost::bind(&LLFloaterTranslationSettings::onAzureKeyEdited, this)); - mAzureAPIEndpointEditor->setCommitCallback(boost::bind(&LLFloaterTranslationSettings::onAzureKeyEdited, this)); + mAzureAPIEndpointEditor->setFocusLostCallback([this](LLFocusableElement*) + { + setAzureVerified(false, false, 0); + }); + mAzureAPIEndpointEditor->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) + { + setAzureVerified(false, false, 0); + }); mGoogleAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1)); mGoogleAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onGoogleKeyEdited, this), NULL); + mDeepLAPIKeyEditor->setFocusReceivedCallback(boost::bind(&LLFloaterTranslationSettings::onEditorFocused, this, _1)); + mDeepLAPIKeyEditor->setKeystrokeCallback(boost::bind(&LLFloaterTranslationSettings::onDeepLKeyEdited, this), NULL); + + mDeepLAPIDomainCombo->setFocusLostCallback([this](LLFocusableElement*) + { + setDeepLVerified(false, false, 0); + }); + mDeepLAPIDomainCombo->setCommitCallback([this](LLUICtrl* ctrl, const LLSD& param) + { + setDeepLVerified(false, false, 0); + }); + center(); return TRUE; } @@ -130,6 +153,20 @@ void LLFloaterTranslationSettings::onOpen(const LLSD& key) mGoogleKeyVerified = FALSE; } + LLSD deepl_key = gSavedSettings.getLLSD("DeepLTranslateAPIKey"); + if (deepl_key.isMap() && !deepl_key["id"].asString().empty()) + { + mDeepLAPIKeyEditor->setText(deepl_key["id"].asString()); + mDeepLAPIKeyEditor->setTentative(false); + mDeepLAPIDomainCombo->setValue(deepl_key["domain"]); + verifyKey(LLTranslate::SERVICE_DEEPL, deepl_key, false); + } + else + { + mDeepLAPIKeyEditor->setTentative(TRUE); + mDeepLKeyVerified = FALSE; + } + updateControlsEnabledState(); } @@ -155,6 +192,17 @@ void LLFloaterTranslationSettings::setGoogleVerified(bool ok, bool alert, S32 st updateControlsEnabledState(); } +void LLFloaterTranslationSettings::setDeepLVerified(bool ok, bool alert, S32 status) +{ + if (alert) + { + showAlert(ok ? "deepl_api_key_verified" : "deepl_api_key_not_verified", status); + } + + mDeepLKeyVerified = ok; + updateControlsEnabledState(); +} + std::string LLFloaterTranslationSettings::getSelectedService() const { return mTranslationServiceRadioGroup->getSelectedValue().asString(); @@ -180,6 +228,17 @@ std::string LLFloaterTranslationSettings::getEnteredGoogleKey() const return mGoogleAPIKeyEditor->getTentative() ? LLStringUtil::null : mGoogleAPIKeyEditor->getText(); } +LLSD LLFloaterTranslationSettings::getEnteredDeepLKey() const +{ + LLSD key; + if (!mDeepLAPIKeyEditor->getTentative()) + { + key["domain"] = mDeepLAPIDomainCombo->getValue(); + key["id"] = mDeepLAPIKeyEditor->getText(); + } + return key; +} + void LLFloaterTranslationSettings::showAlert(const std::string& msg_name, S32 status) const { LLStringUtil::format_map_t string_args; @@ -199,29 +258,42 @@ void LLFloaterTranslationSettings::updateControlsEnabledState() std::string service = getSelectedService(); bool azure_selected = service == "azure"; bool google_selected = service == "google"; + bool deepl_selected = service == "deepl"; mTranslationServiceRadioGroup->setEnabled(on); mLanguageCombo->setEnabled(on); - getChild("azure_api_endoint_label")->setEnabled(on); - mAzureAPIEndpointEditor->setEnabled(on); + // MS Azure + getChild("azure_api_endoint_label")->setEnabled(on); + mAzureAPIEndpointEditor->setEnabled(on && azure_selected); getChild("azure_api_key_label")->setEnabled(on); - mAzureAPIKeyEditor->setEnabled(on); + mAzureAPIKeyEditor->setEnabled(on && azure_selected); getChild("azure_api_region_label")->setEnabled(on); - mAzureAPIRegionEditor->setEnabled(on); + mAzureAPIRegionEditor->setEnabled(on && azure_selected); - getChild("google_api_key_label")->setEnabled(on); - mGoogleAPIKeyEditor->setEnabled(on); + mAzureVerifyBtn->setEnabled(on && azure_selected && + !mAzureKeyVerified && getEnteredAzureKey().isMap()); - mAzureAPIKeyEditor->setEnabled(on && azure_selected); - mGoogleAPIKeyEditor->setEnabled(on && google_selected); + // Google + getChild("google_api_key_label")->setEnabled(on); + mGoogleAPIKeyEditor->setEnabled(on && google_selected); - mAzureVerifyBtn->setEnabled(on && azure_selected && - !mAzureKeyVerified && getEnteredAzureKey().isMap()); mGoogleVerifyBtn->setEnabled(on && google_selected && !mGoogleKeyVerified && !getEnteredGoogleKey().empty()); - bool service_verified = (azure_selected && mAzureKeyVerified) || (google_selected && mGoogleKeyVerified); + // DeepL + getChild("deepl_api_domain_label")->setEnabled(on); + mDeepLAPIDomainCombo->setEnabled(on && deepl_selected); + getChild("deepl_api_key_label")->setEnabled(on); + mDeepLAPIKeyEditor->setEnabled(on && deepl_selected); + + mDeepLVerifyBtn->setEnabled(on && deepl_selected && + !mDeepLKeyVerified && getEnteredDeepLKey().isMap()); + + bool service_verified = + (azure_selected && mAzureKeyVerified) + || (google_selected && mGoogleKeyVerified) + || (deepl_selected && mDeepLKeyVerified); gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified); mOKBtn->setEnabled(!on || service_verified); @@ -247,6 +319,9 @@ void LLFloaterTranslationSettings::setVerificationStatus(int service, bool ok, b case LLTranslate::SERVICE_GOOGLE: floater->setGoogleVerified(ok, alert, status); break; + case LLTranslate::SERVICE_DEEPL: + floater->setDeepLVerified(ok, alert, status); + break; } } @@ -273,8 +348,7 @@ void LLFloaterTranslationSettings::onEditorFocused(LLFocusableElement* control) void LLFloaterTranslationSettings::onAzureKeyEdited() { if (mAzureAPIKeyEditor->isDirty() - || mAzureAPIRegionEditor->isDirty() - || mAzureAPIEndpointEditor->getValue().isString()) + || mAzureAPIRegionEditor->isDirty()) { // todo: verify mAzureAPIEndpointEditor url setAzureVerified(false, false, 0); @@ -289,6 +363,14 @@ void LLFloaterTranslationSettings::onGoogleKeyEdited() } } +void LLFloaterTranslationSettings::onDeepLKeyEdited() +{ + if (mDeepLAPIKeyEditor->isDirty()) + { + setDeepLVerified(false, false, 0); + } +} + void LLFloaterTranslationSettings::onBtnAzureVerify() { LLSD key = getEnteredAzureKey(); @@ -306,15 +388,28 @@ void LLFloaterTranslationSettings::onBtnGoogleVerify() verifyKey(LLTranslate::SERVICE_GOOGLE, LLSD(key)); } } + +void LLFloaterTranslationSettings::onBtnDeepLVerify() +{ + LLSD key = getEnteredDeepLKey(); + if (key.isMap()) + { + verifyKey(LLTranslate::SERVICE_DEEPL, key); + } +} + void LLFloaterTranslationSettings::onClose(bool app_quitting) { std::string service = gSavedSettings.getString("TranslationService"); bool azure_selected = service == "azure"; bool google_selected = service == "google"; + bool deepl_selected = service == "deepl"; - bool service_verified = (azure_selected && mAzureKeyVerified) || (google_selected && mGoogleKeyVerified); - gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified); - + bool service_verified = + (azure_selected && mAzureKeyVerified) + || (google_selected && mGoogleKeyVerified) + || (deepl_selected && mDeepLKeyVerified); + gSavedPerAccountSettings.setBOOL("TranslatingEnabled", service_verified); } void LLFloaterTranslationSettings::onBtnOK() { @@ -323,6 +418,7 @@ void LLFloaterTranslationSettings::onBtnOK() gSavedSettings.setString("TranslationService", getSelectedService()); gSavedSettings.setLLSD("AzureTranslateAPIKey", getEnteredAzureKey()); gSavedSettings.setString("GoogleTranslateAPIKey", getEnteredGoogleKey()); + gSavedSettings.setLLSD("DeepLTranslateAPIKey", getEnteredDeepLKey()); closeFloater(false); } diff --git a/indra/newview/llfloatertranslationsettings.h b/indra/newview/llfloatertranslationsettings.h index f039d90e27..eff0803fdd 100644 --- a/indra/newview/llfloatertranslationsettings.h +++ b/indra/newview/llfloatertranslationsettings.h @@ -44,12 +44,14 @@ public: void setAzureVerified(bool ok, bool alert, S32 status); void setGoogleVerified(bool ok, bool alert, S32 status); + void setDeepLVerified(bool ok, bool alert, S32 status); void onClose(bool app_quitting); private: std::string getSelectedService() const; LLSD getEnteredAzureKey() const; std::string getEnteredGoogleKey() const; + LLSD getEnteredDeepLKey() const; void showAlert(const std::string& msg_name, S32 status) const; void updateControlsEnabledState(); void verifyKey(int service, const LLSD& key, bool alert = true); @@ -57,25 +59,31 @@ private: void onEditorFocused(LLFocusableElement* control); void onAzureKeyEdited(); void onGoogleKeyEdited(); + void onDeepLKeyEdited(); void onBtnAzureVerify(); void onBtnGoogleVerify(); + void onBtnDeepLVerify(); void onBtnOK(); static void setVerificationStatus(int service, bool alert, bool ok, S32 status); LLCheckBoxCtrl* mMachineTranslationCB; LLComboBox* mLanguageCombo; - LLComboBox* mAzureAPIEndpointEditor;; + LLComboBox* mAzureAPIEndpointEditor; LLLineEditor* mAzureAPIKeyEditor; LLLineEditor* mAzureAPIRegionEditor; LLLineEditor* mGoogleAPIKeyEditor; + LLComboBox* mDeepLAPIDomainCombo; + LLLineEditor* mDeepLAPIKeyEditor; LLRadioGroup* mTranslationServiceRadioGroup; LLButton* mAzureVerifyBtn; LLButton* mGoogleVerifyBtn; + LLButton* mDeepLVerifyBtn; LLButton* mOKBtn; bool mAzureKeyVerified; bool mGoogleKeyVerified; + bool mDeepLKeyVerified; }; #endif // LL_LLFLOATERTRANSLATIONSETTINGS_H diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp index 6589ce06c4..70a40921ef 100644 --- a/indra/newview/lltranslate.cpp +++ b/indra/newview/lltranslate.cpp @@ -133,7 +133,9 @@ public: LLCore::HttpOptions::ptr_t options, LLCore::HttpHeaders::ptr_t headers, const std::string & url, - const std::string & msg) const = 0; + const std::string & msg, + const std::string& from_lang, + const std::string& to_lang) const = 0; virtual LLSD verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter, LLCore::HttpRequest::ptr_t request, LLCore::HttpOptions::ptr_t options, @@ -230,7 +232,7 @@ void LLTranslationAPIHandler::translateMessageCoro(LanguagePair_t fromTo, std::s return; } - LLSD result = sendMessageAndSuspend(httpAdapter, httpRequest, httpOpts, httpHeaders, url, msg); + LLSD result = sendMessageAndSuspend(httpAdapter, httpRequest, httpOpts, httpHeaders, url, msg, fromTo.first, fromTo.second); if (LLApp::isQuitting()) { @@ -331,7 +333,9 @@ public: LLCore::HttpOptions::ptr_t options, LLCore::HttpHeaders::ptr_t headers, const std::string & url, - const std::string & msg) const override; + const std::string & msg, + const std::string& from_lang, + const std::string& to_lang) const override; LLSD verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter, LLCore::HttpRequest::ptr_t request, @@ -508,7 +512,9 @@ LLSD LLGoogleTranslationHandler::sendMessageAndSuspend(LLCoreHttpUtil::HttpCorou LLCore::HttpOptions::ptr_t options, LLCore::HttpHeaders::ptr_t headers, const std::string & url, - const std::string & msg) const + const std::string & msg, + const std::string& from_lang, + const std::string& to_lang) const { return adapter->getRawAndSuspend(request, url, options, headers); } @@ -558,7 +564,9 @@ public: LLCore::HttpOptions::ptr_t options, LLCore::HttpHeaders::ptr_t headers, const std::string & url, - const std::string & msg) const override; + const std::string & msg, + const std::string& from_lang, + const std::string& to_lang) const override; LLSD verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter, LLCore::HttpRequest::ptr_t request, @@ -728,7 +736,7 @@ bool LLAzureTranslationHandler::parseResponse( // virtual bool LLAzureTranslationHandler::isConfigured() const { - return !getAPIKey().isMap(); + return getAPIKey().isMap(); } //static @@ -814,7 +822,9 @@ LLSD LLAzureTranslationHandler::sendMessageAndSuspend(LLCoreHttpUtil::HttpCorout LLCore::HttpOptions::ptr_t options, LLCore::HttpHeaders::ptr_t headers, const std::string & url, - const std::string & msg) const + const std::string & msg, + const std::string& from_lang, + const std::string& to_lang) const { LLCore::BufferArray::ptr_t rawbody(new LLCore::BufferArray); LLCore::BufferArrayStream outs(rawbody.get()); @@ -838,6 +848,259 @@ LLSD LLAzureTranslationHandler::verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAd return adapter->postRawAndSuspend(request, url, rawbody, options, headers); } +//========================================================================= +/// DeepL Translator API handler. +class LLDeepLTranslationHandler: public LLTranslationAPIHandler +{ + LOG_CLASS(LLDeepLTranslationHandler); + +public: + std::string getTranslateURL( + const std::string& from_lang, + const std::string& to_lang, + const std::string& text) const override; + std::string getKeyVerificationURL( + const LLSD& key) const override; + bool checkVerificationResponse( + const LLSD& response, + int status) const override; + bool parseResponse( + const LLSD& http_response, + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const override; + bool isConfigured() const override; + + LLTranslate::EService getCurrentService() override + { + return LLTranslate::EService::SERVICE_DEEPL; + } + + void verifyKey(const LLSD& key, LLTranslate::KeyVerificationResult_fn fnc) override; + + void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent) const override; + void initHttpHeader(LLCore::HttpHeaders::ptr_t headers, const std::string& user_agent, const LLSD& key) const override; + LLSD sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter, + LLCore::HttpRequest::ptr_t request, + LLCore::HttpOptions::ptr_t options, + LLCore::HttpHeaders::ptr_t headers, + const std::string& url, + const std::string& msg, + const std::string& from_lang, + const std::string& to_lang) const override; + + LLSD verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter, + LLCore::HttpRequest::ptr_t request, + LLCore::HttpOptions::ptr_t options, + LLCore::HttpHeaders::ptr_t headers, + const std::string& url) const override; +private: + static std::string parseErrorResponse( + const std::string& body); + static LLSD getAPIKey(); + static std::string getAPILanguageCode(const std::string& lang); +}; + +//------------------------------------------------------------------------- +// virtual +std::string LLDeepLTranslationHandler::getTranslateURL( + const std::string& from_lang, + const std::string& to_lang, + const std::string& text) const +{ + std::string url; + LLSD key = getAPIKey(); + if (key.isMap()) + { + url = key["domain"].asString(); + + if (*url.rbegin() != '/') + { + url += "/"; + } + url += std::string("v2/translate"); + } + return url; +} + + +// virtual +std::string LLDeepLTranslationHandler::getKeyVerificationURL( + const LLSD& key) const +{ + std::string url; + if (key.isMap()) + { + url = key["domain"].asString(); + + if (*url.rbegin() != '/') + { + url += "/"; + } + url += std::string("v2/translate"); + } + return url; +} + +//virtual +bool LLDeepLTranslationHandler::checkVerificationResponse( + const LLSD& response, + int status) const +{ + return status == HTTP_OK; +} + +// virtual +bool LLDeepLTranslationHandler::parseResponse( + const LLSD& http_response, + int& status, + const std::string& body, + std::string& translation, + std::string& detected_lang, + std::string& err_msg) const +{ + if (status != HTTP_OK) + { + if (http_response.has("error_body")) + err_msg = parseErrorResponse(http_response["error_body"].asString()); + return false; + } + + //Example: + // "{\"translations\":[{\"detected_source_language\":\"EN\",\"text\":\"test\"}]}" + + Json::Value root; + Json::Reader reader; + + if (!reader.parse(body, root)) + { + err_msg = reader.getFormatedErrorMessages(); + return false; + } + + if (!root.isObject() + || !root.isMember("translations")) // empty response? should not happen + { + return false; + } + + // Request succeeded, extract translation from the response. + const Json::Value& translations = root["translations"]; + if (!translations.isArray() || translations.size() == 0) + { + return false; + } + + const Json::Value& data= translations[0U]; + if (!data.isObject() + || !data.isMember("detected_source_language") + || !data.isMember("text")) + { + return false; + } + + + detected_lang = data["detected_source_language"].asString(); + LLStringUtil::toLower(detected_lang); + translation = data["text"].asString(); + + return true; +} + +// virtual +bool LLDeepLTranslationHandler::isConfigured() const +{ + return getAPIKey().isMap(); +} + +//static +std::string LLDeepLTranslationHandler::parseErrorResponse( + const std::string& body) +{ + // DeepL doesn't seem to have any error handling beyoun http codes + return std::string(); +} + +// static +LLSD LLDeepLTranslationHandler::getAPIKey() +{ + static LLCachedControl deepl_key(gSavedSettings, "DeepLTranslateAPIKey"); + return deepl_key; +} + +// static +std::string LLDeepLTranslationHandler::getAPILanguageCode(const std::string& lang) +{ + return lang == "zh" ? "zh-CHT" : lang; // treat Chinese as Traditional Chinese +} + +/*virtual*/ +void LLDeepLTranslationHandler::verifyKey(const LLSD& key, LLTranslate::KeyVerificationResult_fn fnc) +{ + LLCoros::instance().launch("DeepL /Verify Key", boost::bind(&LLTranslationAPIHandler::verifyKeyCoro, + this, LLTranslate::SERVICE_DEEPL, key, fnc)); +} +/*virtual*/ +void LLDeepLTranslationHandler::initHttpHeader( + LLCore::HttpHeaders::ptr_t headers, + const std::string& user_agent) const +{ + initHttpHeader(headers, user_agent, getAPIKey()); +} + +/*virtual*/ +void LLDeepLTranslationHandler::initHttpHeader( + LLCore::HttpHeaders::ptr_t headers, + const std::string& user_agent, + const LLSD& key) const +{ + headers->append(HTTP_OUT_HEADER_CONTENT_TYPE, "application/x-www-form-urlencoded"); + headers->append(HTTP_OUT_HEADER_USER_AGENT, user_agent); + + if (key.has("id")) + { + std::string authkey = "DeepL-Auth-Key " + key["id"].asString(); + headers->append(HTTP_OUT_HEADER_AUTHORIZATION, authkey); + } +} + +LLSD LLDeepLTranslationHandler::sendMessageAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter, + LLCore::HttpRequest::ptr_t request, + LLCore::HttpOptions::ptr_t options, + LLCore::HttpHeaders::ptr_t headers, + const std::string& url, + const std::string& msg, + const std::string& from_lang, + const std::string& to_lang) const +{ + LLCore::BufferArray::ptr_t rawbody(new LLCore::BufferArray); + LLCore::BufferArrayStream outs(rawbody.get()); + outs << "text="; + std::string escaped_string = LLURI::escape(msg); + outs << escaped_string; + outs << "&target_lang="; + std::string lang = to_lang; + LLStringUtil::toUpper(lang); + outs << lang; + + return adapter->postRawAndSuspend(request, url, rawbody, options, headers); +} + +LLSD LLDeepLTranslationHandler::verifyAndSuspend(LLCoreHttpUtil::HttpCoroutineAdapter::ptr_t adapter, + LLCore::HttpRequest::ptr_t request, + LLCore::HttpOptions::ptr_t options, + LLCore::HttpHeaders::ptr_t headers, + const std::string& url) const +{ + LLCore::BufferArray::ptr_t rawbody(new LLCore::BufferArray); + LLCore::BufferArrayStream outs(rawbody.get()); + outs << "text=&target_lang=EN"; + + return adapter->postRawAndSuspend(request, url, rawbody, options, headers); +} + //========================================================================= LLTranslate::LLTranslate(): mCharsSeen(0), @@ -867,6 +1130,11 @@ std::string LLTranslate::addNoTranslateTags(std::string mesg) return mesg; } + if (getPreferredHandler().getCurrentService() == SERVICE_DEEPL) + { + return mesg; + } + if (getPreferredHandler().getCurrentService() == SERVICE_AZURE) { // https://learn.microsoft.com/en-us/azure/cognitive-services/translator/prevent-translation @@ -892,6 +1160,10 @@ std::string LLTranslate::removeNoTranslateTags(std::string mesg) { return mesg; } + if (getPreferredHandler().getCurrentService() == SERVICE_DEEPL) + { + return mesg; + } if (getPreferredHandler().getCurrentService() == SERVICE_AZURE) { @@ -997,6 +1269,14 @@ LLTranslationAPIHandler& LLTranslate::getPreferredHandler() { service = SERVICE_GOOGLE; } + if (service_str == "azure") + { + service = SERVICE_AZURE; + } + if (service_str == "deepl") + { + service = SERVICE_DEEPL; + } return getHandler(service); } @@ -1006,11 +1286,18 @@ LLTranslationAPIHandler& LLTranslate::getHandler(EService service) { static LLGoogleTranslationHandler google; static LLAzureTranslationHandler azure; + static LLDeepLTranslationHandler deepl; - if (service == SERVICE_GOOGLE) - { - return google; - } + switch (service) + { + case SERVICE_AZURE: + return azure; + case SERVICE_GOOGLE: + return google; + case SERVICE_DEEPL: + return deepl; + } + + return azure; - return azure; } diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h index ffbbb05e62..4a5d80737c 100644 --- a/indra/newview/lltranslate.h +++ b/indra/newview/lltranslate.h @@ -61,6 +61,7 @@ public : typedef enum e_service { SERVICE_AZURE, SERVICE_GOOGLE, + SERVICE_DEEPL, } EService; typedef boost::function KeyVerificationResult_fn; diff --git a/indra/newview/skins/default/xui/en/floater_translation_settings.xml b/indra/newview/skins/default/xui/en/floater_translation_settings.xml index dc3e072adf..8a97d5e5d9 100644 --- a/indra/newview/skins/default/xui/en/floater_translation_settings.xml +++ b/indra/newview/skins/default/xui/en/floater_translation_settings.xml @@ -1,7 +1,7 @@ Azure service identifier not verified. Status: [STATUS]. Please check your settings and try again. Google API key not verified. Status: [STATUS]. Please check your key and try again. + DeepL Auth Key key not verified. Status: [STATUS]. Please check your key and try again. Azure service identifier verified. Google API key verified. + DeepL API key verified. + [https://learn.microsoft.com/en-us/azure/cognitive-services/translator/create-translator-resource Setup] @@ -286,7 +294,7 @@ left_pad="10" name="verify_google_api_key_btn" top_delta="-2" - width="90" /> + width="90" /> + + Domain: + + + + + + + + + DeepL API key: + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml index b9e10c071c..da3d71e31b 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml @@ -1,27 +1,27 @@ - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml index fa1137c7c5..aae708e257 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml @@ -1,21 +1,21 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml index 01699d1593..8c697317a5 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml @@ -1,14 +1,14 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml index 3e706cd403..8a691467a8 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml index 59c80bdb0e..0b60751bb3 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml index e4f78cad31..eb696ec534 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml index b0a619bcb0..80ed3b19c8 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml @@ -1,37 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml index aa07b9476e..3e4ab1f856 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml index eb5faa2545..8af5189f87 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml index d984342896..47d4f76e48 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml index 07bcefd9b3..f6ce0e6c6c 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml index 0de6a5f22f..ff6884f24d 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml @@ -1,33 +1,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml index c9d4f947a4..7e43b8b61f 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml index bd4812603f..c239eb9543 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml new file mode 100644 index 0000000000..819b05f854 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml new file mode 100644 index 0000000000..ac211997bf --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml new file mode 100644 index 0000000000..80d7eeff31 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml new file mode 100644 index 0000000000..ed1491298f --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml new file mode 100644 index 0000000000..92e0ec74ba --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml new file mode 100644 index 0000000000..9504f39ef1 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml new file mode 100644 index 0000000000..1ee1d6a914 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml new file mode 100644 index 0000000000..a596fbe103 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_edit.xml b/indra/newview/skins/default/xui/ja/menu_edit.xml index c2ef0179b2..0152675de7 100644 --- a/indra/newview/skins/default/xui/ja/menu_edit.xml +++ b/indra/newview/skins/default/xui/ja/menu_edit.xml @@ -1,12 +1,12 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml index 4708b1446c..94361555fe 100644 --- a/indra/newview/skins/default/xui/ja/menu_favorites.xml +++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml @@ -1,10 +1,14 @@ - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml index 88c3aee042..2527e373f4 100644 --- a/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml @@ -1,23 +1,35 @@ - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml index 3eacfb3507..333db46380 100644 --- a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml @@ -1,10 +1,11 @@ - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_group_plus.xml b/indra/newview/skins/default/xui/ja/menu_group_plus.xml index 3787f7d645..52cc5e69e1 100644 --- a/indra/newview/skins/default/xui/ja/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_group_plus.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml index 2e633ae1b2..3a9fb3570a 100644 --- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml @@ -1,6 +1,5 @@ - - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml index 55cd6610f7..8899b69f1a 100644 --- a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml @@ -1,15 +1,16 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml index 222a741718..5ef2a4152a 100644 --- a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml +++ b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml index 8cd6fa4a27..26b581b793 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml index 5bcb96f083..7ae8765df4 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml index 5453f998fa..61a9bae73c 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml index 5a0519ba19..ec5abea6b2 100644 --- a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml @@ -1,19 +1,19 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml index 9a4a8138f5..d9642e3c0c 100644 --- a/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml +++ b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml index 7f68c18e0b..f25c32c084 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml @@ -1,117 +1,133 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml index eecf166a70..3f43469c6f 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml @@ -1,40 +1,40 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml index ad60b0d01f..7a8adcb9fb 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml @@ -1,18 +1,21 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml new file mode 100644 index 0000000000..f76be9631a --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_land.xml b/indra/newview/skins/default/xui/ja/menu_land.xml index 3754bd7fa4..a65504b14c 100644 --- a/indra/newview/skins/default/xui/ja/menu_land.xml +++ b/indra/newview/skins/default/xui/ja/menu_land.xml @@ -1,10 +1,13 @@ - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_landmark.xml b/indra/newview/skins/default/xui/ja/menu_landmark.xml index c134422955..06345c5074 100644 --- a/indra/newview/skins/default/xui/ja/menu_landmark.xml +++ b/indra/newview/skins/default/xui/ja/menu_landmark.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml index 61b473858b..5ba2092648 100644 --- a/indra/newview/skins/default/xui/ja/menu_login.xml +++ b/indra/newview/skins/default/xui/ja/menu_login.xml @@ -1,39 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml index bf38075556..6c6913db5d 100644 --- a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml index faae4ef717..6f4f4938f4 100644 --- a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml +++ b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml @@ -1,7 +1,8 @@ - - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml index 2e733ee24b..77a2e60cda 100644 --- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml @@ -1,11 +1,11 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml index 43f86e84bf..f35e74afc5 100644 --- a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml +++ b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml @@ -1,8 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml index 8dab025309..38b736ae9b 100644 --- a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml +++ b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_navbar.xml b/indra/newview/skins/default/xui/ja/menu_navbar.xml index 9ae2e58198..f3e274313e 100644 --- a/indra/newview/skins/default/xui/ja/menu_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_navbar.xml @@ -1,11 +1,11 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml index c2e4a27686..42a6c66168 100644 --- a/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml @@ -1,9 +1,12 @@ - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml b/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml index 913bae8958..3852efcdd4 100644 --- a/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml +++ b/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml index 8da1d5d000..2a1dd7f648 100644 --- a/indra/newview/skins/default/xui/ja/menu_object.xml +++ b/indra/newview/skins/default/xui/ja/menu_object.xml @@ -1,35 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_object_icon.xml b/indra/newview/skins/default/xui/ja/menu_object_icon.xml index 7b55a64eef..163c8d1779 100644 --- a/indra/newview/skins/default/xui/ja/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_object_icon.xml @@ -1,8 +1,9 @@ - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml index 4946d58fd8..962d25bb07 100644 --- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml @@ -1,36 +1,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml index 9491c22f31..66ebb79bb9 100644 --- a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml index 64d8ded722..2f40a033da 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml @@ -1,21 +1,25 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_participant_view.xml b/indra/newview/skins/default/xui/ja/menu_participant_view.xml index 5816351d9d..ef61874763 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_view.xml @@ -1,13 +1,16 @@ - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml index f74399f2ba..8d80ddebad 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml @@ -1,9 +1,10 @@ - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml index 3e74b2ddff..1d89e15f64 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml index 4b86a353f4..db586365b2 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml index f290bec652..fee506c511 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml index 2c0c85ba28..91044bd283 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml @@ -1,8 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml index 4a9e402fa4..07144be420 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml index 87f1d26ca4..641eba496a 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml @@ -1,18 +1,18 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml index fe85e278cf..34935305d1 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml index 2217288987..7b56f1daf8 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml index feaeba4398..da27372963 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_picks.xml b/indra/newview/skins/default/xui/ja/menu_picks.xml index 011d3d2526..4a5a42ad05 100644 --- a/indra/newview/skins/default/xui/ja/menu_picks.xml +++ b/indra/newview/skins/default/xui/ja/menu_picks.xml @@ -1,8 +1,10 @@ - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_picks_plus.xml b/indra/newview/skins/default/xui/ja/menu_picks_plus.xml index 84bf90fea0..62eb8327bc 100644 --- a/indra/newview/skins/default/xui/ja/menu_picks_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_picks_plus.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_place.xml b/indra/newview/skins/default/xui/ja/menu_place.xml index a9f05e126d..f45f9211ed 100644 --- a/indra/newview/skins/default/xui/ja/menu_place.xml +++ b/indra/newview/skins/default/xui/ja/menu_place.xml @@ -1,7 +1,5 @@ - - - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml index d19bc44451..d6a13b92ba 100644 --- a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml +++ b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml index c455204722..c9fa92b6a2 100644 --- a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml @@ -1,16 +1,15 @@ - + - - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml index 579f2c2cbd..16508dde4a 100644 --- a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml @@ -1,19 +1,22 @@ - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml new file mode 100644 index 0000000000..197b61af30 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_profile_other.xml b/indra/newview/skins/default/xui/ja/menu_profile_other.xml new file mode 100644 index 0000000000..760186506f --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_profile_other.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml index 9d3a5dda1c..1dd29a9c2a 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml @@ -1,12 +1,12 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_profile_self.xml b/indra/newview/skins/default/xui/ja/menu_profile_self.xml new file mode 100644 index 0000000000..ec10d92629 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_profile_self.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml index 6513d9264a..6d8f2381d9 100644 --- a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml +++ b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_save_settings.xml b/indra/newview/skins/default/xui/ja/menu_save_settings.xml index 44fb1fb30b..f24700d449 100644 --- a/indra/newview/skins/default/xui/ja/menu_save_settings.xml +++ b/indra/newview/skins/default/xui/ja/menu_save_settings.xml @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml index a89dd0bcbe..c4bc424927 100644 --- a/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml +++ b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_settings_add.xml b/indra/newview/skins/default/xui/ja/menu_settings_add.xml index 814ad9c1a6..9e64476446 100644 --- a/indra/newview/skins/default/xui/ja/menu_settings_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_settings_add.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml index 064eae95bf..a44786b414 100644 --- a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml index 61ba3085d9..9e58ec31b7 100644 --- a/indra/newview/skins/default/xui/ja/menu_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml index 901eab9166..fd4dffeefa 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml @@ -1,6 +1,7 @@ - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml index 1cc230e5b6..dc34bc6463 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml index 4dd44d2ec8..391be973f8 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_text_editor.xml b/indra/newview/skins/default/xui/ja/menu_text_editor.xml index eda973c888..48fd8ad243 100644 --- a/indra/newview/skins/default/xui/ja/menu_text_editor.xml +++ b/indra/newview/skins/default/xui/ja/menu_text_editor.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_toolbars.xml b/indra/newview/skins/default/xui/ja/menu_toolbars.xml index d5363a5131..9bb4eaf496 100644 --- a/indra/newview/skins/default/xui/ja/menu_toolbars.xml +++ b/indra/newview/skins/default/xui/ja/menu_toolbars.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_topinfobar.xml b/indra/newview/skins/default/xui/ja/menu_topinfobar.xml index 1a67a2a8f7..ea1e12ab2b 100644 --- a/indra/newview/skins/default/xui/ja/menu_topinfobar.xml +++ b/indra/newview/skins/default/xui/ja/menu_topinfobar.xml @@ -1,7 +1,11 @@ - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index 639602ce3c..d6488af27b 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -1,9 +1,10 @@ - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_email.xml b/indra/newview/skins/default/xui/ja/menu_url_email.xml index 6c41d759fe..1ba8d6a64e 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_email.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_email.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_experience.xml b/indra/newview/skins/default/xui/ja/menu_url_experience.xml index 582784c2f0..83d7029527 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_experience.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_experience.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml index 1dd3d79438..9214d67dea 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_group.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_group.xml @@ -1,6 +1,7 @@ - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml index c3da8a8686..0bec7cd2be 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_http.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml index 147ab44a1b..7a13030b64 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml @@ -1,6 +1,7 @@ - + - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_map.xml b/indra/newview/skins/default/xui/ja/menu_url_map.xml index 8d41e1a571..75813f9017 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_map.xml @@ -1,6 +1,8 @@ - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml index 96f8b3f7b1..ef76e5484f 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml @@ -1,10 +1,12 @@ - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml index 8d264059d3..0c1eab8dad 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml @@ -1,6 +1,8 @@ - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml index a516c5a075..78f3997bf8 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml @@ -1,5 +1,6 @@ - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml index 2c857ec915..e0d4427008 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml @@ -1,7 +1,9 @@ - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml index c3507a9a33..e6941fb8bd 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml @@ -1,6 +1,8 @@ - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index d5ac67b9e6..2428ab51cd 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -1,495 +1,669 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml index 02029230ba..f6473c1e82 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml index 48aac2ed05..75fa3f69b3 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml @@ -1,8 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml index 8c331bc008..7845ff9aad 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml index 3b29a622a4..23bab3b0b2 100644 --- a/indra/newview/skins/default/xui/ja/mime_types.xml +++ b/indra/newview/skins/default/xui/ja/mime_types.xml @@ -1,240 +1,143 @@ - - - - ここにWebコンテンツがあります。 - - - Webコンテンツを表示 - - - - - - ここにはムービーがあります - - - ムービー再生 - - - - - - ここには画像があります - - - ここの画像を表示 - - - - - - ここではオーディオが聞けます - - - ここのオーディオを再生する - - - - - - ここにメディアなし - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + (不明) + なし + + + この場所には、Webコンテンツが含まれています。 + Web コンテンツを表示する + + + + この場所には、ムービーがあります。 + ムービーを再生する + + + + この場所には、画像があります + この場所の画像を表示する + + + + この場所には、オーディオがあります。 + この場所のオーディオを再生する + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/mime_types_linux.xml b/indra/newview/skins/default/xui/ja/mime_types_linux.xml index cb1e48148f..61574b74f9 100644 --- a/indra/newview/skins/default/xui/ja/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/ja/mime_types_linux.xml @@ -1,225 +1,131 @@ - - - - このロケーションには Web コンテンツが含まれています - - - Web コンテンツを表示する - - - - - - ここにはムービーがあります - - - ムービーを再生する - - - - - - このロケーションには画像があります - - - このロケーションの画像を表示する - - - - - - このロケーションにはオーディオがあります - - - このロケーションのオーディオを再生する - - - - - - ここにメディアなし - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + (不明) + なし + + + この場所には、Webコンテンツが含まれています。 + Web コンテンツを表示する + + + + この場所には、ムービーがあります。 + ムービーを再生する + + + + この場所には、画像があります + この場所の画像を表示する + + + + この場所には、オーディオがあります。 + この場所のオーディオを再生する + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/mime_types_mac.xml b/indra/newview/skins/default/xui/ja/mime_types_mac.xml index cb1e48148f..0bfc9aeb99 100644 --- a/indra/newview/skins/default/xui/ja/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/ja/mime_types_mac.xml @@ -1,225 +1,134 @@ - - - - このロケーションには Web コンテンツが含まれています - - - Web コンテンツを表示する - - - - - - ここにはムービーがあります - - - ムービーを再生する - - - - - - このロケーションには画像があります - - - このロケーションの画像を表示する - - - - - - このロケーションにはオーディオがあります - - - このロケーションのオーディオを再生する - - - - - - ここにメディアなし - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + (不明) + なし + + + この場所には、Webコンテンツが含まれています。 + Web コンテンツを表示する + + + + この場所には、ムービーがあります。 + ムービーを再生する + + + + この場所には、画像があります + この場所の画像を表示する + + + + この場所には、オーディオがあります。 + この場所のオーディオを再生する + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 72b4d21eb2..7521c2da01 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -1,3184 +1,5317 @@ - + - 今後は表示しない - 以後、これを表示しない + 次回からこのメッセージを表示しない + + 次回からこのメッセージを表示しない (現セッションで) - 常にこのオプションを選択 - 閉じる - - - - - - - - - あなたの [APP_NAME] のバージョンでは今受け取った通知メッセージを表示することができません。 最新ビューワがインストールされているかご確認ください。 - -エラー詳細: 「 [_NAME] 」という通知は notifications.xml にありませんでした。 - - - - フロータエラー:下記のコントロールが見つかりませんでした: + + 常にこのオプションを選択 + + 閉じる + + + + + + + + + + + + + + + + 現在使用中の[APP_NAME]のバージョンでは、受け取った通知メッセージを表示することができません。 +最新のビューアーがインストールされている事をご確認ください。 + +エラー詳細:「 [_NAME] 」という通知メッセージは、notifications.xmlに定義されていませんでした。 + fail + + + + フローターエラー:以下のコントロールが見つかりませんでした: + [CONTROLS] - - - - 現在利用可能なチュートリアルはありません。 - - - [MESSAGE] - - [MESSAGE] - - - - [MESSAGE] - - - - [APP_NAME] をアップデート中にエラーが発生しました。 ビューワの [http://get.secondlife.com 最新バージョンをダウンロード] してください。 - - - - [SECOND_LIFE_GRID] に接続できませんでした。 -「[DIAGNOSTIC]」 -インターネット接続が正常かご確認ください。 - - - - メッセージテンプレート [PATH] がありませんでした。 - - - - 現在の衣類、身体部位の変更を保存しますか? - - - - これらのアイテムの 1 つまたは複数をマーチャントアウトボックスにコピーする許可がありません。移動するか、置き去りにすることはできます。 - - - - マーチャントアウトボックスの最上位に転送した各アイテムにつき、それぞれ 1 つの新しいフォルダが作成されました。 - - - - 成功 - -マーケットプレイスに正常に送信されたすべてのフォルダ - - - - 一部のフォルダは転送されませんでした - -一部のフォルダがマーケットプレイスに送信されたときにエラーが発生しました。これらのフォルダはまだマーチャントアウトボックス内にあります。 - -詳細については、[[MARKETPLACE_IMPORTS_URL] エラーログ]をご覧ください。 - - - - '[ERROR_CODE]' エラーで転送できませんでした - -システムまたはネットワークのエラーのため、フォルダはマーケットプレイスに送信されませんでした。後でもう一度お試しください。 - - - - '[ERROR_CODE]' エラーでマーケットプレイスを初期化できませんでした - -システムまたはネットワークのエラーのため、マーケットプレイスの初期化に失敗しました。後でもう一度お試しください。 - - - - 在庫フォルダへのコピーまたは移動がエラーにより失敗しました: + fail + + -'[ERROR_CODE]' - - - - マーケットプレイスのリストへのコピーまたは移動がエラーにより失敗しました: + 現在利用可能なチュートリアルはありません。 + fail + + -'[ERROR_CODE]' - - - - マーケットプレイスによる取引が次のエラーにより失敗しました: - -[ERROR_REASON][ERROR_DESCRIPTION] - - - - この製品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。リストを編集するか、リストフォルダにエラーがないか確認してください。 - - - - マーケットプレイスへのリスト表示が次のエラーで失敗しました : - -'[ERROR_CODE]' - - - - このバージョンフォルダの有効化が次のエラーにより失敗しました : + [MESSAGE] + + [MESSAGE] + + + [MESSAGE] + + + + [APP_NAME]のアップデート中にエラーが発生しました。[http://get.secondlife.com 最新バージョンのビューアーをダウンロード]してください。 + + + + [SECOND_LIFE_GRID]に接続できませんでした。 +[DIAGNOSTIC] + +インターネット接続が正常かご確認ください。 + fail + + + + ビューアがサーバーから不正な形式の応答を受け取りました。インターネット接続が正常に機能していることを確認してから、後でもう一度お試しください。 + +これが誤りだと思われる場合は、サポートにお問い合わせください。 + fail + + + + メッセージテンプレート[PATH]がありませんでした。 + + fail + + + 現在の服装/身体部位の変更を保存しますか? + + + + これらのアイテムの1つ以上を販売用の送信トレイにコピーする権限がありません。移動したり残したままにすることはできます。 + + + + 販売ボックスの最上位に転送した各アイテムにつき、それぞれ1つの新しいフォルダが作成されました。 + + + + + 成功しました。 + +すべてのフォルダが、マーケットプレイスに正常に送信されました。 + + + + 一部のフォルダは送信できていません。 + +一部のフォルダが、マーケットプレイスに送信されるときにエラーが発生しました。これらのフォルダは、販売者の送信トレイにまだ残っています。 + +詳細につきましては、[[MARKETPLACE_IMPORTS_URL] エラーログ]をご確認ください。 + + + 以下のエラーで転送できませんでした:[ERROR_CODE] + +システムまたはネットワークのエラーのため、フォルダはマーケットプレイスに送信されませんでした。お手数ですが、後でもう一度やり直してください。 + + + + 以下のエラーでマーケットプレイスを初期化できませんでした:[ERROR_CODE] + +システムまたはネットワークのエラーのため、マーケットプレイスの初期化に失敗しました。お手数ですが、後でもう一度やり直してください。 + + + + 在庫フォルダへのコピーまたは移動がエラーにより失敗しました:[ERROR_CODE] + + + マーケットプレイスのリストへのコピーまたは移動が以下のエラーにより失敗しました:[ERROR_CODE] + + + マーケットプレイスによる取引が以下のエラーにより失敗しました:[ERROR_REASON] +[ERROR_DESCRIPTION] + + + この商品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。 +リストを編集するか、リストフォルダにエラーがないか確認してください。 + + + マーケットプレイスへのリスト表示が次のエラーで失敗しました: '[ERROR_CODE]' - - - - リストを作成するために、リストするコンテンツの階層を固定しました。 - - - - この操作により、このリストの有効な内容が変更されます。続けますか? - - - - マーケットプレイスのリストウィンドウにドラッグしたアイテムは元の場所からコピーされるのではなく、移動します。続けますか? - - - - リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けますか? - - - - これらのアイテムの 1 つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、置き去りにすることはできます。 - - - - この操作により、このリストが削除されます。続けますか? - - - - この操作により、現在のリストのバージョンフォルダが無効になります。続けますか? - - - - このリストをアップデートできませんでした。 -[[URL] ここをクリック] してマーケットプレイスで編集します。 - - - マーケットプレイスのリストフォルダにある衣服やボディパーツを着用できません。 - リスト ID が無効です。 - - このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。 - - - - 各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。 - - - - 在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。 - - - - バージョンフォルダが空のため、リストを削除しました。もう一度リストを表示するには、バージョンフォルダにアイテムを追加する必要があります。 - - - アニメーションデータの書き込みに問題があります。後でもう一度お試しください。 - 次の理由で、オークションのスナップショットのアップロード時に問題が起こりました。 -[REASON] - 一度に複数のアイテムの中身を表示できません。 -アイテムを 1 つだけ選択して、もう一度お試しください。 - - 衣服、身体部位に対する変更をすべて保存しますか? - - - - フレンド以外の人からのコールや、インスタントメッセージを無視する設定にしたことを、相手に知られることはありません。 - - - - 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。 - - - - 複数の Second Life ビューワを実行することはサポートされていません。テクスチャキャッシュのコリジョンや破損、およびビジュアルとパフォーマンスの低下につながる恐れがあります。 - - - - 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。 -[NAME] に修正権限を与えますか? - - - - 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更することができます。 この権限を与える際には十分に注意してください。 -選択した住人に修正権限を与えますか? - - - - [NAME] の修正権限を解約しますか? - - - - 選択した住人から変更権限を取り下げますか? - - - - グループ名は [MIN_LEN] ~ [MAX_LEN] 文字である必要があります。 - - - - グループを作成できません。 -[MESSAGE] - - - - [NEEDS_APPLY_MESSAGE] + + + このバージョンフォルダの有効化が次のエラーにより失敗しました: +'[ERROR_CODE]' + + + リストを作成するために、リストするコンテンツの階層を固定しました。 + confirm + + + この操作により、このリストの有効な内容が変更されます。続けてもよろしいですか? + confirm + + + マーケットプレイスのリストウィンドウにドラッグしたアイテムは、元の場所からコピーされるのではなく移動となります。続けてもよろしいですか? + confirm + + + リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けてもよろしいですか? + confirm + + + これらのアイテムの1つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、残したままにすることはできます。 + confirm + + + この操作により、このリストが削除されます。続けてもよろしいですか? + confirm + + + この操作により、現在のリストのバージョンフォルダが無効になります。続けてもよろしいですか? + confirm + + + このリストをアップデートできませんでした。 +[[URL] ここをクリック]してマーケットプレイスで編集します。 + + + マーケットプレイスのリストフォルダにある衣服装やボディパーツを着用できません。 + fail + + リストIDが無効です。 + fail + + このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。 + confirm + + + 各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。 + confirm + + + 在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。 + confirm + + + バージョンフォルダが空のため、リストを削除しました。もう一度リストを表示するには、バージョンフォルダにアイテムを追加する必要があります。 + confirm + + + アニメーションデータの書き込みに問題があります。後でもう一度お試しください。 + fail + + 以下の理由で、オークションのスナップショットのアップロード時に問題が起こりました:[REASON] + fail + + 一度に複数のアイテムの中身を表示できません。 +アイテムを1つだけ選択して、もう一度お試しください。 + fail + + 服装、身体部位に対する変更をすべて保存しますか? + confirm + + + フレンド以外の人からのコールや、インスタントメッセージを無視する設定にしたことを、相手に知られることはありません。 + + + 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。 + + + Second Lifeビューアーの多重起動はサポートされていません。 +テクスチャキャッシュの競合による破損や、およびビジュアルとパフォーマンスの低下につながる恐れがあります。 + + + 他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。 +[NAME]に修正権限を与えますか? + + + 他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更することができます。 +この権限を与える際には十分に注意してください。選択した住人に修正権限を与えますか? + confirm + + + [NAME]の修正権限を解除しますか? + confirm + + + 選択した住人から変更権限を取り下げますか? + confirm + + + グループ名は[MIN_LEN]~[MAX_LEN]文字である必要があります。 + group + fail + + + グループを作成できません。 +[MESSAGE] + group + fail + + + [NEEDS_APPLY_MESSAGE] [WANT_APPLY_MESSAGE] - - - - グループ通知の送信には、件名の記入が必要です。 - - - - あなたは [ROLE_NAME] の役割にメンバーを与えようとしています。 -任命されたメンバーが自ら退任しない限り、 -役柄から削除できません。 + group + fail + + + グループ通知の送信には、件名の記入が必要です。 + group + fail + + + あなたは、[ROLE_NAME]の役割にメンバーを与えようとしています。任命されたメンバーが自ら退任しない限り、 役柄から削除できません。 操作を続行しますか? - - - - あなたは [ROLE_NAME] に [ACTION_NAME] の能力を -与えようとしています。 - - *警告* -この能力を持つ役割のメンバーは、 -自分と他のメンバーに現在より強力な権限を割り当て、 -自分をオーナーとほぼ同様の立場に任命することもできるようになります。 -この行為の意味をよく理解してから実行してください。 + + + あなたは[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。 +*警告* +この能力を持つ役割のメンバーは、 自分と他のメンバーに現在より強力な権限を割り当て、 自分をオーナーとほぼ同様の立場に任命することもできるようになります。 +この行為の意味をよく理解してから実行してください。 この能力を [ROLE_NAME] に割り当てますか? - - - - あなたは [ROLE_NAME] に [ACTION_NAME] の能力を -与えようとしています。 - - *警告* -この能力をもつ役割のメンバーは、 -自分と他のメンバーにすべての能力を割り当て、 -自分をオーナーとほぼ同様の立場に任命できます。 + + + あなたは、[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。 -この能力を [ROLE_NAME] に割り当てますか? - - - - 役割 '[ROLE_NAME]' に能力 '[ACTION_NAME]' を追加しようとしています。 +*警告* +この能力をもつ役割のメンバーは、自分と他のメンバーにすべての能力を割り当て、自分をオーナーとほぼ同様の立場に任命できます。 +この能力を[ROLE_NAME] に割り当てますか? + + + 役割「[ROLE_NAME]」に能力「[ACTION_NAME]」を追加しようとしています。 *警告* -この能力を持つ役割のメンバーにも能力 '[ACTION_NAME_2]' と '[ACTION_NAME_3]' が許可されます - - - - 役割 '[ROLE_NAME]' から能力 '[ACTION_NAME]' を削除しようとしています。 +この能力を持つ役割のメンバーにも能力「[ACTION_NAME_2]」と「[ACTION_NAME_3]」が許可されます。 + + + 役割「[ROLE_NAME]」から能力「[ACTION_NAME]」を削除しようとしています。 *警告* -この能力を削除しても能力 '[ACTION_NAME_2]' と '[ACTION_NAME_3]' は削除されません。 - +この能力を削除しても能力「[ACTION_NAME_2]」と「[ACTION_NAME_3]」は削除されません。 これらの能力をこの役割に許可しない場合は、すぐに削除してください! - - - - [AVATAR_NAME] をグループから追放しようとしています。 - - - - [COUNT] 名のメンバーをグループから追放しようとしています。 - - - - [AVATAR_NAME] をグループから追放しようとしています。 - - - - [COUNT] 名のメンバーをグループから追放しようとしています。 - - - 一部の住人がグループから追放されたため、招待状が送られませんでした。 - - アタッチメントを下に置こうとしています。 -続けますか? - - - - このグループに参加するには、L$ [COST] かかります。 -続行しますか? - - - - <nolink>[NAME]</nolink> というグループに入ろうとしています。 -続けますか? - - - このグループに加入するには、L$ [COST] 必要です。 -L$ が不足しているのでこのグループに参加することができません。 - - このグループ作成にかかる費用:L$[COST] + + + [AVATAR_NAME]をグループから追放しようとしています。 + group + confirm + + + [COUNT]名のメンバーをグループから追放しようとしています。 + group + confirm + + + [AVATAR_NAME]をグループから追放しようとしています。 + group + confirm + + + [COUNT]名のメンバーをグループから追放しようとしています。 + group + confirm + + + 一部の住人がグループから追放されたため、招待状が送られませんでした。 + 装着物を下に置こうとしています。 +このまま続けてもよろしいですか? + + + このグループに参加するには、L$ [COST]かかります。 +このまま続けてもよろしいですか? + confirm + funds + group + + + 「<nolink>[NAME]</nolink>」というグループに入ろうとしています。 +このまま続けてもよろしいですか? + group + confirm + + + このグループに加入するには、L$ [COST]必要です。 +L$が不足しているので、このグループに参加することができません。 + group + fail + funds + + このグループ作成にかかる費用:L$[COST] 一人ではグループにならないので、永久に削除されてしまいます。 -48 時間以内にメンバーを勧誘し、入会してもらってください。 - - - - あなたはグループに参加することはできません。 - - - - グループ参加リクエスト中にエラーが発生しました。 - - - - グループに参加できません: [reason] - - - - 申し訳ありませんが、トライアルユーザーはグループに参加できません。 - - - - 「<nolink>[group_name]</nolink>」に参加できません: -既に [group_count] グループのメンバーになっています。参加できるのは最大 [max_groups] グループまでです。 - - - - 「<nolink>[group_name]</nolink>」に参加できません: +48時間以内にメンバーを勧誘し、入会してもらってください。 + group + funds + + + あなたはグループに参加することはできません。 + group_id + success + + + グループ参加リクエスト中にエラーが発生しました。 + group_id + success + + + 以下のグループに参加できませんでした:[reason] + group_id + success + reason + + + 申し訳ありませんが、トライアルユーザーはグループに参加できません。 + group_id + success + + + 「<nolink>[group_name]</nolink>」に参加できません: +既に[group_count]個のグループのメンバーになっています。参加できるのは最大[max_groups]グループまでです。 + success + group_id + group_name + group_count + max_groups + + + 「<nolink>[group_name]</nolink>」に参加できません: このグループは現在、参加が制限されています。 - - - - このユーザーグループに追加されました - - - - 会員料金として必要な L$ [membership_fee] を送金することができません。 - - - - L$ [COST] で [TIME] 時間 [PARCEL_NAME] に入ることができます。 -入場許可を購入しますか? - - - 不特定の人に売却する場合には、 -売却価格はL$ 0 以上に設定する必要があります。 -売却価格をL$ 0 に設定する場合は、 -売却する個人を選択してください。 - - 選択した [LAND_SIZE] 平方メートルの土地は、売り出し中に設定されています。 -売却価格 L$ [SALE_PRICE] で、[NAME] に売却を認可します。 - - - - 注意: 「誰にでも販売」をクリックすることで、あなたの土地はこのリージョンにいる人に限らず [SECOND_LIFE] コミュニティ全体で利用可能となります。 - -選択した [LAND_SIZE] 平方メートルの土地は、販売対象に設定されました。 -販売価格 L$ [SALE_PRICE] で、[NAME] が販売対象者となります。 - - - - グループ「<nolink>[NAME]</nolink>」と共有するこのにある区画のすべてのオブジェクトを前のオーナーのインベントリに返却しますか? - -*注意*この操作をすると、グループに譲渡された譲渡禁止のオブジェクトを削除することになります。 - -オブジェクト: [N] - - - - この区画で、 -住人 [NAME] が所有する全てのオブジェクトを -本人のインベントリに本当に返却してもよいですか? - -オブジェクト: [N] - - - - この土地区画内にある、あなたが所有するすべてのオブジェクトを、 -あなたのインベントリに戻そうとしています。続けますか? - -オブジェクト: [N] - - - - この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、 -それぞれの所有者のインベントリに戻そうとしています。 -操作を続行しますか? -グループに譲渡された「再販・プレゼント可」のオブジェクトは、以前の所有者に返却されます。 - -*警告* これにより、 -グループに譲渡された「再販・プレゼント不可」のオブジェクトは削除されます! -オブジェクト: [N] - - - - この土地区画内にある、 -[NAME]以外による所有のオブジェクトをすべてそれぞれの所有者のインベントリに返却しようとしています。 -操作を続行しますか?グループに譲渡された「再販・プレゼント可」のオブジェクトは、以前の所有者に返却されます。 - -*警告* これにより、 -グループに譲渡された「再販・プレゼント不可」のオブジェクトは削除されます! -オブジェクト: [N] - - - - リストされた全てのオブジェクトを所有者の持ち物に戻しますか?これによりすべてのスクリプト化されたオブジェクトがリージョンに戻ります! - - - - このリージョン(地域)内のすべてのオブジェクトを無効にしようとしています。操作を続行しますか? - - - - グループ <nolink>[NAME]</nolink> と共有されていない、この区画にあるオブジェクトを前のオーナーに返却しますか? - -オブジェクト: [N] - - - スクリプトを無効にできません。 + group_id + success + + + このユーザーグループに入会しました。 + group_id + success + + + 会員料金として必要なL$ [membership_fee]を送金することができません。 + group_id + success + + + この区画([PARCEL_NAME])は、L$ [COST]で[TIME]時間入ることができます。入場許可証を購入しますか? + fail + funds + confirm + + + 不特定の人に売却する場合には、売却価格はL$ 0以上に設定する必要があります。 +売却価格をL$ 0に設定する場合は、売却する個人を選択してください。 + fail + + 選択した[LAND_SIZE]㎡の土地は、売り出し中に設定されています。 +売却価格L$ [SALE_PRICE]で、[NAME]に売却を認可します。 + confirm + + + 注意:「誰にでも販売」をクリックすることで、あなたの土地はこのリージョンにいる人に限らず、[SECOND_LIFE]コミュニティ全体で利用可能となります。 +選択した[LAND_SIZE]㎡の土地は、販売対象に設定されました。 +販売価格L$ [SALE_PRICE]で、[NAME]が販売対象者となります。 + confirm + + + グループ「<nolink>[NAME]</nolink>」と共有するこのにある区画のすべてのオブジェクトを前のオーナーのインベントリに返却しますか? +*警告* +この操作をすると、グループに譲渡された譲渡禁止のオブジェクトを削除することになります。 +オブジェクト:[N] + confirm + group + + + この区画で、住人[NAME]が所有する全てのオブジェクトを本人のインベントリに本当に返却してもよいですか? +オブジェクト:[N] + confirm + + + この土地区画内にある、あなたが所有するすべてのオブジェクトを、あなたのインベントリに戻そうとしています。このまま続けてもよろしいですか? +オブジェクト:[N] + confirm + + + この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、それぞれの所有者のインベントリに戻そうとしています。このまま操作を続行してもよろしいですか? +グループに譲渡された「再販・譲渡可」のオブジェクトは、以前の所有者に返却されます。 + +*警告* + +これにより、グループに譲渡された「再販・譲渡不可」のオブジェクトは削除されます! +オブジェクト:[N] + confirm + + + この土地区画内にある、[NAME]以外による所有のオブジェクトをすべてそれぞれの所有者のインベントリに返却しようとしています。このまま操作を続行してもよろしいですか? +グループに譲渡された「再販・譲渡可」のオブジェクトは、以前の所有者に返却されます。 + +*警告* + +これにより、グループに譲渡された「再販・譲渡不可」のオブジェクトは削除されます! +オブジェクト:[N] + confirm + + + リストされた全てのオブジェクトを所有者の持ち物に戻しますか? +これによりすべてのスクリプト化されたオブジェクトがリージョンに戻ります! + confirm + + + このリージョン(地域)内のすべてのオブジェクトを無効にしようとしています。このまま操作を続行してもよろしいですか? + confirm + + + グループ <nolink>[NAME]</nolink>と共有されていない、この区画にあるオブジェクトを前のオーナーに返却しますか? +オブジェクト:[N] + confirm + + + スクリプトを無効にできません。 このリージョン(地域)全体が「ダメージ有効」に設定されています。 -武器を使用するにはスクリプトの実行を許可する必要があります。 - - 現在複数の面が選択されています。 +武器を使用するには、スクリプトの実行を許可する必要があります。 + fail + + 現在複数の面が選択されています。 このまま続けた場合、メディアの別々のインスタンスがオブジェクトの複数の面に設定されます。 -メディアを 1 つの面だけに取り付けるには、「面を選択」を選んでオブジェクトの希望する面をクリック、それから「追加」をクリックしてください。 - - - 着地点を設定するには、この区画の内側に -立ってください。 - 受信者の有効なメールアドレスを入力してください。 - あなたのメールアドレスを入力してください。 - - デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか? - - - スナップショットデータの処理エラー - スナップショットのエンコード化でエラーが出ました! - このアイテムをアップロードするには L$[COST] が必要です。 - インベントリに写真を保存するには L$[COST] が必要です。L$ を購入するか、代わりに写真をっコンピュータに保存できます。 - インベントリにテクスチャを保存するには L$[COST] が必要です。L$ を購入するか、代わりに写真をコンピュータに保存できます。 - 次の理由で、スナップショットの送信時に問題が起こりました: [REASON] - 次の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました。 [REASON] - [SECOND_LIFE] へのログインを続けるには、Second Life の利用規約、プライバシーポリシー、およびサービス規約に同意する必要があります。 - アウトフィットを装着できません。 -アウトフィットフォルダに衣類、身体部位、アタッチメントがありません。 - ごみ箱にある衣類や身体部位の着用はできません。 - オブジェクトを付けられませんでした。 -最大数の [MAX_ATTACHMENTS] 個を越えています。 どれか取り外してからお試しください。 - まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。 - ログインするためにパスワードを入力してください - - 注意:記入漏れの箇所があります。 +メディアを1つの面だけに取り付けるには、「面を選択」を選んでオブジェクトの希望する面をクリック、それから「追加」をクリックしてください。 + confirm + + + 着地点を設定するには、この区画の内側に立ってください。 + fail + + 受信者の有効なメールアドレスを入力してください。 + fail + + あなたのメールアドレスを入力してください。 + fail + + デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか? + confirm + + + スナップショットデータの処理エラー + fail + + スナップショットのエンコードエラー + fail + + このアイテムをアップロードするには、L$ [COST]が必要です。 + fail + + インベントリに写真を保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。 + fail + + インベントリにテクスチャを保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。 + fail + + 以下の理由でスナップショットの送信時に問題が起こりました:[REASON] + fail + + 以下の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました:[REASON] + fail + + [SECOND_LIFE]へのログインを続けるには、Second Lifeの利用規約、プライバシーポリシー、およびサービス規約に同意する必要があります。 + fail + + アウトフィットを装着できません。 +アウトフィットフォルダに服装、身体部位、装着物がありません。 + fail + + ごみ箱にある服装や身体部位は、着用できません。 + fail + + オブジェクトを装着できませんでした。 +最大装着数[MAX_ATTACHMENTS]個を越えています。どれか取り外してからお試しください。 + fail + + まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。 + fail + + ログインするためにパスワードを入力してください。 + fail + + おっと、記入漏れがあります。 アバターのユーザー名を入力してください。 -[SECOND_LIFE] に入るにはアカウントが必要です。今すぐアカウントを作成しますか? - [create_account_url] - - - ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。 - '[GRID]' は有効なグリッド ID ではありません。 - ログイン位置で有効なグリッドが指定されませんでした。 - - クラシファイド広告 [NAME] を削除しますか? +[SECOND_LIFE]に入るにはアカウントが必要です。今すぐアカウントを作成しますか? + confirm + [create_account_url] + + + ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。 + fail + + 「[GRID]」は、有効なグリッドIDではありません。 + fail + + ログイン位置で有効なグリッドが指定されませんでした。 + fail + + クラシファイド広告『[NAME]』を削除してもよろしいですか? 支払い済みの料金は返金されません。 - - - - この面にあるメディアを削除する選択をしました。 -続けますか? - - - - クラシファイド広告 [NAME] への変更を保存しますか? - - - - クラシファイド広告を出すには、資金が足りません。 - - - - <nolink>[PICK]</nolink> を削除しますか? - - - - 選択したアウトフィットを削除しますか? - - - - [SECOND_LIFE] イベント Web ページに移動しますか? - http://secondlife.com/events/?lang=ja-JP - - - 表示する提案を選択してください。 - 表示する履歴アイテムを選択してください。 - [APP_NAME] を再起動後にキャッシュがクリアされます。 - [APP_NAME] を再起動後にキャッシュが移動されます。 -ご注意: キャッシュがクリアされます。 - ポートの設定は [APP_NAME] を再起動後に反映されます。 - デバッグ設定の変更は [APP_NAME] を再起動後に反映されます。 - 新しいスキンは [APP_NAME] を再起動後に表示されます。 - 言語の変更は [APP_NAME] を再起動後に反映されます。 - - [SECOND_LIFE]の Web ページに移動し、入札あるいはオークションの詳細を確認しますか? - http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] - - - - 変更を保存しますか? - - - - ノートカードを削除しますか? - - - - 以前のスクリーンショットをレポートに使用しますか? - - - ジェスチャーの保存に失敗しました。 + confirm + + + この顔に紐づけられたメディアの削除を選択しました。 +続行してもよろしいですか? + confirm + + + クラシファイド広告[NAME]への変更を保存しますか? + confirm + + + クラシファイド広告を出すには、資金が足りません。 + fail + + + + クラシファイド広告<nolink>[CLASSIFIED]</nolink>を削除してもよろしいですか? + confirm + + + ピック<nolink>[PICK]</nolink>を削除してもよろしいですか? + confirm + + + 未公開のクラシファイド広告があります。 +ウィンドウを閉じると変更が失われます。 + confirm + + + 保存されていない変更があります。 + confirm + save + + + 「<nolink>[PICK]</nolink>」を削除してもよろしいですか? + + + このアウトフィットを削除してもよろしいですか? + confirm + + + [SECOND_LIFE]イベントWebページに移動しますか? + https://secondlife.com/my/community/events/?lang=ja-JP + confirm + + + 表示する提案を選択してください。 + fail + + 表示する履歴アイテムを選択してください。 + fail + + + + + キャッシュは、[APP_NAME]再起動後にクリアされます。 + キャッシュは、[APP_NAME]再起動後が移動されます。 +注意:キャッシュがクリアされます。 + ポートの設定は、[APP_NAME]再起動後に反映されます。 + デバッグ設定の変更は、[APP_NAME]再起動後に反映されます。 + 新しいスキンは、[APP_NAME]再起動後に表示されます。 + 言語の変更は、[APP_NAME]再起動後に反映されます。 + [SECOND_LIFE]のWebページに移動し、入札あるいはオークションの詳細を確認しますか? + confirm + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] + + + 変更を保存しますか? + confirm + + + このノートカードを削除してもよろしいですか? + + confirm + + + 以前のスクリーンショットをレポートに使用しますか? + + + ジェスチャーの保存に失敗しました。 ステップが多すぎます。 -ステップをいくつか削除してから再保存してください - ジェスチャーの保存に失敗しました。少し待ってからもう一度試してください。 - ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 -オブジェクトが範囲内に存在しないか、または削除された可能性があります。 - 次の理由で、ジェスチャーの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。 - ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 -オブジェクトが範囲内に存在しないか、または削除された可能性があります。 - 次の理由で、ノートカードの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。 - - あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。 +ステップをいくつか削除してから再保存してください + fail + + ジェスチャーの保存に失敗しました。 +少し待ってからもう一度試してください。 + fail + + ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 +オブジェクトが範囲内に存在しないか、削除された可能性があります。 + fail + + 以下の理由で、ジェスチャーの保存時に問題が起こりました:[REASON] +お手数ですが、後でもう一度試してください。 + fail + + ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 +オブジェクトが範囲内に存在しないか、削除された可能性があります。 + fail + + 以下の理由で、ノートカードの保存時に問題が起こりました:[REASON] +お手数ですが、後でもう一度試してください。 + fail + + あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。 サーバーの最新保存バージョンをロードしますか? (**警告**:この操作後元に戻すことはできません) - - - スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。 -オブジェクトは範囲外か、または削除されているかもしれません。 - - ログイン位置が指定されていません。 + confirm + + + スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。 +オブジェクトは範囲外か、または削除されているかもしれません。 + fail + + ログイン位置が指定されていません。 ログイン位置の欄にリージョン名を入力するか、「最後にログアウトした場所」か「自宅(ホーム)」を選択してください。 - - - スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。 -オブジェクトが範囲内に存在しないか、または削除された可能性があります。 - ファイルをダウンロードできません。 - - [SECOND_LIFE] でサポートされていないファイルのダウンロードを要求しました。 - - - ファイル [[FILE]] を書き込めません。 - - お使いのコンピューターは [APP_NAME] の必要最低限の動作環境を満たしていません。 パフォーマンスの低下を感じるかもしれません。 恐れ入りますが [SUPPORT_SITE] ではサポート対象外のシステムに関する技術的サポートは行っておりません。 - -[_URL] に移動して確認をしますか? - http://secondlife.com/support/sysreqs.php?lang=ja - - - ビューワ実行ファイルを直接実行しないでください。代わりに、既存のショートカットの内のどれかをアップデートし、SL_Launcher を実行してください。 - - グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。 - - ドライバの更新を確認するために [URL] にアクセスしますか? - [URL] - - - - お使いのシステムには、[APP_NAME] が認識できないグラフィックカードが搭載されています。 -[APP_NAME] でまだテストされていない最新ハードウェアのためだと考えられます。 問題ないとは思いますが、グラフィックの設定を調整する必要があるかもしれません。 -(ミー > 環境設定 > グラフィック) - - - - - グラフィックドライバを初期化中に [APP_NAME] がクラッシュしました。 -ドライバの一般的なエラーを防ぐために、画質が低に設定されます。 そのため、一部のグラフィック特性に制限が出ます。 + fail + + + スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。 +オブジェクトが範囲内に存在しないか、または削除された可能性があります。 + fail + + ファイルをダウンロードできません。 + fail + + ダウンロードをリクエストしたファイルは、[SECOND_LIFE]でサポートされていません。 + + confirm + + + ファイル[[FILE]]に書き込むことができませんでした。 + fail + + お使いのコンピュータは、[APP_NAME]の最小システム要件を満たしていません。 +このためパフォーマンスが低下する場合があります。恐れ入りますが[SUPPORT_SITE]は、サポートされていないシステム構成に対する技術的サポートを提供できません。 + +詳細について、[_URL]を確認しますか? + http://secondlife.com/support/sysreqs.php?lang=ja + fail + + + グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。 +ドライバの更新を確認するために[URL]にアクセスしますか? + [URL] + confirm + fail + + + お使いのシステムには、[APP_NAME]が認識できないグラフィックカードが搭載されています。[APP_NAME]でまだテストされていない最新ハードウェアのためだと考えられます。 +問題ないとは思いますが、グラフィックの設定を調整する必要があるかもしれません。 +(「私」>「初期設定」>「グラフィック」) + fail +
+ + +
+ グラフィックドライバを初期化中に[APP_NAME]がクラッシュしました。 +ドライバの一般的なエラーを防ぐために、画質が低に設定されます。このため、一部のグラフィック特性に制限が出ます。 お使いのグラフィックカードのドライバをアップデートするようおすすめします。 -画質は、環境設定 > グラフィック で設定できます。 - [REGION] では、地形の変更ができません。 - あなたには [PARCEL] 区画を地形編集する許可がありません。 - - あなたには次アイテムをコピーする権限がありません: -<nolink>[ITEMS]</nolink> -他の住人に譲ると、そのアイテムはあなたの持ち物から削除されます。本当にこれらのアイテムを譲りますか? - - - インベントリのアイテムを渡せません。 - 取引がキャンセルされました。 - 一度に 42 個以上のアイテムは渡せません。 - 選択したアイテムを渡す権限がありません。 - - あなたは選択した [COUNT] 個のアイテムののコピーを許されていません。 +画質は、「初期設定」>「グラフィック」で設定できます。 + fail + + この設定を変更すると、「自動調整」の設定が無効になります。 +続けてもよろしいですか? + confirm + + + 高度な照明をオンにするには、品質をレベル4以上にする必要があります。 + confirm + + + 影を有効にするには、品質をレベルを4以上にする必要があります。 + confirm + + + [REGION]では、地形の変更ができません。 + fail + + [PARCEL]区画の地形を編集する権限がありません。 + fail + + 以下のアイテムをコピーする権限がありません: +<nolink>[ITEMS]</nolink> +他の人に譲ると、そのアイテムはあなたの持ち物から削除されます。本当にこれらのアイテムを譲ってもよろしいですか? + confirm + fail + + + インベントリのアイテムを渡すことができません。 + fail + + 取引がキャンセルされました。 + fail + + 一度に42個以上のアイテムを渡すことはできません。 + fail + + 選択したアイテムを渡す権限がありません。 + fail + + あなたは選択した[COUNT]個のアイテムをコピーする権限がありません。 これらのアイテムはあなたのインベントリから失われます。 -本当にアイテムを渡したいですか? - - - 選択したフォルダを渡す権限がありません - - このアバターをフリーズしますか? +本当にアイテムを渡してもよろしいですか? + confirm + fail + + + 選択したフォルダを渡す権限がありません。 + fail + + このアバターをフリーズしますか? アバターは一時的に動けなくなり、チャットを含めインワールドで何もできなくなります。 - - - - [AVATAR_NAME]をフリーズしますか? + confirm + + + [AVATAR_NAME]をフリーズしますか? フリーズされた人は一時的に動けなくなり、チャットなど、この世界に対する関わりを持つことができなくなります。 - - - - あなたの土地から [AVATAR_NAME] を追放しますか? - - - - このアバターをあなたの土地から追放しますか? - - - - [AVATAR_NAME] をあなたの土地から追放しますか? - - - <nolink>[GROUP_NAME]</nolink> から [AVATAR_NAME] を追放しました - 取得エラー:選択したオブジェクトの数が多すぎます。 - 取得エラー: -オブジェクトが複数のリージョン(地域)にまたがって存在しています。 -すべて同じリージョン内に移動させてから取得してください。 - - [EXTRA] - -[_URL] に移動してリンデンドル購入に関する情報を確認しますか? - http://secondlife.com/app/currency/?lang=ja-JP - - - [MUTE_LIMIT] エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。 - [COUNT] 個のオブジェクトをリンクできません。 -リンクできるのは最大 [MAX] 個です。 - セットで揃っているオブジェクトのみリンクできます。 -複数のオブジェクトを選択してください。 - すべてのオブジェクトの修正許可がないためリンクできません。 - -どのオブジェクトもロックされておらず、あなたのものであることを確認してください。 - 地域(リージョン)の境界を越えてオブジェクトをリンクできません。 - 地域(リージョン)の境界を越えてオブジェクトをリンクできません。 - 所有者が異なるため、オブジェクトをリンクできません。 - -自分が所有しているオブジェクトだけを選択してください。 - 「 [FILE] 」の拡張子が無効です。 + confirm + + + あなたの土地から[AVATAR_NAME]を追放しますか? + confirm + + + このアバターをあなたの土地から追放しますか? + confirm + + + [AVATAR_NAME]をあなたの土地から追放しますか? + confirm + + + <nolink>[GROUP_NAME]</nolink>から[AVATAR_NAME]を追放しました。 + group + + 取得エラー:選択したオブジェクトの数が多すぎます。 + fail + + 取得エラー:オブジェクトが複数のリージョン(地域)にまたがって存在しています。 +すべて同じリージョン内に移動させてから取得してください。 + fail + + [EXTRA] + +[_URL]に移動してリンデンドル購入に関する情報を確認しますか? + https://secondlife.com/my/lindex/?lang=ja-JP + + + [MUTE_LIMIT]エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。 + fail + + [COUNT]個のオブジェクトをリンクできませんでした。 +リンクできるオブジェクトは最大[MAX]個です。 + fail + + セットが揃っているオブジェクトのみリンクできます。複数のオブジェクトを選択してください。 + fail + + すべてのオブジェクトの修正許可がないためリンクできません。 + +どのオブジェクトもロックされておらず、あなたのものであることを確認してください。 + fail + + リージョン(地域)の境界を越えてオブジェクトをリンクできません。 + fail + + リージョン(地域)の境界を越えてオブジェクトをリンクできません。 + fail + + 所有者が異なるため、オブジェクトをリンクできません。 +自分が所有しているオブジェクトだけを選択してください。 + fail + + ファイル「[FILE]」は、無効な拡張子です。 このファイルの拡張子が正しいかどうかを確認してください。 - - [EXTENSION] は無効です。 -正しい拡張子:[VALIDS] - - - 読み込みのためにアップロードされたサウンドファイルを開けません: -[FILE] - RIFF WAVE ファイルとして認識されません: -[FILE] - PCM WAVE オーディオファイルとして認識されません: -[FILE] - ファイルのチャンネル数が無効です(モノラルまたはステレオを使用する必要があります): -[FILE] - ファイルのサンプルレートがサポートされていません(44.1k である必要があります): -[FILE] - ファイルのワードサイズがサポートされていません(8 または 16 ビットである必要があります): -[FILE] - WAV ヘッダーにデータチャンクが見つかりません: -[FILE] - WAV ファイルのチャンクサイズが間違っています: -[FILE] - オーディオファイルが長すぎます。(最大 10 秒): -[FILE] - 「 [FILE] 」に問題があります。 - -[ERROR] - 書き込み用の一時圧縮サウンドファイルを開くことができません:[FILE] - 不明の Vorbis のエンコードに失敗: [FILE] - 次のファイルのエンコードができません: [FILE] - - ユーザー名とパスワードを自動入力できません。これはネットワーク設定が変更された場合に起こります - - - 破損したリソースファイル: [FILE] - 不明のリンデンリソースファイルのバージョン: [FILE] - 出力ファイルを作成できません: [FILE] - 現在 [APP_NAME] では、BVH 形式のアニメーションファイルの一括アップロードはサポートされていません。 - 次の理由で、「 [FILE] 」をアップロードできません: [REASON] -あとでもう一度試してください。 - 「 [LANDMARK_NAME] 」を「 [FOLDER_NAME] 」フォルダに追加しました。 - - 現在地のランドマークを既に持っています。 - - - 土地の所有者が許可していないため、ランドマークを作成することはできません。 - 「リコンパイル」できません。 -スクリプトのオブジェクトを選択してください。 - 「リコンパイル」できません。 - -修正修正権限のあるスクリプトのオブジェクトを選択してください。 - 「再設定」ができません。 - -スクリプトのオブジェクトを選択してください。 - 「再設定」ができません。 - -修正権限のあるスクリプトのオブジェクトを選択してください。 - 修正権限のないオブジェクトのスクリプトは開くことはできません。 - スクリプトの「実行」ができません。 - -スクリプトのオブジェクトを選択してください。 - スクリプトを「実行しない」設定にできません。 - -スクリプトのオブジェクトを選択してください。 - 保存する frontmost フロータがありません。 - 指定した検索クエリは変更され、短すぎる語句は取り除かれています。 - -検索語句: [FINALQUERY] - 指定した検索語句が短すぎたため、検索は行われませんでした。 - テレポートに失敗しました。 -[REASON] - テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。 -このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。 - リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。 -このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。 - 申し訳ございません。テレポートは現在、ブロックされています。しばらくしてから再度お試しください。 -それでもテレポートできない場合は、ログアウトし、ログインし直して問題を解決してください。 - 申し訳ございません。ランドマークの目的地が見つかりませんでした。 - 申し訳ございません。システムによるテレポート接続が完了できませんでした。 -しばらくしてから再度お試しください。 - 残念ながら、目的地へアクセスが許可されていないため、テレポートできません。 - 添付物がまだ届いていません。テレポートをする前にあと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてください。 - このリージョンのアセットキューが現在混み合っているため、テレポートのリクエストをすぐに処理することが難しい状況です。 -数分後にやり直すか、混雑していない他のリージョンでお試しください。 - 申し訳ございません。システムはテレポートのリクエストを時間どおりに完了できませんでした。数分後にやり直してください。 - 申し訳ございません。システムはリージョン間の移動を時間どおりに完了できませんでした。 -数分後にやり直してください。 - テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、すでに消滅している可能性があります。数分後にやり直してください。 - インベントリシステムは現在利用できません。 - 土地所有者設定ができません: -区画が選定されていません。 - 複数のリージョンが選択されたため、土地の所有権を取得できません。 -選択する面積を小さくして、もう一度お試しください。 - - この区画はオークションに出されています。 所有権を変更するとオークションはキャンセルとなり、既にオークションに参加している住人がいればその人に迷惑をかけてしまいます。 + 「[EXTENSION]」は、無効な拡張子です。 +有効な拡張子:[VALIDS] + fail + + + 読み込みのためにアップロードされたサウンドファイルを開けません: +[FILE] + fail + + RIFF WAVEファイルとして認識されません: +[FILE] + fail + + PCM WAVEオーディオファイルとして認識されません: +[FILE] + fail + + このファイルのチャンネル数は無効です(モノラルか、ステレオである必要があります): +[FILE] + fail + + このファイルのサンプリングレートはサポートされていません(44.1kである必要があります): +[FILE] + fail + + このファイルのビットサイズはサポートされていません(8bitか、16bitである必要があります): +[FILE] + fail + + WAVヘッダーにデータチャンクが見つかりません: +[FILE] + fail + + WAVファイルのチャンクサイズが間違っています: +[FILE] + fail + + オーディオファイルが長すぎます。(最大10秒): +[FILE] + fail + + 「[FILE]」に問題があります。 + +[ERROR] + fail + + 書き込み用の一時圧縮サウンドファイルを開くことができません: +[FILE] + fail + + 不明なVorbisのエンコードに失敗しました: +[FILE] + fail + + 次のファイルのエンコードができません: +[FILE] + fail + + ユーザー名とパスワードを自動入力できません。これはネットワーク設定が変更された場合に起こります + fail + + + 破損したリソースファイル: +[FILE] + fail + + 不明なLindenリソースファイルのバージョンです: +[FILE] + fail + + 出力ファイルを作成できません: +[FILE] + fail + + 現在[APP_NAME]では、BVH形式のアニメーションファイルの一括アップロードはサポートされていません。 + fail + + 以下の理由で「[FILE]」をアップロードできませんでした: +[REASON] + +お手数ですがもう一度やり直してください。 + fail + + 「[LANDMARK_NAME]」を「[FOLDER_NAME]」フォルダに追加しました。 + この場所のランドマークは、既に持っています。 + fail + + + + +フォルダ名を入力してください: + confirm +
+ + +
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml index df9ef40113..098128bb6d 100644 --- a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml @@ -1,11 +1,12 @@ - - - - - - -
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml index b9e10c071c..4f5d1c61de 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml @@ -1,27 +1,27 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml index fa1137c7c5..aae708e257 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml @@ -1,21 +1,21 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml index 01699d1593..8c697317a5 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml @@ -1,14 +1,14 @@ - - - - - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml index 3e706cd403..8a691467a8 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml @@ -1,26 +1,26 @@ - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml index 59c80bdb0e..0b60751bb3 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml index e4f78cad31..eb696ec534 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml index b0a619bcb0..80ed3b19c8 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml @@ -1,37 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml index aa07b9476e..3e4ab1f856 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml index eb5faa2545..8af5189f87 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml index d984342896..47d4f76e48 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml index 07bcefd9b3..f6ce0e6c6c 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml index 0de6a5f22f..ff6884f24d 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml @@ -1,33 +1,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml index c9d4f947a4..7e43b8b61f 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml index bd4812603f..c239eb9543 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml new file mode 100644 index 0000000000..819b05f854 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml new file mode 100644 index 0000000000..ac211997bf --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml new file mode 100644 index 0000000000..80d7eeff31 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml new file mode 100644 index 0000000000..ed1491298f --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml new file mode 100644 index 0000000000..92e0ec74ba --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml new file mode 100644 index 0000000000..9504f39ef1 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml new file mode 100644 index 0000000000..1ee1d6a914 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml new file mode 100644 index 0000000000..a596fbe103 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml @@ -0,0 +1,5 @@ + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_edit.xml b/indra/newview/skins/default/xui/ja/menu_edit.xml index c2ef0179b2..0152675de7 100644 --- a/indra/newview/skins/default/xui/ja/menu_edit.xml +++ b/indra/newview/skins/default/xui/ja/menu_edit.xml @@ -1,12 +1,12 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml index 4708b1446c..94361555fe 100644 --- a/indra/newview/skins/default/xui/ja/menu_favorites.xml +++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml @@ -1,10 +1,14 @@ - - - - - - - - + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml index 88c3aee042..2527e373f4 100644 --- a/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml @@ -1,23 +1,35 @@ - + - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml index 3eacfb3507..333db46380 100644 --- a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml @@ -1,10 +1,11 @@ - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_group_plus.xml b/indra/newview/skins/default/xui/ja/menu_group_plus.xml index 3787f7d645..52cc5e69e1 100644 --- a/indra/newview/skins/default/xui/ja/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_group_plus.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml index 2e633ae1b2..3a9fb3570a 100644 --- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml @@ -1,6 +1,5 @@ - - - - + + +
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml index 55cd6610f7..8899b69f1a 100644 --- a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml @@ -1,15 +1,16 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml index 222a741718..5ef2a4152a 100644 --- a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml +++ b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml index 8cd6fa4a27..26b581b793 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml @@ -1,4 +1,4 @@ - - + +
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml index 5bcb96f083..7ae8765df4 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml @@ -1,6 +1,6 @@ - - - - + + + +
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml index 5453f998fa..61a9bae73c 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml @@ -1,7 +1,7 @@ - - - - - + + + + +
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml index 5a0519ba19..ec5abea6b2 100644 --- a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml @@ -1,19 +1,19 @@ - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml index 9a4a8138f5..d9642e3c0c 100644 --- a/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml +++ b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml index 7f68c18e0b..f25c32c084 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml @@ -1,117 +1,133 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml index eecf166a70..3f43469c6f 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml @@ -1,40 +1,40 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml index ad60b0d01f..7a8adcb9fb 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml @@ -1,18 +1,21 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml new file mode 100644 index 0000000000..f76be9631a --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_land.xml b/indra/newview/skins/default/xui/ja/menu_land.xml index 3754bd7fa4..a65504b14c 100644 --- a/indra/newview/skins/default/xui/ja/menu_land.xml +++ b/indra/newview/skins/default/xui/ja/menu_land.xml @@ -1,10 +1,13 @@ - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_landmark.xml b/indra/newview/skins/default/xui/ja/menu_landmark.xml index c134422955..06345c5074 100644 --- a/indra/newview/skins/default/xui/ja/menu_landmark.xml +++ b/indra/newview/skins/default/xui/ja/menu_landmark.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml index 61b473858b..5ba2092648 100644 --- a/indra/newview/skins/default/xui/ja/menu_login.xml +++ b/indra/newview/skins/default/xui/ja/menu_login.xml @@ -1,39 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml index bf38075556..6c6913db5d 100644 --- a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml index faae4ef717..6f4f4938f4 100644 --- a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml +++ b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml @@ -1,7 +1,8 @@ - - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml index 2e733ee24b..77a2e60cda 100644 --- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml @@ -1,11 +1,11 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml index 43f86e84bf..f35e74afc5 100644 --- a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml +++ b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml @@ -1,8 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml index 8dab025309..38b736ae9b 100644 --- a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml +++ b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml @@ -1,5 +1,5 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_navbar.xml b/indra/newview/skins/default/xui/ja/menu_navbar.xml index 9ae2e58198..f3e274313e 100644 --- a/indra/newview/skins/default/xui/ja/menu_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_navbar.xml @@ -1,11 +1,11 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml index c2e4a27686..42a6c66168 100644 --- a/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml @@ -1,9 +1,12 @@ - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml b/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml index 913bae8958..3852efcdd4 100644 --- a/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml +++ b/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml index 8da1d5d000..f7e64e015a 100644 --- a/indra/newview/skins/default/xui/ja/menu_object.xml +++ b/indra/newview/skins/default/xui/ja/menu_object.xml @@ -1,35 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_object_icon.xml b/indra/newview/skins/default/xui/ja/menu_object_icon.xml index 7b55a64eef..163c8d1779 100644 --- a/indra/newview/skins/default/xui/ja/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_object_icon.xml @@ -1,8 +1,9 @@ - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml index 4946d58fd8..962d25bb07 100644 --- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml @@ -1,36 +1,42 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml index 9491c22f31..042a3222d1 100644 --- a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml @@ -1,9 +1,9 @@ - - - - - - - - - + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml index 64d8ded722..f64a6dc55c 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml @@ -1,21 +1,25 @@ - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_participant_view.xml b/indra/newview/skins/default/xui/ja/menu_participant_view.xml index 5816351d9d..ef61874763 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_view.xml @@ -1,13 +1,16 @@ - - - - - - - - - - - + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml index f74399f2ba..8d80ddebad 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml @@ -1,9 +1,10 @@ - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml index 3e74b2ddff..1d89e15f64 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml index 4b86a353f4..db586365b2 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml index f290bec652..fee506c511 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml index 2c0c85ba28..91044bd283 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml @@ -1,8 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml index 4a9e402fa4..07144be420 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml index 87f1d26ca4..f59ebfa154 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml @@ -1,18 +1,18 @@ - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml index fe85e278cf..5c73eb5a4f 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml index 2217288987..7b56f1daf8 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml index feaeba4398..da27372963 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_picks.xml b/indra/newview/skins/default/xui/ja/menu_picks.xml index 011d3d2526..4a5a42ad05 100644 --- a/indra/newview/skins/default/xui/ja/menu_picks.xml +++ b/indra/newview/skins/default/xui/ja/menu_picks.xml @@ -1,8 +1,10 @@ - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_picks_plus.xml b/indra/newview/skins/default/xui/ja/menu_picks_plus.xml index 84bf90fea0..62eb8327bc 100644 --- a/indra/newview/skins/default/xui/ja/menu_picks_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_picks_plus.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_place.xml b/indra/newview/skins/default/xui/ja/menu_place.xml index a9f05e126d..f45f9211ed 100644 --- a/indra/newview/skins/default/xui/ja/menu_place.xml +++ b/indra/newview/skins/default/xui/ja/menu_place.xml @@ -1,7 +1,5 @@ - - - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml index d19bc44451..d6a13b92ba 100644 --- a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml +++ b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml index c455204722..c9fa92b6a2 100644 --- a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml @@ -1,16 +1,15 @@ - + - - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml index 579f2c2cbd..16508dde4a 100644 --- a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml @@ -1,19 +1,22 @@ - + - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml new file mode 100644 index 0000000000..197b61af30 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml @@ -0,0 +1,7 @@ + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_profile_other.xml b/indra/newview/skins/default/xui/ja/menu_profile_other.xml new file mode 100644 index 0000000000..0ff41f91a2 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_profile_other.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml index 9d3a5dda1c..67c481cdd6 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml @@ -1,12 +1,12 @@ - - - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_profile_self.xml b/indra/newview/skins/default/xui/ja/menu_profile_self.xml new file mode 100644 index 0000000000..ec10d92629 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/menu_profile_self.xml @@ -0,0 +1,12 @@ + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml index 6513d9264a..6d8f2381d9 100644 --- a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml +++ b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_save_settings.xml b/indra/newview/skins/default/xui/ja/menu_save_settings.xml index 44fb1fb30b..a8bb95a661 100644 --- a/indra/newview/skins/default/xui/ja/menu_save_settings.xml +++ b/indra/newview/skins/default/xui/ja/menu_save_settings.xml @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml index a89dd0bcbe..c4bc424927 100644 --- a/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml +++ b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_settings_add.xml b/indra/newview/skins/default/xui/ja/menu_settings_add.xml index 814ad9c1a6..9e64476446 100644 --- a/indra/newview/skins/default/xui/ja/menu_settings_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_settings_add.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml index 064eae95bf..a44786b414 100644 --- a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml @@ -1,10 +1,10 @@ - - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml index 61ba3085d9..3d5ea3f616 100644 --- a/indra/newview/skins/default/xui/ja/menu_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml index 901eab9166..fd4dffeefa 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml @@ -1,6 +1,7 @@ - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml index 1cc230e5b6..dc34bc6463 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ - - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml index 4dd44d2ec8..391be973f8 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_text_editor.xml b/indra/newview/skins/default/xui/ja/menu_text_editor.xml index eda973c888..48fd8ad243 100644 --- a/indra/newview/skins/default/xui/ja/menu_text_editor.xml +++ b/indra/newview/skins/default/xui/ja/menu_text_editor.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_toolbars.xml b/indra/newview/skins/default/xui/ja/menu_toolbars.xml index d5363a5131..9bb4eaf496 100644 --- a/indra/newview/skins/default/xui/ja/menu_toolbars.xml +++ b/indra/newview/skins/default/xui/ja/menu_toolbars.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_topinfobar.xml b/indra/newview/skins/default/xui/ja/menu_topinfobar.xml index 1a67a2a8f7..ea1e12ab2b 100644 --- a/indra/newview/skins/default/xui/ja/menu_topinfobar.xml +++ b/indra/newview/skins/default/xui/ja/menu_topinfobar.xml @@ -1,7 +1,11 @@ - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index 639602ce3c..dc9a6af8fe 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -1,9 +1,10 @@ - - - - - - - + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_email.xml b/indra/newview/skins/default/xui/ja/menu_url_email.xml index 6c41d759fe..1ba8d6a64e 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_email.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_email.xml @@ -1,5 +1,5 @@ - - - + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_experience.xml b/indra/newview/skins/default/xui/ja/menu_url_experience.xml index 582784c2f0..83d7029527 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_experience.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_experience.xml @@ -1,4 +1,4 @@ - - + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml index 1dd3d79438..9214d67dea 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_group.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_group.xml @@ -1,6 +1,7 @@ - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml index c3da8a8686..ba5048094d 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_http.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml @@ -1,7 +1,7 @@ - - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml index 147ab44a1b..7a13030b64 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml @@ -1,6 +1,7 @@ - + - - - - + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_map.xml b/indra/newview/skins/default/xui/ja/menu_url_map.xml index 8d41e1a571..75813f9017 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_map.xml @@ -1,6 +1,8 @@ - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml index 96f8b3f7b1..ef76e5484f 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml @@ -1,10 +1,12 @@ - - - - - - - - + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml index 8d264059d3..0c1eab8dad 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml @@ -1,6 +1,8 @@ - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml index a516c5a075..78f3997bf8 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml @@ -1,5 +1,6 @@ - - - + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml index 2c857ec915..e0d4427008 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml @@ -1,7 +1,9 @@ - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml index c3507a9a33..e6941fb8bd 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml @@ -1,6 +1,8 @@ - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index d5ac67b9e6..35e4db743b 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -1,495 +1,669 @@ - + - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml index 02029230ba..7ea696d6ca 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml index 48aac2ed05..75fa3f69b3 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml @@ -1,8 +1,8 @@ - - - - - - + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml index 8c331bc008..7845ff9aad 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml @@ -1,9 +1,9 @@ - - - - - - - + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml index 3b29a622a4..23bab3b0b2 100644 --- a/indra/newview/skins/default/xui/ja/mime_types.xml +++ b/indra/newview/skins/default/xui/ja/mime_types.xml @@ -1,240 +1,143 @@ - - - - ここにWebコンテンツがあります。 - - - Webコンテンツを表示 - - - - - - ここにはムービーがあります - - - ムービー再生 - - - - - - ここには画像があります - - - ここの画像を表示 - - - - - - ここではオーディオが聞けます - - - ここのオーディオを再生する - - - - - - ここにメディアなし - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + (不明) + なし + + + この場所には、Webコンテンツが含まれています。 + Web コンテンツを表示する + + + + この場所には、ムービーがあります。 + ムービーを再生する + + + + この場所には、画像があります + この場所の画像を表示する + + + + この場所には、オーディオがあります。 + この場所のオーディオを再生する + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/mime_types_linux.xml b/indra/newview/skins/default/xui/ja/mime_types_linux.xml index cb1e48148f..61574b74f9 100644 --- a/indra/newview/skins/default/xui/ja/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/ja/mime_types_linux.xml @@ -1,225 +1,131 @@ - - - - このロケーションには Web コンテンツが含まれています - - - Web コンテンツを表示する - - - - - - ここにはムービーがあります - - - ムービーを再生する - - - - - - このロケーションには画像があります - - - このロケーションの画像を表示する - - - - - - このロケーションにはオーディオがあります - - - このロケーションのオーディオを再生する - - - - - - ここにメディアなし - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + (不明) + なし + + + この場所には、Webコンテンツが含まれています。 + Web コンテンツを表示する + + + + この場所には、ムービーがあります。 + ムービーを再生する + + + + この場所には、画像があります + この場所の画像を表示する + + + + この場所には、オーディオがあります。 + この場所のオーディオを再生する + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/mime_types_mac.xml b/indra/newview/skins/default/xui/ja/mime_types_mac.xml index cb1e48148f..0bfc9aeb99 100644 --- a/indra/newview/skins/default/xui/ja/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/ja/mime_types_mac.xml @@ -1,225 +1,134 @@ - - - - このロケーションには Web コンテンツが含まれています - - - Web コンテンツを表示する - - - - - - ここにはムービーがあります - - - ムービーを再生する - - - - - - このロケーションには画像があります - - - このロケーションの画像を表示する - - - - - - このロケーションにはオーディオがあります - - - このロケーションのオーディオを再生する - - - - - - ここにメディアなし - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + (不明) + なし + + + この場所には、Webコンテンツが含まれています。 + Web コンテンツを表示する + + + + この場所には、ムービーがあります。 + ムービーを再生する + + + + この場所には、画像があります + この場所の画像を表示する + + + + この場所には、オーディオがあります。 + この場所のオーディオを再生する + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 72b4d21eb2..48983f3157 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -1,3184 +1,5315 @@ - + - 今後は表示しない - 以後、これを表示しない + 次回からこのメッセージを表示しない + + 次回からこのメッセージを表示しない (現セッションで) - 常にこのオプションを選択 - 閉じる - - - - - - - - - あなたの [APP_NAME] のバージョンでは今受け取った通知メッセージを表示することができません。 最新ビューワがインストールされているかご確認ください。 - -エラー詳細: 「 [_NAME] 」という通知は notifications.xml にありませんでした。 - - - - フロータエラー:下記のコントロールが見つかりませんでした: + + 常にこのオプションを選択 + + 閉じる + + + + + + + + + + + + + + + + 現在使用中の[APP_NAME]のバージョンでは、受け取った通知メッセージを表示することができません。 +最新のビューアーがインストールされている事をご確認ください。 + +エラー詳細:「 [_NAME] 」という通知メッセージは、notifications.xmlに定義されていませんでした。 + fail + + + + フローターエラー:以下のコントロールが見つかりませんでした: + [CONTROLS] - - - - 現在利用可能なチュートリアルはありません。 - - - [MESSAGE] - - [MESSAGE] - - - - [MESSAGE] - - - - [APP_NAME] をアップデート中にエラーが発生しました。 ビューワの [http://get.secondlife.com 最新バージョンをダウンロード] してください。 - - - - [SECOND_LIFE_GRID] に接続できませんでした。 -「[DIAGNOSTIC]」 -インターネット接続が正常かご確認ください。 - - - - メッセージテンプレート [PATH] がありませんでした。 - - - - 現在の衣類、身体部位の変更を保存しますか? - - - - これらのアイテムの 1 つまたは複数をマーチャントアウトボックスにコピーする許可がありません。移動するか、置き去りにすることはできます。 - - - - マーチャントアウトボックスの最上位に転送した各アイテムにつき、それぞれ 1 つの新しいフォルダが作成されました。 - - - - 成功 - -マーケットプレイスに正常に送信されたすべてのフォルダ - - - - 一部のフォルダは転送されませんでした - -一部のフォルダがマーケットプレイスに送信されたときにエラーが発生しました。これらのフォルダはまだマーチャントアウトボックス内にあります。 - -詳細については、[[MARKETPLACE_IMPORTS_URL] エラーログ]をご覧ください。 - - - - '[ERROR_CODE]' エラーで転送できませんでした - -システムまたはネットワークのエラーのため、フォルダはマーケットプレイスに送信されませんでした。後でもう一度お試しください。 - - - - '[ERROR_CODE]' エラーでマーケットプレイスを初期化できませんでした - -システムまたはネットワークのエラーのため、マーケットプレイスの初期化に失敗しました。後でもう一度お試しください。 - - - - 在庫フォルダへのコピーまたは移動がエラーにより失敗しました: + fail + + -'[ERROR_CODE]' - - - - マーケットプレイスのリストへのコピーまたは移動がエラーにより失敗しました: + 現在利用可能なチュートリアルはありません。 + fail + + -'[ERROR_CODE]' - - - - マーケットプレイスによる取引が次のエラーにより失敗しました: - -[ERROR_REASON][ERROR_DESCRIPTION] - - - - この製品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。リストを編集するか、リストフォルダにエラーがないか確認してください。 - - - - マーケットプレイスへのリスト表示が次のエラーで失敗しました : - -'[ERROR_CODE]' - - - - このバージョンフォルダの有効化が次のエラーにより失敗しました : + [MESSAGE] + + [MESSAGE] + + + [MESSAGE] + + + + [APP_NAME]のアップデート中にエラーが発生しました。[http://get.secondlife.com 最新バージョンのビューアーをダウンロード]してください。 + + + + [SECOND_LIFE_GRID]に接続できませんでした。 +[DIAGNOSTIC] + +インターネット接続が正常かご確認ください。 + fail + + + + ビューアがサーバーから不正な形式の応答を受け取りました。インターネット接続が正常に機能していることを確認してから、後でもう一度お試しください。 + +これが誤りだと思われる場合は、サポートにお問い合わせください。 + fail + + + + メッセージテンプレート[PATH]がありませんでした。 + + fail + + + 現在の服装/身体部位の変更を保存しますか? + + + + これらのアイテムの1つ以上を販売用の送信トレイにコピーする権限がありません。移動したり残したままにすることはできます。 + + + + 販売ボックスの最上位に転送した各アイテムにつき、それぞれ1つの新しいフォルダが作成されました。 + + + + + 成功しました。 + +すべてのフォルダが、マーケットプレイスに正常に送信されました。 + + + + 一部のフォルダは送信できていません。 + +一部のフォルダが、マーケットプレイスに送信されるときにエラーが発生しました。これらのフォルダは、販売者の送信トレイにまだ残っています。 + +詳細につきましては、[[MARKETPLACE_IMPORTS_URL] エラーログ]をご確認ください。 + + + 以下のエラーで転送できませんでした:[ERROR_CODE] + +システムまたはネットワークのエラーのため、フォルダはマーケットプレイスに送信されませんでした。お手数ですが、後でもう一度やり直してください。 + + + + 以下のエラーでマーケットプレイスを初期化できませんでした:[ERROR_CODE] + +システムまたはネットワークのエラーのため、マーケットプレイスの初期化に失敗しました。お手数ですが、後でもう一度やり直してください。 + + + + 在庫フォルダへのコピーまたは移動がエラーにより失敗しました:[ERROR_CODE] + + + マーケットプレイスのリストへのコピーまたは移動が以下のエラーにより失敗しました:[ERROR_CODE] + + + マーケットプレイスによる取引が以下のエラーにより失敗しました:[ERROR_REASON] +[ERROR_DESCRIPTION] + + + この商品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。 +リストを編集するか、リストフォルダにエラーがないか確認してください。 + + + マーケットプレイスへのリスト表示が次のエラーで失敗しました: '[ERROR_CODE]' - - - - リストを作成するために、リストするコンテンツの階層を固定しました。 - - - - この操作により、このリストの有効な内容が変更されます。続けますか? - - - - マーケットプレイスのリストウィンドウにドラッグしたアイテムは元の場所からコピーされるのではなく、移動します。続けますか? - - - - リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けますか? - - - - これらのアイテムの 1 つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、置き去りにすることはできます。 - - - - この操作により、このリストが削除されます。続けますか? - - - - この操作により、現在のリストのバージョンフォルダが無効になります。続けますか? - - - - このリストをアップデートできませんでした。 -[[URL] ここをクリック] してマーケットプレイスで編集します。 - - - マーケットプレイスのリストフォルダにある衣服やボディパーツを着用できません。 - リスト ID が無効です。 - - このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。 - - - - 各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。 - - - - 在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。 - - - - バージョンフォルダが空のため、リストを削除しました。もう一度リストを表示するには、バージョンフォルダにアイテムを追加する必要があります。 - - - アニメーションデータの書き込みに問題があります。後でもう一度お試しください。 - 次の理由で、オークションのスナップショットのアップロード時に問題が起こりました。 -[REASON] - 一度に複数のアイテムの中身を表示できません。 -アイテムを 1 つだけ選択して、もう一度お試しください。 - - 衣服、身体部位に対する変更をすべて保存しますか? - - - - フレンド以外の人からのコールや、インスタントメッセージを無視する設定にしたことを、相手に知られることはありません。 - - - - 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。 - - - - 複数の Second Life ビューワを実行することはサポートされていません。テクスチャキャッシュのコリジョンや破損、およびビジュアルとパフォーマンスの低下につながる恐れがあります。 - - - - 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。 -[NAME] に修正権限を与えますか? - - - - 他人に修正権限を与えると、権限を与えられた人はあなたが所有するインワールドのオブジェクトを変更することができます。 この権限を与える際には十分に注意してください。 -選択した住人に修正権限を与えますか? - - - - [NAME] の修正権限を解約しますか? - - - - 選択した住人から変更権限を取り下げますか? - - - - グループ名は [MIN_LEN] ~ [MAX_LEN] 文字である必要があります。 - - - - グループを作成できません。 -[MESSAGE] - - - - [NEEDS_APPLY_MESSAGE] + + + このバージョンフォルダの有効化が次のエラーにより失敗しました: +'[ERROR_CODE]' + + + リストを作成するために、リストするコンテンツの階層を固定しました。 + confirm + + + この操作により、このリストの有効な内容が変更されます。続けてもよろしいですか? + confirm + + + マーケットプレイスのリストウィンドウにドラッグしたアイテムは、元の場所からコピーされるのではなく移動となります。続けてもよろしいですか? + confirm + + + リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けてもよろしいですか? + confirm + + + これらのアイテムの1つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、残したままにすることはできます。 + confirm + + + この操作により、このリストが削除されます。続けてもよろしいですか? + confirm + + + この操作により、現在のリストのバージョンフォルダが無効になります。続けてもよろしいですか? + confirm + + + このリストをアップデートできませんでした。 +[[URL] ここをクリック]してマーケットプレイスで編集します。 + + + マーケットプレイスのリストフォルダにある衣服装やボディパーツを着用できません。 + fail + + リストIDが無効です。 + fail + + このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。 + confirm + + + 各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。 + confirm + + + 在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。 + confirm + + + バージョンフォルダが空のため、リストを削除しました。もう一度リストを表示するには、バージョンフォルダにアイテムを追加する必要があります。 + confirm + + + アニメーションデータの書き込みに問題があります。後でもう一度お試しください。 + fail + + 以下の理由で、オークションのスナップショットのアップロード時に問題が起こりました:[REASON] + fail + + 一度に複数のアイテムの中身を表示できません。 +アイテムを1つだけ選択して、もう一度お試しください。 + fail + + 服装、身体部位に対する変更をすべて保存しますか? + confirm + + + フレンド以外の人からのコールや、インスタントメッセージを無視する設定にしたことを、相手に知られることはありません。 + + + 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。 + + + Second Lifeビューアーの多重起動はサポートされていません。 +テクスチャキャッシュの競合による破損や、およびビジュアルとパフォーマンスの低下につながる恐れがあります。 + + + 他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。 +[NAME]に修正権限を与えますか? + + + 他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更することができます。 +この権限を与える際には十分に注意してください。選択した住人に修正権限を与えますか? + confirm + + + [NAME]の修正権限を解除しますか? + confirm + + + 選択した住人から変更権限を取り下げますか? + confirm + + + グループ名は[MIN_LEN]~[MAX_LEN]文字である必要があります。 + group + fail + + + グループを作成できません。 +[MESSAGE] + group + fail + + + [NEEDS_APPLY_MESSAGE] [WANT_APPLY_MESSAGE] - - - - グループ通知の送信には、件名の記入が必要です。 - - - - あなたは [ROLE_NAME] の役割にメンバーを与えようとしています。 -任命されたメンバーが自ら退任しない限り、 -役柄から削除できません。 + group + fail + + + グループ通知の送信には、件名の記入が必要です。 + group + fail + + + あなたは、[ROLE_NAME]の役割にメンバーを与えようとしています。任命されたメンバーが自ら退任しない限り、 役柄から削除できません。 操作を続行しますか? - - - - あなたは [ROLE_NAME] に [ACTION_NAME] の能力を -与えようとしています。 - - *警告* -この能力を持つ役割のメンバーは、 -自分と他のメンバーに現在より強力な権限を割り当て、 -自分をオーナーとほぼ同様の立場に任命することもできるようになります。 -この行為の意味をよく理解してから実行してください。 + + + あなたは[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。 +*警告* +この能力を持つ役割のメンバーは、 自分と他のメンバーに現在より強力な権限を割り当て、 自分をオーナーとほぼ同様の立場に任命することもできるようになります。 +この行為の意味をよく理解してから実行してください。 この能力を [ROLE_NAME] に割り当てますか? - - - - あなたは [ROLE_NAME] に [ACTION_NAME] の能力を -与えようとしています。 - - *警告* -この能力をもつ役割のメンバーは、 -自分と他のメンバーにすべての能力を割り当て、 -自分をオーナーとほぼ同様の立場に任命できます。 + + + あなたは、[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。 -この能力を [ROLE_NAME] に割り当てますか? - - - - 役割 '[ROLE_NAME]' に能力 '[ACTION_NAME]' を追加しようとしています。 +*警告* +この能力をもつ役割のメンバーは、自分と他のメンバーにすべての能力を割り当て、自分をオーナーとほぼ同様の立場に任命できます。 +この能力を[ROLE_NAME] に割り当てますか? + + + 役割「[ROLE_NAME]」に能力「[ACTION_NAME]」を追加しようとしています。 *警告* -この能力を持つ役割のメンバーにも能力 '[ACTION_NAME_2]' と '[ACTION_NAME_3]' が許可されます - - - - 役割 '[ROLE_NAME]' から能力 '[ACTION_NAME]' を削除しようとしています。 +この能力を持つ役割のメンバーにも能力「[ACTION_NAME_2]」と「[ACTION_NAME_3]」が許可されます。 + + + 役割「[ROLE_NAME]」から能力「[ACTION_NAME]」を削除しようとしています。 *警告* -この能力を削除しても能力 '[ACTION_NAME_2]' と '[ACTION_NAME_3]' は削除されません。 - +この能力を削除しても能力「[ACTION_NAME_2]」と「[ACTION_NAME_3]」は削除されません。 これらの能力をこの役割に許可しない場合は、すぐに削除してください! - - - - [AVATAR_NAME] をグループから追放しようとしています。 - - - - [COUNT] 名のメンバーをグループから追放しようとしています。 - - - - [AVATAR_NAME] をグループから追放しようとしています。 - - - - [COUNT] 名のメンバーをグループから追放しようとしています。 - - - 一部の住人がグループから追放されたため、招待状が送られませんでした。 - - アタッチメントを下に置こうとしています。 -続けますか? - - - - このグループに参加するには、L$ [COST] かかります。 -続行しますか? - - - - <nolink>[NAME]</nolink> というグループに入ろうとしています。 -続けますか? - - - このグループに加入するには、L$ [COST] 必要です。 -L$ が不足しているのでこのグループに参加することができません。 - - このグループ作成にかかる費用:L$[COST] + + + [AVATAR_NAME]をグループから追放しようとしています。 + group + confirm + + + [COUNT]名のメンバーをグループから追放しようとしています。 + group + confirm + + + [AVATAR_NAME]をグループから追放しようとしています。 + group + confirm + + + [COUNT]名のメンバーをグループから追放しようとしています。 + group + confirm + + + 一部の住人がグループから追放されたため、招待状が送られませんでした。 + 装着物を下に置こうとしています。 +このまま続けてもよろしいですか? + + + このグループに参加するには、L$ [COST]かかります。 +このまま続けてもよろしいですか? + confirm + funds + group + + + 「<nolink>[NAME]</nolink>」というグループに入ろうとしています。 +このまま続けてもよろしいですか? + group + confirm + + + このグループに加入するには、L$ [COST]必要です。 +L$が不足しているので、このグループに参加することができません。 + group + fail + funds + + このグループ作成にかかる費用:L$[COST] 一人ではグループにならないので、永久に削除されてしまいます。 -48 時間以内にメンバーを勧誘し、入会してもらってください。 - - - - あなたはグループに参加することはできません。 - - - - グループ参加リクエスト中にエラーが発生しました。 - - - - グループに参加できません: [reason] - - - - 申し訳ありませんが、トライアルユーザーはグループに参加できません。 - - - - 「<nolink>[group_name]</nolink>」に参加できません: -既に [group_count] グループのメンバーになっています。参加できるのは最大 [max_groups] グループまでです。 - - - - 「<nolink>[group_name]</nolink>」に参加できません: +48時間以内にメンバーを勧誘し、入会してもらってください。 + group + funds + + + あなたはグループに参加することはできません。 + group_id + success + + + グループ参加リクエスト中にエラーが発生しました。 + group_id + success + + + 以下のグループに参加できませんでした:[reason] + group_id + success + reason + + + 申し訳ありませんが、トライアルユーザーはグループに参加できません。 + group_id + success + + + 「<nolink>[group_name]</nolink>」に参加できません: +既に[group_count]個のグループのメンバーになっています。参加できるのは最大[max_groups]グループまでです。 + success + group_id + group_name + group_count + max_groups + + + 「<nolink>[group_name]</nolink>」に参加できません: このグループは現在、参加が制限されています。 - - - - このユーザーグループに追加されました - - - - 会員料金として必要な L$ [membership_fee] を送金することができません。 - - - - L$ [COST] で [TIME] 時間 [PARCEL_NAME] に入ることができます。 -入場許可を購入しますか? - - - 不特定の人に売却する場合には、 -売却価格はL$ 0 以上に設定する必要があります。 -売却価格をL$ 0 に設定する場合は、 -売却する個人を選択してください。 - - 選択した [LAND_SIZE] 平方メートルの土地は、売り出し中に設定されています。 -売却価格 L$ [SALE_PRICE] で、[NAME] に売却を認可します。 - - - - 注意: 「誰にでも販売」をクリックすることで、あなたの土地はこのリージョンにいる人に限らず [SECOND_LIFE] コミュニティ全体で利用可能となります。 - -選択した [LAND_SIZE] 平方メートルの土地は、販売対象に設定されました。 -販売価格 L$ [SALE_PRICE] で、[NAME] が販売対象者となります。 - - - - グループ「<nolink>[NAME]</nolink>」と共有するこのにある区画のすべてのオブジェクトを前のオーナーのインベントリに返却しますか? - -*注意*この操作をすると、グループに譲渡された譲渡禁止のオブジェクトを削除することになります。 - -オブジェクト: [N] - - - - この区画で、 -住人 [NAME] が所有する全てのオブジェクトを -本人のインベントリに本当に返却してもよいですか? - -オブジェクト: [N] - - - - この土地区画内にある、あなたが所有するすべてのオブジェクトを、 -あなたのインベントリに戻そうとしています。続けますか? - -オブジェクト: [N] - - - - この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、 -それぞれの所有者のインベントリに戻そうとしています。 -操作を続行しますか? -グループに譲渡された「再販・プレゼント可」のオブジェクトは、以前の所有者に返却されます。 - -*警告* これにより、 -グループに譲渡された「再販・プレゼント不可」のオブジェクトは削除されます! -オブジェクト: [N] - - - - この土地区画内にある、 -[NAME]以外による所有のオブジェクトをすべてそれぞれの所有者のインベントリに返却しようとしています。 -操作を続行しますか?グループに譲渡された「再販・プレゼント可」のオブジェクトは、以前の所有者に返却されます。 - -*警告* これにより、 -グループに譲渡された「再販・プレゼント不可」のオブジェクトは削除されます! -オブジェクト: [N] - - - - リストされた全てのオブジェクトを所有者の持ち物に戻しますか?これによりすべてのスクリプト化されたオブジェクトがリージョンに戻ります! - - - - このリージョン(地域)内のすべてのオブジェクトを無効にしようとしています。操作を続行しますか? - - - - グループ <nolink>[NAME]</nolink> と共有されていない、この区画にあるオブジェクトを前のオーナーに返却しますか? - -オブジェクト: [N] - - - スクリプトを無効にできません。 + group_id + success + + + このユーザーグループに入会しました。 + group_id + success + + + 会員料金として必要なL$ [membership_fee]を送金することができません。 + group_id + success + + + この区画([PARCEL_NAME])は、L$ [COST]で[TIME]時間入ることができます。入場許可証を購入しますか? + fail + funds + confirm + + + 不特定の人に売却する場合には、売却価格はL$ 0以上に設定する必要があります。 +売却価格をL$ 0に設定する場合は、売却する個人を選択してください。 + fail + + 選択した[LAND_SIZE]㎡の土地は、売り出し中に設定されています。 +売却価格L$ [SALE_PRICE]で、[NAME]に売却を認可します。 + confirm + + + 注意:「誰にでも販売」をクリックすることで、あなたの土地はこのリージョンにいる人に限らず、[SECOND_LIFE]コミュニティ全体で利用可能となります。 +選択した[LAND_SIZE]㎡の土地は、販売対象に設定されました。 +販売価格L$ [SALE_PRICE]で、[NAME]が販売対象者となります。 + confirm + + + グループ「<nolink>[NAME]</nolink>」と共有するこのにある区画のすべてのオブジェクトを前のオーナーのインベントリに返却しますか? +*警告* +この操作をすると、グループに譲渡された譲渡禁止のオブジェクトを削除することになります。 +オブジェクト:[N] + confirm + group + + + この区画で、住人[NAME]が所有する全てのオブジェクトを本人のインベントリに本当に返却してもよいですか? +オブジェクト:[N] + confirm + + + この土地区画内にある、あなたが所有するすべてのオブジェクトを、あなたのインベントリに戻そうとしています。このまま続けてもよろしいですか? +オブジェクト:[N] + confirm + + + この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、それぞれの所有者のインベントリに戻そうとしています。このまま操作を続行してもよろしいですか? +グループに譲渡された「再販・譲渡可」のオブジェクトは、以前の所有者に返却されます。 + +*警告* + +これにより、グループに譲渡された「再販・譲渡不可」のオブジェクトは削除されます! +オブジェクト:[N] + confirm + + + この土地区画内にある、[NAME]以外による所有のオブジェクトをすべてそれぞれの所有者のインベントリに返却しようとしています。このまま操作を続行してもよろしいですか? +グループに譲渡された「再販・譲渡可」のオブジェクトは、以前の所有者に返却されます。 + +*警告* + +これにより、グループに譲渡された「再販・譲渡不可」のオブジェクトは削除されます! +オブジェクト:[N] + confirm + + + リストされた全てのオブジェクトを所有者の持ち物に戻しますか? +これによりすべてのスクリプト化されたオブジェクトがリージョンに戻ります! + confirm + + + このリージョン(地域)内のすべてのオブジェクトを無効にしようとしています。このまま操作を続行してもよろしいですか? + confirm + + + グループ <nolink>[NAME]</nolink>と共有されていない、この区画にあるオブジェクトを前のオーナーに返却しますか? +オブジェクト:[N] + confirm + + + スクリプトを無効にできません。 このリージョン(地域)全体が「ダメージ有効」に設定されています。 -武器を使用するにはスクリプトの実行を許可する必要があります。 - - 現在複数の面が選択されています。 +武器を使用するには、スクリプトの実行を許可する必要があります。 + fail + + 現在複数の面が選択されています。 このまま続けた場合、メディアの別々のインスタンスがオブジェクトの複数の面に設定されます。 -メディアを 1 つの面だけに取り付けるには、「面を選択」を選んでオブジェクトの希望する面をクリック、それから「追加」をクリックしてください。 - - - 着地点を設定するには、この区画の内側に -立ってください。 - 受信者の有効なメールアドレスを入力してください。 - あなたのメールアドレスを入力してください。 - - デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか? - - - スナップショットデータの処理エラー - スナップショットのエンコード化でエラーが出ました! - このアイテムをアップロードするには L$[COST] が必要です。 - インベントリに写真を保存するには L$[COST] が必要です。L$ を購入するか、代わりに写真をっコンピュータに保存できます。 - インベントリにテクスチャを保存するには L$[COST] が必要です。L$ を購入するか、代わりに写真をコンピュータに保存できます。 - 次の理由で、スナップショットの送信時に問題が起こりました: [REASON] - 次の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました。 [REASON] - [SECOND_LIFE] へのログインを続けるには、Second Life の利用規約、プライバシーポリシー、およびサービス規約に同意する必要があります。 - アウトフィットを装着できません。 -アウトフィットフォルダに衣類、身体部位、アタッチメントがありません。 - ごみ箱にある衣類や身体部位の着用はできません。 - オブジェクトを付けられませんでした。 -最大数の [MAX_ATTACHMENTS] 個を越えています。 どれか取り外してからお試しください。 - まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。 - ログインするためにパスワードを入力してください - - 注意:記入漏れの箇所があります。 +メディアを1つの面だけに取り付けるには、「面を選択」を選んでオブジェクトの希望する面をクリック、それから「追加」をクリックしてください。 + confirm + + + 着地点を設定するには、この区画の内側に立ってください。 + fail + + 受信者の有効なメールアドレスを入力してください。 + fail + + あなたのメールアドレスを入力してください。 + fail + + デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか? + confirm + + + スナップショットデータの処理エラー + fail + + スナップショットのエンコードエラー + fail + + このアイテムをアップロードするには、L$ [COST]が必要です。 + fail + + インベントリに写真を保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。 + fail + + インベントリにテクスチャを保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。 + fail + + 以下の理由でスナップショットの送信時に問題が起こりました:[REASON] + fail + + 以下の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました:[REASON] + fail + + [SECOND_LIFE]へのログインを続けるには、Second Lifeの利用規約、プライバシーポリシー、およびサービス規約に同意する必要があります。 + fail + + アウトフィットを装着できません。 +アウトフィットフォルダに服装、身体部位、装着物がありません。 + fail + + ごみ箱にある服装や身体部位は、着用できません。 + fail + + オブジェクトを装着できませんでした。 +最大装着数[MAX_ATTACHMENTS]個を越えています。どれか取り外してからお試しください。 + fail + + まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。 + fail + + ログインするためにパスワードを入力してください。 + fail + + おっと、記入漏れがあります。 アバターのユーザー名を入力してください。 -[SECOND_LIFE] に入るにはアカウントが必要です。今すぐアカウントを作成しますか? - [create_account_url] - - - ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。 - '[GRID]' は有効なグリッド ID ではありません。 - ログイン位置で有効なグリッドが指定されませんでした。 - - クラシファイド広告 [NAME] を削除しますか? +[SECOND_LIFE]に入るにはアカウントが必要です。今すぐアカウントを作成しますか? + confirm + [create_account_url] + + + ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。 + fail + + 「[GRID]」は、有効なグリッドIDではありません。 + fail + + ログイン位置で有効なグリッドが指定されませんでした。 + fail + + クラシファイド広告『[NAME]』を削除してもよろしいですか? 支払い済みの料金は返金されません。 - - - - この面にあるメディアを削除する選択をしました。 -続けますか? - - - - クラシファイド広告 [NAME] への変更を保存しますか? - - - - クラシファイド広告を出すには、資金が足りません。 - - - - <nolink>[PICK]</nolink> を削除しますか? - - - - 選択したアウトフィットを削除しますか? - - - - [SECOND_LIFE] イベント Web ページに移動しますか? - http://secondlife.com/events/?lang=ja-JP - - - 表示する提案を選択してください。 - 表示する履歴アイテムを選択してください。 - [APP_NAME] を再起動後にキャッシュがクリアされます。 - [APP_NAME] を再起動後にキャッシュが移動されます。 -ご注意: キャッシュがクリアされます。 - ポートの設定は [APP_NAME] を再起動後に反映されます。 - デバッグ設定の変更は [APP_NAME] を再起動後に反映されます。 - 新しいスキンは [APP_NAME] を再起動後に表示されます。 - 言語の変更は [APP_NAME] を再起動後に反映されます。 - - [SECOND_LIFE]の Web ページに移動し、入札あるいはオークションの詳細を確認しますか? - http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] - - - - 変更を保存しますか? - - - - ノートカードを削除しますか? - - - - 以前のスクリーンショットをレポートに使用しますか? - - - ジェスチャーの保存に失敗しました。 + confirm + + + この顔に紐づけられたメディアの削除を選択しました。 +続行してもよろしいですか? + confirm + + + クラシファイド広告[NAME]への変更を保存しますか? + confirm + + + クラシファイド広告を出すには、資金が足りません。 + fail + + + + クラシファイド広告<nolink>[CLASSIFIED]</nolink>を削除してもよろしいですか? + confirm + + + ピック<nolink>[PICK]</nolink>を削除してもよろしいですか? + confirm + + + 未公開のクラシファイド広告があります。 +ウィンドウを閉じると変更が失われます。 + confirm + + + 保存されていない変更があります。 + confirm + save + + + 「<nolink>[PICK]</nolink>」を削除してもよろしいですか? + + + このアウトフィットを削除してもよろしいですか? + confirm + + + [SECOND_LIFE]イベントWebページに移動しますか? + https://secondlife.com/my/community/events/?lang=ja-JP + confirm + + + 表示する提案を選択してください。 + fail + + 表示する履歴アイテムを選択してください。 + fail + + + + + キャッシュは、[APP_NAME]再起動後にクリアされます。 + キャッシュは、[APP_NAME]再起動後が移動されます。 +注意:キャッシュがクリアされます。 + ポートの設定は、[APP_NAME]再起動後に反映されます。 + デバッグ設定の変更は、[APP_NAME]再起動後に反映されます。 + 新しいスキンは、[APP_NAME]再起動後に表示されます。 + 言語の変更は、[APP_NAME]再起動後に反映されます。 + [SECOND_LIFE]のWebページに移動し、入札あるいはオークションの詳細を確認しますか? + confirm + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID] + + + 変更を保存しますか? + confirm + + + このノートカードを削除してもよろしいですか? + + confirm + + + 以前のスクリーンショットをレポートに使用しますか? + + + ジェスチャーの保存に失敗しました。 ステップが多すぎます。 -ステップをいくつか削除してから再保存してください - ジェスチャーの保存に失敗しました。少し待ってからもう一度試してください。 - ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 -オブジェクトが範囲内に存在しないか、または削除された可能性があります。 - 次の理由で、ジェスチャーの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。 - ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 -オブジェクトが範囲内に存在しないか、または削除された可能性があります。 - 次の理由で、ノートカードの保存時に問題が起こりました。 [REASON]。 後でもう一度試してください。 - - あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。 +ステップをいくつか削除してから再保存してください + fail + + ジェスチャーの保存に失敗しました。 +少し待ってからもう一度試してください。 + fail + + ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 +オブジェクトが範囲内に存在しないか、削除された可能性があります。 + fail + + 以下の理由で、ジェスチャーの保存時に問題が起こりました:[REASON] +お手数ですが、後でもう一度試してください。 + fail + + ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 +オブジェクトが範囲内に存在しないか、削除された可能性があります。 + fail + + 以下の理由で、ノートカードの保存時に問題が起こりました:[REASON] +お手数ですが、後でもう一度試してください。 + fail + + あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。 サーバーの最新保存バージョンをロードしますか? (**警告**:この操作後元に戻すことはできません) - - - スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。 -オブジェクトは範囲外か、または削除されているかもしれません。 - - ログイン位置が指定されていません。 + confirm + + + スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。 +オブジェクトは範囲外か、または削除されているかもしれません。 + fail + + ログイン位置が指定されていません。 ログイン位置の欄にリージョン名を入力するか、「最後にログアウトした場所」か「自宅(ホーム)」を選択してください。 - - - スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。 -オブジェクトが範囲内に存在しないか、または削除された可能性があります。 - ファイルをダウンロードできません。 - - [SECOND_LIFE] でサポートされていないファイルのダウンロードを要求しました。 - - - ファイル [[FILE]] を書き込めません。 - - お使いのコンピューターは [APP_NAME] の必要最低限の動作環境を満たしていません。 パフォーマンスの低下を感じるかもしれません。 恐れ入りますが [SUPPORT_SITE] ではサポート対象外のシステムに関する技術的サポートは行っておりません。 - -[_URL] に移動して確認をしますか? - http://secondlife.com/support/sysreqs.php?lang=ja - - - ビューワ実行ファイルを直接実行しないでください。代わりに、既存のショートカットの内のどれかをアップデートし、SL_Launcher を実行してください。 - - グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。 - - ドライバの更新を確認するために [URL] にアクセスしますか? - [URL] - - - - お使いのシステムには、[APP_NAME] が認識できないグラフィックカードが搭載されています。 -[APP_NAME] でまだテストされていない最新ハードウェアのためだと考えられます。 問題ないとは思いますが、グラフィックの設定を調整する必要があるかもしれません。 -(ミー > 環境設定 > グラフィック) -
- - -
- グラフィックドライバを初期化中に [APP_NAME] がクラッシュしました。 -ドライバの一般的なエラーを防ぐために、画質が低に設定されます。 そのため、一部のグラフィック特性に制限が出ます。 + fail + + + スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。 +オブジェクトが範囲内に存在しないか、または削除された可能性があります。 + fail + + ファイルをダウンロードできません。 + fail + + ダウンロードをリクエストしたファイルは、[SECOND_LIFE]でサポートされていません。 + + confirm + + + ファイル[[FILE]]に書き込むことができませんでした。 + fail + + お使いのコンピュータは、[APP_NAME]の最小システム要件を満たしていません。 +このためパフォーマンスが低下する場合があります。恐れ入りますが[SUPPORT_SITE]は、サポートされていないシステム構成に対する技術的サポートを提供できません。 + +詳細について、[_URL]を確認しますか? + http://secondlife.com/support/sysreqs.php?lang=ja + fail + + + グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。 +ドライバの更新を確認するために[URL]にアクセスしますか? + [URL] + confirm + fail + + + お使いのシステムには、[APP_NAME]が認識できないグラフィックカードが搭載されています。[APP_NAME]でまだテストされていない最新ハードウェアのためだと考えられます。 +問題ないとは思いますが、グラフィックの設定を調整する必要があるかもしれません。 +(「私」>「初期設定」>「グラフィック」) + fail +
+ + +
+ グラフィックドライバを初期化中に[APP_NAME]がクラッシュしました。 +ドライバの一般的なエラーを防ぐために、画質が低に設定されます。このため、一部のグラフィック特性に制限が出ます。 お使いのグラフィックカードのドライバをアップデートするようおすすめします。 -画質は、環境設定 > グラフィック で設定できます。 - [REGION] では、地形の変更ができません。 - あなたには [PARCEL] 区画を地形編集する許可がありません。 - - あなたには次アイテムをコピーする権限がありません: -<nolink>[ITEMS]</nolink> -他の住人に譲ると、そのアイテムはあなたの持ち物から削除されます。本当にこれらのアイテムを譲りますか? - - - インベントリのアイテムを渡せません。 - 取引がキャンセルされました。 - 一度に 42 個以上のアイテムは渡せません。 - 選択したアイテムを渡す権限がありません。 - - あなたは選択した [COUNT] 個のアイテムののコピーを許されていません。 +画質は、「初期設定」>「グラフィック」で設定できます。 + fail + + この設定を変更すると、「自動調整」の設定が無効になります。 +続けてもよろしいですか? + confirm + + + 高度な照明をオンにするには、品質をレベル4以上にする必要があります。 + confirm + + + 影を有効にするには、品質をレベルを4以上にする必要があります。 + confirm + + + [REGION]では、地形の変更ができません。 + fail + + [PARCEL]区画の地形を編集する権限がありません。 + fail + + 以下のアイテムをコピーする権限がありません: +<nolink>[ITEMS]</nolink> +他の人に譲ると、そのアイテムはあなたの持ち物から削除されます。本当にこれらのアイテムを譲ってもよろしいですか? + confirm + fail + + + インベントリのアイテムを渡すことができません。 + fail + + 取引がキャンセルされました。 + fail + + 一度に42個以上のアイテムを渡すことはできません。 + fail + + 選択したアイテムを渡す権限がありません。 + fail + + あなたは選択した[COUNT]個のアイテムをコピーする権限がありません。 これらのアイテムはあなたのインベントリから失われます。 -本当にアイテムを渡したいですか? - - - 選択したフォルダを渡す権限がありません - - このアバターをフリーズしますか? +本当にアイテムを渡してもよろしいですか? + confirm + fail + + + 選択したフォルダを渡す権限がありません。 + fail + + このアバターをフリーズしますか? アバターは一時的に動けなくなり、チャットを含めインワールドで何もできなくなります。 - - - - [AVATAR_NAME]をフリーズしますか? -フリーズされた人は一時的に動けなくなり、チャットなど、この世界に対する関わりを持つことができなくなります。 - - - - あなたの土地から [AVATAR_NAME] を追放しますか? - - - - このアバターをあなたの土地から追放しますか? - - - - [AVATAR_NAME] をあなたの土地から追放しますか? - - - <nolink>[GROUP_NAME]</nolink> から [AVATAR_NAME] を追放しました - 取得エラー:選択したオブジェクトの数が多すぎます。 - 取得エラー: -オブジェクトが複数のリージョン(地域)にまたがって存在しています。 -すべて同じリージョン内に移動させてから取得してください。 - - [EXTRA] - -[_URL] に移動してリンデンドル購入に関する情報を確認しますか? - http://secondlife.com/app/currency/?lang=ja-JP - - - [MUTE_LIMIT] エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。 - [COUNT] 個のオブジェクトをリンクできません。 -リンクできるのは最大 [MAX] 個です。 - セットで揃っているオブジェクトのみリンクできます。 -複数のオブジェクトを選択してください。 - すべてのオブジェクトの修正許可がないためリンクできません。 - -どのオブジェクトもロックされておらず、あなたのものであることを確認してください。 - 地域(リージョン)の境界を越えてオブジェクトをリンクできません。 - 地域(リージョン)の境界を越えてオブジェクトをリンクできません。 - 所有者が異なるため、オブジェクトをリンクできません。 - -自分が所有しているオブジェクトだけを選択してください。 - 「 [FILE] 」の拡張子が無効です。 + confirm + + + [AVATAR_NAME]をフリーズしますか? +フリーズされた人は一時的に動けなくなり、チャットなど、ワールドに対する関わりを持つことができなくなります。 + confirm + + + あなたの土地から[AVATAR_NAME]を追放しますか? + confirm + + + このアバターをあなたの土地から追放しますか? + confirm + + + [AVATAR_NAME]をあなたの土地から追放しますか? + confirm + + + <nolink>[GROUP_NAME]</nolink>から[AVATAR_NAME]を追放しました。 + group + + 取得エラー:選択したオブジェクトの数が多すぎます。 + fail + + 取得エラー:オブジェクトが複数のリージョン(地域)にまたがって存在しています。 +すべて同じリージョン内に移動させてから取得してください。 + fail + + [EXTRA] + +[_URL]に移動してリンデンドル購入に関する情報を確認しますか? + https://secondlife.com/my/lindex/?lang=ja-JP + + + [MUTE_LIMIT]エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。 + fail + + [COUNT]個のオブジェクトをリンクできませんでした。 +リンクできるオブジェクトは最大[MAX]個です。 + fail + + セットが揃っているオブジェクトのみリンクできます。複数のオブジェクトを選択してください。 + fail + + すべてのオブジェクトの修正許可がないためリンクできません。 + +どのオブジェクトもロックされておらず、あなたのものであることを確認してください。 + fail + + リージョン(地域)の境界を越えてオブジェクトをリンクできません。 + fail + + リージョン(地域)の境界を越えてオブジェクトをリンクできません。 + fail + + 所有者が異なるため、オブジェクトをリンクできません。 +自分が所有しているオブジェクトだけを選択してください。 + fail + + ファイル「[FILE]」は、無効な拡張子です。 このファイルの拡張子が正しいかどうかを確認してください。 - - [EXTENSION] は無効です。 -正しい拡張子:[VALIDS] - - - 読み込みのためにアップロードされたサウンドファイルを開けません: -[FILE] - RIFF WAVE ファイルとして認識されません: -[FILE] - PCM WAVE オーディオファイルとして認識されません: -[FILE] - ファイルのチャンネル数が無効です(モノラルまたはステレオを使用する必要があります): -[FILE] - ファイルのサンプルレートがサポートされていません(44.1k である必要があります): -[FILE] - ファイルのワードサイズがサポートされていません(8 または 16 ビットである必要があります): -[FILE] - WAV ヘッダーにデータチャンクが見つかりません: -[FILE] - WAV ファイルのチャンクサイズが間違っています: -[FILE] - オーディオファイルが長すぎます。(最大 10 秒): -[FILE] - 「 [FILE] 」に問題があります。 - -[ERROR] - 書き込み用の一時圧縮サウンドファイルを開くことができません:[FILE] - 不明の Vorbis のエンコードに失敗: [FILE] - 次のファイルのエンコードができません: [FILE] - - ユーザー名とパスワードを自動入力できません。これはネットワーク設定が変更された場合に起こります - - - 破損したリソースファイル: [FILE] - 不明のリンデンリソースファイルのバージョン: [FILE] - 出力ファイルを作成できません: [FILE] - 現在 [APP_NAME] では、BVH 形式のアニメーションファイルの一括アップロードはサポートされていません。 - 次の理由で、「 [FILE] 」をアップロードできません: [REASON] -あとでもう一度試してください。 - 「 [LANDMARK_NAME] 」を「 [FOLDER_NAME] 」フォルダに追加しました。 - - 現在地のランドマークを既に持っています。 - - - 土地の所有者が許可していないため、ランドマークを作成することはできません。 - 「リコンパイル」できません。 -スクリプトのオブジェクトを選択してください。 - 「リコンパイル」できません。 - -修正修正権限のあるスクリプトのオブジェクトを選択してください。 - 「再設定」ができません。 - -スクリプトのオブジェクトを選択してください。 - 「再設定」ができません。 - -修正権限のあるスクリプトのオブジェクトを選択してください。 - 修正権限のないオブジェクトのスクリプトは開くことはできません。 - スクリプトの「実行」ができません。 - -スクリプトのオブジェクトを選択してください。 - スクリプトを「実行しない」設定にできません。 - -スクリプトのオブジェクトを選択してください。 - 保存する frontmost フロータがありません。 - 指定した検索クエリは変更され、短すぎる語句は取り除かれています。 - -検索語句: [FINALQUERY] - 指定した検索語句が短すぎたため、検索は行われませんでした。 - テレポートに失敗しました。 -[REASON] - テレポート処理中に問題が発生しました。 ログインし直す必要があるかもしれません。 -このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。 - リージョン間の移動中に問題が発生しました。 ログインし直す必要があるかもしれません。 -このメッセージが何度も出る場合は、[SUPPORT_SITE] をご確認ください。 - 申し訳ございません。テレポートは現在、ブロックされています。しばらくしてから再度お試しください。 -それでもテレポートできない場合は、ログアウトし、ログインし直して問題を解決してください。 - 申し訳ございません。ランドマークの目的地が見つかりませんでした。 - 申し訳ございません。システムによるテレポート接続が完了できませんでした。 -しばらくしてから再度お試しください。 - 残念ながら、目的地へアクセスが許可されていないため、テレポートできません。 - 添付物がまだ届いていません。テレポートをする前にあと数秒間お待ちいただくか、いったんログアウトし、再度ログインしてください。 - このリージョンのアセットキューが現在混み合っているため、テレポートのリクエストをすぐに処理することが難しい状況です。 -数分後にやり直すか、混雑していない他のリージョンでお試しください。 - 申し訳ございません。システムはテレポートのリクエストを時間どおりに完了できませんでした。数分後にやり直してください。 - 申し訳ございません。システムはリージョン間の移動を時間どおりに完了できませんでした。 -数分後にやり直してください。 - テレポート目的地を見つけられません。目的地が一時的に利用できない状態か、すでに消滅している可能性があります。数分後にやり直してください。 - インベントリシステムは現在利用できません。 - 土地所有者設定ができません: -区画が選定されていません。 - 複数のリージョンが選択されたため、土地の所有権を取得できません。 -選択する面積を小さくして、もう一度お試しください。 - - この区画はオークションに出されています。 所有権を変更するとオークションはキャンセルとなり、既にオークションに参加している住人がいればその人に迷惑をかけてしまいます。 + 「[EXTENSION]」は、無効な拡張子です。 +有効な拡張子:[VALIDS] + fail + + + 読み込みのためにアップロードされたサウンドファイルを開けません: +[FILE] + fail + + RIFF WAVEファイルとして認識されません: +[FILE] + fail + + PCM WAVEオーディオファイルとして認識されません: +[FILE] + fail + + このファイルのチャンネル数は無効です(モノラルか、ステレオである必要があります): +[FILE] + fail + + このファイルのサンプリングレートはサポートされていません(44.1kである必要があります): +[FILE] + fail + + このファイルのビットサイズはサポートされていません(8bitか、16bitである必要があります): +[FILE] + fail + + WAVヘッダーにデータチャンクが見つかりません: +[FILE] + fail + + WAVファイルのチャンクサイズが間違っています: +[FILE] + fail + + オーディオファイルが長すぎます。(最大10秒): +[FILE] + fail + + 「[FILE]」に問題があります。 + +[ERROR] + fail + + 書き込み用の一時圧縮サウンドファイルを開くことができません: +[FILE] + fail + + 不明なVorbisのエンコードに失敗しました: +[FILE] + fail + + 次のファイルのエンコードができません: +[FILE] + fail + + ユーザー名とパスワードを自動入力できません。これはネットワーク設定が変更された場合に起こります + fail + + + 破損したリソースファイル: +[FILE] + fail + + 不明なLindenリソースファイルのバージョンです: +[FILE] + fail + + 出力ファイルを作成できません: +[FILE] + fail + + 現在[APP_NAME]では、BVH形式のアニメーションファイルの一括アップロードはサポートされていません。 + fail + + 以下の理由で「[FILE]」をアップロードできませんでした: +[REASON] + +お手数ですがもう一度やり直してください。 + fail + + 「[LANDMARK_NAME]」を「[FOLDER_NAME]」フォルダに追加しました。 + この場所のランドマークは、既に持っています。 + fail + + + + +フォルダ名を入力してください: + confirm +
+ + +
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml index df9ef40113..098128bb6d 100644 --- a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml @@ -1,11 +1,12 @@ - - - - - - - + + + + 名前タグ: + + + + + + + \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml new file mode 100644 index 0000000000..21dabb133c --- /dev/null +++ b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml @@ -0,0 +1,66 @@ + + + + + + 0 + [https://community.secondlife.com/t5/Featured-News/Why-are-all-these-people-made-of-colored-jelly/ba-p/3031255 これはなんですか?] + + + +
- + diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml index 3f43469c6f..8311f0859f 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml @@ -34,7 +34,7 @@ - +
\ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml index f64a6dc55c..76b484a816 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml @@ -5,7 +5,7 @@ - + diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index cc5bed8331..5227c0d583 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -326,7 +326,7 @@ - + diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 66ac069be4..13f94172b6 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -3303,7 +3303,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ fail - [TO_NAME]にテレポートを送りました。 + [TO_NAME]にテレポートのオファーを送りました。 [NAME_SLURL] は、テレポートであなたを呼んでいます。 [MESSAGE] @@ -3329,7 +3329,7 @@ Webページにリンクすると、他人がこの場所に簡単にアクセ [MESSAGE] -(デフォルト設定だとお互いのオンライン状態を見ることができます) +(デフォルトの設定では、お互いのオンライン状態を知ることができます。) friendship confirm @@ -3984,10 +3984,10 @@ UDP:3478, 3479, 5060, 5062, 6250, 12000-32000 - ⒈クリックで移動 -行地面の一箇所をクリックすると、その場所まで歩きます。 + 1,クリックで移動 +地面をクリックすると、その場所まで歩きます。 -⒉クリック・ドラッグで視界を回転 +2,クリック・ドラッグで視界を回転 任意の場所をクリックしてドラッグすると視界を回転させることができます。 custom_skin diff --git a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml index 21dabb133c..f5f1bc1b03 100644 --- a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml +++ b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml @@ -38,10 +38,10 @@ - - 水の効果を簡素化するかオフにすると、フレームレートが大幅に向上します。 + 水面 + 水面の効果を簡素化するかオフにすると、フレームレートが大幅に向上します。 - 水の反射: + 水面の反射: @@ -56,11 +56,11 @@ 詳細度を最大にすると撮影に適した画像になりますが、フレームレートが下がります。 (0.0~4.0の値を入れてください) - 1 - 2 - 3 - 4 - 5 - 6 - 7 + 1 + 2 + 3 + 4 + 5 + 6 + 7 \ No newline at end of file diff --git a/indra/newview/skins/default/xui/ja/panel_region_environment.xml b/indra/newview/skins/default/xui/ja/panel_region_environment.xml index a11ebb1fb3..092ea431b9 100644 --- a/indra/newview/skins/default/xui/ja/panel_region_environment.xml +++ b/indra/newview/skins/default/xui/ja/panel_region_environment.xml @@ -2,12 +2,12 @@ 既定の設定を使用 リージョン(地域)の設定を使用 - 空 [INDEX]([ALTITUDE]m) - 区画が選択されていません。環境設定が無効になっています。 - リージョン(地域)の境界では環境設定ができません。 - このリージョン(地域)で環境設定はできません。 - 不動産マネージャーが、このリージョン(地域)で区画の環境を変更することを許可していません。 - 環境をサポートするには、最低でも128㎡の区画が必要です。 + 空 [INDEX]([ALTITUDE]m) + 区画が選択されていません。環境の設定は無効になっています。 + リージョン(地域)の境界では環境の設定ができません。 + このリージョン(地域)で環境の設定ができません。 + このリージョン(地域)の不動産マネージャーは、区画ごとの環境の変更を許可していません。 + 環境を変更するには、最低でも128㎡の区画が必要です。 (空) (リージョンの環境) @@ -22,7 +22,7 @@ +
diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml index 6dd6b486a7..284449d59d 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_other.xml @@ -1,36 +1,31 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml index aae708e257..d2e46447a0 100644 --- a/indra/newview/skins/default/xui/ja/menu_attachment_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_attachment_self.xml @@ -1,21 +1,21 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml index 8c697317a5..f032327dd9 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_icon.xml @@ -1,14 +1,14 @@ - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml index 237d66c54d..a7989b35c8 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_other.xml @@ -1,38 +1,29 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml index 0205564756..3c824840a5 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml index 65f7fae6bd..15021859bb 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_rendering_settings_add.xml @@ -1,6 +1,5 @@ - - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml index 80ed3b19c8..f0100f6f08 100644 --- a/indra/newview/skins/default/xui/ja/menu_avatar_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_avatar_self.xml @@ -1,37 +1,37 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml index 3e4ab1f856..154db254da 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_attachment.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml index 8af5189f87..eb5faa2545 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_body_part.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml index 47d4f76e48..f94e5d393c 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_clothing.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml index f6ce0e6c6c..c60b27111e 100644 --- a/indra/newview/skins/default/xui/ja/menu_cof_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_cof_gear.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_conversation.xml b/indra/newview/skins/default/xui/ja/menu_conversation.xml index ff6884f24d..047f5d57cf 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation.xml @@ -1,34 +1,34 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml index 7e43b8b61f..78c46d13b4 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_gear.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml index c239eb9543..bcda112d2f 100644 --- a/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_conversation_log_view.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml index 819b05f854..b58b08ebb2 100644 --- a/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_color.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml index ac211997bf..6105fd5296 100644 --- a/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_features.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml index 80d7eeff31..0f069dfffa 100644 --- a/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_light.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml index ed1491298f..b2d3672019 100644 --- a/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_object.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml index 92e0ec74ba..3589d7bd4c 100644 --- a/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_pos.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml index 9504f39ef1..7a77a74b67 100644 --- a/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_rot.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml index 1ee1d6a914..3b813ba97f 100644 --- a/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_size.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml b/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml index a596fbe103..0947a66b9a 100644 --- a/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml +++ b/indra/newview/skins/default/xui/ja/menu_copy_paste_texture.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_edit.xml b/indra/newview/skins/default/xui/ja/menu_edit.xml index 0152675de7..121b3d699b 100644 --- a/indra/newview/skins/default/xui/ja/menu_edit.xml +++ b/indra/newview/skins/default/xui/ja/menu_edit.xml @@ -1,12 +1,12 @@ - - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_favorites.xml b/indra/newview/skins/default/xui/ja/menu_favorites.xml index 94361555fe..58347b55fb 100644 --- a/indra/newview/skins/default/xui/ja/menu_favorites.xml +++ b/indra/newview/skins/default/xui/ja/menu_favorites.xml @@ -1,14 +1,14 @@ - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml index 2527e373f4..5540c9a234 100644 --- a/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_gallery_outfit_tab.xml @@ -1,35 +1,35 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml index 333db46380..e1f24cdb39 100644 --- a/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_gesture_gear.xml @@ -1,11 +1,11 @@ - - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_group_plus.xml b/indra/newview/skins/default/xui/ja/menu_group_plus.xml index 52cc5e69e1..db403ac938 100644 --- a/indra/newview/skins/default/xui/ja/menu_group_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_group_plus.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml index 3a9fb3570a..d9d6e51867 100644 --- a/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_hide_navbar.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + +
diff --git a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml index 8899b69f1a..b3d3917965 100644 --- a/indra/newview/skins/default/xui/ja/menu_im_conversation.xml +++ b/indra/newview/skins/default/xui/ja/menu_im_conversation.xml @@ -1,16 +1,16 @@ - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml index 5ef2a4152a..73e4164407 100644 --- a/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml +++ b/indra/newview/skins/default/xui/ja/menu_im_session_showmodes.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml index 26b581b793..8cd6fa4a27 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_adhoc.xml @@ -1,4 +1,4 @@ - - \ No newline at end of file + +
diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml index 7ae8765df4..e7f5cb310a 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_group.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml index 61a9bae73c..edcc0f751a 100644 --- a/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml +++ b/indra/newview/skins/default/xui/ja/menu_imchiclet_p2p.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml index ec5abea6b2..55b2e8b21b 100644 --- a/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_inspect_object_gear.xml @@ -1,19 +1,19 @@ - + - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml index d9642e3c0c..9a4a8138f5 100644 --- a/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml +++ b/indra/newview/skins/default/xui/ja/menu_inv_offer_chiclet.xml @@ -1,4 +1,4 @@ - - \ No newline at end of file + + diff --git a/indra/newview/skins/default/xui/ja/menu_inventory.xml b/indra/newview/skins/default/xui/ja/menu_inventory.xml index 03e02ff200..c7cba4845d 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory.xml @@ -1,133 +1,129 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml index 8311f0859f..0de24d1c7a 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory_add.xml @@ -1,40 +1,40 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml index 7a8adcb9fb..975e1b147a 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory_gear_default.xml @@ -1,21 +1,21 @@ - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml index f76be9631a..2395c9e7b3 100644 --- a/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml +++ b/indra/newview/skins/default/xui/ja/menu_inventory_search_visibility.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_land.xml b/indra/newview/skins/default/xui/ja/menu_land.xml index a65504b14c..bef249d203 100644 --- a/indra/newview/skins/default/xui/ja/menu_land.xml +++ b/indra/newview/skins/default/xui/ja/menu_land.xml @@ -1,13 +1,10 @@ - - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_landmark.xml b/indra/newview/skins/default/xui/ja/menu_landmark.xml index 06345c5074..c134422955 100644 --- a/indra/newview/skins/default/xui/ja/menu_landmark.xml +++ b/indra/newview/skins/default/xui/ja/menu_landmark.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_login.xml b/indra/newview/skins/default/xui/ja/menu_login.xml index 5ba2092648..f59b0b7e5e 100644 --- a/indra/newview/skins/default/xui/ja/menu_login.xml +++ b/indra/newview/skins/default/xui/ja/menu_login.xml @@ -1,39 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml index 6c6913db5d..ad02ada4b9 100644 --- a/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_marketplace_view.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml index 6f4f4938f4..3c566a87a4 100644 --- a/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml +++ b/indra/newview/skins/default/xui/ja/menu_media_ctrl.xml @@ -1,8 +1,8 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_mini_map.xml b/indra/newview/skins/default/xui/ja/menu_mini_map.xml index 77a2e60cda..eee3fb7690 100644 --- a/indra/newview/skins/default/xui/ja/menu_mini_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_mini_map.xml @@ -1,11 +1,11 @@ - - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml index f35e74afc5..9472255128 100644 --- a/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml +++ b/indra/newview/skins/default/xui/ja/menu_model_import_gear_default.xml @@ -1,8 +1,8 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml index 38b736ae9b..8befe0cf57 100644 --- a/indra/newview/skins/default/xui/ja/menu_mute_particle.xml +++ b/indra/newview/skins/default/xui/ja/menu_mute_particle.xml @@ -1,5 +1,4 @@ - - - \ No newline at end of file + + diff --git a/indra/newview/skins/default/xui/ja/menu_navbar.xml b/indra/newview/skins/default/xui/ja/menu_navbar.xml index f3e274313e..9954c17ddc 100644 --- a/indra/newview/skins/default/xui/ja/menu_navbar.xml +++ b/indra/newview/skins/default/xui/ja/menu_navbar.xml @@ -1,11 +1,11 @@ - - - - - - - - - \ No newline at end of file + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml index 42a6c66168..1665efe46a 100644 --- a/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml +++ b/indra/newview/skins/default/xui/ja/menu_nearby_chat.xml @@ -1,12 +1,12 @@ - - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml b/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml index 3852efcdd4..913bae8958 100644 --- a/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml +++ b/indra/newview/skins/default/xui/ja/menu_notification_well_button.xml @@ -1,4 +1,4 @@ - - \ No newline at end of file + + diff --git a/indra/newview/skins/default/xui/ja/menu_object.xml b/indra/newview/skins/default/xui/ja/menu_object.xml index f7e64e015a..14db32081b 100644 --- a/indra/newview/skins/default/xui/ja/menu_object.xml +++ b/indra/newview/skins/default/xui/ja/menu_object.xml @@ -1,36 +1,36 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_object_icon.xml b/indra/newview/skins/default/xui/ja/menu_object_icon.xml index 163c8d1779..e7cd4b40b8 100644 --- a/indra/newview/skins/default/xui/ja/menu_object_icon.xml +++ b/indra/newview/skins/default/xui/ja/menu_object_icon.xml @@ -1,9 +1,9 @@ - - - - - - - \ No newline at end of file + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml index 962d25bb07..b869e67923 100644 --- a/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_outfit_gear.xml @@ -1,42 +1,39 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml index 66ebb79bb9..cc04ac6dcf 100644 --- a/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_outfit_tab.xml @@ -1,9 +1,9 @@ - - - - - - - \ No newline at end of file + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_participant_list.xml b/indra/newview/skins/default/xui/ja/menu_participant_list.xml index 76b484a816..ebce5f7e6b 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_list.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_list.xml @@ -1,25 +1,25 @@ - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_participant_view.xml b/indra/newview/skins/default/xui/ja/menu_participant_view.xml index ef61874763..be9fffae04 100644 --- a/indra/newview/skins/default/xui/ja/menu_participant_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_participant_view.xml @@ -1,16 +1,16 @@ - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml index 8d80ddebad..ac1757cc48 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_gear.xml @@ -1,10 +1,10 @@ - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml index 1d89e15f64..a87c55038f 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_plus.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml index db586365b2..80d9d43005 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_blocked_view.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml index fee506c511..e761c506bf 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_friends_view.xml @@ -1,9 +1,9 @@ - - - - - - - \ No newline at end of file + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups.xml b/indra/newview/skins/default/xui/ja/menu_people_groups.xml index 91044bd283..2c0c85ba28 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups.xml @@ -1,8 +1,8 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml index 07144be420..4a9e402fa4 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_groups_view.xml @@ -1,4 +1,4 @@ - - \ No newline at end of file + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml index f59ebfa154..bbe842a37e 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby.xml @@ -1,18 +1,18 @@ - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml index 5c73eb5a4f..4e3dbd3279 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_multiselect.xml @@ -1,10 +1,10 @@ - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml index 7b56f1daf8..68e5ec88bf 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_nearby_view.xml @@ -1,10 +1,10 @@ - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml index da27372963..84b24726f4 100644 --- a/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml +++ b/indra/newview/skins/default/xui/ja/menu_people_recent_view.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_picks.xml b/indra/newview/skins/default/xui/ja/menu_picks.xml index 4a5a42ad05..ef4d9bc369 100644 --- a/indra/newview/skins/default/xui/ja/menu_picks.xml +++ b/indra/newview/skins/default/xui/ja/menu_picks.xml @@ -1,10 +1,10 @@ - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_picks_plus.xml b/indra/newview/skins/default/xui/ja/menu_picks_plus.xml index 62eb8327bc..84bf90fea0 100644 --- a/indra/newview/skins/default/xui/ja/menu_picks_plus.xml +++ b/indra/newview/skins/default/xui/ja/menu_picks_plus.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_place.xml b/indra/newview/skins/default/xui/ja/menu_place.xml index f45f9211ed..fc1ec43c6c 100644 --- a/indra/newview/skins/default/xui/ja/menu_place.xml +++ b/indra/newview/skins/default/xui/ja/menu_place.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml index d6a13b92ba..575b61ffa5 100644 --- a/indra/newview/skins/default/xui/ja/menu_place_add_button.xml +++ b/indra/newview/skins/default/xui/ja/menu_place_add_button.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml index c9fa92b6a2..9b1bd4f18b 100644 --- a/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_folder.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml index 16508dde4a..594a2016b1 100644 --- a/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_landmark.xml @@ -1,22 +1,22 @@ - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml b/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml index 197b61af30..70dd50c25d 100644 --- a/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml +++ b/indra/newview/skins/default/xui/ja/menu_places_gear_sorting.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_profile_other.xml b/indra/newview/skins/default/xui/ja/menu_profile_other.xml index 0ff41f91a2..0247a60803 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_other.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_other.xml @@ -1,23 +1,23 @@ - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml index 67c481cdd6..24304689ce 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_overflow.xml @@ -1,12 +1,12 @@ - - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_profile_self.xml b/indra/newview/skins/default/xui/ja/menu_profile_self.xml index ec10d92629..7c9570378e 100644 --- a/indra/newview/skins/default/xui/ja/menu_profile_self.xml +++ b/indra/newview/skins/default/xui/ja/menu_profile_self.xml @@ -1,12 +1,12 @@ - - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml index 6d8f2381d9..0533c8677b 100644 --- a/indra/newview/skins/default/xui/ja/menu_save_outfit.xml +++ b/indra/newview/skins/default/xui/ja/menu_save_outfit.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_save_settings.xml b/indra/newview/skins/default/xui/ja/menu_save_settings.xml index a8bb95a661..0e8e25955f 100644 --- a/indra/newview/skins/default/xui/ja/menu_save_settings.xml +++ b/indra/newview/skins/default/xui/ja/menu_save_settings.xml @@ -1,9 +1,9 @@ - - - - - - - \ No newline at end of file + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml index c4bc424927..a89dd0bcbe 100644 --- a/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml +++ b/indra/newview/skins/default/xui/ja/menu_script_chiclet.xml @@ -1,4 +1,4 @@ - - \ No newline at end of file + + diff --git a/indra/newview/skins/default/xui/ja/menu_settings_add.xml b/indra/newview/skins/default/xui/ja/menu_settings_add.xml index 9e64476446..814ad9c1a6 100644 --- a/indra/newview/skins/default/xui/ja/menu_settings_add.xml +++ b/indra/newview/skins/default/xui/ja/menu_settings_add.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml index a44786b414..a8ff0d3721 100644 --- a/indra/newview/skins/default/xui/ja/menu_settings_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_settings_gear.xml @@ -1,10 +1,10 @@ - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_slurl.xml b/indra/newview/skins/default/xui/ja/menu_slurl.xml index 3d5ea3f616..820cc3cd53 100644 --- a/indra/newview/skins/default/xui/ja/menu_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_slurl.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml index fd4dffeefa..e5e5b7b1ba 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_gear.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml index dc34bc6463..c26b70e9e1 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_item.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml b/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml index 391be973f8..4dd44d2ec8 100644 --- a/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_teleport_history_tab.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_text_editor.xml b/indra/newview/skins/default/xui/ja/menu_text_editor.xml index 48fd8ad243..3a5892bafc 100644 --- a/indra/newview/skins/default/xui/ja/menu_text_editor.xml +++ b/indra/newview/skins/default/xui/ja/menu_text_editor.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_toolbars.xml b/indra/newview/skins/default/xui/ja/menu_toolbars.xml index 9bb4eaf496..a54f7bdef7 100644 --- a/indra/newview/skins/default/xui/ja/menu_toolbars.xml +++ b/indra/newview/skins/default/xui/ja/menu_toolbars.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_topinfobar.xml b/indra/newview/skins/default/xui/ja/menu_topinfobar.xml index ea1e12ab2b..326e6d232b 100644 --- a/indra/newview/skins/default/xui/ja/menu_topinfobar.xml +++ b/indra/newview/skins/default/xui/ja/menu_topinfobar.xml @@ -1,11 +1,9 @@ - - - - - - - - \ No newline at end of file + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_agent.xml b/indra/newview/skins/default/xui/ja/menu_url_agent.xml index dc9a6af8fe..9ce9a070f2 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_agent.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_agent.xml @@ -1,10 +1,10 @@ - - - - - - - - \ No newline at end of file + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_email.xml b/indra/newview/skins/default/xui/ja/menu_url_email.xml index 1ba8d6a64e..6c41d759fe 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_email.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_email.xml @@ -1,5 +1,5 @@ - - - \ No newline at end of file + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_experience.xml b/indra/newview/skins/default/xui/ja/menu_url_experience.xml index 83d7029527..09d4dce74d 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_experience.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_experience.xml @@ -1,4 +1,4 @@ - - \ No newline at end of file + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_group.xml b/indra/newview/skins/default/xui/ja/menu_url_group.xml index 9214d67dea..ebd7f25d6e 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_group.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_group.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_http.xml b/indra/newview/skins/default/xui/ja/menu_url_http.xml index ba5048094d..ae97e8bd8d 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_http.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_http.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml index 7a13030b64..1805fb03bb 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_inventory.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_inventory.xml @@ -1,7 +1,7 @@ - - - - - \ No newline at end of file + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_map.xml b/indra/newview/skins/default/xui/ja/menu_url_map.xml index 75813f9017..041b30d05b 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_map.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_map.xml @@ -1,8 +1,8 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml index ef76e5484f..06defa7aed 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_objectim.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_objectim.xml @@ -1,12 +1,12 @@ - - - - - - - - - - \ No newline at end of file + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml index 0c1eab8dad..93aa1372c5 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_parcel.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_parcel.xml @@ -1,8 +1,8 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml index 78f3997bf8..c80351bdae 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_slapp.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_slapp.xml @@ -1,6 +1,6 @@ - - - - \ No newline at end of file + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml index e0d4427008..100dbd0f99 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_slurl.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_slurl.xml @@ -1,9 +1,9 @@ - - - - - - - \ No newline at end of file + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml index e6941fb8bd..a2097ec1f9 100644 --- a/indra/newview/skins/default/xui/ja/menu_url_teleport.xml +++ b/indra/newview/skins/default/xui/ja/menu_url_teleport.xml @@ -1,8 +1,8 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_viewer.xml b/indra/newview/skins/default/xui/ja/menu_viewer.xml index 5227c0d583..a1f3980df4 100644 --- a/indra/newview/skins/default/xui/ja/menu_viewer.xml +++ b/indra/newview/skins/default/xui/ja/menu_viewer.xml @@ -1,690 +1,573 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml index 7ea696d6ca..213a554bbd 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearable_list_item.xml @@ -1,15 +1,15 @@ - - - - - - - - - - - - - \ No newline at end of file + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml index 75fa3f69b3..54c30757ea 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearing_gear.xml @@ -1,8 +1,8 @@ - - - - - - \ No newline at end of file + + + + + + diff --git a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml index 7845ff9aad..7d305e4e34 100644 --- a/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml +++ b/indra/newview/skins/default/xui/ja/menu_wearing_tab.xml @@ -1,9 +1,9 @@ - - - - - - - \ No newline at end of file + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/mime_types.xml b/indra/newview/skins/default/xui/ja/mime_types.xml index 23bab3b0b2..b25d4dd0cc 100644 --- a/indra/newview/skins/default/xui/ja/mime_types.xml +++ b/indra/newview/skins/default/xui/ja/mime_types.xml @@ -1,143 +1,251 @@ - (不明) - なし - - - この場所には、Webコンテンツが含まれています。 - Web コンテンツを表示する - - - - この場所には、ムービーがあります。 - ムービーを再生する - - - - この場所には、画像があります - この場所の画像を表示する - - - - この場所には、オーディオがあります。 - この場所のオーディオを再生する - - - - この場所には、メディアがありません。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + (不明) + + + なし + + + + + この場所には、Webコンテンツが含まれています。 + + + Web コンテンツを表示する + + + + + + この場所には、ムービーがあります。 + + + ムービーを再生する + + + + + + この場所には、画像があります + + + この場所の画像を表示する + + + + + + この場所には、オーディオがあります。 + + + この場所のオーディオを再生する + + + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/mime_types_linux.xml b/indra/newview/skins/default/xui/ja/mime_types_linux.xml index 61574b74f9..3bc18c65b0 100644 --- a/indra/newview/skins/default/xui/ja/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/ja/mime_types_linux.xml @@ -1,131 +1,231 @@ - (不明) - なし - - - この場所には、Webコンテンツが含まれています。 - Web コンテンツを表示する - - - - この場所には、ムービーがあります。 - ムービーを再生する - - - - この場所には、画像があります - この場所の画像を表示する - - - - この場所には、オーディオがあります。 - この場所のオーディオを再生する - - - - この場所には、メディアがありません。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + (不明) + + + なし + + + + + この場所には、Webコンテンツが含まれています。 + + + Web コンテンツを表示する + + + + + + この場所には、ムービーがあります。 + + + ムービーを再生する + + + + + + この場所には、画像があります + + + この場所の画像を表示する + + + + + + この場所には、オーディオがあります。 + + + この場所のオーディオを再生する + + + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/mime_types_mac.xml b/indra/newview/skins/default/xui/ja/mime_types_mac.xml index 0bfc9aeb99..a76394703b 100644 --- a/indra/newview/skins/default/xui/ja/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/ja/mime_types_mac.xml @@ -1,134 +1,236 @@ - (不明) - なし - - - この場所には、Webコンテンツが含まれています。 - Web コンテンツを表示する - - - - この場所には、ムービーがあります。 - ムービーを再生する - - - - この場所には、画像があります - この場所の画像を表示する - - - - この場所には、オーディオがあります。 - この場所のオーディオを再生する - - - - この場所には、メディアがありません。 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ No newline at end of file + + (不明) + + + なし + + + + + この場所には、Webコンテンツが含まれています。 + + + Web コンテンツを表示する + + + + + + この場所には、ムービーがあります。 + + + ムービーを再生する + + + + + + この場所には、画像があります + + + この場所の画像を表示する + + + + + + この場所には、オーディオがあります。 + + + この場所のオーディオを再生する + + + + + + この場所には、メディアがありません。 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/notifications.xml b/indra/newview/skins/default/xui/ja/notifications.xml index 31c54b58e8..123e95df04 100644 --- a/indra/newview/skins/default/xui/ja/notifications.xml +++ b/indra/newview/skins/default/xui/ja/notifications.xml @@ -1,1639 +1,2188 @@ - 次回からこのメッセージを表示しない - - 次回からこのメッセージを表示しない -(現セッションで) - - 常にこのオプションを選択 - - 閉じる - - - - - - - - - - - - - - - - 現在使用中の[APP_NAME]のバージョンでは、受け取った通知メッセージを表示することができません。 + + 次回からこのメッセージを表示しない + + + 次回からこのメッセージを表示しない +(現セッションで) + + + 常にこのオプションを選択 + + + 閉じる + + + + + + + + + 現在使用中の[APP_NAME]のバージョンでは、受け取った通知メッセージを表示することができません。 最新のビューアーがインストールされている事をご確認ください。 エラー詳細:「 [_NAME] 」という通知メッセージは、notifications.xmlに定義されていませんでした。 - fail - - - - フローターエラー:以下のコントロールが見つかりませんでした: + + fail + + + + フローターエラー:以下のコントロールが見つかりませんでした: [CONTROLS] - fail - - - - 現在利用可能なチュートリアルはありません。 - fail - - - - [MESSAGE] - - [MESSAGE] - - - - [MESSAGE] - - - - [APP_NAME]のアップデート中にエラーが発生しました。[http://get.secondlife.com 最新バージョンのビューアーをダウンロード]してください。 - - - - [SECOND_LIFE_GRID]に接続できませんでした。 + + fail + + + + 現在利用可能なチュートリアルはありません。 + + fail + + + + + [MESSAGE] + + [MESSAGE] + + + [MESSAGE] + + + [APP_NAME]のアップデート中にエラーが発生しました。[http://get.secondlife.com 最新バージョンのビューアーをダウンロード]してください。 + + + [SECOND_LIFE_GRID]に接続できませんでした。 [DIAGNOSTIC] インターネット接続が正常かご確認ください。 - fail - - - - ビューアがサーバーから不正な形式の応答を受け取りました。インターネット接続が正常に機能していることを確認してから、後でもう一度お試しください。 + + fail + + + + ビューアがサーバーから不正な形式の応答を受け取りました。インターネット接続が正常に機能していることを確認してから、後でもう一度お試しください。 これが誤りだと思われる場合は、サポートにお問い合わせください。 - fail + + fail + + + + メッセージテンプレート[PATH]がありませんでした。 - - - メッセージテンプレート[PATH]がありませんでした。 - - fail - - - 現在の服装/身体部位の変更を保存しますか? - - - - これらのアイテムの1つ以上を販売用の送信トレイにコピーする権限がありません。移動したり残したままにすることはできます。 - - - - 販売ボックスの最上位に転送した各アイテムにつき、それぞれ1つの新しいフォルダが作成されました。 - - - - - 成功しました。 + + fail + + + 現在の服装/身体部位の変更を保存しますか? + + + これらのアイテムの1つ以上を販売用の送信トレイにコピーする権限がありません。移動したり残したままにすることはできます。 + + + 販売ボックスの最上位に転送した各アイテムにつき、それぞれ1つの新しいフォルダが作成されました。 + + + + 成功しました。 すべてのフォルダが、マーケットプレイスに正常に送信されました。 - - - - 一部のフォルダは送信できていません。 + + + 一部のフォルダは送信できていません。 一部のフォルダが、マーケットプレイスに送信されるときにエラーが発生しました。これらのフォルダは、販売者の送信トレイにまだ残っています。 詳細につきましては、[[MARKETPLACE_IMPORTS_URL] エラーログ]をご確認ください。 - - - 以下のエラーで転送できませんでした:[ERROR_CODE] + + + 以下のエラーで転送できませんでした:[ERROR_CODE] システムまたはネットワークのエラーのため、フォルダはマーケットプレイスに送信されませんでした。お手数ですが、後でもう一度やり直してください。 - - - - 以下のエラーでマーケットプレイスを初期化できませんでした:[ERROR_CODE] + + + 以下のエラーでマーケットプレイスを初期化できませんでした:[ERROR_CODE] システムまたはネットワークのエラーのため、マーケットプレイスの初期化に失敗しました。お手数ですが、後でもう一度やり直してください。 - - - - 在庫フォルダへのコピーまたは移動がエラーにより失敗しました:[ERROR_CODE] - - - マーケットプレイスのリストへのコピーまたは移動が以下のエラーにより失敗しました:[ERROR_CODE] - - - マーケットプレイスによる取引が以下のエラーにより失敗しました:[ERROR_REASON] + + + 在庫フォルダへのコピーまたは移動がエラーにより失敗しました:[ERROR_CODE] + + + マーケットプレイスのリストへのコピーまたは移動が以下のエラーにより失敗しました:[ERROR_CODE] + + + マーケットプレイスによる取引が以下のエラーにより失敗しました:[ERROR_REASON] [ERROR_DESCRIPTION] - - - この商品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。 + + + この商品をリストに表示できないか、バージョンフォルダを有効にできません。通常、これはリスト説明フォームに情報が不足しているために起こりますが、フォルダ構造のエラーが原因の場合もあります。 リストを編集するか、リストフォルダにエラーがないか確認してください。 - - - マーケットプレイスへのリスト表示が次のエラーで失敗しました: + + + マーケットプレイスへのリスト表示が次のエラーで失敗しました: '[ERROR_CODE]' - - - このバージョンフォルダの有効化が次のエラーにより失敗しました: + + + このバージョンフォルダの有効化が次のエラーにより失敗しました: '[ERROR_CODE]' - - - リストを作成するために、リストするコンテンツの階層を固定しました。 - confirm - - - この操作により、このリストの有効な内容が変更されます。続けてもよろしいですか? - confirm - - - マーケットプレイスのリストウィンドウにドラッグしたアイテムは、元の場所からコピーされるのではなく移動となります。続けてもよろしいですか? - confirm - - - リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けてもよろしいですか? - confirm - - - これらのアイテムの1つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、残したままにすることはできます。 - confirm - - - この操作により、このリストが削除されます。続けてもよろしいですか? - confirm - - - この操作により、現在のリストのバージョンフォルダが無効になります。続けてもよろしいですか? - confirm - - - このリストをアップデートできませんでした。 + + + リストを作成するために、リストするコンテンツの階層を固定しました。 + + confirm + + + + この操作により、このリストの有効な内容が変更されます。続けてもよろしいですか? + + confirm + + + + マーケットプレイスのリストウィンドウにドラッグしたアイテムは、元の場所からコピーされるのではなく移動となります。続けてもよろしいですか? + + confirm + + + + リストフォルダを移動または削除すると、マーケットプレイスのリストが削除されます。マーケットプレイスのリストを維持する場合は、変更するバージョンフォルダの中身を移動または削除してください。続けてもよろしいですか? + + confirm + + + + これらのアイテムの1つまたは複数をマーケットプレイスにコピーする権限がありません。移動するか、残したままにすることはできます。 + + confirm + + + + この操作により、このリストが削除されます。続けてもよろしいですか? + + confirm + + + + この操作により、現在のリストのバージョンフォルダが無効になります。続けてもよろしいですか? + + confirm + + + + このリストをアップデートできませんでした。 [[URL] ここをクリック]してマーケットプレイスで編集します。 - - - マーケットプレイスのリストフォルダにある衣服装やボディパーツを着用できません。 - fail - - リストIDが無効です。 - fail - - このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。 - confirm - - - 各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。 - confirm - - - 在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。 - confirm - - - バージョンフォルダが空のため、リストを削除しました。もう一度リストを表示するには、バージョンフォルダにアイテムを追加する必要があります。 - confirm - - - アニメーションデータの書き込みに問題があります。後でもう一度お試しください。 - fail - - 以下の理由で、オークションのスナップショットのアップロード時に問題が起こりました:[REASON] - fail - - 一度に複数のアイテムの中身を表示できません。 + + + マーケットプレイスのリストフォルダにある衣服装やボディパーツを着用できません。 + + fail + + + リストIDが無効です。 + + fail + + + このリストには複数のバージョンフォルダがあるか、バージョンフォルダがありません。後で、単独でバージョンフォルダを選択して有効にする必要があります。 + + confirm + + + + 各種の在庫品目を別々の在庫フォルダに分けたため、フォルダはリストに表示できるように配置されています。 + + confirm + + + + 在庫が空のため、リストを削除しました。もう一度リストを表示するには、在庫フォルダにユニットを追加する必要があります。 + + confirm + + + + バージョンフォルダが空のため、リストを削除しました。もう一度リストを表示するには、バージョンフォルダにアイテムを追加する必要があります。 + + confirm + + + + アニメーションデータの書き込みに問題があります。後でもう一度お試しください。 + + fail + + + 以下の理由で、オークションのスナップショットのアップロード時に問題が起こりました:[REASON] + + fail + + + 一度に複数のアイテムの中身を表示できません。 アイテムを1つだけ選択して、もう一度お試しください。 - fail - - 服装、身体部位に対する変更をすべて保存しますか? - confirm - - - フレンド以外の人からのコールや、インスタントメッセージを無視する設定にしたことを、相手に知られることはありません。 - - - 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。 - - - Second Lifeビューアーの多重起動はサポートされていません。 + + fail + + + 服装、身体部位に対する変更をすべて保存しますか? + + confirm + + + + フレンド以外の人からのコールや、インスタントメッセージを無視する設定にしたことを、相手に知られることはありません。 + + + 注意:このオプションを有効にすると、このパソコンを使うユーザーは誰でも、あなたのお気に入りの場所を見ることができるようになります。 + + + Second Lifeビューアーの多重起動はサポートされていません。 テクスチャキャッシュの競合による破損や、およびビジュアルとパフォーマンスの低下につながる恐れがあります。 - - - 他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。 + + + 他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更、削除、持ち帰ることができます。この権限を与える際には十分に注意してください。 [NAME]に修正権限を与えますか? - - - 他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更することができます。 + + + 他人に修正権限を与えると、権限を与えられた人はあなたが所有する、インワールドのオブジェクトを変更することができます。 この権限を与える際には十分に注意してください。選択した住人に修正権限を与えますか? - confirm - - - [NAME]の修正権限を解除しますか? - confirm - - - 選択した住人から変更権限を取り下げますか? - confirm - - - グループ名は[MIN_LEN]~[MAX_LEN]文字である必要があります。 - group - fail - - - グループを作成できません。 + + confirm + + + + [NAME]の修正権限を解除しますか? + + confirm + + + + 選択した住人から変更権限を取り下げますか? + + confirm + + + + グループ名は[MIN_LEN]~[MAX_LEN]文字である必要があります。 + + group + + + fail + + + + グループを作成できません。 [MESSAGE] - group - fail - - - [NEEDS_APPLY_MESSAGE] + + group + + + fail + + + + [NEEDS_APPLY_MESSAGE] [WANT_APPLY_MESSAGE] - group - fail - - - グループ通知の送信には、件名の記入が必要です。 - group - fail - - - あなたは、[ROLE_NAME]の役割にメンバーを与えようとしています。任命されたメンバーが自ら退任しない限り、 役柄から削除できません。 + + group + + + fail + + + + グループ通知の送信には、件名の記入が必要です。 + + group + + + fail + + + + あなたは、[ROLE_NAME]の役割にメンバーを与えようとしています。任命されたメンバーが自ら退任しない限り、 役柄から削除できません。 操作を続行しますか? - - - あなたは[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。 + + + あなたは[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。 *警告* この能力を持つ役割のメンバーは、 自分と他のメンバーに現在より強力な権限を割り当て、 自分をオーナーとほぼ同様の立場に任命することもできるようになります。 この行為の意味をよく理解してから実行してください。 この能力を [ROLE_NAME] に割り当てますか? - - - あなたは、[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。 + + + あなたは、[ROLE_NAME]に[ACTION_NAME]の能力を与えようとしています。 *警告* この能力をもつ役割のメンバーは、自分と他のメンバーにすべての能力を割り当て、自分をオーナーとほぼ同様の立場に任命できます。 この能力を[ROLE_NAME] に割り当てますか? - - - 役割「[ROLE_NAME]」に能力「[ACTION_NAME]」を追加しようとしています。 + + + 役割「[ROLE_NAME]」に能力「[ACTION_NAME]」を追加しようとしています。 *警告* この能力を持つ役割のメンバーにも能力「[ACTION_NAME_2]」と「[ACTION_NAME_3]」が許可されます。 - - - 役割「[ROLE_NAME]」から能力「[ACTION_NAME]」を削除しようとしています。 + + + 役割「[ROLE_NAME]」から能力「[ACTION_NAME]」を削除しようとしています。 *警告* この能力を削除しても能力「[ACTION_NAME_2]」と「[ACTION_NAME_3]」は削除されません。 これらの能力をこの役割に許可しない場合は、すぐに削除してください! - - - [AVATAR_NAME]をグループから追放しようとしています。 - group - confirm - - - [COUNT]名のメンバーをグループから追放しようとしています。 - group - confirm - - - [AVATAR_NAME]をグループから追放しようとしています。 - group - confirm - - - [COUNT]名のメンバーをグループから追放しようとしています。 - group - confirm - - - 一部の住人がグループから追放されたため、招待状が送られませんでした。 - 装着物を下に置こうとしています。 + + + [AVATAR_NAME]をグループから追放しようとしています。 + + group + + + confirm + + + + [COUNT]名のメンバーをグループから追放しようとしています。 + + group + + + confirm + + + + [AVATAR_NAME]をグループから追放しようとしています。 + + group + + + confirm + + + + [COUNT]名のメンバーをグループから追放しようとしています。 + + group + + + confirm + + + + + 一部の住人がグループから追放されたため、招待状が送られませんでした。 + + 装着物を下に置こうとしています。 このまま続けてもよろしいですか? - - - このグループに参加するには、L$ [COST]かかります。 + + + このグループに参加するには、L$ [COST]かかります。 このまま続けてもよろしいですか? - confirm - funds - group - - - 「<nolink>[NAME]</nolink>」というグループに入ろうとしています。 + + confirm + + + funds + + + group + + + + 「<nolink>[NAME]</nolink>」というグループに入ろうとしています。 このまま続けてもよろしいですか? - group - confirm - - - このグループに加入するには、L$ [COST]必要です。 + + group + + + confirm + + + + このグループに加入するには、L$ [COST]必要です。 L$が不足しているので、このグループに参加することができません。 - group - fail - funds - - このグループ作成にかかる費用:L$ [COST] + + group + + + fail + + + funds + + + このグループ作成にかかる費用:L$ [COST] 一人ではグループにならないので、永久に削除されてしまいます。 48時間以内にメンバーを勧誘し、入会してもらってください。 - group - funds - - - あなたはグループに参加することはできません。 - group_id - success - - - グループ参加リクエスト中にエラーが発生しました。 - group_id - success - - - 以下のグループに参加できませんでした:[reason] - group_id - success - reason - - - 申し訳ありませんが、トライアルユーザーはグループに参加できません。 - group_id - success - - - 「<nolink>[group_name]</nolink>」に参加できません: + + group + + + funds + + + + あなたはグループに参加することはできません。 + + group_id + + + success + + + + グループ参加リクエスト中にエラーが発生しました。 + + group_id + + + success + + + + 以下のグループに参加できませんでした:[reason] + + group_id + + + success + + + reason + + + + 申し訳ありませんが、トライアルユーザーはグループに参加できません。 + + group_id + + + success + + + + 「<nolink>[group_name]</nolink>」に参加できません: 既に[group_count]個のグループのメンバーになっています。参加できるのは最大[max_groups]グループまでです。 - success - group_id - group_name - group_count - max_groups - - - 「<nolink>[group_name]</nolink>」に参加できません: + + success + + + group_id + + + group_name + + + group_count + + + max_groups + + + + 「<nolink>[group_name]</nolink>」に参加できません: このグループは現在、参加が制限されています。 - group_id - success - - - このユーザーグループに入会しました。 - group_id - success - - - 会員料金として必要なL$ [membership_fee]を送金することができません。 - group_id - success - - - この区画([PARCEL_NAME])は、L$ [COST]で[TIME]時間入ることができます。入場許可証を購入しますか? - fail - funds - confirm - - - 不特定の人に売却する場合には、売却価格はL$ 0以上に設定する必要があります。 + + group_id + + + success + + + + このユーザーグループに入会しました。 + + group_id + + + success + + + + 会員料金として必要なL$ [membership_fee]を送金することができません。 + + group_id + + + success + + + + この区画([PARCEL_NAME])は、L$ [COST]で[TIME]時間入ることができます。入場許可証を購入しますか? + + fail + + + funds + + + confirm + + + + 不特定の人に売却する場合には、売却価格はL$ 0以上に設定する必要があります。 売却価格をL$ 0に設定する場合は、売却する個人を選択してください。 - fail - - 選択した[LAND_SIZE]㎡の土地は、売り出し中に設定されています。 + + fail + + + 選択した[LAND_SIZE]㎡の土地は、売り出し中に設定されています。 売却価格L$ [SALE_PRICE]で、[NAME]に売却を認可します。 - confirm - - - 注意:「誰にでも販売」をクリックすることで、あなたの土地はこのリージョンにいる人に限らず、[SECOND_LIFE]コミュニティ全体で利用可能となります。 + + confirm + + + + 注意:「誰にでも販売」をクリックすることで、あなたの土地はこのリージョンにいる人に限らず、[SECOND_LIFE]コミュニティ全体で利用可能となります。 選択した[LAND_SIZE]㎡の土地は、販売対象に設定されました。 販売価格L$ [SALE_PRICE]で、[NAME]が販売対象者となります。 - confirm - - - グループ「<nolink>[NAME]</nolink>」と共有するこのにある区画のすべてのオブジェクトを前のオーナーのインベントリに返却しますか? + + confirm + + + + グループ「<nolink>[NAME]</nolink>」と共有するこのにある区画のすべてのオブジェクトを前のオーナーのインベントリに返却しますか? *警告* この操作をすると、グループに譲渡された譲渡禁止のオブジェクトを削除することになります。 オブジェクト:[N] - confirm - group - - - この区画で、住人[NAME]が所有する全てのオブジェクトを本人のインベントリに本当に返却してもよいですか? + + confirm + + + group + + + + この区画で、住人[NAME]が所有する全てのオブジェクトを本人のインベントリに本当に返却してもよいですか? オブジェクト:[N] - confirm - - - この土地区画内にある、あなたが所有するすべてのオブジェクトを、あなたのインベントリに戻そうとしています。このまま続けてもよろしいですか? + + confirm + + + + この土地区画内にある、あなたが所有するすべてのオブジェクトを、あなたのインベントリに戻そうとしています。このまま続けてもよろしいですか? オブジェクト:[N] - confirm - - - この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、それぞれの所有者のインベントリに戻そうとしています。このまま操作を続行してもよろしいですか? + + confirm + + + + この土地区画内にある、あなた以外が所有するすべてのオブジェクトを、それぞれの所有者のインベントリに戻そうとしています。このまま操作を続行してもよろしいですか? グループに譲渡された「再販・譲渡可」のオブジェクトは、以前の所有者に返却されます。 *警告* これにより、グループに譲渡された「再販・譲渡不可」のオブジェクトは削除されます! オブジェクト:[N] - confirm - - - この土地区画内にある、[NAME]以外による所有のオブジェクトをすべてそれぞれの所有者のインベントリに返却しようとしています。このまま操作を続行してもよろしいですか? + + confirm + + + + この土地区画内にある、[NAME]以外による所有のオブジェクトをすべてそれぞれの所有者のインベントリに返却しようとしています。このまま操作を続行してもよろしいですか? グループに譲渡された「再販・譲渡可」のオブジェクトは、以前の所有者に返却されます。 *警告* これにより、グループに譲渡された「再販・譲渡不可」のオブジェクトは削除されます! オブジェクト:[N] - confirm - - - リストされた全てのオブジェクトを所有者のインベントリに戻しますか? + + confirm + + + + リストされた全てのオブジェクトを所有者のインベントリに戻しますか? これによりすべてのスクリプト化されたオブジェクトがリージョンに戻ります! - confirm - - - このリージョン(地域)内のすべてのオブジェクトを無効にしようとしています。このまま操作を続行してもよろしいですか? - confirm - - - グループ <nolink>[NAME]</nolink>と共有されていない、この区画にあるオブジェクトを前のオーナーに返却しますか? + + confirm + + + + このリージョン(地域)内のすべてのオブジェクトを無効にしようとしています。このまま操作を続行してもよろしいですか? + + confirm + + + + グループ <nolink>[NAME]</nolink>と共有されていない、この区画にあるオブジェクトを前のオーナーに返却しますか? オブジェクト:[N] - confirm - - - スクリプトを無効にできません。 + + confirm + + + + スクリプトを無効にできません。 このリージョン(地域)全体が「ダメージ有効」に設定されています。 武器を使用するには、スクリプトの実行を許可する必要があります。 - fail - - 現在複数の面が選択されています。 + + fail + + + 現在複数の面が選択されています。 このまま続けた場合、メディアの別々のインスタンスがオブジェクトの複数の面に設定されます。 メディアを1つの面だけに取り付けるには、「面を選択」を選んでオブジェクトの希望する面をクリック、それから「追加」をクリックしてください。 - confirm - - - 着地点を設定するには、この区画の内側に立ってください。 - fail - - 受信者の有効なメールアドレスを入力してください。 - fail - - あなたのメールアドレスを入力してください。 - fail - - デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか? - confirm - - - スナップショットデータの処理エラー - fail - - スナップショットのエンコードエラー - fail - - このアイテムをアップロードするには、L$ [COST]が必要です。 - fail - - インベントリに写真を保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。 - fail - - インベントリにテクスチャを保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。 - fail - - 以下の理由でスナップショットの送信時に問題が起こりました:[REASON] - fail - - 以下の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました:[REASON] - fail - - [SECOND_LIFE]へのログインを続けるには、Second Lifeの利用規約、プライバシーポリシー、およびサービス規約に同意する必要があります。 - fail - - アウトフィットを装着できません。 + + confirm + + + + 着地点を設定するには、この区画の内側に立ってください。 + + fail + + + 受信者の有効なメールアドレスを入力してください。 + + fail + + + あなたのメールアドレスを入力してください。 + + fail + + + デフォルトの件名またはメッセージを付けて、スナップショットを送信しますか? + + confirm + + + + スナップショットデータの処理エラー + + fail + + + スナップショットのエンコードエラー + + fail + + + このアイテムをアップロードするには、L$ [COST]が必要です。 + + fail + + + インベントリに写真を保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。 + + fail + + + インベントリにテクスチャを保存するには、L$ [COST]が必要です。L$を購入するか、代わりに写真をコンピュータに保存できます。 + + fail + + + 以下の理由でスナップショットの送信時に問題が起こりました:[REASON] + + fail + + + 以下の理由で、レポートのスクリーンショットのアップロード時に問題が起こりました:[REASON] + + fail + + + [SECOND_LIFE]へのログインを続けるには、Second Lifeの利用規約、プライバシーポリシー、およびサービス規約に同意する必要があります。 + + fail + + + アウトフィットを装着できません。 アウトフィットフォルダに服装、身体部位、装着物がありません。 - fail - - ごみ箱にある服装や身体部位は、着用できません。 - fail - - オブジェクトを装着できませんでした。 + + fail + + + ごみ箱にある服装や身体部位は、着用できません。 + + fail + + + オブジェクトを装着できませんでした。 最大装着数[MAX_ATTACHMENTS]個を越えています。どれか取り外してからお試しください。 - fail - - まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。 - fail - - ログインするためにパスワードを入力してください。 - fail - - おっと、記入漏れがあります。 + + fail + + + まだ読み込まれていないため、そのアイテムを装着できません。後でやり直してください。 + + fail + + + ログインするためにパスワードを入力してください。 + + fail + + + おっと、記入漏れがあります。 アバターのユーザー名を入力してください。 [SECOND_LIFE]に入るにはアカウントが必要です。今すぐアカウントを作成しますか? - confirm - [create_account_url] - - - ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。 - fail - - 「[GRID]」は、有効なグリッドIDではありません。 - fail - - ログイン位置で有効なグリッドが指定されませんでした。 - fail - - クラシファイド広告『[NAME]』を削除してもよろしいですか? + + confirm + + + [create_account_url] + + + + ユーザー名のフィールドにアバターのユーザー名もしくは氏名を入力してから、再度ログインする必要があります。 + + fail + + + 「[GRID]」は、有効なグリッドIDではありません。 + + fail + + + ログイン位置で有効なグリッドが指定されませんでした。 + + fail + + + クラシファイド広告『[NAME]』を削除してもよろしいですか? 支払い済みの料金は返金されません。 - confirm - - - この顔に紐づけられたメディアの削除を選択しました。 + + confirm + + + + この顔に紐づけられたメディアの削除を選択しました。 続行してもよろしいですか? - confirm - - - クラシファイド広告[NAME]への変更を保存しますか? - confirm - - - クラシファイド広告を出すには、資金が足りません。 - fail - - - - クラシファイド広告<nolink>[CLASSIFIED]</nolink>を削除してもよろしいですか? - confirm - - - ピック<nolink>[PICK]</nolink>を削除してもよろしいですか? - confirm - - - 未公開のクラシファイド広告があります。 + + confirm + + + + クラシファイド広告[NAME]への変更を保存しますか? + + confirm + + + + クラシファイド広告を出すには、資金が足りません。 + + fail + + + + クラシファイド広告<nolink>[CLASSIFIED]</nolink>を削除してもよろしいですか? + + confirm + + + + ピック<nolink>[PICK]</nolink>を削除してもよろしいですか? + + confirm + + + + 未公開のクラシファイド広告があります。 ウィンドウを閉じると変更が失われます。 - confirm - - - 保存されていない変更があります。 - confirm - save - - - 「<nolink>[PICK]</nolink>」を削除してもよろしいですか? - - - このアウトフィットを削除してもよろしいですか? - confirm - - - [SECOND_LIFE]イベントWebページに移動しますか? - https://secondlife.com/my/community/events/?lang=ja-JP - confirm - - - 表示する提案を選択してください。 - fail - - 表示する履歴アイテムを選択してください。 - fail - - - - - キャッシュは、[APP_NAME]再起動後にクリアされます。 - キャッシュは、[APP_NAME]再起動後が移動されます。 -注意:キャッシュがクリアされます。 - ポートの設定は、[APP_NAME]再起動後に反映されます。 - デバッグ設定の変更は、[APP_NAME]再起動後に反映されます。 - 新しいスキンは、[APP_NAME]再起動後に表示されます。 - 言語の変更は、[APP_NAME]再起動後に反映されます。 - [SECOND_LIFE]のWebページに移動し、入札あるいはオークションの詳細を確認しますか? - confirm - http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]&lang=ja-JP - - - 変更を保存しますか? - confirm - - - このノートカードを削除してもよろしいですか? - - confirm - - - 以前のスクリーンショットをレポートに使用しますか? - - - ジェスチャーの保存に失敗しました。 + + confirm + + + + 保存されていない変更があります。 + + confirm + + + save + + + + 「<nolink>[PICK]</nolink>」を削除してもよろしいですか? + + + このアウトフィットを削除してもよろしいですか? + + confirm + + + + [SECOND_LIFE]イベントWebページに移動しますか? + + https://secondlife.com/my/community/events/?lang=ja-JP + + + confirm + + + + 表示する提案を選択してください。 + + fail + + + 表示する履歴アイテムを選択してください。 + + fail + + + + キャッシュは、[APP_NAME]再起動後にクリアされます。 + + + キャッシュは、[APP_NAME]再起動後が移動されます。 +注意:キャッシュがクリアされます。 + + + ポートの設定は、[APP_NAME]再起動後に反映されます。 + + + デバッグ設定の変更は、[APP_NAME]再起動後に反映されます。 + + + 新しいスキンは、[APP_NAME]再起動後に表示されます。 + + + 言語の変更は、[APP_NAME]再起動後に反映されます。 + + [SECOND_LIFE]のWebページに移動し、入札あるいはオークションの詳細を確認しますか? + + confirm + + + http://secondlife.com/auctions/auction-detail.php?id=[AUCTION_ID]&lang=ja-JP + + + + 変更を保存しますか? + + confirm + + + + このノートカードを削除してもよろしいですか? + + + confirm + + + + 以前のスクリーンショットをレポートに使用しますか? + + + ジェスチャーの保存に失敗しました。 ステップが多すぎます。 ステップをいくつか削除してから再保存してください - fail - - ジェスチャーの保存に失敗しました。 + + fail + + + ジェスチャーの保存に失敗しました。 少し待ってからもう一度試してください。 - fail - - ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 + + fail + + + ジェスチャーの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 オブジェクトが範囲内に存在しないか、削除された可能性があります。 - fail - - 以下の理由で、ジェスチャーの保存時に問題が起こりました:[REASON] + + fail + + + 以下の理由で、ジェスチャーの保存時に問題が起こりました:[REASON] お手数ですが、後でもう一度試してください。 - fail - - ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 + + fail + + + ノートカードの保存に失敗しました。オブジェクト、または関連するオブジェクトインベントリが見つかりません。 オブジェクトが範囲内に存在しないか、削除された可能性があります。 - fail - - 以下の理由で、ノートカードの保存時に問題が起こりました:[REASON] + + fail + + + 以下の理由で、ノートカードの保存時に問題が起こりました:[REASON] お手数ですが、後でもう一度試してください。 - fail - - あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。 + + fail + + + あなたのスクリプトのバージョンでは、変更を元に戻すことはできませんでした。 サーバーの最新保存バージョンをロードしますか? (**警告**:この操作後元に戻すことはできません) - confirm - - - スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。 + + confirm + + + + スクリプトの保存に失敗しました。スクリプトが入ったオブジェクトが見つかりません。 オブジェクトは範囲外か、または削除されているかもしれません。 - fail - - ログイン位置が指定されていません。 + + fail + + + ログイン位置が指定されていません。 ログイン位置の欄にリージョン名を入力するか、「最後にログアウトした場所」か「自宅(ホーム)」を選択してください。 - fail - - - スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。 + + fail + + + + スクリプトの起動または停止に失敗しました。スクリプトが格納されているオブジェクトが見つかりません。 オブジェクトが範囲内に存在しないか、または削除された可能性があります。 - fail - - ファイルをダウンロードできません。 - fail - - ダウンロードをリクエストしたファイルは、[SECOND_LIFE]でサポートされていません。 - - confirm - - - ファイル[[FILE]]に書き込むことができませんでした。 - fail - - お使いのコンピュータは、[APP_NAME]の最小システム要件を満たしていません。 + + fail + + + ファイルをダウンロードできません。 + + fail + + + ダウンロードをリクエストしたファイルは、[SECOND_LIFE]でサポートされていません。 + + + confirm + + + + ファイル[[FILE]]に書き込むことができませんでした。 + + fail + + + お使いのコンピュータは、[APP_NAME]の最小システム要件を満たしていません。 このためパフォーマンスが低下する場合があります。恐れ入りますが[SUPPORT_SITE]は、サポートされていないシステム構成に対する技術的サポートを提供できません。 詳細について、[_URL] を確認しますか? - https://secondlife.com/system-requirements?lang=ja - fail - - - グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。 + + https://secondlife.com/system-requirements?lang=ja + + + fail + + + + グラフィックスチップに最新のドライバがある可能性があります。グラフィックドライバを更新することにより、大幅にパフォーマンスが向上します。 ドライバの更新を確認するために[URL] にアクセスしますか? - [URL] - confirm - fail - - - お使いのシステムには、[APP_NAME]が認識できないグラフィックカードが搭載されています。[APP_NAME]でまだテストされていない最新ハードウェアのためだと考えられます。 + + [URL] + + + confirm + + + fail + + + + お使いのシステムには、[APP_NAME]が認識できないグラフィックカードが搭載されています。[APP_NAME]でまだテストされていない最新ハードウェアのためだと考えられます。 問題ないとは思いますが、グラフィックの設定を調整する必要があるかもしれません。 (「私」>「初期設定」>「グラフィック」) - fail - - - - - グラフィックドライバを初期化中に[APP_NAME]がクラッシュしました。 + + fail + +
+ + +
+ グラフィックドライバを初期化中に[APP_NAME]がクラッシュしました。 ドライバの一般的なエラーを防ぐために、画質が低に設定されます。このため、一部のグラフィック特性に制限が出ます。 お使いのグラフィックカードのドライバをアップデートするようおすすめします。 画質は、「初期設定」>「グラフィック」で設定できます。 - fail - - この設定を変更すると、「自動調整」の設定が無効になります。 + + fail + + + この設定を変更すると、「自動調整」の設定が無効になります。 続けてもよろしいですか? - confirm - - - 高度な照明をオンにするには、品質をレベル4以上にする必要があります。 - confirm - - - 影を有効にするには、品質をレベルを4以上にする必要があります。 - confirm - - - [REGION]では、地形の変更ができません。 - fail - - [PARCEL]区画の地形を編集する権限がありません。 - fail - - 以下のアイテムをコピーする権限がありません: + + confirm + + + + 高度な照明をオンにするには、品質をレベル4以上にする必要があります。 + + confirm + + + + 影を有効にするには、品質をレベルを4以上にする必要があります。 + + confirm + + + + [REGION]では、地形の変更ができません。 + + fail + + + [PARCEL]区画の地形を編集する権限がありません。 + + fail + + + 以下のアイテムをコピーする権限がありません: <nolink>[ITEMS]</nolink> 他の人に譲ると、そのアイテムはあなたのインベントリから削除されます。本当にこれらのアイテムを譲ってもよろしいですか? - confirm - fail - - - インベントリのアイテムを渡すことができません。 - fail - - 取引がキャンセルされました。 - fail - - 一度に42個以上のアイテムを渡すことはできません。 - fail - - 選択したアイテムを渡す権限がありません。 - fail - - あなたは選択した[COUNT]個のアイテムをコピーする権限がありません。 + + confirm + + + fail + + + + インベントリのアイテムを渡すことができません。 + + fail + + + 取引がキャンセルされました。 + + fail + + + 一度に42個以上のアイテムを渡すことはできません。 + + fail + + + 選択したアイテムを渡す権限がありません。 + + fail + + + あなたは選択した[COUNT]個のアイテムをコピーする権限がありません。 これらのアイテムはあなたのインベントリから失われます。 本当にアイテムを渡してもよろしいですか? - confirm - fail - - - 選択したフォルダを渡す権限がありません。 - fail - - このアバターをフリーズしますか? + + confirm + + + fail + + + + 選択したフォルダを渡す権限がありません。 + + fail + + + このアバターをフリーズしますか? アバターは一時的に動けなくなり、チャットを含めインワールドで何もできなくなります。 - confirm - - - [AVATAR_NAME]をフリーズしますか? + + confirm + + + + [AVATAR_NAME]をフリーズしますか? フリーズされた人は一時的に動けなくなり、チャットなど、この世界に対する関わりを持つことができなくなります。 - confirm - - - あなたの土地から[AVATAR_NAME]を追放しますか? - confirm - - - このアバターをあなたの土地から追放しますか? - confirm - - - [AVATAR_NAME]をあなたの土地から追放しますか? - confirm - - - <nolink>[GROUP_NAME]</nolink>から[AVATAR_NAME]を追放しました。 - group - - 取得エラー:選択したオブジェクトの数が多すぎます。 - fail - - 取得エラー:オブジェクトが複数のリージョン(地域)にまたがって存在しています。 + + confirm + + + + あなたの土地から[AVATAR_NAME]を追放しますか? + + confirm + + + + このアバターをあなたの土地から追放しますか? + + confirm + + + + [AVATAR_NAME]をあなたの土地から追放しますか? + + confirm + + + + <nolink>[GROUP_NAME]</nolink>から[AVATAR_NAME]を追放しました。 + + group + + + 取得エラー:選択したオブジェクトの数が多すぎます。 + + fail + + + 取得エラー:オブジェクトが複数のリージョン(地域)にまたがって存在しています。 すべて同じリージョン内に移動させてから取得してください。 - fail - - [EXTRA] + + fail + + + [EXTRA] [_URL] に移動してリンデンドル購入に関する情報を確認しますか? - https://secondlife.com/my/lindex/?lang=ja-JP - - - [MUTE_LIMIT]エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。 - fail - - [COUNT]個のオブジェクトをリンクできませんでした。 + + https://secondlife.com/my/lindex/?lang=ja-JP + + + + [MUTE_LIMIT]エントリの制限に達したため、ブロックリストに新しいエントリを追加できません。 + + fail + + + [COUNT]個のオブジェクトをリンクできませんでした。 リンクできるオブジェクトは最大[MAX]個です。 - fail - - セットが揃っているオブジェクトのみリンクできます。複数のオブジェクトを選択してください。 - fail - - すべてのオブジェクトの修正許可がないためリンクできません。 + + fail + + + セットが揃っているオブジェクトのみリンクできます。複数のオブジェクトを選択してください。 + + fail + + + すべてのオブジェクトの修正許可がないためリンクできません。 どのオブジェクトもロックされておらず、あなたのものであることを確認してください。 - fail - - リージョン(地域)の境界を越えてオブジェクトをリンクできません。 - fail - - リージョン(地域)の境界を越えてオブジェクトをリンクできません。 - fail - - 所有者が異なるため、オブジェクトをリンクできません。 + + fail + + + リージョン(地域)の境界を越えてオブジェクトをリンクできません。 + + fail + + + リージョン(地域)の境界を越えてオブジェクトをリンクできません。 + + fail + + + 所有者が異なるため、オブジェクトをリンクできません。 自分が所有しているオブジェクトだけを選択してください。 - fail - - ファイル「[FILE]」は、無効な拡張子です。 - -このファイルの拡張子が正しいかどうかを確認してください。 - 「[EXTENSION]」は、無効な拡張子です。 + + fail + + + + ファイル「[FILE]」は、無効な拡張子です。 + +このファイルの拡張子が正しいかどうかを確認してください。 + + 「[EXTENSION]」は、無効な拡張子です。 有効な拡張子:[VALIDS] - fail - - - 読み込みのためにアップロードされたサウンドファイルを開けません: + + fail + + + + 読み込みのためにアップロードされたサウンドファイルを開けません: [FILE] - fail - - RIFF WAVEファイルとして認識されません: + + fail + + + RIFF WAVEファイルとして認識されません: [FILE] - fail - - PCM WAVEオーディオファイルとして認識されません: + + fail + + + PCM WAVEオーディオファイルとして認識されません: [FILE] - fail - - このファイルのチャンネル数は無効です(モノラルか、ステレオである必要があります): + + fail + + + このファイルのチャンネル数は無効です(モノラルか、ステレオである必要があります): [FILE] - fail - - このファイルのサンプリングレートはサポートされていません(44.1kである必要があります): + + fail + + + このファイルのサンプリングレートはサポートされていません(44.1kである必要があります): [FILE] - fail - - このファイルのビットサイズはサポートされていません(8bitか、16bitである必要があります): + + fail + + + このファイルのビットサイズはサポートされていません(8bitか、16bitである必要があります): [FILE] - fail - - WAVヘッダーにデータチャンクが見つかりません: + + fail + + + WAVヘッダーにデータチャンクが見つかりません: [FILE] - fail - - WAVファイルのチャンクサイズが間違っています: + + fail + + + WAVファイルのチャンクサイズが間違っています: [FILE] - fail - - オーディオファイルが長すぎます。(最大10秒): + + fail + + + オーディオファイルが長すぎます。(最大10秒): [FILE] - fail - - 「[FILE]」に問題があります。 + + fail + + + 「[FILE]」に問題があります。 [ERROR] - fail - - 書き込み用の一時圧縮サウンドファイルを開くことができません: + + fail + + + 書き込み用の一時圧縮サウンドファイルを開くことができません: [FILE] - fail - - 不明なVorbisのエンコードに失敗しました: + + fail + + + 不明なVorbisのエンコードに失敗しました: [FILE] - fail - - 次のファイルのエンコードができません: + + fail + + + 次のファイルのエンコードができません: [FILE] - fail - - ユーザー名とパスワードを自動入力できません。これはネットワーク設定が変更された場合に起こります - fail - - - 破損したリソースファイル: + + fail + + + ユーザー名とパスワードを自動入力できません。これはネットワーク設定が変更された場合に起こります + + fail + + + + 破損したリソースファイル: [FILE] - fail - - 不明なLindenリソースファイルのバージョンです: + + fail + + + 不明なLindenリソースファイルのバージョンです: [FILE] - fail - - 出力ファイルを作成できません: + + fail + + + 出力ファイルを作成できません: [FILE] - fail - - 現在[APP_NAME]では、BVH形式のアニメーションファイルの一括アップロードはサポートされていません。 - fail - - 以下の理由で「[FILE]」をアップロードできませんでした: + + fail + + + 現在[APP_NAME]では、BVH形式のアニメーションファイルの一括アップロードはサポートされていません。 + + fail + + + 以下の理由で「[FILE]」をアップロードできませんでした: [REASON] お手数ですがもう一度やり直してください。 - fail - - 「[LANDMARK_NAME]」を「[FOLDER_NAME]」フォルダに追加しました。 - この場所のランドマークは、既に持っています。 - fail - - - - + + fail + + + + 「[LANDMARK_NAME]」を「[FOLDER_NAME]」フォルダに追加しました。 + + この場所のランドマークは、既に持っています。 + + fail + + + + + フォルダ名を入力してください: - confirm -
- + + confirm + + + -
diff --git a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml index 098128bb6d..94766ee8fa 100644 --- a/indra/newview/skins/default/xui/ja/panel_outfits_list.xml +++ b/indra/newview/skins/default/xui/ja/panel_outfits_list.xml @@ -1,12 +1,12 @@ - - - - - - - - - - - - 名前タグ: - - - - - - - \ No newline at end of file + + + + + 名前タグ: + + + + + + + diff --git a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml index f5f1bc1b03..a031cd7176 100644 --- a/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml +++ b/indra/newview/skins/default/xui/ja/panel_performance_preferences.xml @@ -1,66 +1,120 @@ -
Date: Wed, 6 Sep 2023 21:47:33 +0300 Subject: SL-19826 Basic 'shift' support for gallery Part#4 --- indra/newview/llinventorygallery.cpp | 159 +++++++++++++++++++++++++---------- indra/newview/llinventorygallery.h | 3 +- 2 files changed, 116 insertions(+), 46 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index eab15b79ad..1ee08eb01c 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -217,6 +217,14 @@ void LLInventoryGallery::setRootFolder(const LLUUID cat_id) gIdleCallbacks.deleteFunction(onIdle, (void*)this); + for (const LLUUID& id : mSelectedItemIDs) + { + if (mItemMap[id]) + { + mItemMap[id]->setSelected(FALSE); + } + } + mFolderID = cat_id; mItemsToSelect.clear(); mSelectedItemIDs.clear(); @@ -1153,7 +1161,7 @@ void LLInventoryGallery::moveUp(MASK mask) if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1) { - LLInventoryGalleryItem* item = mItemMap[mLastSelectedUUID]; + LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID]; if (item) { if (mask == MASK_NONE || mask == MASK_CONTROL) @@ -1180,10 +1188,10 @@ void LLInventoryGallery::moveUp(MASK mask) { S32 n = mItemIndexMap[item]; S32 target = llmax(0, n - mItemsInRow); - toggleSelectionRange(target, n - 1); if (target != n) { item = mIndexToItemMap[target]; + toggleSelectionRangeFromLast(item->getUUID()); item->setFocus(TRUE); claimEditHandler(); } @@ -1198,7 +1206,7 @@ void LLInventoryGallery::moveDown(MASK mask) if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1) { - LLInventoryGalleryItem* item = mItemMap[mLastSelectedUUID]; + LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID]; if (item) { if (mask == MASK_NONE || mask == MASK_CONTROL) @@ -1225,10 +1233,10 @@ void LLInventoryGallery::moveDown(MASK mask) { S32 n = mItemIndexMap[item]; S32 target = llmin(mItemsAddedCount - 1, n + mItemsInRow); - toggleSelectionRange(n + 1, target); if (target != n) { item = mIndexToItemMap[target]; + toggleSelectionRangeFromLast(item->getUUID()); item->setFocus(TRUE); claimEditHandler(); } @@ -1243,10 +1251,10 @@ void LLInventoryGallery::moveLeft(MASK mask) if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1) { - LLInventoryGalleryItem* item = mItemMap[mLastSelectedUUID]; + LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID]; if (mask == MASK_SHIFT) { - item = mItemMap[mLastSelectedUUID]; + item = mItemMap[mLastInteractedUUID]; } if (item) { @@ -1265,7 +1273,15 @@ void LLInventoryGallery::moveLeft(MASK mask) } else if (mask == MASK_SHIFT) { - toggleItemSelection(item_id, true); + if (item->isSelected()) + { + toggleItemSelection(mLastInteractedUUID, true); + } + else + { + toggleItemSelection(item_id, true); + } + mLastInteractedUUID = item_id; } else { @@ -1283,7 +1299,7 @@ void LLInventoryGallery::moveRight(MASK mask) if (mInventoryGalleryMenu && mSelectedItemIDs.size() > 0 && mItemsAddedCount > 1) { - LLInventoryGalleryItem* item = mItemMap[mLastSelectedUUID]; + LLInventoryGalleryItem* item = mItemMap[mLastInteractedUUID]; if (item) { S32 n = mItemIndexMap[item]; @@ -1300,7 +1316,15 @@ void LLInventoryGallery::moveRight(MASK mask) } else if (mask == MASK_SHIFT) { - toggleItemSelection(item_id, true); + if (item->isSelected()) + { + toggleItemSelection(mLastInteractedUUID, true); + } + else + { + toggleItemSelection(item_id, true); + } + mLastInteractedUUID = item_id; } else { @@ -1315,35 +1339,62 @@ void LLInventoryGallery::moveRight(MASK mask) void LLInventoryGallery::toggleSelectionRange(S32 start_idx, S32 end_idx) { LLInventoryGalleryItem* item = NULL; - for (S32 i = start_idx; i <= end_idx; i++) + if (end_idx > start_idx) + { + for (S32 i = start_idx; i <= end_idx; i++) + { + item = mIndexToItemMap[i]; + LLUUID item_id = item->getUUID(); + toggleItemSelection(item_id, true); + } + } + else { - item = mIndexToItemMap[i]; - LLUUID item_id = item->getUUID(); - toggleItemSelection(item_id, true); + for (S32 i = start_idx; i >= end_idx; i--) + { + item = mIndexToItemMap[i]; + LLUUID item_id = item->getUUID(); + toggleItemSelection(item_id, true); + } } } void LLInventoryGallery::toggleSelectionRangeFromLast(const LLUUID target) { - if (mLastSelectedUUID == target) + if (mLastInteractedUUID == target) { return; } - LLInventoryGalleryItem* last_item = mItemMap[mLastSelectedUUID]; + LLInventoryGalleryItem* last_item = mItemMap[mLastInteractedUUID]; LLInventoryGalleryItem* next_item = mItemMap[target]; if (last_item && next_item) { S32 last_idx = mItemIndexMap[last_item]; S32 next_idx = mItemIndexMap[next_item]; - if (last_idx < next_idx) + if (next_item->isSelected()) { - toggleSelectionRange(last_idx + 1, next_idx); + if (last_idx < next_idx) + { + toggleSelectionRange(last_idx, next_idx - 1); + } + else + { + toggleSelectionRange(last_idx, next_idx + 1); + } } else { - toggleSelectionRange(next_idx, last_idx - 1); + if (last_idx < next_idx) + { + toggleSelectionRange(last_idx + 1, next_idx); + } + else + { + toggleSelectionRange(last_idx - 1, next_idx); + } } } + mLastInteractedUUID = next_item->getUUID(); } void LLInventoryGallery::onFocusLost() @@ -1408,7 +1459,6 @@ void LLInventoryGallery::showContextMenu(LLUICtrl* ctrl, S32 x, S32 y, const LLU { if (std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id) == mSelectedItemIDs.end()) { - mSelectedItemIDs.clear(); changeItemSelection(item_id, false); } uuid_vec_t selected_uuids(mSelectedItemIDs.begin(), mSelectedItemIDs.end()); @@ -1426,10 +1476,10 @@ void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_ } } mSelectedItemIDs.clear(); + mItemsToSelect.clear(); if ((mItemMap.count(item_id) == 0) || mNeedsArrange) { - mItemsToSelect.clear(); mItemsToSelect.push_back(item_id); return; } @@ -1446,7 +1496,7 @@ void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_ } mSelectedItemIDs.push_back(item_id); signalSelectionItemID(item_id); - mLastSelectedUUID = item_id; + mLastInteractedUUID = item_id; if (scroll_to_selection) { @@ -1473,7 +1523,7 @@ void LLInventoryGallery::addItemSelection(const LLUUID& item_id, bool scroll_to_ } mSelectedItemIDs.push_back(item_id); signalSelectionItemID(item_id); - mLastSelectedUUID = item_id; + mLastInteractedUUID = item_id; if (scroll_to_selection) { @@ -1507,9 +1557,9 @@ bool LLInventoryGallery::toggleItemSelection(const LLUUID& item_id, bool scroll_ } mSelectedItemIDs.push_back(item_id); signalSelectionItemID(item_id); - mLastSelectedUUID = item_id; result = true; } + mLastInteractedUUID = item_id; if (scroll_to_selection) { @@ -2338,6 +2388,43 @@ BOOL LLInventoryGallery::handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, return handled; } +void LLInventoryGallery::startDrag() +{ + std::vector types; + uuid_vec_t ids; + LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_AGENT; + for (LLUUID& selected_id : mSelectedItemIDs) + { + const LLInventoryItem* item = gInventory.getItem(selected_id); + if (item) + { + if (item->getPermissions().getOwner() == ALEXANDRIA_LINDEN_ID) + { + src = LLToolDragAndDrop::SOURCE_LIBRARY; + } + + EDragAndDropType type = LLViewerAssetType::lookupDragAndDropType(item->getType()); + types.push_back(type); + ids.push_back(selected_id); + } + + const LLViewerInventoryCategory* cat = gInventory.getCategory(selected_id); + if (cat && gInventory.isObjectDescendentOf(selected_id, gInventory.getRootFolderID()) + && !LLFolderType::lookupIsProtectedType((cat)->getPreferredType())) + { + if (cat->getOwnerID() == ALEXANDRIA_LINDEN_ID) + { + src = LLToolDragAndDrop::SOURCE_LIBRARY; + } + + EDragAndDropType type = LLViewerAssetType::lookupDragAndDropType(cat->getType()); + types.push_back(type); + ids.push_back(selected_id); + } + } + LLToolDragAndDrop::getInstance()->beginMultiDrag(types, ids, LLToolDragAndDrop::SOURCE_AGENT); +} + bool LLInventoryGallery::areViewsInitialized() { return mGalleryCreated && mItemBuildQuery.empty(); @@ -2620,7 +2707,7 @@ BOOL LLInventoryGalleryItem::handleMouseDown(S32 x, S32 y, MASK mask) { mGallery->toggleSelectionRangeFromLast(mUUID); } - else + else if (!isSelected()) { mGallery->changeItemSelection(mUUID, false); } @@ -2663,28 +2750,10 @@ BOOL LLInventoryGalleryItem::handleHover(S32 x, S32 y, MASK mask) S32 screen_y; localPointToScreen(x, y, &screen_x, &screen_y ); - if(LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y)) + if(LLToolDragAndDrop::getInstance()->isOverThreshold(screen_x, screen_y) && mGallery) { - const LLInventoryItem *item = gInventory.getItem(mUUID); - if(item) - { - EDragAndDropType type = LLViewerAssetType::lookupDragAndDropType(item->getType()); - LLToolDragAndDrop::ESource src = LLToolDragAndDrop::SOURCE_LIBRARY; - if(item->getPermissions().getOwner() == gAgent.getID()) - { - src = LLToolDragAndDrop::SOURCE_AGENT; - } - LLToolDragAndDrop::getInstance()->beginDrag(type, item->getUUID(), src); - return LLToolDragAndDrop::getInstance()->handleHover(x, y, mask ); - } - - const LLInventoryCategory *cat = gInventory.getCategory(mUUID); - if(cat && gInventory.isObjectDescendentOf(mUUID, gInventory.getRootFolderID()) - && !LLFolderType::lookupIsProtectedType((cat)->getPreferredType())) - { - LLToolDragAndDrop::getInstance()->beginDrag(LLViewerAssetType::lookupDragAndDropType(cat->getType()), cat->getUUID(), LLToolDragAndDrop::SOURCE_AGENT); - return LLToolDragAndDrop::getInstance()->handleHover(x, y, mask ); - } + mGallery->startDrag(); + return LLToolDragAndDrop::getInstance()->handleHover(x, y, mask); } } return LLUICtrl::handleHover(x,y,mask); diff --git a/indra/newview/llinventorygallery.h b/indra/newview/llinventorygallery.h index 44e0dcf960..9b3f12701f 100644 --- a/indra/newview/llinventorygallery.h +++ b/indra/newview/llinventorygallery.h @@ -80,6 +80,7 @@ public: void onVisibilityChange(BOOL new_visibility) override; BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop, EDragAndDropType cargo_type, void* cargo_data, EAcceptance* accept, std::string& tooltip_msg) override; + void startDrag(); BOOL handleRightMouseDown(S32 x, S32 y, MASK mask) override; BOOL handleKeyHere(KEY key, MASK mask) override; void moveUp(MASK mask); @@ -199,7 +200,7 @@ protected: LLInventoryObserver* mInventoryObserver; selection_deque mSelectedItemIDs; selection_deque mItemsToSelect; - LLUUID mLastSelectedUUID; + LLUUID mLastInteractedUUID; bool mIsInitialized; bool mRootDirty; -- cgit v1.2.3 From 46425b2e49377acc186e41c67a793f7f6b7f583b Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 7 Sep 2023 01:35:37 +0300 Subject: SL-19826 Keep scroll from acting up if selection changed Unfulfilled scroll (due to fetching) persisted after selection changed --- indra/llui/llfolderview.cpp | 1 + 1 file changed, 1 insertion(+) (limited to 'indra') diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index 630d93cde0..650ae9ae75 100644 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -611,6 +611,7 @@ void LLFolderView::clearSelection() } mSelectedItems.clear(); + mNeedsScroll = false; } std::set LLFolderView::getSelectionList() const -- cgit v1.2.3 From cfb69846f1e8309ed86d4a18eb26a889f6dbaccc Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Sat, 9 Sep 2023 00:00:22 +0300 Subject: SL-20261 Allow and resize existing textures as necessary for thumbnails --- indra/newview/llfloaterchangeitemthumbnail.cpp | 132 ++++++++++++++++++++- indra/newview/llfloaterchangeitemthumbnail.h | 9 +- indra/newview/llfloatersimplesnapshot.cpp | 15 +++ indra/newview/llfloatersimplesnapshot.h | 1 + indra/newview/llsnapshotlivepreview.cpp | 32 +---- indra/newview/lltexturectrl.cpp | 5 +- indra/newview/lltexturectrl.h | 2 +- indra/newview/llviewertexturelist.cpp | 39 ++++++ indra/newview/llviewertexturelist.h | 4 + .../skins/default/xui/en/floater_texture_ctrl.xml | 2 +- 10 files changed, 197 insertions(+), 44 deletions(-) (limited to 'indra') diff --git a/indra/newview/llfloaterchangeitemthumbnail.cpp b/indra/newview/llfloaterchangeitemthumbnail.cpp index 77212507ab..780130039b 100644 --- a/indra/newview/llfloaterchangeitemthumbnail.cpp +++ b/indra/newview/llfloaterchangeitemthumbnail.cpp @@ -512,6 +512,13 @@ void LLFloaterChangeItemThumbnail::onPasteFromClipboard(void *userdata) asset_id = potential_uuid; } } + + LLInventoryObject* obj = self->getInventoryObject(); + if (obj && obj->getThumbnailUUID() == asset_id) + { + // nothing to do + return; + } if (asset_id.notNull()) { self->assignAndValidateAsset(asset_id); @@ -547,6 +554,8 @@ struct ImageLoadedData LLUUID mObjectId; LLHandle mFloaterHandle; bool mSilent; + // Keep image reference to prevent deletion on timeout + LLPointer mTexturep; }; void LLFloaterChangeItemThumbnail::assignAndValidateAsset(const LLUUID &asset_id, bool silent) @@ -576,8 +585,9 @@ void LLFloaterChangeItemThumbnail::assignAndValidateAsset(const LLUUID &asset_id data->mThumbnailId = asset_id; data->mFloaterHandle = getHandle(); data->mSilent = silent; + data->mTexturep = texturep; - texturep->setLoadedCallback(onImageLoaded, + texturep->setLoadedCallback(onImageDataLoaded, MAX_DISCARD_LEVEL, // Don't need full image, just size data FALSE, FALSE, @@ -636,7 +646,7 @@ bool LLFloaterChangeItemThumbnail::validateAsset(const LLUUID &asset_id) } //static -void LLFloaterChangeItemThumbnail::onImageLoaded( +void LLFloaterChangeItemThumbnail::onImageDataLoaded( BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, @@ -678,6 +688,45 @@ void LLFloaterChangeItemThumbnail::onImageLoaded( delete data; } +//static +void LLFloaterChangeItemThumbnail::onFullImageLoaded( + BOOL success, + LLViewerFetchedTexture* src_vi, + LLImageRaw* src, + LLImageRaw* aux_src, + S32 discard_level, + BOOL final, + void* userdata) +{ + if (!userdata) return; + + if (!final && success) return; //not done yet + + ImageLoadedData* data = (ImageLoadedData*)userdata; + + if (success) + { + if (src_vi->getFullWidth() != src_vi->getFullHeight() + || src_vi->getFullWidth() < LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN) + { + if (!data->mSilent) + { + LLNotificationsUtil::add("ThumbnailDimentionsLimit"); + } + } + else if (src_vi->getFullWidth() > LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX) + { + LLFloaterSimpleSnapshot::uploadThumbnail(src, data->mObjectId, LLUUID::null); + } + else + { + setThumbnailId(data->mThumbnailId, data->mObjectId); + } + } + + delete data; +} + void LLFloaterChangeItemThumbnail::showTexturePicker(const LLUUID &thumbnail_id) { // show hourglass cursor when loading inventory window @@ -725,8 +774,7 @@ void LLFloaterChangeItemThumbnail::showTexturePicker(const LLUUID &thumbnail_id) texture_floaterp->setBakeTextureEnabled(FALSE); texture_floaterp->setCanApplyImmediately(false); texture_floaterp->setCanApply(false, true, false /*Hide 'preview disabled'*/); - texture_floaterp->setDimentionsLimits(LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX, - LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN); + texture_floaterp->setMinDimentionsLimits(LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN); addDependentFloater(texture_floaterp); } @@ -743,14 +791,86 @@ void LLFloaterChangeItemThumbnail::onTexturePickerCommit() if (floaterp) { LLUUID asset_id = floaterp->getAssetID(); - if (validateAsset(asset_id)) + + if (asset_id.isNull()) { setThumbnailId(asset_id); + return; } - else + + LLInventoryObject* obj = getInventoryObject(); + if (obj && obj->getThumbnailUUID() == asset_id) + { + // nothing to do + return; + } + + LLPointer texturep = LLViewerTextureManager::findFetchedTexture(asset_id, TEX_LIST_STANDARD); + if (!texturep) + { + LL_WARNS() << "Image " << asset_id << " doesn't exist" << LL_ENDL; + return; + } + + if (texturep->isMissingAsset()) + { + LL_WARNS() << "Image " << asset_id << " is missing" << LL_ENDL; + return; + } + + if (texturep->getFullWidth() != texturep->getFullHeight()) + { + LLNotificationsUtil::add("ThumbnailDimentionsLimit"); + return; + } + + if (texturep->getFullWidth() < LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MIN + && texturep->getFullWidth() > 0) { LLNotificationsUtil::add("ThumbnailDimentionsLimit"); + return; + } + + if (texturep->getFullWidth() > LLFloaterSimpleSnapshot::THUMBNAIL_SNAPSHOT_DIM_MAX + || texturep->getFullWidth() == 0) + { + if (texturep->isFullyLoaded() + && (texturep->getCachedRawImageLevel() == 0 || texturep->getRawImageLevel() == 0) + && (texturep->isCachedRawImageReady() || texturep->isRawImageValid())) + { + if (texturep->isRawImageValid()) + { + LLFloaterSimpleSnapshot::uploadThumbnail(texturep->getRawImage(), mItemId, mTaskId); + } + else + { + LLFloaterSimpleSnapshot::uploadThumbnail(texturep->getCachedRawImage(), mItemId, mTaskId); + } + } + else + { + ImageLoadedData* data = new ImageLoadedData(); + data->mObjectId = mItemId; + data->mThumbnailId = asset_id; + data->mFloaterHandle = getHandle(); + data->mSilent = false; + data->mTexturep = texturep; + + texturep->setBoostLevel(LLGLTexture::BOOST_PREVIEW); + texturep->setMinDiscardLevel(0); + texturep->setLoadedCallback(onFullImageLoaded, + 0, // Need best quality + TRUE, + FALSE, + (void*)data, + NULL, + FALSE); + texturep->forceToSaveRawImage(0); + } + return; } + + setThumbnailId(asset_id); } } diff --git a/indra/newview/llfloaterchangeitemthumbnail.h b/indra/newview/llfloaterchangeitemthumbnail.h index 02f934337b..a91e9b8ee9 100644 --- a/indra/newview/llfloaterchangeitemthumbnail.h +++ b/indra/newview/llfloaterchangeitemthumbnail.h @@ -83,13 +83,20 @@ private: static void onRemovalConfirmation(const LLSD& notification, const LLSD& response, LLHandle handle); void assignAndValidateAsset(const LLUUID &asset_id, bool silent = false); - static void onImageLoaded(BOOL success, + static void onImageDataLoaded(BOOL success, LLViewerFetchedTexture *src_vi, LLImageRaw* src, LLImageRaw* aux_src, S32 discard_level, BOOL final, void* userdata); + static void onFullImageLoaded(BOOL success, + LLViewerFetchedTexture* src_vi, + LLImageRaw* src, + LLImageRaw* aux_src, + S32 discard_level, + BOOL final, + void* userdata); void showTexturePicker(const LLUUID &thumbnail_id); void onTexturePickerCommit(); diff --git a/indra/newview/llfloatersimplesnapshot.cpp b/indra/newview/llfloatersimplesnapshot.cpp index 757ac605e3..58604c5628 100644 --- a/indra/newview/llfloatersimplesnapshot.cpp +++ b/indra/newview/llfloatersimplesnapshot.cpp @@ -397,6 +397,21 @@ void LLFloaterSimpleSnapshot::uploadThumbnail(const std::string &file_path, cons uploadImageUploadFile(temp_file, inventory_id, task_id); } +// static +void LLFloaterSimpleSnapshot::uploadThumbnail(LLPointer raw_image, const LLUUID& inventory_id, const LLUUID& task_id) +{ + std::string temp_file = gDirUtilp->getTempFilename(); + if (!LLViewerTextureList::createUploadFile(raw_image, temp_file, THUMBNAIL_SNAPSHOT_DIM_MAX, THUMBNAIL_SNAPSHOT_DIM_MIN)) + { + LLSD notif_args; + notif_args["REASON"] = LLImage::getLastError().c_str(); + LLNotificationsUtil::add("CannotUploadTexture", notif_args); + LL_WARNS("Thumbnail") << "Failed to upload thumbnail for " << inventory_id << " " << task_id << ", reason: " << notif_args["REASON"].asString() << LL_ENDL; + return; + } + uploadImageUploadFile(temp_file, inventory_id, task_id); +} + // static void LLFloaterSimpleSnapshot::uploadImageUploadFile(const std::string &temp_file, const LLUUID &inventory_id, const LLUUID &task_id) { diff --git a/indra/newview/llfloatersimplesnapshot.h b/indra/newview/llfloatersimplesnapshot.h index a2bf2946d4..91a81ee5c3 100644 --- a/indra/newview/llfloatersimplesnapshot.h +++ b/indra/newview/llfloatersimplesnapshot.h @@ -63,6 +63,7 @@ public: void postSave(); static void uploadThumbnail(const std::string &file_path, const LLUUID &inventory_id, const LLUUID &task_id); + static void uploadThumbnail(LLPointer raw_image, const LLUUID& inventory_id, const LLUUID& task_id); class Impl; friend class Impl; diff --git a/indra/newview/llsnapshotlivepreview.cpp b/indra/newview/llsnapshotlivepreview.cpp index 37ebcd1266..b7a1832b17 100644 --- a/indra/newview/llsnapshotlivepreview.cpp +++ b/indra/newview/llsnapshotlivepreview.cpp @@ -876,37 +876,7 @@ LLPointer LLSnapshotLivePreview::getEncodedImage() bool LLSnapshotLivePreview::createUploadFile(const std::string &out_filename, const S32 max_image_dimentions, const S32 min_image_dimentions) { - // make a copy, since convertToUploadFile modifies raw image - LLPointer raw_image = new LLImageRaw( - mPreviewImage->getData(), - mPreviewImage->getWidth(), - mPreviewImage->getHeight(), - mPreviewImage->getComponents()); - - LLPointer compressedImage = LLViewerTextureList::convertToUploadFile(raw_image, max_image_dimentions); - if (compressedImage->getWidth() < min_image_dimentions || compressedImage->getHeight() < min_image_dimentions) - { - std::string reason = llformat("Images below %d x %d pixels are not allowed. Actual size: %d x %dpx", - min_image_dimentions, - min_image_dimentions, - compressedImage->getWidth(), - compressedImage->getHeight()); - compressedImage->setLastError(reason); - return FALSE; - } - if (compressedImage.isNull()) - { - compressedImage->setLastError("Couldn't convert the image to jpeg2000."); - LL_INFOS() << "Couldn't convert to j2c, file : " << out_filename << LL_ENDL; - return false; - } - if (!compressedImage->save(out_filename)) - { - compressedImage->setLastError("Couldn't create the jpeg2000 image for upload."); - LL_INFOS() << "Couldn't create output file : " << out_filename << LL_ENDL; - return false; - } - return true; + return LLViewerTextureList::createUploadFile(mPreviewImage, out_filename, max_image_dimentions, min_image_dimentions); } // We actually estimate the data size so that we do not require actual compression when showing the preview diff --git a/indra/newview/lltexturectrl.cpp b/indra/newview/lltexturectrl.cpp index a746744e53..0c3730d084 100644 --- a/indra/newview/lltexturectrl.cpp +++ b/indra/newview/lltexturectrl.cpp @@ -1197,15 +1197,12 @@ void LLFloaterTexturePicker::setCanApply(bool can_preview, bool can_apply, bool mPreviewSettingChanged = true; } -void LLFloaterTexturePicker::setDimentionsLimits(S32 max_dim, S32 min_dim) +void LLFloaterTexturePicker::setMinDimentionsLimits(S32 min_dim) { - mMaxDim = max_dim; mMinDim = min_dim; std::string formatted_dims = llformat("%dx%d", mMinDim, mMinDim); mResolutionWarning->setTextArg("[MINTEXDIM]", formatted_dims); - formatted_dims = llformat("%dx%d", mMaxDim, mMaxDim); - mResolutionWarning->setTextArg("[MAXTEXDIM]", formatted_dims); } void LLFloaterTexturePicker::onFilterEdit(const std::string& search_string ) diff --git a/indra/newview/lltexturectrl.h b/indra/newview/lltexturectrl.h index 60543191b6..7239b97552 100644 --- a/indra/newview/lltexturectrl.h +++ b/indra/newview/lltexturectrl.h @@ -323,7 +323,7 @@ public: void onFilterEdit(const std::string& search_string); void setCanApply(bool can_preview, bool can_apply, bool inworld_image = true); - void setDimentionsLimits(S32 max_dim, S32 min_dim); + void setMinDimentionsLimits(S32 min_dim); void setTextureSelectedCallback(const texture_selected_callback& cb) { mTextureSelectedCallback = cb; } void setOnFloaterCloseCallback(const floater_close_callback& cb) { mOnFloaterCloseCallback = cb; } void setOnFloaterCommitCallback(const floater_commit_callback& cb) { mOnFloaterCommitCallback = cb; } diff --git a/indra/newview/llviewertexturelist.cpp b/indra/newview/llviewertexturelist.cpp index d10e1ea8c9..f9fe8054a4 100644 --- a/indra/newview/llviewertexturelist.cpp +++ b/indra/newview/llviewertexturelist.cpp @@ -1285,6 +1285,45 @@ void LLViewerTextureList::decodeAllImages(F32 max_time) << LL_ENDL; } +bool LLViewerTextureList::createUploadFile(LLPointer raw_image, + const std::string& out_filename, + const S32 max_image_dimentions, + const S32 min_image_dimentions) +{ + LL_PROFILE_ZONE_SCOPED_CATEGORY_TEXTURE; + + // make a copy, since convertToUploadFile scales raw image + LLPointer scale_image = new LLImageRaw( + raw_image->getData(), + raw_image->getWidth(), + raw_image->getHeight(), + raw_image->getComponents()); + + LLPointer compressedImage = LLViewerTextureList::convertToUploadFile(scale_image, max_image_dimentions); + if (compressedImage->getWidth() < min_image_dimentions || compressedImage->getHeight() < min_image_dimentions) + { + std::string reason = llformat("Images below %d x %d pixels are not allowed. Actual size: %d x %dpx", + min_image_dimentions, + min_image_dimentions, + compressedImage->getWidth(), + compressedImage->getHeight()); + compressedImage->setLastError(reason); + return false; + } + if (compressedImage.isNull()) + { + compressedImage->setLastError("Couldn't convert the image to jpeg2000."); + LL_INFOS() << "Couldn't convert to j2c, file : " << out_filename << LL_ENDL; + return false; + } + if (!compressedImage->save(out_filename)) + { + compressedImage->setLastError("Couldn't create the jpeg2000 image for upload."); + LL_INFOS() << "Couldn't create output file : " << out_filename << LL_ENDL; + return false; + } + return true; +} BOOL LLViewerTextureList::createUploadFile(const std::string& filename, const std::string& out_filename, diff --git a/indra/newview/llviewertexturelist.h b/indra/newview/llviewertexturelist.h index 8fc65fc9ce..82dec6b329 100644 --- a/indra/newview/llviewertexturelist.h +++ b/indra/newview/llviewertexturelist.h @@ -92,6 +92,10 @@ class LLViewerTextureList friend class LLLocalBitmap; public: + static bool createUploadFile(LLPointer raw_image, + const std::string& out_filename, + const S32 max_image_dimentions = LLViewerFetchedTexture::MAX_IMAGE_SIZE_DEFAULT, + const S32 min_image_dimentions = 0); static BOOL createUploadFile(const std::string& filename, const std::string& out_filename, const U8 codec, diff --git a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml index 771113d989..8081af6673 100644 --- a/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml +++ b/indra/newview/skins/default/xui/en/floater_texture_ctrl.xml @@ -96,7 +96,7 @@ name="over_limit_lbl" visible="false" top_delta="0"> - Selected texture is [TEXDIM]. Inventory image must be square, between [MINTEXDIM] and [MAXTEXDIM]. + Selected texture is [TEXDIM]. Inventory image must be square, no less than [MINTEXDIM]. -- cgit v1.2.3 From 1514ade10dc0f64c476ff405256b86fb6a1d9b57 Mon Sep 17 00:00:00 2001 From: RunitaiLinden Date: Mon, 11 Sep 2023 09:20:00 -0500 Subject: SL-19842 WIP -- Now that probes can override ambient, unroll ambient darkening hacks. --- indra/llinventory/llsettingssky.cpp | 4 ++++ indra/newview/app_settings/settings.xml | 8 ++++---- .../app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl | 8 ++------ indra/newview/llsettingsvo.cpp | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) (limited to 'indra') diff --git a/indra/llinventory/llsettingssky.cpp b/indra/llinventory/llsettingssky.cpp index 976a61fb69..fedbed2990 100644 --- a/indra/llinventory/llsettingssky.cpp +++ b/indra/llinventory/llsettingssky.cpp @@ -1449,6 +1449,7 @@ F32 LLSettingsSky::getReflectionProbeAmbiance(bool auto_adjust) const F32 LLSettingsSky::getTotalReflectionProbeAmbiance(F32 cloud_shadow_scale, bool auto_adjust) const { +#if 0 // feed cloud shadow back into reflection probe ambiance to mimic pre-reflection-probe behavior // without brightening dark/interior spaces F32 probe_ambiance = getReflectionProbeAmbiance(auto_adjust); @@ -1459,6 +1460,9 @@ F32 LLSettingsSky::getTotalReflectionProbeAmbiance(F32 cloud_shadow_scale, bool } return probe_ambiance; +#else + return getReflectionProbeAmbiance(auto_adjust); +#endif } F32 LLSettingsSky::getSkyBottomRadius() const diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index b4e149f0e0..35ab1e9d40 100644 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -10654,7 +10654,7 @@ Type F32 Value - 0.7 + 1.0 RenderSkyAutoAdjustHDRScale @@ -10709,7 +10709,7 @@ Type F32 Value - 1.0 + 0.001 RenderSkySunlightScale @@ -10720,7 +10720,7 @@ Type F32 Value - 1.5 + 1.0 RenderSkyAmbientScale @@ -10731,7 +10731,7 @@ Type F32 Value - 0.5 + 0.7 RenderReflectionProbeMaxLocalLightAmbiance diff --git a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl index 53474ded7f..a8aa5a36a3 100644 --- a/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl +++ b/indra/newview/app_settings/shaders/class1/windlight/atmosphericsFuncs.glsl @@ -39,7 +39,6 @@ uniform float max_y; uniform vec3 glow; uniform float scene_light_strength; uniform float sun_moon_glow_factor; -uniform float sky_hdr_scale; uniform float sky_sunlight_scale; uniform float sky_ambient_scale; @@ -150,12 +149,9 @@ void calcAtmosphericVarsLinear(vec3 inPositionEye, vec3 norm, vec3 light_dir, ou // multiply to get similar colors as when the "scaleSoftClip" implementation was doubling color values // (allows for mixing of light sources other than sunlight e.g. reflection probes) - sunlit *= sky_sunlight_scale; //1.5; - amblit *= sky_ambient_scale; //0.5; + sunlit *= sky_sunlight_scale; + amblit *= sky_ambient_scale; - // override amblit with ambient_color if sky probe ambiance is not zero - amblit = mix(amblit, ambient_color, clamp(sky_hdr_scale-1.0, 0.0, 1.0)); - amblit = srgb_to_linear(amblit); amblit *= ambientLighting(norm, light_dir); } diff --git a/indra/newview/llsettingsvo.cpp b/indra/newview/llsettingsvo.cpp index 9ccac82e63..b7c4dbe648 100644 --- a/indra/newview/llsettingsvo.cpp +++ b/indra/newview/llsettingsvo.cpp @@ -742,7 +742,7 @@ void LLSettingsVOSky::applySpecial(void *ptarget, bool force) { if (psky->getReflectionProbeAmbiance() != 0.f) { - shader->uniform3fv(LLShaderMgr::AMBIENT, getAmbientColor().mV); + shader->uniform3fv(LLShaderMgr::AMBIENT, LLVector3(ambient.mV)); shader->uniform1f(LLShaderMgr::SKY_HDR_SCALE, sqrtf(g)*2.0); // use a modifier here so 1.0 maps to the "most desirable" default and the maximum value doesn't go off the rails } else if (psky->canAutoAdjust() && should_auto_adjust) -- cgit v1.2.3 From f107d8431ccbd85bbe6f2ac0fd47cd409b8c0cfc Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Mon, 11 Sep 2023 17:31:08 +0300 Subject: SL-20199 Fix invalid or oversized folder being refetched indefinetely --- indra/newview/llinventorymodelbackgroundfetch.cpp | 7 +++++++ 1 file changed, 7 insertions(+) (limited to 'indra') diff --git a/indra/newview/llinventorymodelbackgroundfetch.cpp b/indra/newview/llinventorymodelbackgroundfetch.cpp index 44eccd955e..07d5713fc8 100644 --- a/indra/newview/llinventorymodelbackgroundfetch.cpp +++ b/indra/newview/llinventorymodelbackgroundfetch.cpp @@ -549,6 +549,13 @@ void LLInventoryModelBackgroundFetch::onAISFolderCalback(const LLUUID &request_i { LL_WARNS() << "Failed to download folder: " << request_id << " Requesting known content separately" << LL_ENDL; mFetchFolderQueue.push_back(FetchQueueInfo(request_id, FT_CONTENT_RECURSIVE)); + + // set folder's version to prevent viewer from trying to request folder indefinetely + LLViewerInventoryCategory* cat(gInventory.getCategory(request_id)); + if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) + { + cat->setVersion(0); + } } } else -- cgit v1.2.3 From 0b02bf5d262fe9a6de968686420c4d525ac04077 Mon Sep 17 00:00:00 2001 From: Alexander Gavriliuk Date: Mon, 7 Aug 2023 18:44:04 +0200 Subject: SL-20090 BugSplat Crash: LLViewerFetchedTexture::updateFetch(2099) --- indra/newview/llviewertexture.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index cb58588848..9fc092d4b9 100644 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -2096,7 +2096,8 @@ bool LLViewerFetchedTexture::updateFetch() } } - llassert_always(mRawImage.notNull() || (!mNeedsCreateTexture && !mIsRawImageValid)); + llassert_always(mRawImage.notNull() || !mIsRawImageValid); + llassert_always(mRawImage.notNull() || !mNeedsCreateTexture); return mIsFetching ? true : false; } -- cgit v1.2.3 From b5c745185f4e3d2d215b5a171dc96a57d01eb079 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Tue, 12 Sep 2023 19:51:13 +0300 Subject: SL-20162 Option for debuging folder version in UI Shows folder's data instead of a suffix. Will need either a new inventory window or to toggle UI debug on early. --- indra/newview/llinventorybridge.cpp | 21 ++++++++++++++++++++- indra/newview/skins/default/xui/en/strings.xml | 1 + 2 files changed, 21 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 49b6275c3e..481b221870 100644 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -2321,13 +2321,32 @@ void LLFolderBridge::buildDisplayName() const std::string LLFolderBridge::getLabelSuffix() const { static LLCachedControl folder_loading_message_delay(gSavedSettings, "FolderLoadingMessageWaitTime", 0.5f); + static LLCachedControl xui_debug(gSavedSettings, "DebugShowXUINames", 0); if (mIsLoading && mTimeSinceRequestStart.getElapsedTimeF32() >= folder_loading_message_delay()) { return llformat(" ( %s ) ", LLTrans::getString("LoadingData").c_str()); } std::string suffix = ""; - if(mShowDescendantsCount) + if (xui_debug) + { + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(getUUID(), cats, items); + + LLViewerInventoryCategory* cat = gInventory.getCategory(getUUID()); + if (cat) + { + LLStringUtil::format_map_t args; + args["[FOLDER_COUNT]"] = llformat("%d", cats->size()); + args["[ITEMS_COUNT]"] = llformat("%d", items->size()); + args["[VERSION]"] = llformat("%d", cat->getVersion()); + args["[VIEWER_DESCENDANT_COUNT]"] = llformat("%d", cats->size() + items->size()); + args["[SERVER_DESCENDANT_COUNT]"] = llformat("%d", cat->getDescendentCount()); + suffix = " " + LLTrans::getString("InventoryFolderDebug", args); + } + } + else if(mShowDescendantsCount) { LLInventoryModel::cat_array_t cat_array; LLInventoryModel::item_array_t item_array; diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index 4cdc8f2835..04b374cb00 100644 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -2355,6 +2355,7 @@ If you continue to receive this message, please contact Second Life support for Drag folders to this area to list them for sale on the [[MARKETPLACE_DASHBOARD_URL] Marketplace]. + ( F:[FOLDER_COUNT] I:[ITEMS_COUNT] V:[VERSION] DC:[VIEWER_DESCENDANT_COUNT]/[SERVER_DESCENDANT_COUNT] ) ( [ITEMS_COUNT] Items ) stock folder must be contained by a version folder -- cgit v1.2.3 From a280bacfea5453df3453322223b677adc2780511 Mon Sep 17 00:00:00 2001 From: Cosmic Linden Date: Mon, 11 Sep 2023 17:11:03 -0700 Subject: SL-20157: Fix scale of avatar mesh parts when mikktspace tangent generation fails --- indra/llmath/llvolume.cpp | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) (limited to 'indra') diff --git a/indra/llmath/llvolume.cpp b/indra/llmath/llvolume.cpp index 0e3792fda3..6d36daa92a 100644 --- a/indra/llmath/llvolume.cpp +++ b/indra/llmath/llvolume.cpp @@ -5626,29 +5626,29 @@ bool LLVolumeFace::cacheOptimize(bool gen_tangents) mWeights[dst_idx].loadua(data.w[src_idx].mV); } } + + // put back in normalized coordinate frame + LLVector4a inv_scale(1.f/mNormalizedScale.mV[0], 1.f / mNormalizedScale.mV[1], 1.f / mNormalizedScale.mV[2]); + LLVector4a scale; + scale.load3(mNormalizedScale.mV); + scale.getF32ptr()[3] = 1.f; + + for (int i = 0; i < mNumVertices; ++i) + { + mPositions[i].mul(inv_scale); + mNormals[i].mul(scale); + mNormals[i].normalize3(); + F32 w = mTangents[i].getF32ptr()[3]; + mTangents[i].mul(scale); + mTangents[i].normalize3(); + mTangents[i].getF32ptr()[3] = w; + } } else { // blew past the max vertex size limit, use legacy tangent generation which never adds verts createTangents(); } - - // put back in normalized coordinate frame - LLVector4a inv_scale(1.f/mNormalizedScale.mV[0], 1.f / mNormalizedScale.mV[1], 1.f / mNormalizedScale.mV[2]); - LLVector4a scale; - scale.load3(mNormalizedScale.mV); - scale.getF32ptr()[3] = 1.f; - - for (int i = 0; i < mNumVertices; ++i) - { - mPositions[i].mul(inv_scale); - mNormals[i].mul(scale); - mNormals[i].normalize3(); - F32 w = mTangents[i].getF32ptr()[3]; - mTangents[i].mul(scale); - mTangents[i].normalize3(); - mTangents[i].getF32ptr()[3] = w; - } } // cache optimize index buffer -- cgit v1.2.3 From 2e7cf2c1afd9cec1b2e69a5ac7fbbe7ad745c457 Mon Sep 17 00:00:00 2001 From: Mnikolenko Productengine Date: Thu, 14 Sep 2023 14:55:41 +0300 Subject: SL-20268 FIXED clicking Cancel doesn't revert Materials perms --- indra/newview/llfloaterperms.cpp | 2 +- indra/newview/llfloaterperms.h | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/newview/llfloaterperms.cpp b/indra/newview/llfloaterperms.cpp index fb55c6c6c4..b53839977e 100644 --- a/indra/newview/llfloaterperms.cpp +++ b/indra/newview/llfloaterperms.cpp @@ -122,7 +122,7 @@ const std::string LLFloaterPermsDefault::sCategoryNames[CAT_LAST] = "Notecards", "Gestures", "Wearables", - "Settings" + "Settings", "Materials" }; diff --git a/indra/newview/llfloaterperms.h b/indra/newview/llfloaterperms.h index 02359a256e..97ddec7cba 100644 --- a/indra/newview/llfloaterperms.h +++ b/indra/newview/llfloaterperms.h @@ -75,6 +75,7 @@ enum Categories CAT_GESTURES, CAT_WEARABLES, CAT_SETTINGS, + CAT_MATERIALS, CAT_LAST }; -- cgit v1.2.3 From fa47e4402b7925a45c5fec9fb9d92fb5e34a589e Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 14 Sep 2023 18:42:42 +0300 Subject: SL-20285 Sturdier cof and fixed link fetching --- indra/newview/llaisapi.cpp | 62 +++++++++++++++++++---------------- indra/newview/llaisapi.h | 2 +- indra/newview/llappearancemgr.cpp | 58 ++++++++++++++++---------------- indra/newview/llattachmentsmgr.cpp | 1 + indra/newview/llinventoryobserver.cpp | 19 ++++------- 5 files changed, 70 insertions(+), 72 deletions(-) (limited to 'indra') diff --git a/indra/newview/llaisapi.cpp b/indra/newview/llaisapi.cpp index d8d30037c8..087cfb8d48 100644 --- a/indra/newview/llaisapi.cpp +++ b/indra/newview/llaisapi.cpp @@ -741,8 +741,10 @@ void AISAPI::FetchCategoryLinks(const LLUUID &catId, completion_t callback) (&LLCoreHttpUtil::HttpCoroutineAdapter::getAndSuspend), _1, _2, _3, _5, _6); + LLSD body; + body["depth"] = 0; LLCoprocedureManager::CoProcedure_t proc( - boost::bind(&AISAPI::InvokeAISCommandCoro, _1, getFn, url, LLUUID::null, LLSD(), callback, FETCHCATEGORYLINKS)); + boost::bind(&AISAPI::InvokeAISCommandCoro, _1, getFn, url, LLUUID::null, body, callback, FETCHCATEGORYLINKS)); EnqueueAISCommand("FetchCategoryLinks", proc); } @@ -1337,13 +1339,6 @@ void AISUpdate::parseCategory(const LLSD& category_map, S32 depth) return; } - // Check descendent count first, as it may be needed - // to populate newly created categories - if (category_map.has("_embedded")) - { - parseDescendentCount(category_id, category_map["_embedded"]); - } - LLPointer new_cat; if (curr_cat) { @@ -1366,6 +1361,13 @@ void AISUpdate::parseCategory(const LLSD& category_map, S32 depth) // *NOTE: unpackMessage does not unpack version or descendent count. if (rv) { + // Check descendent count first, as it may be needed + // to populate newly created categories + if (category_map.has("_embedded")) + { + parseDescendentCount(category_id, new_cat->getPreferredType(), category_map["_embedded"]); + } + if (mFetch) { uuid_int_map_t::const_iterator lookup_it = mCatDescendentsKnown.find(category_id); @@ -1379,10 +1381,20 @@ void AISUpdate::parseCategory(const LLSD& category_map, S32 depth) // set version only if we are sure this update has full data and embeded items // since viewer uses version to decide if folder and content still need fetching if (version > LLViewerInventoryCategory::VERSION_UNKNOWN - && (depth >= 0 || (curr_cat && curr_cat->getVersion() > LLViewerInventoryCategory::VERSION_UNKNOWN))) + && depth >= 0) { - LL_DEBUGS("Inventory") << "Setting version to " << version - << " for category " << category_id << LL_ENDL; + if (curr_cat && curr_cat->getVersion() > version) + { + LL_WARNS("Inventory") << "Version was " << curr_cat->getVersion() + << ", but fetch returned version " << version + << " for category " << category_id << LL_ENDL; + } + else + { + LL_DEBUGS("Inventory") << "Setting version to " << version + << " for category " << category_id << LL_ENDL; + } + new_cat->setVersion(version); } } @@ -1445,27 +1457,21 @@ void AISUpdate::parseCategory(const LLSD& category_map, S32 depth) } } -void AISUpdate::parseDescendentCount(const LLUUID& category_id, const LLSD& embedded) +void AISUpdate::parseDescendentCount(const LLUUID& category_id, LLFolderType::EType type, const LLSD& embedded) { - if (mType == AISAPI::FETCHCOF) + // We can only determine true descendent count if this contains all descendent types. + if (embedded.has("categories") && + embedded.has("links") && + embedded.has("items")) { - // contains only links - if (embedded.has("links")) - { - mCatDescendentsKnown[category_id] = embedded["links"].size(); - } + mCatDescendentsKnown[category_id] = embedded["categories"].size(); + mCatDescendentsKnown[category_id] += embedded["links"].size(); + mCatDescendentsKnown[category_id] += embedded["items"].size(); } - else + else if (mFetch && embedded.has("links") && (type == LLFolderType::FT_CURRENT_OUTFIT || type == LLFolderType::FT_OUTFIT)) { - // We can only determine true descendent count if this contains all descendent types. - if (embedded.has("categories") && - embedded.has("links") && - embedded.has("items")) - { - mCatDescendentsKnown[category_id] = embedded["categories"].size(); - mCatDescendentsKnown[category_id] += embedded["links"].size(); - mCatDescendentsKnown[category_id] += embedded["items"].size(); - } + // COF and outfits contain links only + mCatDescendentsKnown[category_id] = embedded["links"].size(); } } diff --git a/indra/newview/llaisapi.h b/indra/newview/llaisapi.h index 53c74ae078..0fdf4a0b74 100644 --- a/indra/newview/llaisapi.h +++ b/indra/newview/llaisapi.h @@ -118,7 +118,7 @@ public: void parseLink(const LLSD& link_map, S32 depth); void parseItem(const LLSD& link_map); void parseCategory(const LLSD& link_map, S32 depth); - void parseDescendentCount(const LLUUID& category_id, const LLSD& embedded); + void parseDescendentCount(const LLUUID& category_id, LLFolderType::EType type, const LLSD& embedded); void parseEmbedded(const LLSD& embedded, S32 depth); void parseEmbeddedLinks(const LLSD& links, S32 depth); void parseEmbeddedItems(const LLSD& items); diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 80ef5e3bae..876ae23e62 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -4446,7 +4446,7 @@ public: { LLViewerInventoryCategory* cat = gInventory.getCategory(*it); if (!cat) continue; - if (!isCategoryComplete(cat)) + if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) { // CHECK IT: isCategoryComplete() checks both version and descendant count but // fetch() only works for Unknown version and doesn't care about descentants, @@ -4456,6 +4456,12 @@ public: cat->fetch(); //blindly fetch it without seeing if anything else is fetching it. mIncomplete.push_back(*it); //Add to list of things being downloaded for this observer. } + else if (!isCategoryComplete(cat)) + { + LL_DEBUGS("Inventory") << "Categoty " << *it << " incomplete despite having version" << LL_ENDL; + LLInventoryModelBackgroundFetch::instance().scheduleFolderFetch(*it, true); + mIncomplete.push_back(*it); + } else if (ais3) { LLInventoryModel::cat_array_t* cats; @@ -4484,10 +4490,7 @@ public: if (incomplete_count > MAX_INDIVIDUAL_FETCH || (incomplete_count > 1 && complete_count == 0)) { - // To prevent premature removal from mIncomplete and - // since we are doing a full refetch anyway, mark unknown - cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN); - cat->fetch(); + LLInventoryModelBackgroundFetch::instance().scheduleFolderFetch(*it, true); mIncomplete.push_back(*it); } else @@ -4496,6 +4499,7 @@ public: mComplete.push_back(*it); } } + // else should have been handled by isCategoryComplete } else { @@ -4519,13 +4523,11 @@ public: // What we do here is get the complete information on the // items in the requested category, and set up an observer // that will wait for that to happen. - LLInventoryModel::cat_array_t cat_array; - LLInventoryModel::item_array_t item_array; - gInventory.collectDescendents(mComplete.front(), - cat_array, - item_array, - LLInventoryModel::EXCLUDE_TRASH); - S32 count = item_array.size(); + LLInventoryModel::cat_array_t* cats; + LLInventoryModel::item_array_t* items; + gInventory.getDirectDescendentsOf(mComplete.front(), cats, items); + + S32 count = items->size(); if(!count) { LL_WARNS() << "Nothing fetched in category " << mComplete.front() @@ -4537,11 +4539,13 @@ public: return; } - LL_INFOS() << "stage1 got " << item_array.size() << " items, passing to stage2 " << LL_ENDL; + LLViewerInventoryCategory* cat = gInventory.getCategory(mComplete.front()); + S32 version = cat ? cat->getVersion() : -2; + LL_INFOS() << "stage1, category " << mComplete.front() << " got " << count << " items, version " << version << " passing to stage2 " << LL_ENDL; uuid_vec_t ids; for(S32 i = 0; i < count; ++i) { - ids.push_back(item_array.at(i)->getUUID()); + ids.push_back(items->at(i)->getUUID()); } gInventory.removeObserver(this); @@ -4570,14 +4574,14 @@ void callAfterCOFFetch(nullary_func_t cb) { LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id); - if (cat->getVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) + + if (AISAPI::isAvailable()) { - if (AISAPI::isAvailable()) - { - // Mark cof (update timer) so that background fetch won't request it - cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); - // Assume that we have no relevant cache. Fetch cof, and items cof's links point to. - AISAPI::FetchCOF([cb](const LLUUID& id) + // Mark cof (update timer) so that background fetch won't request it + cat->setFetching(LLViewerInventoryCategory::FETCH_RECURSIVE); + // For reliability assume that we have no relevant cache, so + // fetch cof along with items cof's links point to. + AISAPI::FetchCOF([cb](const LLUUID& id) { cb(); LLUUID cat_id = LLAppearanceMgr::instance().getCOF(); @@ -4587,18 +4591,12 @@ void callAfterCOFFetch(nullary_func_t cb) cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); } }); - } - else - { - LL_WARNS() << "AIS API v3 not available, can't use AISAPI::FetchCOF" << LL_ENDL; - // startup should have marked folder as fetching, remove that - cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); - callAfterCategoryFetch(cat_id, cb); - } } else { - // Assume that cache is present. Process like a normal folder. + LL_INFOS() << "AIS API v3 not available, using callAfterCategoryFetch" << LL_ENDL; + // startup should have marked folder as fetching, remove that + cat->setFetching(LLViewerInventoryCategory::FETCH_NONE); callAfterCategoryFetch(cat_id, cb); } } diff --git a/indra/newview/llattachmentsmgr.cpp b/indra/newview/llattachmentsmgr.cpp index bcd89cf8db..d3fce306bc 100644 --- a/indra/newview/llattachmentsmgr.cpp +++ b/indra/newview/llattachmentsmgr.cpp @@ -243,6 +243,7 @@ void LLAttachmentsMgr::linkRecentlyArrivedAttachments() if (LLAppearanceMgr::instance().getCOFVersion() == LLViewerInventoryCategory::VERSION_UNKNOWN) { // Wait for cof to load + LL_DEBUGS_ONCE("Avatar") << "Received atachments, but cof isn't loaded yet, postponing processing" << LL_ENDL; return; } diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 227d4285eb..51be44bef4 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -334,21 +334,14 @@ void LLInventoryFetchItemsObserver::startFetch() if (aisv3) { - const S32 MAX_INDIVIDUAL_REQUESTS = 10; + const S32 MAX_INDIVIDUAL_REQUESTS = 7; for (requests_by_folders_t::value_type &folder : requests) { - LLViewerInventoryCategory* cat = gInventory.getCategory(folder.first); if (folder.second.size() > MAX_INDIVIDUAL_REQUESTS) { // requesting one by one will take a while // do whole folder - if (cat) - { - // Either drop version or use scheduleFolderFetch to force-fetch - // otherwise background fetch will ignore folders with set version - cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN); - } - LLInventoryModelBackgroundFetch::getInstance()->start(folder.first); + LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); } else { @@ -360,12 +353,11 @@ void LLInventoryFetchItemsObserver::startFetch() // start fetching whole folder since it's not ready either way cat->fetch(); } - else if (cat->getViewerDescendentCount() <= folder.second.size()) + else if (cat->getViewerDescendentCount() <= folder.second.size() + || cat->getDescendentCount() <= folder.second.size()) { // Start fetching whole folder since we need all items - // Drop version or use scheduleFolderFetch - cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN); - cat->fetch(); + LLInventoryModelBackgroundFetch::getInstance()->scheduleFolderFetch(folder.first, true); } else @@ -382,6 +374,7 @@ void LLInventoryFetchItemsObserver::startFetch() // Isn't supposed to happen? We should have all folders // and if item exists, folder is supposed to exist as well. llassert(false); + LL_WARNS("Inventory") << "Missing folder: " << folder.first << " fetching items individually" << LL_ENDL; // get items one by one for (LLUUID &item_id : folder.second) -- cgit v1.2.3 From b09c19d27ceb2a3695cd688b1ccffcb3084f0e46 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 14 Sep 2023 20:58:42 +0300 Subject: SL-20285 Updated individual request count declaration --- indra/newview/llappearancemgr.cpp | 3 +-- indra/newview/llinventoryobserver.cpp | 4 ++-- indra/newview/llinventoryobserver.h | 3 +++ 3 files changed, 6 insertions(+), 4 deletions(-) (limited to 'indra') diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 876ae23e62..8010b84c20 100644 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -4486,8 +4486,7 @@ public: // AIS can fetch couple items, but if there // is more than a dozen it will be very slow // it's faster to get whole folder in such case - const S32 MAX_INDIVIDUAL_FETCH = 10; - if (incomplete_count > MAX_INDIVIDUAL_FETCH + if (incomplete_count > LLInventoryFetchItemsObserver::MAX_INDIVIDUAL_ITEM_REQUESTS || (incomplete_count > 1 && complete_count == 0)) { LLInventoryModelBackgroundFetch::instance().scheduleFolderFetch(*it, true); diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp index 51be44bef4..281a8bc789 100644 --- a/indra/newview/llinventoryobserver.cpp +++ b/indra/newview/llinventoryobserver.cpp @@ -58,6 +58,7 @@ #include "llsdutil.h" #include +const S32 LLInventoryFetchItemsObserver::MAX_INDIVIDUAL_ITEM_REQUESTS = 7; const F32 LLInventoryFetchItemsObserver::FETCH_TIMER_EXPIRY = 60.0f; @@ -334,10 +335,9 @@ void LLInventoryFetchItemsObserver::startFetch() if (aisv3) { - const S32 MAX_INDIVIDUAL_REQUESTS = 7; for (requests_by_folders_t::value_type &folder : requests) { - if (folder.second.size() > MAX_INDIVIDUAL_REQUESTS) + if (folder.second.size() > MAX_INDIVIDUAL_ITEM_REQUESTS) { // requesting one by one will take a while // do whole folder diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h index 93109a70ac..bec08d2cdf 100644 --- a/indra/newview/llinventoryobserver.h +++ b/indra/newview/llinventoryobserver.h @@ -104,6 +104,9 @@ public: /*virtual*/ void startFetch(); /*virtual*/ void changed(U32 mask); + + // For attempts to group requests if too many items are requested + static const S32 MAX_INDIVIDUAL_ITEM_REQUESTS; private: LLTimer mFetchingPeriod; -- cgit v1.2.3 From 28e6ce451c3d01333a805f11286dacc9f3157c54 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 14 Sep 2023 23:34:57 +0300 Subject: SL-20269 Tab's focus jumps over item when clicking on edge items --- indra/llui/lltabcontainer.cpp | 8 +++++++- indra/llui/lltabcontainer.h | 1 + 2 files changed, 8 insertions(+), 1 deletion(-) (limited to 'indra') diff --git a/indra/llui/lltabcontainer.cpp b/indra/llui/lltabcontainer.cpp index f15e9771c0..76b9e448a1 100644 --- a/indra/llui/lltabcontainer.cpp +++ b/indra/llui/lltabcontainer.cpp @@ -605,6 +605,7 @@ BOOL LLTabContainer::handleMouseDown( S32 x, S32 y, MASK mask ) LLButton* tab_button = getTab(index)->mButton; gFocusMgr.setMouseCapture(this); tab_button->setFocus(TRUE); + mMouseDownTimer.start(); } } if (handled) { @@ -653,7 +654,11 @@ BOOL LLTabContainer::handleHover( S32 x, S32 y, MASK mask ) handled = LLPanel::handleHover(x, y, mask); } - commitHoveredButton(x, y); + F32 drag_delay = 0.25f; // filter out clicks from dragging + if (mMouseDownTimer.getElapsedTimeF32() > drag_delay) + { + commitHoveredButton(x, y); + } return handled; } @@ -699,6 +704,7 @@ BOOL LLTabContainer::handleMouseUp( S32 x, S32 y, MASK mask ) } commitHoveredButton(x, y); + mMouseDownTimer.stop(); LLPanel* cur_panel = getCurrentPanel(); if (hasMouseCapture()) { diff --git a/indra/llui/lltabcontainer.h b/indra/llui/lltabcontainer.h index 8f8cedb1b9..aa4a08c4ff 100644 --- a/indra/llui/lltabcontainer.h +++ b/indra/llui/lltabcontainer.h @@ -320,6 +320,7 @@ private: LLUIColor mTabsFlashingColor; S32 mTabIconCtrlPad; bool mUseTabEllipses; + LLFrameTimer mMouseDownTimer; }; #endif // LL_TABCONTAINER_H -- cgit v1.2.3 From 76c6dc025d39adba54cff2c112337274efaddd10 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Thu, 14 Sep 2023 23:59:58 +0300 Subject: SL-19826 Gallery multiselect support, fix right click --- indra/newview/llinventorygallery.cpp | 25 ++++++++++++++++--------- 1 file changed, 16 insertions(+), 9 deletions(-) (limited to 'indra') diff --git a/indra/newview/llinventorygallery.cpp b/indra/newview/llinventorygallery.cpp index 1ee08eb01c..4838ba7a47 100644 --- a/indra/newview/llinventorygallery.cpp +++ b/indra/newview/llinventorygallery.cpp @@ -1012,20 +1012,16 @@ BOOL LLInventoryGallery::handleRightMouseDown(S32 x, S32 y, MASK mask) { if (mSelectedItemIDs.size() > 0) { - selection_deque::iterator iter = mSelectedItemIDs.begin(); - if (mItemMap[*iter]) - { - mItemMap[*iter]->setFocus(false); - setFocus(true); - } + setFocus(true); } - clearSelection(); + mLastInteractedUUID = LLUUID::null; // Scroll is going to always return true BOOL res = LLPanel::handleRightMouseDown(x, y, mask); - if (mSelectedItemIDs.empty()) + if (mLastInteractedUUID.isNull()) // no child were hit { + clearSelection(); if (mInventoryGalleryMenu && mFolderID.notNull()) { uuid_vec_t selected_uuids; @@ -1487,6 +1483,7 @@ void LLInventoryGallery::changeItemSelection(const LLUUID& item_id, bool scroll_ && std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id) != mSelectedItemIDs.end()) { // Already selected + mLastInteractedUUID = item_id; return; } @@ -1514,6 +1511,7 @@ void LLInventoryGallery::addItemSelection(const LLUUID& item_id, bool scroll_to_ if (std::find(mSelectedItemIDs.begin(), mSelectedItemIDs.end(), item_id) != mSelectedItemIDs.end()) { // Already selected + mLastInteractedUUID = item_id; return; } @@ -2707,7 +2705,7 @@ BOOL LLInventoryGalleryItem::handleMouseDown(S32 x, S32 y, MASK mask) { mGallery->toggleSelectionRangeFromLast(mUUID); } - else if (!isSelected()) + else { mGallery->changeItemSelection(mUUID, false); } @@ -2724,6 +2722,15 @@ BOOL LLInventoryGalleryItem::handleMouseDown(S32 x, S32 y, MASK mask) BOOL LLInventoryGalleryItem::handleRightMouseDown(S32 x, S32 y, MASK mask) { + if (!isSelected()) + { + mGallery->changeItemSelection(mUUID, false); + } + else + { + // refresh last interacted + mGallery->addItemSelection(mUUID, false); + } setFocus(TRUE); mGallery->claimEditHandler(); mGallery->showContextMenu(this, x, y, mUUID); -- cgit v1.2.3 From 69a98a8465f910d58911456dfe840a7b829ccc65 Mon Sep 17 00:00:00 2001 From: Andrey Kleshchev Date: Wed, 13 Sep 2023 18:50:42 +0300 Subject: SL-20278 Disconnect saving MFA from saving password --- indra/newview/llfloaterforgetuser.cpp | 1 + indra/newview/lllogininstance.cpp | 28 +++++++++++++++------ indra/newview/lllogininstance.h | 3 +++ indra/newview/llpanellogin.cpp | 5 ---- indra/newview/llstartup.cpp | 11 +++++++- indra/newview/lltoastalertpanel.cpp | 8 ++++++ .../newview/skins/default/xui/en/notifications.xml | 29 ++++++++++++++++++++-- 7 files changed, 69 insertions(+), 16 deletions(-) (limited to 'indra') diff --git a/indra/newview/llfloaterforgetuser.cpp b/indra/newview/llfloaterforgetuser.cpp index 97b022699f..05e0b07584 100644 --- a/indra/newview/llfloaterforgetuser.cpp +++ b/indra/newview/llfloaterforgetuser.cpp @@ -229,6 +229,7 @@ void LLFloaterForgetUser::forgetUser(const std::string &userid, const std::strin { // Remove creds gSecAPIHandler->removeFromCredentialMap("login_list", grid, userid); + gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, userid); LLPointer cred = gSecAPIHandler->loadCredential(grid); if (cred.notNull() && cred->userID() == userid) diff --git a/indra/newview/lllogininstance.cpp b/indra/newview/lllogininstance.cpp index dd8c9b2dde..01496fa7ce 100644 --- a/indra/newview/lllogininstance.cpp +++ b/indra/newview/lllogininstance.cpp @@ -87,6 +87,7 @@ LLLoginInstance::LLLoginInstance() : mLoginModule(new LLLogin()), mNotifications(NULL), mLoginState("offline"), + mSaveMFA(true), mAttemptComplete(false), mTransferRate(0.0f), mDispatcher("LLLoginInstance", "change") @@ -449,10 +450,7 @@ void LLLoginInstance::handleLoginFailure(const LLSD& event) gViewerWindow->setShowProgress(FALSE); } - LLSD args(llsd::map( "MESSAGE", LLTrans::getString(response["message_id"]) )); - LLSD payload; - LLNotificationsUtil::add("PromptMFAToken", args, payload, - boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2)); + showMFAChallange(LLTrans::getString(response["message_id"])); } else if( reason_response == "key" || reason_response == "presence" @@ -540,10 +538,7 @@ bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key) { // SL-18511 this TOS failure happened while we are in the middle of an MFA challenge/response. // the previously entered token is very likely expired, so prompt again - LLSD args(llsd::map( "MESSAGE", LLTrans::getString("LoginFailedAuthenticationMFARequired") )); - LLSD payload; - LLNotificationsUtil::add("PromptMFAToken", args, payload, - boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2)); + showMFAChallange(LLTrans::getString("LoginFailedAuthenticationMFARequired")); } else { @@ -561,6 +556,22 @@ bool LLLoginInstance::handleTOSResponse(bool accepted, const std::string& key) return true; } +void LLLoginInstance::showMFAChallange(const std::string& message) +{ + LLSD args(llsd::map("MESSAGE", message)); + LLSD payload; + if (gSavedSettings.getBOOL("RememberUser")) + { + LLNotificationsUtil::add("PromptMFATokenWithSave", args, payload, + boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2)); + } + else + { + LLNotificationsUtil::add("PromptMFAToken", args, payload, + boost::bind(&LLLoginInstance::handleMFAChallenge, this, _1, _2)); + } +} + bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & response) { bool continue_clicked = response["continue"].asBoolean(); @@ -576,6 +587,7 @@ bool LLLoginInstance::handleMFAChallenge(LLSD const & notif, LLSD const & respon // Set the request data to true and retry login. mRequestData["params"]["token"] = token; + mSaveMFA = response.has("ignore") ? response["ignore"].asBoolean() : false; reconnect(); } else { LL_INFOS("LLLogin") << "PromptMFAToken: no token, attemptComplete" << LL_ENDL; diff --git a/indra/newview/lllogininstance.h b/indra/newview/lllogininstance.h index ee3ef0e4b1..2e9aab7c00 100644 --- a/indra/newview/lllogininstance.h +++ b/indra/newview/lllogininstance.h @@ -56,6 +56,7 @@ public: bool authSuccess() { return mAttemptComplete && mLoginState == "online"; } const std::string& getLoginState() { return mLoginState; } + bool saveMFA() const { return mSaveMFA; } LLSD getResponse(const std::string& key) { return getResponse()[key]; } LLSD getResponse(); @@ -84,6 +85,7 @@ private: void syncWithUpdater(ResponsePtr resp, const LLSD& notification, const LLSD& response); bool handleTOSResponse(bool v, const std::string& key); + void showMFAChallange(const std::string& message); bool handleMFAChallenge(LLSD const & notif, LLSD const & response); void attemptComplete() { mAttemptComplete = true; } // In the future an event? @@ -95,6 +97,7 @@ private: LLSD mRequestData; LLSD mResponseData; bool mAttemptComplete; + bool mSaveMFA; F64 mTransferRate; std::string mSerialNumber; int mLastExecEvent; diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 8f1e57e44c..49756a4e09 100644 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -1110,11 +1110,6 @@ void LLPanelLogin::onRememberPasswordCheck(void*) std::string grid(LLGridManager::getInstance()->getGridId()); std::string user_id(cred->userID()); - if (!remember_password) - { - gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); - gSecAPIHandler->syncProtectedMap(); - } } } diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index ced6ffa32e..ad87fca25b 100644 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -3795,7 +3795,9 @@ bool process_login_success_response() // Only save mfa_hash for future logins if the user wants their info remembered. - if(response.has("mfa_hash") && gSavedSettings.getBOOL("RememberUser") && gSavedSettings.getBOOL("RememberPassword")) + if(response.has("mfa_hash") + && gSavedSettings.getBOOL("RememberUser") + && LLLoginInstance::getInstance()->saveMFA()) { std::string grid(LLGridManager::getInstance()->getGridId()); std::string user_id(gUserCredential->userID()); @@ -3803,6 +3805,13 @@ bool process_login_success_response() // TODO(brad) - related to SL-17223 consider building a better interface that sync's automatically gSecAPIHandler->syncProtectedMap(); } + else if (!LLLoginInstance::getInstance()->saveMFA()) + { + std::string grid(LLGridManager::getInstance()->getGridId()); + std::string user_id(gUserCredential->userID()); + gSecAPIHandler->removeFromProtectedMap("mfa_hash", grid, user_id); + gSecAPIHandler->syncProtectedMap(); + } bool success = false; // JC: gesture loading done below, when we have an asset system diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 692e8d91a9..d35833fac9 100644 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -279,6 +279,10 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal if (!edit_text_name.empty()) { S32 y = VPAD + BTN_HEIGHT + VPAD/2; + if (form->getIgnoreType() != LLNotificationForm::IGNORE_NO) + { + y += EDITOR_HEIGHT; + } mLineEditor = LLUICtrlFactory::getInstance()->createFromFile("alert_line_editor.xml", this, LLPanel::child_registry_t::instance()); if (mLineEditor) @@ -522,6 +526,10 @@ void LLToastAlertPanel::onButtonPressed( const LLSD& data, S32 button ) { response[mLineEditor->getName()] = mLineEditor->getValue(); } + if (mNotification->getForm()->getIgnoreType() != LLNotificationForm::IGNORE_NO) + { + response["ignore"] = mNotification->isIgnored(); + } response[button_data->mButton->getName()] = true; // If we declared a URL and chose the URL option, go to the url diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index ef720e65e3..204fead7e0 100644 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -11988,16 +11988,41 @@ Packing: [PACK_TIME]s [PSIZE]KB Unpacking: [UNPACK_TIME]s [USIZE]KB fail - + + + [MESSAGE] + confirm +
+ +