Merge branch 'DRTVWR-507-maint' of https://bitbucket.org/lindenlab/viewer

master
Ansariel 2020-05-07 12:29:58 +02:00
commit 0007ff2660
46 changed files with 908 additions and 1576 deletions

View File

@ -835,6 +835,7 @@ Khyota Wulluf
Kimar Coba
Kithrak Kirkorian
Kitty Barnett
BUG-228665
VWR-19699
STORM-288
STORM-799

View File

@ -33,10 +33,6 @@
#include "llsingleton.h"
#include "llinvtranslationbrdg.h"
//=========================================================================
namespace {
LLTranslationBridge::ptr_t sTranslator;
}
//=========================================================================
struct SettingsEntry : public LLDictionaryEntry
@ -49,14 +45,14 @@ struct SettingsEntry : public LLDictionaryEntry
mLabel(name),
mIconName(iconName)
{
std::string transdname = sTranslator->getString(mLabel);
std::string transdname = LLSettingsType::getInstance()->mTranslator->getString(mLabel);
if (!transdname.empty())
{
mLabel = transdname;
}
// <FS:Ansariel> Name of newly created setting is not translated
transdname = sTranslator->getString(mDefaultNewName);
transdname = LLSettingsType::getInstance()->mTranslator->getString(mDefaultNewName);
if (!transdname.empty())
{
mDefaultNewName = transdname;
@ -92,6 +88,16 @@ void LLSettingsDictionary::initSingleton()
//=========================================================================
LLSettingsType::LLSettingsType(LLTranslationBridge::ptr_t &trans)
{
mTranslator = trans;
}
LLSettingsType::~LLSettingsType()
{
mTranslator.reset();
}
LLSettingsType::type_e LLSettingsType::fromInventoryFlags(U32 flags)
{
return (LLSettingsType::type_e)(flags & LLInventoryItemFlags::II_FLAGS_SUBTYPE_MASK);
@ -112,13 +118,3 @@ std::string LLSettingsType::getDefaultName(LLSettingsType::type_e type)
return getDefaultName(ST_INVALID);
return entry->mDefaultNewName;
}
void LLSettingsType::initClass(LLTranslationBridge::ptr_t &trans)
{
sTranslator = trans;
}
void LLSettingsType::cleanupClass()
{
sTranslator.reset();
}

View File

@ -30,9 +30,15 @@
#include "llinventorytype.h"
#include "llinvtranslationbrdg.h"
#include "llsingleton.h"
class LLSettingsType
class LLSettingsType : public LLParamSingleton<LLSettingsType>
{
LLSINGLETON(LLSettingsType, LLTranslationBridge::ptr_t &trans);
~LLSettingsType();
friend struct SettingsEntry;
public:
enum type_e
{
@ -48,8 +54,9 @@ public:
static LLInventoryType::EIconName getIconName(type_e type);
static std::string getDefaultName(type_e type);
static void initClass(LLTranslationBridge::ptr_t &trans);
static void cleanupClass();
protected:
LLTranslationBridge::ptr_t mTranslator;
};

View File

@ -2707,9 +2707,10 @@ LLGLSPipelineBlendSkyBox::LLGLSPipelineBlendSkyBox(bool depth_test, bool depth_w
}
#if LL_WINDOWS
// Expose desired use of high-performance graphics processor to Optimus driver
// Expose desired use of high-performance graphics processor to Optimus driver and to AMD driver
extern "C"
{
_declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
{
__declspec(dllexport) DWORD NvOptimusEnablement = 0x00000001;
__declspec(dllexport) int AmdPowerXpressRequestHighPerformance = 1;
}
#endif

View File

@ -1359,7 +1359,7 @@ bool LLVertexBuffer::createGLBuffer(U32 size)
return true;
}
bool sucsess = true;
bool success = true;
mEmpty = true;
@ -1381,9 +1381,9 @@ bool LLVertexBuffer::createGLBuffer(U32 size)
if (!mMappedData)
{
sucsess = false;
success = false;
}
return sucsess;
return success;
}
bool LLVertexBuffer::createGLIndices(U32 size)
@ -1398,7 +1398,7 @@ bool LLVertexBuffer::createGLIndices(U32 size)
return true;
}
bool sucsess = true;
bool success = true;
mEmpty = true;
@ -1423,9 +1423,9 @@ bool LLVertexBuffer::createGLIndices(U32 size)
if (!mMappedIndexData)
{
sucsess = false;
success = false;
}
return sucsess;
return success;
}
void LLVertexBuffer::destroyGLBuffer()
@ -1472,7 +1472,7 @@ bool LLVertexBuffer::updateNumVerts(S32 nverts)
{
llassert(nverts >= 0);
bool sucsess = true;
bool success = true;
if (nverts > 65536)
{
@ -1484,34 +1484,34 @@ bool LLVertexBuffer::updateNumVerts(S32 nverts)
if (needed_size > mSize || needed_size <= mSize/2)
{
sucsess &= createGLBuffer(needed_size);
success &= createGLBuffer(needed_size);
}
sVertexCount -= mNumVerts;
mNumVerts = nverts;
sVertexCount += mNumVerts;
return sucsess;
return success;
}
bool LLVertexBuffer::updateNumIndices(S32 nindices)
{
llassert(nindices >= 0);
bool sucsess = true;
bool success = true;
U32 needed_size = sizeof(U16) * nindices;
if (needed_size > mIndicesSize || needed_size <= mIndicesSize/2)
{
sucsess &= createGLIndices(needed_size);
success &= createGLIndices(needed_size);
}
sIndexCount -= mNumIndices;
mNumIndices = nindices;
sIndexCount += mNumIndices;
return sucsess;
return success;
}
bool LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
@ -1524,10 +1524,10 @@ bool LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
LL_ERRS() << "Bad vertex buffer allocation: " << nverts << " : " << nindices << LL_ENDL;
}
bool sucsess = true;
bool success = true;
sucsess &= updateNumVerts(nverts);
sucsess &= updateNumIndices(nindices);
success &= updateNumVerts(nverts);
success &= updateNumIndices(nindices);
if (create && (nverts || nindices))
{
@ -1543,7 +1543,7 @@ bool LLVertexBuffer::allocateBuffer(S32 nverts, S32 nindices, bool create)
}
}
return sucsess;
return success;
}
static LLTrace::BlockTimerStatHandle FTM_SETUP_VERTEX_ARRAY("Setup VAO");

View File

@ -346,12 +346,9 @@ static LLTrace::BlockTimerStatHandle FTM_FILTER("Filter Folder View");
void LLFolderView::filter( LLFolderViewFilter& filter )
{
LL_RECORD_BLOCK_TIME(FTM_FILTER);
// <FS:Ansariel> Replace frequently called gSavedSettings
//filter.resetTime(llclamp(LLUI::getInstance()->mSettingGroups["config"]->getS32(mParentPanel.get()->getVisible() ? "FilterItemsMaxTimePerFrameVisible" : "FilterItemsMaxTimePerFrameUnvisible"), 1, 100));
static LLCachedControl<S32> sFilterItemsMaxTimePerFrameVisible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible");
static LLCachedControl<S32> sFilterItemsMaxTimePerFrameUnvisible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameUnvisible");
filter.resetTime(llclamp((mParentPanel.get()->getVisible() ? sFilterItemsMaxTimePerFrameVisible() : sFilterItemsMaxTimePerFrameUnvisible()), 1, 100));
// </FS:Ansariel>
static LLCachedControl<S32> filter_visible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible", 10);
static LLCachedControl<S32> filter_hidden(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameUnvisible", 1);
filter.resetTime(llclamp(mParentPanel.get()->getVisible() ? filter_visible() : filter_hidden(), 1, 100));
// Note: we filter the model, not the view
getViewModelItem()->filter(filter);

View File

@ -129,6 +129,7 @@ LLFolderViewItem::LLFolderViewItem(const LLFolderViewItem::Params& p)
: LLView(p),
mLabelWidth(0),
mLabelWidthDirty(false),
mSuffixNeedsRefresh(false),
mLabelPaddingRight(DEFAULT_LABEL_PADDING_RIGHT),
mParentFolder( NULL ),
mIsSelected( FALSE ),
@ -200,11 +201,25 @@ LLFolderViewItem::~LLFolderViewItem()
BOOL LLFolderViewItem::postBuild()
{
refresh();
LLFolderViewModelItem& vmi = *getViewModelItem();
// getDisplayName() is expensive (due to internal getLabelSuffix() and name building)
// it also sets search strings so it requires a filter reset
mLabel = vmi.getDisplayName();
setToolTip(vmi.getName());
// Dirty the filter flag of the model from the view (CHUI-849)
vmi.dirtyFilter();
// Don't do full refresh on constructor if it is possible to avoid
// it significantly slows down bulk view creation.
// Todo: Ideally we need to move getDisplayName() out of constructor as well.
// Like: make a logic that will let filter update search string,
// while LLFolderViewItem::arrange() updates visual part
mSuffixNeedsRefresh = true;
mLabelWidthDirty = true;
return TRUE;
}
LLFolderView* LLFolderViewItem::getRoot()
{
return mRoot;
@ -299,24 +314,51 @@ BOOL LLFolderViewItem::isPotentiallyVisible(S32 filter_generation)
void LLFolderViewItem::refresh()
{
LLFolderViewModelItem& vmi = *getViewModelItem();
LLFolderViewModelItem& vmi = *getViewModelItem();
mLabel = vmi.getDisplayName();
mLabel = vmi.getDisplayName();
setToolTip(vmi.getName());
// icons are slightly expensive to get, can be optimized
// see LLInventoryIcon::getIcon()
mIcon = vmi.getIcon();
mIconOpen = vmi.getIconOpen();
mIconOverlay = vmi.getIconOverlay();
setToolTip(vmi.getName());
mIcon = vmi.getIcon();
mIconOpen = vmi.getIconOpen();
mIconOverlay = vmi.getIconOverlay();
if (mRoot->useLabelSuffix())
{
// Very Expensive!
// Can do a number of expensive checks, like checking active motions, wearables or friend list
mLabelStyle = vmi.getLabelStyle();
mLabelSuffix = vmi.getLabelSuffix();
}
// Dirty the filter flag of the model from the view (CHUI-849)
vmi.dirtyFilter();
mLabelWidthDirty = true;
mSuffixNeedsRefresh = false;
}
void LLFolderViewItem::refreshSuffix()
{
LLFolderViewModelItem const* vmi = getViewModelItem();
// icons are slightly expensive to get, can be optimized
// see LLInventoryIcon::getIcon()
mIcon = vmi->getIcon();
mIconOpen = vmi->getIconOpen();
mIconOverlay = vmi->getIconOverlay();
if (mRoot->useLabelSuffix())
{
mLabelStyle = vmi.getLabelStyle();
mLabelSuffix = vmi.getLabelSuffix();
// Very Expensive!
// Can do a number of expensive checks, like checking active motions, wearables or friend list
mLabelStyle = vmi->getLabelStyle();
mLabelSuffix = vmi->getLabelSuffix();
}
mLabelWidthDirty = true;
// Dirty the filter flag of the model from the view (CHUI-849)
vmi.dirtyFilter();
mLabelWidthDirty = true;
mSuffixNeedsRefresh = false;
}
// Utility function for LLFolderView
@ -385,6 +427,12 @@ S32 LLFolderViewItem::arrange( S32* width, S32* height )
if (mLabelWidthDirty)
{
if (mSuffixNeedsRefresh)
{
// Expensive. But despite refreshing label,
// it is purely visual, so it is fine to do at our laisure
refreshSuffix();
}
mLabelWidth = getLabelXPos() + getLabelFontForStyle(mLabelStyle)->getWidth(mLabel) + getLabelFontForStyle(mLabelStyle)->getWidth(mLabelSuffix) + mLabelPaddingRight;
mLabelWidthDirty = false;
}

View File

@ -99,6 +99,7 @@ protected:
LLPointer<LLFolderViewModelItem> mViewModelItem;
LLFontGL::StyleFlags mLabelStyle;
std::string mLabelSuffix;
bool mSuffixNeedsRefresh; //suffix and icons
LLUIImagePtr mIcon,
mIconOpen,
mIconOverlay;
@ -276,8 +277,13 @@ public:
virtual BOOL passedFilter(S32 filter_generation = -1);
virtual BOOL isPotentiallyVisible(S32 filter_generation = -1);
// refresh information from the object being viewed.
virtual void refresh();
// refresh information from the object being viewed.
// refreshes label, suffixes and sets icons. Expensive!
// Causes filter update
virtual void refresh();
// refreshes suffixes and sets icons. Expensive!
// Does not need filter update
virtual void refreshSuffix();
// LLView functionality
virtual BOOL handleRightMouseDown( S32 x, S32 y, MASK mask );

View File

@ -48,11 +48,8 @@ std::string LLFolderViewModelCommon::getStatusText()
void LLFolderViewModelCommon::filter()
{
// <FS:Ansariel> Replace frequently called gSavedSettings
//getFilter().resetTime(llclamp(LLUI::getInstance()->mSettingGroups["config"]->getS32("FilterItemsMaxTimePerFrameVisible"), 1, 100));
static LLCachedControl<S32> sFilterItemsMaxTimePerFrameVisible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible");
getFilter().resetTime(llclamp(sFilterItemsMaxTimePerFrameVisible(), 1, 100));
// </FS:Ansariel>
static LLCachedControl<S32> filter_visible(*LLUI::getInstance()->mSettingGroups["config"], "FilterItemsMaxTimePerFrameVisible", 10);
getFilter().resetTime(llclamp(filter_visible(), 1, 100));
mFolderView->getViewModelItem()->filter(getFilter());
}

View File

@ -295,26 +295,7 @@ public:
typedef std::list<LLFolderViewModelItem*> child_list_t;
virtual void addChild(LLFolderViewModelItem* child)
{
// Avoid duplicates: bail out if that child is already present in the list
// Note: this happens when models are created before views
// <FS:ND> Ugh, linear search! Replace this by simply looking if the parent matches
// child_list_t::const_iterator iter;
// for (iter = mChildren.begin(); iter != mChildren.end(); iter++)
// {
// if (child == *iter)
// {
// return;
// }
// }
if( child->getParent() == this )
return;
// </FS:ND>
{
mChildren.push_back(child);
child->setParent(this);
dirtyFilter();

View File

@ -520,13 +520,17 @@ std::string LLUrlEntrySLURL::getLocation(const std::string &url) const
}
//
// LLUrlEntrySeconlifeURL Describes *secondlife.com/ *lindenlab.com/ and *tilia-inc.com/ urls to substitute icon 'hand.png' before link
// LLUrlEntrySeconlifeURL Describes *secondlife.com/ *lindenlab.com/ *secondlifegrid.net/ and *tilia-inc.com/ urls to substitute icon 'hand.png' before link
//
LLUrlEntrySecondlifeURL::LLUrlEntrySecondlifeURL()
{
mPattern = boost::regex("((http://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com)"
"|"
"(https://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(:\\d{1,5})?))"
"(http://([-\\w\\.]*\\.)?secondlifegrid\\.net)"
"|"
"(https://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(:\\d{1,5})?)"
"|"
"(https://([-\\w\\.]*\\.)?secondlifegrid\\.net(:\\d{1,5})?))"
"\\/\\S*",
boost::regex::perl|boost::regex::icase);
@ -564,12 +568,14 @@ std::string LLUrlEntrySecondlifeURL::getTooltip(const std::string &url) const
}
//
// LLUrlEntrySimpleSecondlifeURL Describes *secondlife.com *lindenlab.com and *tilia-inc.com urls to substitute icon 'hand.png' before link
// LLUrlEntrySimpleSecondlifeURL Describes *secondlife.com *lindenlab.com *secondlifegrid.net and *tilia-inc.com urls to substitute icon 'hand.png' before link
//
LLUrlEntrySimpleSecondlifeURL::LLUrlEntrySimpleSecondlifeURL()
{
mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(?!\\S)",
boost::regex::perl|boost::regex::icase);
mPattern = boost::regex("https?://([-\\w\\.]*\\.)?(secondlife|lindenlab|tilia-inc)\\.com(?!\\S)"
"|"
"https?://([-\\w\\.]*\\.)?secondlifegrid\\.net(?!\\S)",
boost::regex::perl|boost::regex::icase);
mIcon = "Hand";
mMenuName = "menu_url_http.xml";

View File

@ -105,8 +105,7 @@ bool FSExportPermsCheck::canExportNode(LLSelectNode* node, bool dae)
{
if (dae)
{
LLSD mesh_header = gMeshRepo.getMeshHeader(sculpt_params->getSculptTexture());
exportable = mesh_header["creator"].asUUID() == gAgentID;
exportable = gMeshRepo.getCreatorFromHeader(sculpt_params->getSculptTexture()) == gAgentID;
}
else
{

View File

@ -867,7 +867,7 @@ bool LLAppViewer::init()
LLWearableType::initParamSingleton(new LLUITranslationBridge());
LLTranslationBridge::ptr_t trans = std::make_shared<LLUITranslationBridge>();
LLSettingsType::initClass(trans);
LLSettingsType::initParamSingleton(trans);
// initialize SSE options
LLVector4a::initClass();

View File

@ -402,23 +402,30 @@ bool LLCommandLineParser::parseCommandLineString(const std::string& str)
}
}
// Split the string content into tokens
const char* escape_chars = "\\";
const char* separator_chars = "\r\n ";
const char* quote_chars = "\"'";
boost::escaped_list_separator<char> sep(escape_chars, separator_chars, quote_chars);
boost::tokenizer< boost::escaped_list_separator<char> > tok(cmd_line_string, sep);
std::vector<std::string> tokens;
// std::copy(tok.begin(), tok.end(), std::back_inserter(tokens));
for(boost::tokenizer< boost::escaped_list_separator<char> >::iterator i = tok.begin();
i != tok.end();
++i)
try
{
if(0 != i->size())
// Split the string content into tokens
const char* escape_chars = "\\";
const char* separator_chars = "\r\n ";
const char* quote_chars = "\"'";
boost::escaped_list_separator<char> sep(escape_chars, separator_chars, quote_chars);
boost::tokenizer< boost::escaped_list_separator<char> > tok(cmd_line_string, sep);
// std::copy(tok.begin(), tok.end(), std::back_inserter(tokens));
for (boost::tokenizer< boost::escaped_list_separator<char> >::iterator i = tok.begin();
i != tok.end();
++i)
{
tokens.push_back(*i);
if (0 != i->size())
{
tokens.push_back(*i);
}
}
}
catch (...)
{
CRASH_ON_UNHANDLED_EXCEPTION(STRINGIZE("Unexpected crash while parsing: " << str));
}
po::command_line_parser clp(tokens);
return parseAndStoreResults(clp);

View File

@ -94,6 +94,23 @@ LLConversationItem::~LLConversationItem()
}
}
//virtual
void LLConversationItem::addChild(LLFolderViewModelItem* child)
{
// Avoid duplicates: bail out if that child is already present in the list
// Note: this happens when models are created and 'parented' before views
// This is performance unfriendly, but conversation can addToFolder multiple times
child_list_t::const_iterator iter;
for (iter = mChildren.begin(); iter != mChildren.end(); iter++)
{
if (child == *iter)
{
return;
}
}
LLFolderViewModelItemCommon::addChild(child);
}
void LLConversationItem::postEvent(const std::string& event_type, LLConversationItemSession* session, LLConversationItemParticipant* participant)
{
LLUUID session_id = (session ? session->getUUID() : LLUUID());

View File

@ -99,6 +99,7 @@ public:
virtual void buildContextMenu(LLMenuGL& menu, U32 flags) { }
virtual BOOL isUpToDate() const { return TRUE; }
virtual bool hasChildren() const { return FALSE; }
virtual void addChild(LLFolderViewModelItem* child);
virtual bool potentiallyVisible() { return true; }
virtual bool filter( LLFolderViewFilter& filter) { return false; }

View File

@ -432,7 +432,7 @@ void LLConversationViewSession::refresh()
// Refresh the session view from its model data
LLConversationItem* vmi = dynamic_cast<LLConversationItem*>(getViewModelItem());
vmi->resetRefresh();
if (mSessionTitle)
{
mSessionTitle->setText(vmi->getDisplayName());
@ -547,7 +547,9 @@ BOOL LLConversationViewParticipant::postBuild()
}
updateChildren();
return LLFolderViewItem::postBuild();
LLFolderViewItem::postBuild();
refresh();
return TRUE;
}
void LLConversationViewParticipant::draw()
@ -621,7 +623,7 @@ void LLConversationViewParticipant::refresh()
// *TODO: We should also do something with vmi->isModerator() to echo that state in the UI somewhat
mSpeakingIndicator->setIsModeratorMuted(participant_model->isModeratorMuted());
// Do the regular upstream refresh
LLFolderViewItem::refresh();
}

View File

@ -733,17 +733,59 @@ void LLInventoryModel::createNewCategoryCoro(std::string url, LLSD postData, inv
LLUUID categoryId = result["folder_id"].asUUID();
// Add the category to the internal representation
LLPointer<LLViewerInventoryCategory> cat = new LLViewerInventoryCategory(categoryId,
result["parent_id"].asUUID(), (LLFolderType::EType)result["type"].asInteger(),
result["name"].asString(), gAgent.getID());
LLViewerInventoryCategory* folderp = gInventory.getCategory(categoryId);
if (!folderp)
{
// Add the category to the internal representation
LLPointer<LLViewerInventoryCategory> cat = new LLViewerInventoryCategory(categoryId,
result["parent_id"].asUUID(), (LLFolderType::EType)result["type"].asInteger(),
result["name"].asString(), gAgent.getID());
cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1
cat->setDescendentCount(0);
LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
accountForUpdate(update);
updateCategory(cat);
LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
accountForUpdate(update);
cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1
cat->setDescendentCount(0);
updateCategory(cat);
}
else
{
// bulk processing was faster than coroutine (coro request->processBulkUpdateInventory->coro response)
// category already exists, but needs an update
if (folderp->getVersion() != LLViewerInventoryCategory::VERSION_INITIAL
|| folderp->getDescendentCount() != LLViewerInventoryCategory::DESCENDENT_COUNT_UNKNOWN)
{
LL_WARNS() << "Inventory desync on folder creation. Newly created folder already has descendants or got a version.\n"
<< "Name: " << folderp->getName()
<< " Id: " << folderp->getUUID()
<< " Version: " << folderp->getVersion()
<< " Descendants: " << folderp->getDescendentCount()
<< LL_ENDL;
}
// Recreate category with correct values
// Creating it anew just simplifies figuring out needed change-masks
// and making all needed updates, see updateCategory
LLPointer<LLViewerInventoryCategory> cat = new LLViewerInventoryCategory(categoryId,
result["parent_id"].asUUID(), (LLFolderType::EType)result["type"].asInteger(),
result["name"].asString(), gAgent.getID());
if (folderp->getParentUUID() != cat->getParentUUID())
{
LL_WARNS() << "Inventory desync on folder creation. Newly created folder has wrong parent.\n"
<< "Name: " << folderp->getName()
<< " Id: " << folderp->getUUID()
<< " Expected parent: " << cat->getParentUUID()
<< " Actual parent: " << folderp->getParentUUID()
<< LL_ENDL;
LLInventoryModel::LLCategoryUpdate update(cat->getParentUUID(), 1);
accountForUpdate(update);
}
// else: Do not update parent, parent is already aware of the change. See processBulkUpdateInventory
cat->setVersion(LLViewerInventoryCategory::VERSION_INITIAL - 1); // accountForUpdate() will icrease version by 1
cat->setDescendentCount(0);
updateCategory(cat);
}
if (callback)
{

View File

@ -153,7 +153,7 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
mCompletionObserver(NULL),
mScroller(NULL),
mSortOrderSetting(p.sort_order_setting),
mInventory(p.inventory),
mInventory(p.inventory), //inventory("", &gInventory)
mAcceptsDragAndDrop(p.accepts_drag_and_drop),
mAllowMultiSelect(p.allow_multi_select),
mAllowDrag(p.allow_drag),
@ -566,7 +566,18 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
view_item->destroyView();
removeItemID(idp);
}
view_item = buildNewViews(item_id);
LLInventoryObject const* objectp = mInventory->getObject(item_id);
if (objectp)
{
// providing NULL directly avoids unnessesary getItemByID calls
view_item = buildNewViews(item_id, objectp, NULL);
}
else
{
view_item = NULL;
}
viewmodel_item =
static_cast<LLFolderViewModelItemInventory*>(view_item ? view_item->getViewModelItem() : NULL);
view_folder = dynamic_cast<LLFolderViewFolder *>(view_item);
@ -609,7 +620,13 @@ void LLInventoryPanel::itemChanged(const LLUUID& item_id, U32 mask, const LLInve
if (model_item && !view_item)
{
// Add the UI element for this item.
buildNewViews(item_id);
LLInventoryObject const* objectp = mInventory->getObject(item_id);
if (objectp)
{
// providing NULL directly avoids unnessesary getItemByID calls
buildNewViews(item_id, objectp, NULL);
}
// Select any newly created object that has the auto rename at top of folder root set.
if(mFolderRoot.get()->getRoot()->needsAutoRename())
{
@ -924,7 +941,7 @@ LLFolderViewItem * LLInventoryPanel::createFolderViewItem(LLInvFVBridge * bridge
LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id)
{
LLInventoryObject const* objectp = gInventory.getObject(id);
LLInventoryObject const* objectp = mInventory->getObject(id);
return buildNewViews(id, objectp);
}
@ -934,11 +951,43 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id, LLInventoryO
{
return NULL;
}
LLFolderViewItem* folder_view_item = getItemByID(id);
if (!typedViewsFilter(id, objectp))
{
// if certain types are not allowed permanently, no reason to create views
return NULL;
}
const LLUUID &parent_id = objectp->getParentUUID();
LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)getItemByID(parent_id);
LLFolderViewItem* folder_view_item = getItemByID(id);
LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)getItemByID(parent_id);
return buildViewsTree(id, parent_id, objectp, folder_view_item, parent_folder);
}
LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id, LLInventoryObject const* objectp, LLFolderViewItem *folder_view_item)
{
if (!objectp)
{
return NULL;
}
if (!typedViewsFilter(id, objectp))
{
// if certain types are not allowed permanently, no reason to create views
return NULL;
}
const LLUUID &parent_id = objectp->getParentUUID();
LLFolderViewFolder* parent_folder = (LLFolderViewFolder*)getItemByID(parent_id);
return buildViewsTree(id, parent_id, objectp, folder_view_item, parent_folder);
}
LLFolderViewItem* LLInventoryPanel::buildViewsTree(const LLUUID& id,
const LLUUID& parent_id,
LLInventoryObject const* objectp,
LLFolderViewItem *folder_view_item,
LLFolderViewFolder *parent_folder)
{
// 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;
@ -959,7 +1008,7 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id, LLInventoryO
{
if (objectp->getType() <= LLAssetType::AT_NONE)
{
LL_WARNS() << "LLInventoryPanel::buildNewViews called with invalid objectp->mType : "
LL_WARNS() << "LLInventoryPanel::buildViewsTree called with invalid objectp->mType : "
<< ((S32)objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
<< LL_ENDL;
return NULL;
@ -968,7 +1017,7 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id, LLInventoryO
if (objectp->getType() >= LLAssetType::AT_COUNT)
{
// Example: Happens when we add assets of new, not yet supported type to library
LL_DEBUGS() << "LLInventoryPanel::buildNewViews called with unknown objectp->mType : "
LL_DEBUGS() << "LLInventoryPanel::buildViewsTree called with unknown objectp->mType : "
<< ((S32) objectp->getType()) << " name " << objectp->getName() << " UUID " << objectp->getUUID()
<< LL_ENDL;
@ -1045,26 +1094,58 @@ LLFolderViewItem* LLInventoryPanel::buildNewViews(const LLUUID& id, LLInventoryO
LLViewerInventoryCategory::cat_array_t* categories;
LLViewerInventoryItem::item_array_t* items;
mInventory->lockDirectDescendentArrays(id, categories, items);
LLFolderViewFolder *parentp = dynamic_cast<LLFolderViewFolder*>(folder_view_item);
if(categories)
{
{
bool has_folders = parentp->getFoldersCount() > 0;
for (LLViewerInventoryCategory::cat_array_t::const_iterator cat_iter = categories->begin();
cat_iter != categories->end();
++cat_iter)
{
const LLViewerInventoryCategory* cat = (*cat_iter);
buildNewViews(cat->getUUID());
if (typedViewsFilter(cat->getUUID(), cat))
{
if (has_folders)
{
// This can be optimized: we don't need to call getItemByID()
// 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);
}
else
{
buildViewsTree(cat->getUUID(), id, cat, NULL, parentp);
}
}
}
}
if(items)
{
{
bool has_items = parentp->getItemsCount() > 0;
for (LLViewerInventoryItem::item_array_t::const_iterator item_iter = items->begin();
item_iter != items->end();
++item_iter)
{
const LLViewerInventoryItem* item = (*item_iter);
buildNewViews(item->getUUID());
if (typedViewsFilter(item->getUUID(), item))
{
if (has_items)
{
// This can be optimized: we don't need to call getItemByID()
// 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);
}
else
{
buildViewsTree(item->getUUID(), id, item, NULL, parentp);
}
}
}
}
mInventory->unlockDirectDescendentArrays(id);
@ -1966,41 +2047,7 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params)
/************************************************************************/
/* Asset Pre-Filtered Inventory Panel related class */
/* Exchanges filter's flexibility for speed of generation and */
/* improved performance */
/************************************************************************/
class LLAssetFilteredInventoryPanel : public LLInventoryPanel
{
public:
struct Params
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
{
Mandatory<std::string> filter_asset_type;
Params() : filter_asset_type("filter_asset_type") {}
};
void initFromParams(const Params& p);
protected:
LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
friend class LLUICtrlFactory;
public:
~LLAssetFilteredInventoryPanel() {}
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg) override;
protected:
/*virtual*/ LLFolderViewItem* buildNewViews(const LLUUID& id) override;
/*virtual*/ void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
private:
LLAssetType::EType mAssetType;
};
void LLAssetFilteredInventoryPanel::initFromParams(const Params& p)
{
@ -2034,21 +2081,20 @@ BOOL LLAssetFilteredInventoryPanel::handleDragAndDrop(S32 x, S32 y, MASK mask, B
return result;
}
LLFolderViewItem* LLAssetFilteredInventoryPanel::buildNewViews(const LLUUID& id)
/*virtual*/
bool LLAssetFilteredInventoryPanel::typedViewsFilter(const LLUUID& id, LLInventoryObject const* objectp)
{
LLInventoryObject const* objectp = gInventory.getObject(id);
if (!objectp)
{
return NULL;
return false;
}
if (objectp->getType() != mAssetType && objectp->getType() != LLAssetType::AT_CATEGORY)
{
return NULL;
return false;
}
return LLInventoryPanel::buildNewViews(id, objectp);
return true;
}
void LLAssetFilteredInventoryPanel::itemChanged(const LLUUID& id, U32 mask, const LLInventoryObject* model_item)

View File

@ -335,8 +335,15 @@ protected:
static LLUIColor sLibraryColor;
static LLUIColor sLinkColor;
virtual LLFolderViewItem* buildNewViews(const LLUUID& id);
LLFolderViewItem* buildNewViews(const LLUUID& id, LLInventoryObject const* objectp);
LLFolderViewItem* buildNewViews(const LLUUID& id);
LLFolderViewItem* buildNewViews(const LLUUID& id,
LLInventoryObject const* objectp);
LLFolderViewItem* buildNewViews(const LLUUID& id,
LLInventoryObject const* objectp,
LLFolderViewItem *target_view);
// if certain types are not allowed, no reason to create views
virtual bool typedViewsFilter(const LLUUID& id, LLInventoryObject const* objectp) { return true; }
virtual void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item);
BOOL getIsHiddenFolderType(LLFolderType::EType folder_type) const;
@ -344,8 +351,75 @@ protected:
virtual LLFolderViewFolder* createFolderViewFolder(LLInvFVBridge * bridge, bool allow_drop);
virtual LLFolderViewItem* createFolderViewItem(LLInvFVBridge * bridge);
private:
// buildViewsTree does not include some checks and is meant
// for recursive use, use buildNewViews() for first call
LLFolderViewItem* buildViewsTree(const LLUUID& id,
const LLUUID& parent_id,
LLInventoryObject const* objectp,
LLFolderViewItem *target_view,
LLFolderViewFolder *parent_folder_view);
bool mBuildDefaultHierarchy; // default inventory hierarchy should be created in postBuild()
bool mViewsInitialized; // Views have been generated
};
class LLInventoryFavoriteItemsPanel : public LLInventoryPanel
{
public:
struct Params : public LLInitParam::Block<Params, LLInventoryPanel::Params>
{};
void initFromParams(const Params& p);
bool isSelectionRemovable() { return false; }
void setSelectCallback(const boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)>& cb);
protected:
LLInventoryFavoriteItemsPanel(const Params& params);
~LLInventoryFavoriteItemsPanel() { mFolderChangedSignal.disconnect(); }
void updateFavoritesRootFolder();
boost::signals2::connection mFolderChangedSignal;
boost::function<void(const std::deque<LLFolderViewItem*>& items, BOOL user_action)> mSelectionCallback;
friend class LLUICtrlFactory;
};
/************************************************************************/
/* Asset Pre-Filtered Inventory Panel related class */
/* Exchanges filter's flexibility for speed of generation and */
/* improved performance */
/************************************************************************/
class LLAssetFilteredInventoryPanel : public LLInventoryPanel
{
public:
struct Params
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
{
Mandatory<std::string> filter_asset_type;
Params() : filter_asset_type("filter_asset_type") {}
};
void initFromParams(const Params& p);
protected:
LLAssetFilteredInventoryPanel(const Params& p) : LLInventoryPanel(p) {}
friend class LLUICtrlFactory;
public:
~LLAssetFilteredInventoryPanel() {}
/*virtual*/ BOOL handleDragAndDrop(S32 x, S32 y, MASK mask, BOOL drop,
EDragAndDropType cargo_type,
void* cargo_data,
EAcceptance* accept,
std::string& tooltip_msg) override;
protected:
/*virtual*/ bool typedViewsFilter(const LLUUID& id, LLInventoryObject const* objectp) override;
/*virtual*/ void itemChanged(const LLUUID& item_id, U32 mask, const LLInventoryObject* model_item) override;
private:
LLAssetType::EType mAssetType;
};
#endif // LL_LLINVENTORYPANEL_H

View File

@ -147,6 +147,16 @@ void append_to_last_message(std::list<LLSD>& messages, const std::string& line)
messages.back()[LL_IM_TEXT] = im_text;
}
std::string remove_utf8_bom(const char* buf)
{
std::string res(buf);
if (res[0] == (char)0xEF && res[1] == (char)0xBB && res[2] == (char)0xBF)
{
res.erase(0, 3);
}
return res;
}
class LLLogChatTimeScanner: public LLSingleton<LLLogChatTimeScanner>
{
LLSINGLETON(LLLogChatTimeScanner);
@ -504,18 +514,7 @@ void LLLogChat::loadChatHistory(const std::string& file_name, std::list<LLSD>& m
continue;
}
std::string line(buffer);
// <FS:Ansariel> FIRE-28990: Unable to open chat transcript if file is UTF-8-BOM encoded
// Technically it doesn't make sense to do it each iteration and ideally we
// would do it once before the loop starts, but seeking backwards to the start of
// the file causes the viewer's process being locked up for several seconds
// during login, we just do it here to skip seeking backwards.
if (line.length() > 3 && line[0] == char(239) && line[1] == char(187) && line[2] == char(191))
{
line = line.substr(3);
}
// </FS:Ansariel>
std::string line(remove_utf8_bom(buffer));
//updated 1.23 plain text log format requires a space added before subsequent lines in a multilined message
if (' ' == line[0])
@ -919,19 +918,11 @@ bool LLLogChat::isTranscriptFileFound(std::string fullname)
if (bytes_to_read > 0 && NULL != fgets(buffer, bytes_to_read, filep))
{
// <FS:Ansariel> FIRE-28990: Unable to open chat transcript if file is UTF-8-BOM encoded
std::string bufferstr(buffer);
if (bufferstr.length() > 3 && bufferstr[0] == char(239) && bufferstr[1] == char(187) && bufferstr[2] == char(191))
{
bufferstr = bufferstr.substr(3);
}
// </FS:Ansariel>
//matching a timestamp
boost::match_results<std::string::const_iterator> matches;
// <FS:Ansariel> Seconds in timestamp
//if (boost::regex_match(std::string(buffer), matches, TIMESTAMP))
if (boost::regex_match(bufferstr, matches, TIMESTAMP) || boost::regex_match(bufferstr, matches, TIMESTAMP_AND_SEC))
//if (boost::regex_match(remove_utf8_bom(buffer), matches, TIMESTAMP))
if (boost::regex_match(remove_utf8_bom(buffer), matches, TIMESTAMP) || boost::regex_match(remove_utf8_bom(buffer), matches, TIMESTAMP_AND_SEC))
// </FS:Ansariel>
{
result = true;
@ -1295,19 +1286,7 @@ void LLLoadHistoryThread::loadHistory(const std::string& file_name, std::list<LL
firstline = FALSE;
continue;
}
std::string line(buffer);
// <FS:Ansariel> FIRE-28990: Unable to open chat transcript if file is UTF-8-BOM encoded
// Technically it doesn't make sense to do it each iteration and ideally we
// would do it once before the loop starts, but since this code was duplicated
// from further above and in the other case seeking backwards to the start of
// the file causes the viewer's process being locked up for several seconds
// during login, we just do it here the same way we do above.
if (line.length() > 3 && line[0] == char(239) && line[1] == char(187) && line[2] == char(191))
{
line = line.substr(3);
}
// </FS:Ansariel>
std::string line(remove_utf8_bom(buffer));
//updated 1.23 plaint text log format requires a space added before subsequent lines in a multilined message
if (' ' == line[0])

View File

@ -100,7 +100,7 @@
// locking actions. In particular, the following operations
// on LLMeshRepository are very averse to any stalls:
// * loadMesh
// * getMeshHeader (For structural details, see:
// * search in mMeshHeader (For structural details, see:
// http://wiki.secondlife.com/wiki/Mesh/Mesh_Asset_Format)
// * notifyLoadedMeshes
// * getSkinInfo
@ -3277,7 +3277,6 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
header_bytes = (S32)gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
header = iter->second;
}
gMeshRepo.mThread->mHeaderMutex->unlock();
if (header_bytes > 0
&& !header.has("404")
@ -3298,7 +3297,10 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
lod_bytes = llmax(lod_bytes, header["skin"]["offset"].asInteger() + header["skin"]["size"].asInteger());
lod_bytes = llmax(lod_bytes, header["physics_convex"]["offset"].asInteger() + header["physics_convex"]["size"].asInteger());
S32 header_bytes = (S32) gMeshRepo.mThread->mMeshHeaderSize[mesh_id];
// Do not unlock mutex untill we are done with LLSD.
// LLSD is smart and can work like smart pointer, is not thread safe.
gMeshRepo.mThread->mHeaderMutex->unlock();
S32 bytes = lod_bytes + header_bytes;
@ -3334,6 +3336,8 @@ void LLMeshHeaderHandler::processData(LLCore::BufferArray * /* body */, S32 /* b
{
LL_WARNS(LOG_MESH) << "Trying to cache nonexistent mesh, mesh id: " << mesh_id << LL_ENDL;
gMeshRepo.mThread->mHeaderMutex->unlock();
// headerReceived() parsed header, but header's data is invalid so none of the LODs will be available
LLMutexLock lock(gMeshRepo.mThread->mMutex);
for (int i(0); i < 4; ++i)
@ -4269,44 +4273,74 @@ void LLMeshRepository::buildHull(const LLVolumeParams& params, S32 detail)
bool LLMeshRepository::hasPhysicsShape(const LLUUID& mesh_id)
{
LLSD mesh = mThread->getMeshHeader(mesh_id);
if (mesh.has("physics_mesh") && mesh["physics_mesh"].has("size") && (mesh["physics_mesh"]["size"].asInteger() > 0))
{
return true;
}
if (mesh_id.isNull())
{
return false;
}
LLModel::Decomposition* decomp = getDecomposition(mesh_id);
if (decomp && !decomp->mHull.empty())
{
return true;
}
if (mThread->hasPhysicsShapeInHeader(mesh_id))
{
return true;
}
return false;
LLModel::Decomposition* decomp = getDecomposition(mesh_id);
if (decomp && !decomp->mHull.empty())
{
return true;
}
return false;
}
LLSD& LLMeshRepository::getMeshHeader(const LLUUID& mesh_id)
bool LLMeshRepoThread::hasPhysicsShapeInHeader(const LLUUID& mesh_id)
{
LL_RECORD_BLOCK_TIME(FTM_MESH_FETCH);
LLMutexLock lock(mHeaderMutex);
if (mMeshHeaderSize[mesh_id] > 0)
{
mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
if (iter != mMeshHeader.end())
{
LLSD &mesh = iter->second;
if (mesh.has("physics_mesh") && mesh["physics_mesh"].has("size") && (mesh["physics_mesh"]["size"].asInteger() > 0))
{
return true;
}
}
}
return mThread->getMeshHeader(mesh_id);
return false;
}
LLSD& LLMeshRepoThread::getMeshHeader(const LLUUID& mesh_id)
// <FS:Ansariel> DAE export
LLUUID LLMeshRepository::getCreatorFromHeader(const LLUUID& mesh_id)
{
static LLSD dummy_ret;
if (mesh_id.notNull())
if (mesh_id.isNull())
{
return LLUUID();
}
return mThread->getCreatorFromHeader(mesh_id);
}
LLUUID LLMeshRepoThread::getCreatorFromHeader(const LLUUID& mesh_id)
{
LLMutexLock lock(mHeaderMutex);
if (mMeshHeaderSize[mesh_id] > 0)
{
LLMutexLock lock(mHeaderMutex);
mesh_header_map::iterator iter = mMeshHeader.find(mesh_id);
if (iter != mMeshHeader.end() && mMeshHeaderSize[mesh_id] > 0)
if (iter != mMeshHeader.end())
{
return iter->second;
LLSD& mesh = iter->second;
if (mesh.has("creator") && mesh["creator"].isUUID())
{
return mesh["creator"].asUUID();
}
}
}
return dummy_ret;
return LLUUID();
}
// </FS:Ansariel>
void LLMeshRepository::uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,

View File

@ -349,7 +349,7 @@ public:
bool skinInfoReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
bool decompositionReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
bool physicsShapeReceived(const LLUUID& mesh_id, U8* data, S32 data_size);
LLSD& getMeshHeader(const LLUUID& mesh_id);
bool hasPhysicsShapeInHeader(const LLUUID& mesh_id);
void notifyLoadedMeshes();
S32 getActualMeshLOD(const LLVolumeParams& mesh_params, S32 lod);
@ -390,6 +390,9 @@ public:
void constructUrl(LLUUID mesh_id, std::string * url, int * legacy_version);
// </FS:Ansariel> [UDP Assets]
// <FS:Ansariel> DAE export
LLUUID getCreatorFromHeader(const LLUUID& mesh_id);
private:
// Issue a GET request to a URL with 'Range' header using
// the correct policy class and other attributes. If an invalid
@ -610,9 +613,6 @@ public:
bool meshUploadEnabled();
bool meshRezEnabled();
LLSD& getMeshHeader(const LLUUID& mesh_id);
void uploadModel(std::vector<LLModelInstance>& data, LLVector3& scale, bool upload_textures,
bool upload_skin, bool upload_joints, bool lock_scale_if_joint_position,
@ -631,6 +631,9 @@ public:
typedef std::map<LLVolumeParams, std::set<LLUUID> > mesh_load_map;
mesh_load_map mLoadingMeshes[4];
// <FS:Ansariel> DAE export
LLUUID getCreatorFromHeader(const LLUUID& mesh_id);
// <FS:Ansariel> Faster lookup
//typedef std::map<LLUUID, LLMeshSkinInfo> skin_map;
typedef boost::unordered_map<LLUUID, LLMeshSkinInfo, FSUUIDHash> skin_map;

View File

@ -39,6 +39,7 @@
#include "llagent.h"
#include "llagentui.h"
#include "lllandmarkactions.h"
#include "llparcel.h"
#include "llslurl.h"
#include "llviewerinventory.h"
#include "llviewerparcelmgr.h"
@ -101,6 +102,9 @@ void LLPanelLandmarkInfo::resetLocation()
mLandmarkTitle->setText(LLStringUtil::null);
mLandmarkTitleEditor->setText(LLStringUtil::null);
mNotesEditor->setText(LLStringUtil::null);
mParcelOwner->setVisible(FALSE);
getChild<LLUICtrl>("parcel_owner_label")->setVisible(FALSE);
}
// virtual
@ -126,7 +130,8 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
mNotesEditor->setEnabled(TRUE);
LLViewerParcelMgr* parcel_mgr = LLViewerParcelMgr::getInstance();
std::string name = parcel_mgr->getAgentParcelName();
LLParcel* parcel = parcel_mgr->getAgentParcel();
std::string name = parcel->getName();
LLVector3 agent_pos = gAgent.getPositionAgent();
std::string desc;
@ -159,6 +164,27 @@ void LLPanelLandmarkInfo::setInfoType(EInfoType type)
mLandmarkTitleEditor->setText(name);
}
mParcelOwner->setVisible(TRUE);
getChild<LLUICtrl>("parcel_owner_label")->setVisible(TRUE);
LLUUID owner_id = parcel->getOwnerID();
if (owner_id.notNull())
{
if (parcel->getIsGroupOwned())
{
std::string owner_name = LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString();
mParcelOwner->setText(owner_name);
}
else
{
std::string owner_name = LLSLURL("agent", owner_id, "inspect").getSLURLString();
mParcelOwner->setText(owner_name);
}
}
else
{
mParcelOwner->setText(getString("public"));
}
// Moved landmark creation here from LLPanelLandmarkInfo::processParcelInfo()
// because we use only agent's current coordinates instead of waiting for
// remote parcel request to complete.
@ -210,6 +236,17 @@ void LLPanelLandmarkInfo::processParcelInfo(const LLParcelData& parcel_data)
mMaturityRatingText->setText(LLViewerRegion::accessToString(SIM_ACCESS_PG));
}
if (parcel_data.owner_id.notNull())
{
// not suported and ivisible due to missing isGroupOwned flag
}
else
{
mParcelOwner->setVisible(TRUE);
mParcelOwner->setText(getString("public"));
getChild<LLUICtrl>("parcel_owner_label")->setVisible(FALSE);
}
LLSD info;
info["update_verbs"] = true;
info["global_x"] = parcel_data.global_x;
@ -264,7 +301,8 @@ void LLPanelLandmarkInfo::displayItemInfo(const LLInventoryItem* pItem)
}
else
{
mOwner->setText(getString("public"));
std::string public_str = getString("public");
mOwner->setText(public_str);
}
//////////////////
@ -357,7 +395,7 @@ void LLPanelLandmarkInfo::createLandmark(const LLUUID& folder_id)
// If no parcel exists use the region name instead.
if (name.empty())
{
name = mRegionName->getText();
name = mRegionTitle;
}
}

View File

@ -686,7 +686,6 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
if (LLPanelLogin::sInstance->mPasswordModified)
{
authenticator = LLSD::emptyMap();
// password is plaintext
authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
authenticator["secret"] = password;
@ -697,6 +696,15 @@ void LLPanelLogin::getFields(LLPointer<LLCredential>& credential,
if (credential.notNull())
{
authenticator = credential->getAuthenticator();
if (authenticator.emptyMap())
{
// Likely caused by user trying to log in to non-system grid
// with unsupported name format, just retry
LL_WARNS() << "Authenticator failed to load for: " << username << LL_ENDL;
// password is plaintext
authenticator["type"] = CRED_AUTHENTICATOR_TYPE_CLEAR;
authenticator["secret"] = password;
}
}
}
}

View File

@ -43,6 +43,7 @@
#include "llagent.h"
#include "llexpandabletextbox.h"
#include "llpanelpick.h"
#include "llslurl.h"
#include "lltexturectrl.h"
#include "llviewerregion.h"
#include "llhttpconstants.h"
@ -80,6 +81,7 @@ BOOL LLPanelPlaceInfo::postBuild()
mSnapshotCtrl = getChild<LLTextureCtrl>("logo");
mRegionName = getChild<LLTextBox>("region_title");
mParcelName = getChild<LLTextBox>("parcel_title");
mParcelOwner = getChild<LLTextBox>("parcel_owner"); // <FS:Ansariel> Custom place profile layout
mDescEditor = getChild<LLExpandableTextBox>("description");
// <FS:Ansariel> FIRE-2717: Display traffic and area in landmark
mInfoText = findChild<LLTextBox>("information");
@ -112,11 +114,13 @@ void LLPanelPlaceInfo::resetLocation()
mParcelID.setNull();
mRequestedID.setNull();
mPosRegion.clearVec();
mRegionTitle.clear();
std::string loading = LLTrans::getString("LoadingData");
mMaturityRatingText->setValue(loading);
mRegionName->setText(loading);
mRegionName->setTextArg("[REGIONAMEPOS]", loading);
mParcelName->setText(loading);
mParcelOwner->setText(loading);
mDescEditor->setText(loading);
// <FS:Ansariel> FIRE-2717: Display traffic and area in landmark
if (mInfoText)
@ -205,8 +209,9 @@ void LLPanelPlaceInfo::setErrorStatus(S32 status, const std::string& reason)
std::string not_available = getString("not_available");
mMaturityRatingText->setValue(not_available);
mRegionName->setText(not_available);
mRegionName->setTextArg("[REGIONAMEPOS]", not_available);
mParcelName->setText(not_available);
mParcelOwner->setText(not_available);
// <FS:Ansariel> FIRE-2717: Display traffic and area in landmark
if (mInfoText)
{
@ -217,6 +222,7 @@ void LLPanelPlaceInfo::setErrorStatus(S32 status, const std::string& reason)
//mMaturityRatingIcon->setValue(LLUUID::null);
mMaturityRatingIcon->setValue(LLSD("Unknown_Icon"));
// </FS:Ansariel> Fix loading icon
mRegionTitle.clear();
// Enable "Back" button that was disabled when parcel request was sent.
getChild<LLButton>("back_btn")->setEnabled(TRUE);
@ -230,12 +236,34 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
mSnapshotCtrl->setImageAssetID(parcel_data.snapshot_id);
}
if(!parcel_data.sim_name.empty())
{
mRegionName->setText(parcel_data.sim_name);
S32 region_x;
S32 region_y;
S32 region_z;
// If the region position is zero, grab position from the global
if (mPosRegion.isExactlyZero())
{
region_x = ll_round(parcel_data.global_x) % REGION_WIDTH_UNITS;
region_y = ll_round(parcel_data.global_y) % REGION_WIDTH_UNITS;
region_z = ll_round(parcel_data.global_z);
}
else
{
region_x = ll_round(mPosRegion.mV[VX]);
region_y = ll_round(mPosRegion.mV[VY]);
region_z = ll_round(mPosRegion.mV[VZ]);
}
if (!parcel_data.sim_name.empty())
{
mRegionTitle = parcel_data.sim_name;
std::string name_and_pos = llformat("%s (%d, %d, %d)",
mRegionTitle.c_str(), region_x, region_y, region_z);
mRegionName->setTextArg("[REGIONAMEPOS]", name_and_pos);
}
else
{
mRegionTitle.clear();
mRegionName->setText(LLStringUtil::null);
}
@ -248,30 +276,11 @@ void LLPanelPlaceInfo::processParcelInfo(const LLParcelData& parcel_data)
mDescEditor->setText(getString("not_available"));
}
S32 region_x;
S32 region_y;
S32 region_z;
// If the region position is zero, grab position from the global
if(mPosRegion.isExactlyZero())
{
region_x = ll_round(parcel_data.global_x) % REGION_WIDTH_UNITS;
region_y = ll_round(parcel_data.global_y) % REGION_WIDTH_UNITS;
region_z = ll_round(parcel_data.global_z);
}
else
{
region_x = ll_round(mPosRegion.mV[VX]);
region_y = ll_round(mPosRegion.mV[VY]);
region_z = ll_round(mPosRegion.mV[VZ]);
}
if (!parcel_data.name.empty())
{
mParcelTitle = parcel_data.name;
mParcelName->setText(llformat("%s (%d, %d, %d)",
mParcelTitle.c_str(), region_x, region_y, region_z));
mParcelName->setText(mParcelTitle);
}
else
{
@ -330,12 +339,10 @@ void LLPanelPlaceInfo::reshape(S32 width, S32 height, BOOL called_from_parent)
void LLPanelPlaceInfo::createPick(const LLVector3d& pos_global, LLPanelPickEdit* pick_panel)
{
std::string region_name = mRegionName->getText();
LLPickData data;
data.pos_global = pos_global;
data.name = mParcelTitle.empty() ? region_name : mParcelTitle;
data.sim_name = region_name;
data.name = mParcelTitle.empty() ? mRegionTitle : mParcelTitle;
data.sim_name = mRegionTitle;
data.desc = mDescEditor->getText();
data.snapshot_id = mSnapshotCtrl->getImageAssetID();
data.parcel_id = mParcelID;

View File

@ -122,6 +122,7 @@ protected:
LLUUID mRequestedID;
LLVector3 mPosRegion;
std::string mParcelTitle; // used for pick title without coordinates
std::string mRegionTitle;
std::string mCurrentTitle;
S32 mScrollingPanelMinHeight;
S32 mScrollingPanelWidth;
@ -133,6 +134,7 @@ protected:
LLTextureCtrl* mSnapshotCtrl;
LLTextBox* mRegionName;
LLTextBox* mParcelName;
LLTextBox* mParcelOwner;
LLExpandableTextBox* mDescEditor;
LLIconCtrl* mMaturityRatingIcon;
LLTextBox* mMaturityRatingText;

View File

@ -107,8 +107,6 @@ BOOL LLPanelPlaceProfile::postBuild()
mForSalePanel->getChild<LLIconCtrl>("icon_for_sale")->
setMouseDownCallback(boost::bind(&LLPanelPlaceProfile::onForSaleBannerClick, this));
mParcelOwner = getChild<LLTextBox>("owner_value");
mParcelRatingIcon = getChild<LLIconCtrl>("rating_icon");
mParcelRatingText = getChild<LLTextBox>("rating_value");
mVoiceIcon = getChild<LLIconCtrl>("voice_icon");
@ -189,7 +187,6 @@ void LLPanelPlaceProfile::resetLocation()
const std::string unknown("Unknown_Icon");
std::string loading = LLTrans::getString("LoadingData");
mParcelOwner->setValue(loading);
// <FS:Ansariel> Fix loading icon; don't use translated string!
//mParcelRatingIcon->setValue(loading);
@ -266,14 +263,14 @@ void LLPanelPlaceProfile::setInfoType(EInfoType type)
const S32 SEARCH_DESC_HEIGHT = 150;
// Remember original geometry (once).
static const S32 sOrigDescVPad = getChildView("parcel_title")->getRect().mBottom - mDescEditor->getRect().mTop;
static const S32 sOrigDescVPad = getChildView("owner_label")->getRect().mBottom - mDescEditor->getRect().mTop;
static const S32 sOrigDescHeight = mDescEditor->getRect().getHeight();
static const S32 sOrigMRIconVPad = mDescEditor->getRect().mBottom - mMaturityRatingIcon->getRect().mTop;
static const S32 sOrigMRTextVPad = mDescEditor->getRect().mBottom - mMaturityRatingText->getRect().mTop;
// Resize the description.
const S32 desc_height = is_info_type_agent ? sOrigDescHeight : SEARCH_DESC_HEIGHT;
const S32 desc_top = getChildView("parcel_title")->getRect().mBottom - sOrigDescVPad;
const S32 desc_top = getChildView("owner_label")->getRect().mBottom - sOrigDescVPad;
LLRect desc_rect = mDescEditor->getRect();
desc_rect.setOriginAndSize(desc_rect.mLeft, desc_top - desc_height, desc_rect.getWidth(), desc_height);
mDescEditor->reshape(desc_rect.getWidth(), desc_rect.getHeight());
@ -419,6 +416,7 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
parcel_data.global_x = pos_global.mdV[VX];
parcel_data.global_y = pos_global.mdV[VY];
parcel_data.global_z = pos_global.mdV[VZ];
parcel_data.owner_id = parcel->getOwnerID();
std::string on = getString("on");
std::string off = getString("off");

View File

@ -76,8 +76,6 @@ private:
LLPanel* mForSalePanel;
LLPanel* mYouAreHerePanel;
LLTextBox* mParcelOwner;
LLIconCtrl* mParcelRatingIcon;
LLTextBox* mParcelRatingText;
LLIconCtrl* mVoiceIcon;

View File

@ -44,9 +44,8 @@ static LLDefaultChildRegistry::Register<LLPlacesInventoryPanel> r("places_invent
static LLPlacesInventoryBridgeBuilder PLACES_INVENTORY_BUILDER; // <ND/> const makes GCC >= 4.6 very angry about not user defined default ctor.
LLPlacesInventoryPanel::LLPlacesInventoryPanel(const Params& p) :
LLInventoryPanel(p),
LLAssetFilteredInventoryPanel(p),
mSavedFolderState(NULL)
{
mInvFVBridgeBuilder = &PLACES_INVENTORY_BUILDER;
mSavedFolderState = new LLSaveFolderState();

View File

@ -32,14 +32,16 @@
class LLLandmarksPanel;
class LLFolderView;
class LLPlacesInventoryPanel : public LLInventoryPanel
class LLPlacesInventoryPanel : public LLAssetFilteredInventoryPanel
{
public:
struct Params
: public LLInitParam::Block<Params, LLInventoryPanel::Params>
: public LLInitParam::Block<Params, LLAssetFilteredInventoryPanel::Params>
{
Params()
{}
{
filter_asset_type = "landmark";
}
};
LLPlacesInventoryPanel(const Params& p);

View File

@ -135,7 +135,7 @@ LLSD LLCredential::getLoginParams()
else if (mIdentifier["type"].asString() == "account")
{
result["username"] = mIdentifier["account_name"];
result["passwd"] = mAuthenticator["secret"];
result["passwd"] = mAuthenticator["secret"].asString();
username = result["username"].asString();
}
}

View File

@ -6200,25 +6200,18 @@ static F32 calc_light_dist(LLVOVolume* light, const LLVector3& cam_pos, F32 max_
{
return max_dist;
}
F32 radius = light->getLightRadius();
bool selected = light->isSelected();
LLVector3 dpos = light->getRenderPosition() - cam_pos;
F32 dist2 = dpos.lengthSquared();
if (!selected && dist2 > (max_dist + radius)*(max_dist + radius))
{
return max_dist;
}
F32 dist = (F32) sqrt(dist2);
dist *= 1.f / inten;
dist -= radius;
if (selected)
{
dist -= 10000.f; // selected lights get highest priority
return 0.f; // selected lights get highest priority
}
F32 radius = light->getLightRadius();
F32 dist = dist_vec(light->getRenderPosition(), cam_pos);
dist = llmax(dist - radius, 0.f);
if (light->mDrawable.notNull() && light->mDrawable->isState(LLDrawable::ACTIVE))
{
// moving lights get a little higher priority (too much causes artifacts)
dist -= light->getLightRadius()*0.25f;
dist = llmax(dist - light->getLightRadius()*0.25f, 0.f);
}
return dist;
}
@ -6237,12 +6230,17 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
// mNearbyLight (and all light_set_t's) are sorted such that
// begin() == the closest light and rbegin() == the farthest light
const S32 MAX_LOCAL_LIGHTS = 6;
// LLVector3 cam_pos = gAgent.getCameraPositionAgent();
LLVector3 cam_pos = LLViewerJoystick::getInstance()->getOverrideCamera() ?
camera.getOrigin() :
gAgent.getPositionAgent();
LLVector3 cam_pos = camera.getOrigin();
F32 max_dist = LIGHT_MAX_RADIUS * 4.f; // ignore enitrely lights > 4 * max light rad
F32 max_dist;
if (LLPipeline::sRenderDeferred)
{
max_dist = RenderFarClip;
}
else
{
max_dist = llmin(RenderFarClip, LIGHT_MAX_RADIUS * 4.f);
}
// UPDATE THE EXISTING NEARBY LIGHTS
light_set_t cur_nearby_lights;
@ -6277,8 +6275,38 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
continue;
}
F32 dist = calc_light_dist(volight, cam_pos, max_dist);
cur_nearby_lights.insert(Light(drawable, dist, light->fade));
F32 dist = calc_light_dist(volight, cam_pos, max_dist);
F32 fade = light->fade;
// actual fade gets decreased/increased by setupHWLights
// light->fade value is 'time'.
// >=0 and light will become visible as value increases
// <0 and light will fade out
if (dist < max_dist)
{
if (fade < 0)
{
// mark light to fade in
// if fade was -LIGHT_FADE_TIME - it was fully invisible
// if fade -0 - it was fully visible
// visibility goes up from 0 to LIGHT_FADE_TIME.
fade += LIGHT_FADE_TIME;
}
}
else
{
// mark light to fade out
// visibility goes down from -0 to -LIGHT_FADE_TIME.
if (fade >= LIGHT_FADE_TIME)
{
fade = -0.0001f; // was fully visible
}
else if (fade >= 0)
{
// 0.75 visible light should stay 0.75 visible, but should reverse direction
fade -= LIGHT_FADE_TIME;
}
}
cur_nearby_lights.insert(Light(drawable, dist, fade));
}
mNearbyLights = cur_nearby_lights;
@ -6297,17 +6325,23 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
{
continue; // no lighting from HUD objects
}
if (!sRenderAttachedLights && light && light->isAttachment())
{
continue;
}
LLVOAvatar *av = light->getAvatar();
if (av && (av->isTooComplex() || av->isInMuteList()))
{
// avatars that are already in the list will be removed by removeMutedAVsLights
continue;
}
F32 dist = calc_light_dist(light, cam_pos, max_dist);
if (dist >= max_dist)
{
continue;
}
if (!sRenderAttachedLights && light && light->isAttachment())
{
continue;
}
new_nearby_lights.insert(Light(drawable, dist, 0.f));
if (new_nearby_lights.size() > (U32)MAX_LOCAL_LIGHTS)
if (!LLPipeline::sRenderDeferred && new_nearby_lights.size() > (U32)MAX_LOCAL_LIGHTS)
{
new_nearby_lights.erase(--new_nearby_lights.end());
const Light& last = *new_nearby_lights.rbegin();
@ -6320,7 +6354,7 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
iter != new_nearby_lights.end(); iter++)
{
const Light* light = &(*iter);
if (mNearbyLights.size() < (U32)MAX_LOCAL_LIGHTS)
if (LLPipeline::sRenderDeferred || mNearbyLights.size() < (U32)MAX_LOCAL_LIGHTS)
{
mNearbyLights.insert(*light);
((LLDrawable*) light->drawable)->setState(LLDrawable::NEARBY_LIGHT);
@ -6333,10 +6367,22 @@ void LLPipeline::calcNearbyLights(LLCamera& camera)
Light* farthest_light = (const_cast<Light*>(&(*(mNearbyLights.rbegin()))));
if (light->dist < farthest_light->dist)
{
if (farthest_light->fade >= 0.f)
{
farthest_light->fade = -(gFrameIntervalSeconds.value());
}
// mark light to fade out
// visibility goes down from -0 to -LIGHT_FADE_TIME.
//
// This is a mess, but for now it needs to be in sync
// with fade code above. Ex: code above detects distance < max,
// sets fade time to positive, this code then detects closer
// lights and sets fade time negative, fully compensating
// for the code above
if (farthest_light->fade >= LIGHT_FADE_TIME)
{
farthest_light->fade = -0.0001f; // was fully visible
}
else if (farthest_light->fade >= 0)
{
farthest_light->fade -= LIGHT_FADE_TIME;
}
}
else
{
@ -6456,12 +6502,6 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
}
}
const LLViewerObject *vobj = drawable->getVObj();
if(vobj && vobj->getAvatar() && vobj->getAvatar()->isInMuteList())
{
continue;
}
if (drawable->isState(LLDrawable::ACTIVE))
{
mLightMovingMask |= (1<<cur_light);
@ -6544,6 +6584,7 @@ void LLPipeline::setupHWLights(LLDrawPool* pool)
light_state->setSpecular(specular);
}
else // omnidirectional (point) light
{
light_state->setSpotExponent(0.f);
light_state->setSpotCutoff(180.f);
@ -8913,47 +8954,51 @@ void LLPipeline::renderDeferredLighting(LLRenderTarget* screen_target)
mCubeVB->setBuffer(LLVertexBuffer::MAP_VERTEX);
LLGLDepthTest depth(GL_TRUE, GL_FALSE);
for (LLDrawable::drawable_set_t::iterator iter = mLights.begin(); iter != mLights.end(); ++iter)
{
LLDrawable* drawablep = *iter;
LLVOVolume* volume = drawablep->getVOVolume();
if (!volume)
{
continue;
}
if (volume->isAttachment())
{
if (!sRenderAttachedLights)
{
continue;
}
}
const LLViewerObject *vobj = drawablep->getVObj();
if (vobj)
// mNearbyLights already includes distance calculation and excludes muted avatars.
// It is calculated from mLights
// mNearbyLights also provides fade value to gracefully fade-out out of range lights
for (light_set_t::iterator iter = mNearbyLights.begin(); iter != mNearbyLights.end(); ++iter)
{
LLDrawable* drawablep = iter->drawable;
LLVOVolume* volume = drawablep->getVOVolume();
if (!volume)
{
LLVOAvatar *av = vobj->getAvatar();
if (av && (av->isTooComplex() || av->isInMuteList()))
continue;
}
if (volume->isAttachment())
{
if (!sRenderAttachedLights)
{
continue;
}
}
const LLVector3 position = drawablep->getPositionAgent();
if (dist_vec(position, LLViewerCamera::getInstance()->getOrigin()) > RenderFarClip + volume->getLightRadius())
{
continue;
}
LLVector4a center;
center.load3(position.mV);
center.load3(drawablep->getPositionAgent().mV);
const F32* c = center.getF32ptr();
F32 s = volume->getLightRadius()*1.5f;
//send light color to shader in linear space
LLColor3 col = volume->getLightLinearColor();
// fade also works as flicker prevention during reparenting
// because reparenting causes distance to jump temporary
F32 fade = iter->fade;
if (fade < LIGHT_FADE_TIME)
{
// fade in/out light
if (fade >= 0.f)
{
fade = fade / LIGHT_FADE_TIME;
}
else
{
fade = 1.f + fade / LIGHT_FADE_TIME;
}
fade = llclamp(fade, 0.f, 1.f);
col *= fade;
}
if (col.magVecSquared() < 0.001f)
{

View File

@ -1,373 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
follows="all"
height="587"
layout="topleft"
left="0"
min_height="367"
name="landmark_info"
top="20"
width="333">
<string
name="title_create_landmark"
value="Create Landmark" />
<string
name="title_edit_landmark"
value="Edit Landmark" />
<string
name="title_landmark"
value="Landmark" />
<string
name="not_available"
value="(N\A)" />
<string
name="unknown"
value="(unknown)" />
<string
name="public"
value="(public)" />
<string
name="server_update_text">
Place information not available without server update.
</string>
<string
name="server_error_text">
Information about this location is unavailable at this time, please try again later.
</string>
<string
name="server_forbidden_text">
Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
</string>
<string
name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
<string
name="information_text">
Traffic: [TRAFFIC] Area: [AREA] m²
</string>
<!-- Texture names for rating icons -->
<string
name="icon_PG"
translate="false"
value="Parcel_PG_Dark" />
<string
name="icon_M"
translate="false"
value="Parcel_M_Dark" />
<string
name="icon_R"
translate="false"
value="Parcel_R_Dark" />
<layout_stack
name="place_info_sidetray_main"
layout="topleft"
follows="all"
top="0"
left="0"
width="331"
height="587"
border_size="0"
orientation="vertical">
<layout_panel
name="header_container"
auto_resize="false"
height="30"
width="331"
layout="topleft"
visible="true"
follows="top|left|right">
<button
follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
image_unselected="BackButton_Off"
layout="topleft"
left="9"
name="back_btn"
tool_tip="Back"
tab_stop="false"
top="4"
width="30"
use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
left_pad="7"
name="title"
text_color="LtGray"
top="3"
use_ellipses="true"
value="Place Profile"
width="280" />
</layout_panel>
<layout_panel
name="place_info_content"
auto_resize="true"
height="557"
width="331"
layout="topleft"
follows="all">
<texture_picker
enabled="false"
fallback_image="default_land_picture.j2c"
follows="left|top|right"
height="197"
layout="topleft"
left="21"
name="logo"
top_pad="2"
width="290" />
<text
follows="left|top|right"
font="SansSerifLarge"
height="14"
layout="topleft"
left="4"
name="region_title"
text_color="white"
top_pad="-18"
use_ellipses="true"
value="SampleRegion"
right="-80" />
<icon
follows="top|right"
height="16"
image_name="Unknown_Icon"
layout="topleft"
left_pad="0"
top_pad="-12"
name="maturity_icon"
width="18" />
<text
follows="top|right"
height="16"
layout="topleft"
left_pad="5"
name="maturity_value"
top_pad="-13"
value="unknown"
width="50" />
<text
follows="left|top|right"
height="14"
layout="topleft"
left="4"
name="parcel_title"
top_pad="2"
use_ellipses="true"
value="SampleParcel, Name Long (145, 228, 26)"
right="-1" />
<panel
follows="top|left|right"
height="90"
border="true"
bevel_style="in"
layout="topleft"
left="4"
name="description_panel"
top_pad="4"
right="-2">
<expandable_text
follows="all"
height="90"
layout="topleft"
left="0"
top="0"
name="description"
value="(loading ...)"
right="-1" />
</panel>
<panel
follows="top|left|right"
height="72"
layout="topleft"
left="4"
name="landmark_info_panel"
top_pad="4"
right="-1">
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="owner_label"
top_pad="0"
value="Owner:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="owner"
top_delta="0"
use_ellipses="true"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
top_pad="2"
name="creator_label"
value="Creator:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="creator"
top_delta="0"
use_ellipses="true"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
top_pad="2"
left="0"
name="created_label"
value="Created:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="created"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
top_pad="2"
left="0"
name="information_label"
value="Info:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="information"
right="-1" />
</panel>
<panel
follows="all"
height="168"
layout="topleft"
left="4"
top_pad="0"
name="landmark_edit_panel"
right="-1">
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="title_label"
top_pad="0"
value="Title:"
width="60" />
<text
parse_urls="false"
follows="left|top|right"
height="22"
layout="topleft"
left_pad="0"
top_pad="-20"
name="title_value"
text_color="white"
use_ellipses="true"
right="-1" />
<line_editor
follows="left|top|right"
height="22"
layout="topleft"
top_pad="-22"
name="title_editor"
prevalidate_callback="ascii"
text_readonly_color="white"
top_delta="0"
right="-1" />
<text
follows="top|left|right"
height="15"
layout="topleft"
left="0"
name="notes_label"
top_pad="2"
value="My notes:"
right="-1" />
<text_editor
bg_readonly_color="DkGray2"
follows="all"
height="108"
layout="topleft"
left="0"
max_length="127"
name="notes_editor"
read_only="true"
spellcheck="true"
text_readonly_color="white"
text_type="ascii_with_newline"
top_pad="0"
right="-1"
wrap="true" />
<text
follows="bottom|left"
height="15"
layout="topleft"
left="0"
name="folder_label"
top_pad="4"
value="Landmark location:"
width="120" />
<combo_box
follows="bottom|left|right"
height="23"
layout="topleft"
left_pad="0"
top_pad="-18"
name="folder_combo"
right="-1" />
</panel>
</layout_panel>
</layout_stack>
</panel>

View File

@ -4220,7 +4220,7 @@ Sie ist voll oder startet in Kürze neu.
Skript konnte nicht hinzugefügt werden.
</notification>
<notification name="AssetServerTimeoutObjReturn">
Asset-Server hat nicht rechtzeitig reagiert. Objekt wurde zum Sim zurückübertragen.
Asset-Server hat nicht rechtzeitig reagiert. Objekt wurde zur Region zurückübertragen.
</notification>
<notification name="RegionDisablePhysicsShapes">
In dieser Region sind keine Physikformen aktiviert.

View File

@ -31,9 +31,13 @@
</layout_panel>
<layout_panel name="place_info_content">
<text name="region_title" value="unbekannt"/>
<text name="maturity_value" value="unbekannt"/>
<text name="parcel_title" value="unbekannt"/>
<text name="region_title">
Region: [REGIONAMEPOS]
</text>
<text name="maturity_value" value="unbekannt"/>
<text name="parcel_owner_label" value="Eigentümer:" width="70"/>
<text name="parcel_owner" value="unbekannt"/>
<panel name="description_panel">
<expandable_text name="description" value="unbekannt"/>
</panel>

View File

@ -51,11 +51,13 @@
</layout_panel>
<layout_panel name="place_info_content">
<text name="region_title" value="unbekannt"/>
<text name="parcel_title" value="unbekannt"/>
<text name="region_title">
Region: [REGIONAMEPOS]
</text>
<expandable_text name="description" value="unbekannt"/>
<text name="owner_label" value="Eigentümer:"/>
<text name="owner_value" value="unbekannt"/>
<text name="parcel_owner" value="unbekannt"/>
<text name="maturity_value" value="unbekannt"/>
<accordion name="advanced_info_accordion">
<accordion_tab name="parcel_characteristics_tab" title="Parzelle">

View File

@ -11434,7 +11434,7 @@ Unable to add script!
name="AssetServerTimeoutObjReturn"
type="notify">
<tag>fail</tag>
Asset server didn't respond in a timely fashion. Object returned to sim.
Asset server didn't respond in a timely fashion. Object returned to the region.
</notification>
<notification

View File

@ -1,5 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
follows="all"
height="587"
layout="topleft"
@ -105,7 +106,7 @@
use_ellipses="true"
value="Place Profile"
width="280" />
</layout_panel>
<layout_panel
name="place_info_content"
@ -132,12 +133,24 @@
height="14"
layout="topleft"
left="4"
name="region_title"
name="parcel_title"
text_color="white"
top_pad="-18"
use_ellipses="true"
value="SampleRegion"
right="-80" />
value="SampleParcel, Name Long"
right="-1" />
<text
follows="left|top|right"
height="14"
layout="topleft"
left="4"
name="region_title"
top_pad="10"
use_ellipses="true"
right="-80">
Region: [REGIONAMEPOS]
</text>
<icon
follows="top|right"
@ -145,7 +158,7 @@
image_name="Unknown_Icon"
layout="topleft"
left_pad="0"
top_pad="-12"
top_pad="-18"
name="maturity_icon"
width="18" />
@ -157,17 +170,26 @@
name="maturity_value"
top_pad="-13"
value="unknown"
width="60" />
width="50" />
<text
follows="left|top|right"
height="14"
follows="left|top"
height="15"
layout="topleft"
left="4"
name="parcel_title"
name="parcel_owner_label"
top_pad="2"
value="Owner:"
width="40" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="parcel_owner"
top_delta="0"
use_ellipses="true"
value="SampleParcel, Name Long (145, 228, 26)"
value="unknown"
right="-1" />
<panel
@ -280,7 +302,7 @@
<panel
follows="all"
height="178"
height="168"
layout="topleft"
left="4"
top_pad="0"
@ -303,18 +325,16 @@
height="22"
layout="topleft"
left_pad="0"
top_pad="-20"
top_delta="0"
name="title_value"
text_color="white"
use_ellipses="true"
wrap="true"
right="-1" />
<line_editor
follows="left|top|right"
height="22"
layout="topleft"
top_pad="-22"
top_pad="-27"
name="title_editor"
prevalidate_callback="ascii"
text_readonly_color="white"
@ -332,14 +352,15 @@
right="-1" />
<text_editor
bg_readonly_color="DkGray2"
follows="all"
height="108"
height="90"
layout="topleft"
left="0"
max_length="127"
name="notes_editor"
read_only="true"
spellcheck="true"
spellcheck="true"
text_readonly_color="white"
text_type="ascii_with_newline"
top_pad="0"
@ -352,7 +373,7 @@
layout="topleft"
left="0"
name="folder_label"
top_pad="4"
top_pad="6"
value="Landmark location:"
width="120" />
@ -361,7 +382,7 @@
height="23"
layout="topleft"
left_pad="0"
top_pad="-18"
top_pad="-20"
name="folder_combo"
right="-1" />
</panel>

View File

@ -286,7 +286,7 @@
height="14"
layout="topleft"
left="10"
name="region_title"
name="parcel_title"
text_color="white"
top_pad="5"
use_ellipses="true"
@ -298,11 +298,12 @@
height="14"
layout="topleft"
left="10"
name="parcel_title"
name="region_title"
top_pad="4"
use_ellipses="true"
value="unknown"
width="320" />
width="320">
Region: [REGIONAMEPOS]
</text>
<expandable_text
follows="left|top|right"
height="50"
@ -328,7 +329,7 @@
height="14"
layout="topleft"
left_pad="1"
name="owner_value"
name="parcel_owner"
top_delta="0"
value="unknown"
use_ellipses="true"

View File

@ -1,373 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
follows="all"
height="587"
layout="topleft"
left="0"
min_height="367"
name="landmark_info"
top="20"
width="333">
<string
name="title_create_landmark"
value="Create Landmark" />
<string
name="title_edit_landmark"
value="Edit Landmark" />
<string
name="title_landmark"
value="Landmark" />
<string
name="not_available"
value="(N\A)" />
<string
name="unknown"
value="(unknown)" />
<string
name="public"
value="(public)" />
<string
name="server_update_text">
Place information not available without server update.
</string>
<string
name="server_error_text">
Information about this location is unavailable at this time, please try again later.
</string>
<string
name="server_forbidden_text">
Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
</string>
<string
name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
<string
name="information_text">
Traffic: [TRAFFIC] Area: [AREA] m²
</string>
<!-- Texture names for rating icons -->
<string
name="icon_PG"
translate="false"
value="Parcel_PG_Dark" />
<string
name="icon_M"
translate="false"
value="Parcel_M_Dark" />
<string
name="icon_R"
translate="false"
value="Parcel_R_Dark" />
<layout_stack
name="place_info_sidetray_main"
layout="topleft"
follows="all"
top="0"
left="0"
width="331"
height="587"
border_size="0"
orientation="vertical">
<layout_panel
name="header_container"
auto_resize="false"
height="30"
width="331"
layout="topleft"
visible="true"
follows="top|left|right">
<button
follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
image_unselected="BackButton_Off"
layout="topleft"
left="9"
name="back_btn"
tool_tip="Back"
tab_stop="false"
top="4"
width="30"
use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
left_pad="7"
name="title"
text_color="LtGray"
top="3"
use_ellipses="true"
value="Place Profile"
width="280" />
</layout_panel>
<layout_panel
name="place_info_content"
auto_resize="true"
height="557"
width="331"
layout="topleft"
follows="all">
<texture_picker
enabled="false"
fallback_image="default_land_picture.j2c"
follows="left|top|right"
height="197"
layout="topleft"
left="21"
name="logo"
top_pad="2"
width="290" />
<text
follows="left|top|right"
font="SansSerifLarge"
height="14"
layout="topleft"
left="4"
name="region_title"
text_color="white"
top_pad="-18"
use_ellipses="true"
value="SampleRegion"
right="-80" />
<icon
follows="top|right"
height="16"
image_name="unknown"
layout="topleft"
left_pad="0"
top_pad="-12"
name="maturity_icon"
width="18" />
<text
follows="top|right"
height="16"
layout="topleft"
left_pad="5"
name="maturity_value"
top_pad="-13"
value="unknown"
width="50" />
<text
follows="left|top|right"
height="14"
layout="topleft"
left="4"
name="parcel_title"
top_pad="2"
use_ellipses="true"
value="SampleParcel, Name Long (145, 228, 26)"
right="-1" />
<panel
follows="top|left|right"
height="90"
border="true"
bevel_style="in"
layout="topleft"
left="4"
name="description_panel"
top_pad="4"
right="-2">
<expandable_text
follows="all"
height="90"
layout="topleft"
left="0"
top="0"
name="description"
value="(loading ...)"
right="-1" />
</panel>
<panel
follows="top|left|right"
height="72"
layout="topleft"
left="4"
name="landmark_info_panel"
top_pad="4"
right="-1">
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="owner_label"
top_pad="0"
value="Owner:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="owner"
top_delta="0"
use_ellipses="true"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
top_pad="2"
name="creator_label"
value="Creator:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="creator"
top_delta="0"
use_ellipses="true"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
top_pad="2"
left="0"
name="created_label"
value="Created:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="created"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
top_pad="2"
left="0"
name="information_label"
value="Info:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="information"
right="-1" />
</panel>
<panel
follows="all"
height="168"
layout="topleft"
left="4"
top_pad="0"
name="landmark_edit_panel"
right="-1">
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="title_label"
top_pad="0"
value="Title:"
width="60" />
<text
parse_urls="false"
follows="left|top|right"
height="22"
layout="topleft"
left_pad="0"
top_pad="-20"
name="title_value"
text_color="white"
use_ellipses="true"
right="-1" />
<line_editor
follows="left|top|right"
height="22"
layout="topleft"
top_pad="-22"
name="title_editor"
prevalidate_callback="ascii"
text_readonly_color="white"
top_delta="0"
right="-1" />
<text
follows="top|left|right"
height="15"
layout="topleft"
left="0"
name="notes_label"
top_pad="2"
value="My notes:"
right="-1" />
<text_editor
bg_readonly_color="DkGray2"
follows="all"
height="108"
layout="topleft"
left="0"
max_length="127"
name="notes_editor"
read_only="true"
spellcheck="true"
text_readonly_color="white"
text_type="ascii_with_newline"
top_pad="0"
right="-1"
wrap="true" />
<text
follows="bottom|left"
height="15"
layout="topleft"
left="0"
name="folder_label"
top_pad="4"
value="Landmark location:"
width="120" />
<combo_box
follows="bottom|left|right"
height="23"
layout="topleft"
left_pad="0"
top_pad="-18"
name="folder_combo"
right="-1" />
</panel>
</layout_panel>
</layout_stack>
</panel>

View File

@ -129,7 +129,7 @@
<panel
bg_alpha_color="SL-Background_50"
follows="left|top|right"
height="647"
height="654"
layout="topleft"
left="0"
min_height="300"
@ -146,35 +146,56 @@
name="logo"
top="10"
width="290" />
<!-- texture picker has an empty label section, compensate for it with negative top_pad-->
<text
follows="left|top|right"
font="SansSerifLarge"
height="14"
layout="topleft"
left="10"
name="region_title"
text_color="White"
top_pad="10"
top_pad="-10"
width="280"
name="parcel_title"
text_color="white"
use_ellipses="true"
value="SampleRegion"
width="280" />
value="SampleParcel, Name Long" />
<text
follows="left|top|right"
height="14"
layout="topleft"
left="10"
name="parcel_title"
top_pad="10"
top_pad="9"
width="280"
name="region_title"
use_ellipses="true">
Region: [REGIONAMEPOS]
</text>
<text
follows="left|top"
height="15"
layout="topleft"
left="10"
name="parcel_owner_label"
top_pad="7"
value="Owner:"
width="80" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="parcel_owner"
top_delta="0"
use_ellipses="true"
value="SampleParcel, Name Long (145, 228, 26)"
width="280" />
value="TempOwner"
width="215" />
<expandable_text
follows="left|top|right"
height="50"
layout="topleft"
left="10"
name="description"
top_pad="10"
top_pad="7"
value="Du waltz die spritz"
width="280"
expanded_bg_visible="true"
@ -199,19 +220,38 @@
width="268" />
<panel
follows="left|top|right"
height="72"
height="81"
layout="topleft"
left="10"
name="landmark_info_panel"
top_pad="10"
width="290">
<view_border
bevel_style="none"
follows="top|left"
height="0"
layout="topleft"
left="0"
name="lod_tab_border"
top_pad="5"
width="290" />
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="this_landmark"
top_pad="8"
width="90">
This landmark:
</text>
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="owner_label"
top_pad="10"
top_pad="8"
value="Owner:"
width="90" />
<text

View File

@ -153,7 +153,7 @@
name="icon_DamageNo"
translate="false"
value="Parcel_DamageNo_Dark" />
<string
<string
name="icon_SeeAVs_Off"
translate="false"
value="Parcel_SeeAVsOff_Dark" />
@ -226,11 +226,11 @@
name="place_scroll"
opaque="true"
top_pad="10"
width="310">
width="320">
<panel
bg_alpha_color="SL-Background_50"
follows="left|top|right|bottom"
height="580"
height="597"
layout="topleft"
left="0"
min_height="300"
@ -307,34 +307,25 @@
height="14"
layout="topleft"
left="10"
name="region_title"
text_color="White"
top_pad="5"
width="290"
name="parcel_title"
text_color="White"
use_ellipses="true"
value="Unknown"
width="290" />
value="Unknown" />
<text
parse_urls="false"
follows="left|top|right"
height="14"
layout="topleft"
left="10"
name="parcel_title"
top_pad="4"
use_ellipses="true"
value="Unknown"
width="285" />
<expandable_text
follows="left|top|right"
height="50"
layout="topleft"
left="5"
name="description"
top_pad="10"
value="Unknown"
width="300"
expanded_bg_visible="true"
expanded_bg_color="SL-Background_Light" />
width="285"
name="region_title"
text_color="White"
use_ellipses="true">
Region: [REGIONAMEPOS]
</text>
<text
follows="left|top"
height="14"
@ -345,17 +336,27 @@
top_pad="0"
value="Owner:"
width="90" />
<!--TODO: HOOK THIS NAME UP WITH AN INSPECTOR -->
<text
follows="left|top|right"
height="14"
layout="topleft"
left_pad="1"
name="owner_value"
name="parcel_owner"
top_delta="0"
value="Unknown"
use_ellipses="true"
width="200" />
<expandable_text
follows="left|top"
height="50"
layout="topleft"
left="5"
name="description"
top_pad="10"
value="Du waltz die spritz"
width="285"
expanded_bg_visible="true"
expanded_bg_color="SL-Background_Light" />
<icon
follows="top|left"
height="16"
@ -363,7 +364,7 @@
layout="topleft"
left="10"
name="maturity_icon"
top_delta="0"
top_pad="0"
width="18" />
<text
follows="left|top|right"
@ -383,7 +384,7 @@
left="0"
name="advanced_info_accordion"
top_pad="5"
width="313">
width="305">
<accordion_tab
fit_panel="false"
height="175"
@ -581,7 +582,7 @@
top_delta="0"
value="Off"
width="60" />
<icon
<icon
follows="top|left"
height="18"
image_name="Parcel_SeeAVsOff_Dark"

View File

@ -129,7 +129,7 @@
<panel
bg_alpha_color="SL-Background_50"
follows="left|top|right"
height="647"
height="654"
layout="topleft"
left="0"
min_height="300"
@ -146,35 +146,56 @@
name="logo"
top="10"
width="290" />
<!-- texture picker has an empty label section, compensate for it with negative top_pad-->
<text
follows="left|top|right"
font="SansSerifLarge"
height="14"
layout="topleft"
left="10"
name="region_title"
text_color="White"
top_pad="10"
top_pad="-10"
width="280"
name="parcel_title"
text_color="white"
use_ellipses="true"
value="SampleRegion"
width="280" />
value="SampleParcel, Name Long" />
<text
follows="left|top|right"
height="14"
layout="topleft"
left="10"
name="parcel_title"
top_pad="10"
top_pad="9"
width="280"
name="region_title"
use_ellipses="true">
Region: [REGIONAMEPOS]
</text>
<text
follows="left|top"
height="15"
layout="topleft"
left="10"
name="parcel_owner_label"
top_pad="7"
value="Owner:"
width="80" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="parcel_owner"
top_delta="0"
use_ellipses="true"
value="SampleParcel, Name Long (145, 228, 26)"
width="280" />
value="TempOwner"
width="215" />
<expandable_text
follows="left|top|right"
height="50"
layout="topleft"
left="10"
name="description"
top_pad="10"
top_pad="7"
value="Du waltz die spritz"
width="280"
expanded_bg_visible="true"
@ -199,19 +220,38 @@
width="268" />
<panel
follows="left|top|right"
height="72"
height="81"
layout="topleft"
left="10"
name="landmark_info_panel"
top_pad="10"
width="290">
<view_border
bevel_style="none"
follows="top|left"
height="0"
layout="topleft"
left="0"
name="lod_tab_border"
top_pad="5"
width="290" />
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="this_landmark"
top_pad="8"
width="90">
This landmark:
</text>
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="owner_label"
top_pad="10"
top_pad="8"
value="Owner:"
width="90" />
<text

View File

@ -153,7 +153,7 @@
name="icon_DamageNo"
translate="false"
value="Parcel_DamageNo_Dark" />
<string
<string
name="icon_SeeAVs_Off"
translate="false"
value="Parcel_SeeAVsOff_Dark" />
@ -226,11 +226,11 @@
name="place_scroll"
opaque="true"
top_pad="10"
width="310">
width="320">
<panel
bg_alpha_color="SL-Background_50"
follows="left|top|right|bottom"
height="580"
height="597"
layout="topleft"
left="0"
min_height="300"
@ -307,34 +307,25 @@
height="14"
layout="topleft"
left="10"
name="region_title"
text_color="White"
top_pad="5"
width="290"
name="parcel_title"
text_color="White"
use_ellipses="true"
value="Unknown"
width="290" />
value="Unknown" />
<text
parse_urls="false"
follows="left|top|right"
height="14"
layout="topleft"
left="10"
name="parcel_title"
top_pad="4"
use_ellipses="true"
value="Unknown"
width="285" />
<expandable_text
follows="left|top|right"
height="50"
layout="topleft"
left="5"
name="description"
top_pad="10"
value="Unknown"
width="300"
expanded_bg_visible="true"
expanded_bg_color="SL-Background_Light" />
width="285"
name="region_title"
text_color="White"
use_ellipses="true">
Region: [REGIONAMEPOS]
</text>
<text
follows="left|top"
height="14"
@ -345,17 +336,27 @@
top_pad="0"
value="Owner:"
width="90" />
<!--TODO: HOOK THIS NAME UP WITH AN INSPECTOR -->
<text
follows="left|top|right"
height="14"
layout="topleft"
left_pad="1"
name="owner_value"
name="parcel_owner"
top_delta="0"
value="Unknown"
use_ellipses="true"
width="200" />
<expandable_text
follows="left|top"
height="50"
layout="topleft"
left="5"
name="description"
top_pad="10"
value="Du waltz die spritz"
width="285"
expanded_bg_visible="true"
expanded_bg_color="SL-Background_Light" />
<icon
follows="top|left"
height="16"
@ -363,7 +364,7 @@
layout="topleft"
left="10"
name="maturity_icon"
top_delta="0"
top_pad="0"
width="18" />
<text
follows="left|top|right"
@ -383,7 +384,7 @@
left="0"
name="advanced_info_accordion"
top_pad="5"
width="313">
width="305">
<accordion_tab
fit_panel="false"
height="175"
@ -581,7 +582,7 @@
top_delta="0"
value="Off"
width="60" />
<icon
<icon
follows="top|left"
height="18"
image_name="Parcel_SeeAVsOff_Dark"

View File

@ -1,373 +0,0 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
background_visible="true"
follows="all"
height="587"
layout="topleft"
left="0"
min_height="367"
name="landmark_info"
top="20"
width="333">
<string
name="title_create_landmark"
value="Create Landmark" />
<string
name="title_edit_landmark"
value="Edit Landmark" />
<string
name="title_landmark"
value="Landmark" />
<string
name="not_available"
value="(N\A)" />
<string
name="unknown"
value="(unknown)" />
<string
name="public"
value="(public)" />
<string
name="server_update_text">
Place information not available without server update.
</string>
<string
name="server_error_text">
Information about this location is unavailable at this time, please try again later.
</string>
<string
name="server_forbidden_text">
Information about this location is unavailable due to access restrictions. Please check your permissions with the parcel owner.
</string>
<string
name="acquired_date">
[wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
</string>
<string
name="information_text">
Traffic: [TRAFFIC] Area: [AREA] m²
</string>
<!-- Texture names for rating icons -->
<string
name="icon_PG"
translate="false"
value="Parcel_PG_Dark" />
<string
name="icon_M"
translate="false"
value="Parcel_M_Dark" />
<string
name="icon_R"
translate="false"
value="Parcel_R_Dark" />
<layout_stack
name="place_info_sidetray_main"
layout="topleft"
follows="all"
top="0"
left="0"
width="331"
height="587"
border_size="0"
orientation="vertical">
<layout_panel
name="header_container"
auto_resize="false"
height="30"
width="331"
layout="topleft"
visible="true"
follows="top|left|right">
<button
follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
image_unselected="BackButton_Off"
layout="topleft"
left="9"
name="back_btn"
tool_tip="Back"
tab_stop="false"
top="4"
width="30"
use_draw_context_alpha="false" />
<text
follows="top|left|right"
font="SansSerifHugeBold"
height="26"
layout="topleft"
left_pad="7"
name="title"
text_color="LtGray"
top="3"
use_ellipses="true"
value="Place Profile"
width="280" />
</layout_panel>
<layout_panel
name="place_info_content"
auto_resize="true"
height="557"
width="331"
layout="topleft"
follows="all">
<texture_picker
enabled="false"
fallback_image="default_land_picture.j2c"
follows="left|top|right"
height="197"
layout="topleft"
left="21"
name="logo"
top_pad="2"
width="290" />
<text
follows="left|top|right"
font="SansSerifLarge"
height="14"
layout="topleft"
left="4"
name="region_title"
text_color="white"
top_pad="-18"
use_ellipses="true"
value="SampleRegion"
right="-80" />
<icon
follows="top|right"
height="16"
image_name="unknown"
layout="topleft"
left_pad="0"
top_pad="-12"
name="maturity_icon"
width="18" />
<text
follows="top|right"
height="16"
layout="topleft"
left_pad="5"
name="maturity_value"
top_pad="-13"
value="unknown"
width="50" />
<text
follows="left|top|right"
height="14"
layout="topleft"
left="4"
name="parcel_title"
top_pad="2"
use_ellipses="true"
value="SampleParcel, Name Long (145, 228, 26)"
right="-1" />
<panel
follows="top|left|right"
height="90"
border="true"
bevel_style="in"
layout="topleft"
left="4"
name="description_panel"
top_pad="4"
right="-2">
<expandable_text
follows="all"
height="90"
layout="topleft"
left="0"
top="0"
name="description"
value="(loading ...)"
right="-1" />
</panel>
<panel
follows="top|left|right"
height="72"
layout="topleft"
left="4"
name="landmark_info_panel"
top_pad="4"
right="-1">
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="owner_label"
top_pad="0"
value="Owner:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="owner"
top_delta="0"
use_ellipses="true"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
top_pad="2"
name="creator_label"
value="Creator:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="creator"
top_delta="0"
use_ellipses="true"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
top_pad="2"
left="0"
name="created_label"
value="Created:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="created"
right="-1" />
<text
follows="left|top"
height="15"
layout="topleft"
top_pad="2"
left="0"
name="information_label"
value="Info:"
width="60" />
<text
follows="left|top|right"
height="15"
layout="topleft"
left_pad="0"
name="information"
right="-1" />
</panel>
<panel
follows="all"
height="168"
layout="topleft"
left="4"
top_pad="0"
name="landmark_edit_panel"
right="-1">
<text
follows="left|top"
height="15"
layout="topleft"
left="0"
name="title_label"
top_pad="0"
value="Title:"
width="60" />
<text
parse_urls="false"
follows="left|top|right"
height="22"
layout="topleft"
left_pad="0"
top_pad="-20"
name="title_value"
text_color="white"
use_ellipses="true"
right="-1" />
<line_editor
follows="left|top|right"
height="22"
layout="topleft"
top_pad="-22"
name="title_editor"
prevalidate_callback="ascii"
text_readonly_color="white"
top_delta="0"
right="-1" />
<text
follows="top|left|right"
height="15"
layout="topleft"
left="0"
name="notes_label"
top_pad="2"
value="My notes:"
right="-1" />
<text_editor
bg_readonly_color="DkGray2"
follows="all"
height="108"
layout="topleft"
left="0"
max_length="127"
name="notes_editor"
read_only="true"
spellcheck="true"
text_readonly_color="white"
text_type="ascii_with_newline"
top_pad="0"
right="-1"
wrap="true" />
<text
follows="bottom|left"
height="15"
layout="topleft"
left="0"
name="folder_label"
top_pad="4"
value="Landmark location:"
width="120" />
<combo_box
follows="bottom|left|right"
height="23"
layout="topleft"
left_pad="0"
top_pad="-18"
name="folder_combo"
right="-1" />
</panel>
</layout_panel>
</layout_stack>
</panel>