Merge viewer-bear
commit
e8d4094d90
|
|
@ -3767,10 +3767,46 @@ void LLVolume::generateSilhouetteVertices(std::vector<LLVector3> &vertices,
|
|||
continue;
|
||||
}
|
||||
|
||||
if (face.mTypeMask & (LLVolumeFace::CAP_MASK)) {
|
||||
if (face.mTypeMask & (LLVolumeFace::CAP_MASK))
|
||||
{
|
||||
LLVector4a* v = (LLVector4a*)face.mPositions;
|
||||
LLVector4a* n = (LLVector4a*)face.mNormals;
|
||||
|
||||
for (U32 j = 0; j < face.mNumIndices / 3; j++)
|
||||
{
|
||||
for (S32 k = 0; k < 3; k++)
|
||||
{
|
||||
S32 index = face.mEdge[j * 3 + k];
|
||||
|
||||
if (index == -1)
|
||||
{
|
||||
// silhouette edge, currently only cubes, so no other conditions
|
||||
|
||||
S32 v1 = face.mIndices[j * 3 + k];
|
||||
S32 v2 = face.mIndices[j * 3 + ((k + 1) % 3)];
|
||||
|
||||
LLVector4a t;
|
||||
mat.affineTransform(v[v1], t);
|
||||
vertices.push_back(LLVector3(t[0], t[1], t[2]));
|
||||
|
||||
norm_mat.rotate(n[v1], t);
|
||||
|
||||
t.normalize3fast();
|
||||
normals.push_back(LLVector3(t[0], t[1], t[2]));
|
||||
|
||||
mat.affineTransform(v[v2], t);
|
||||
vertices.push_back(LLVector3(t[0], t[1], t[2]));
|
||||
|
||||
norm_mat.rotate(n[v2], t);
|
||||
t.normalize3fast();
|
||||
normals.push_back(LLVector3(t[0], t[1], t[2]));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
else
|
||||
{
|
||||
|
||||
//==============================================
|
||||
//DEBUG draw edge map instead of silhouette edge
|
||||
|
|
@ -5629,10 +5665,17 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
|
|||
if (!partial_build)
|
||||
{
|
||||
resizeIndices(grid_size*grid_size*6);
|
||||
if (!volume->isMeshAssetLoaded())
|
||||
{
|
||||
mEdge.resize(grid_size*grid_size * 6);
|
||||
}
|
||||
|
||||
U16* out = mIndices;
|
||||
|
||||
S32 idxs[] = {0,1,(grid_size+1)+1,(grid_size+1)+1,(grid_size+1),0};
|
||||
|
||||
int cur_edge = 0;
|
||||
|
||||
for(S32 gx = 0;gx<grid_size;gx++)
|
||||
{
|
||||
|
||||
|
|
@ -5643,7 +5686,49 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
|
|||
for(S32 i=5;i>=0;i--)
|
||||
{
|
||||
*out++ = ((gy*(grid_size+1))+gx+idxs[i]);
|
||||
}
|
||||
}
|
||||
|
||||
S32 edge_value = grid_size * 2 * gy + gx * 2;
|
||||
|
||||
if (gx > 0)
|
||||
{
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEdge[cur_edge++] = -1; // Mark face to higlight it
|
||||
}
|
||||
|
||||
if (gy < grid_size - 1)
|
||||
{
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEdge[cur_edge++] = -1;
|
||||
}
|
||||
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
|
||||
if (gx < grid_size - 1)
|
||||
{
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEdge[cur_edge++] = -1;
|
||||
}
|
||||
|
||||
if (gy > 0)
|
||||
{
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEdge[cur_edge++] = -1;
|
||||
}
|
||||
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -5651,8 +5736,50 @@ BOOL LLVolumeFace::createUnCutCubeCap(LLVolume* volume, BOOL partial_build)
|
|||
{
|
||||
*out++ = ((gy*(grid_size+1))+gx+idxs[i]);
|
||||
}
|
||||
|
||||
S32 edge_value = grid_size * 2 * gy + gx * 2;
|
||||
|
||||
if (gy > 0)
|
||||
{
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEdge[cur_edge++] = -1;
|
||||
}
|
||||
|
||||
if (gx < grid_size - 1)
|
||||
{
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEdge[cur_edge++] = -1;
|
||||
}
|
||||
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
|
||||
if (gy < grid_size - 1)
|
||||
{
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEdge[cur_edge++] = -1;
|
||||
}
|
||||
|
||||
if (gx > 0)
|
||||
{
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
else
|
||||
{
|
||||
mEdge[cur_edge++] = -1;
|
||||
}
|
||||
|
||||
mEdge[cur_edge++] = edge_value;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -610,6 +610,50 @@
|
|||
<key>Value</key>
|
||||
<integer>1</integer>
|
||||
</map>
|
||||
<key>ModelUploadFolder</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>All model uploads will be stored in this directory (UUID)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>TextureUploadFolder</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>All image(texture) uploads will be stored in this directory (UUID)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>SoundUploadFolder</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>All sound uploads will be stored in this directory (UUID)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
<key>AnimationUploadFolder</key>
|
||||
<map>
|
||||
<key>Comment</key>
|
||||
<string>All animation uploads will be stored in this directory (UUID)</string>
|
||||
<key>Persist</key>
|
||||
<integer>1</integer>
|
||||
<key>Type</key>
|
||||
<string>String</string>
|
||||
<key>Value</key>
|
||||
<string></string>
|
||||
</map>
|
||||
|
||||
<!-- Firestorm settings -->
|
||||
<key>DebugLookAt</key>
|
||||
|
|
|
|||
|
|
@ -67,6 +67,8 @@ public:
|
|||
void sortByType();
|
||||
void refresh();
|
||||
|
||||
U32 getMuteListSize() { return mMuteListSize; }
|
||||
|
||||
private:
|
||||
|
||||
void addNewItem(const LLMute* mute);
|
||||
|
|
|
|||
|
|
@ -379,8 +379,13 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
|
|||
|
||||
bool is_p2p = LLIMModel::LLIMSession::P2P_SESSION == stype;
|
||||
bool is_group = LLIMModel::LLIMSession::GROUP_SESSION == stype;
|
||||
bool is_group_member = is_group && gAgent.isInGroup(selected_id, TRUE);
|
||||
|
||||
if ("can_im" == command_name || "can_view_profile" == command_name)
|
||||
if ("can_im" == command_name)
|
||||
{
|
||||
return is_p2p || is_group_member;
|
||||
}
|
||||
else if ("can_view_profile" == command_name)
|
||||
{
|
||||
return is_p2p || is_group;
|
||||
}
|
||||
|
|
@ -390,7 +395,7 @@ bool LLConversationLogList::isActionEnabled(const LLSD& userdata)
|
|||
}
|
||||
else if ("can_call" == command_name)
|
||||
{
|
||||
return (is_p2p || is_group) && LLAvatarActions::canCall();
|
||||
return (is_p2p || is_group_member) && LLAvatarActions::canCall();
|
||||
}
|
||||
else if ("add_rem_friend" == command_name ||
|
||||
"can_invite_to_group" == command_name ||
|
||||
|
|
|
|||
|
|
@ -658,6 +658,11 @@ BOOL LLFloaterPreference::postBuild()
|
|||
|
||||
gSavedSettings.getControl("PreferredMaturity")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeMaturity, this));
|
||||
|
||||
gSavedPerAccountSettings.getControl("ModelUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeModelFolder, this));
|
||||
gSavedPerAccountSettings.getControl("TextureUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeTextureFolder, this));
|
||||
gSavedPerAccountSettings.getControl("SoundUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeSoundFolder, this));
|
||||
gSavedPerAccountSettings.getControl("AnimationUploadFolder")->getSignal()->connect(boost::bind(&LLFloaterPreference::onChangeAnimationFolder, this));
|
||||
|
||||
LLTabContainer* tabcontainer = getChild<LLTabContainer>("pref core");
|
||||
if (!tabcontainer->selectTab(gSavedSettings.getS32("LastPrefTab")))
|
||||
tabcontainer->selectFirstTab();
|
||||
|
|
@ -1149,7 +1154,12 @@ void LLFloaterPreference::onOpen(const LLSD& key)
|
|||
|
||||
// Display selected maturity icons.
|
||||
onChangeMaturity();
|
||||
|
||||
|
||||
onChangeModelFolder();
|
||||
onChangeTextureFolder();
|
||||
onChangeSoundFolder();
|
||||
onChangeAnimationFolder();
|
||||
|
||||
// Load (double-)click to walk/teleport settings.
|
||||
updateClickActionControls();
|
||||
|
||||
|
|
@ -3229,6 +3239,57 @@ void LLFloaterPreference::onChangeMaturity()
|
|||
getChild<LLIconCtrl>("rating_icon_adult")->setVisible(sim_access == SIM_ACCESS_ADULT);
|
||||
}
|
||||
|
||||
std::string get_category_path(LLUUID cat_id)
|
||||
{
|
||||
LLViewerInventoryCategory* cat = gInventory.getCategory(cat_id);
|
||||
if (cat->getParentUUID().notNull())
|
||||
{
|
||||
return get_category_path(cat->getParentUUID()) + " > " + cat->getName();
|
||||
}
|
||||
else
|
||||
{
|
||||
return cat->getName();
|
||||
}
|
||||
}
|
||||
|
||||
std::string get_category_path(LLFolderType::EType cat_type)
|
||||
{
|
||||
LLUUID cat_id = gInventory.findUserDefinedCategoryUUIDForType(cat_type);
|
||||
return get_category_path(cat_id);
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onChangeModelFolder()
|
||||
{
|
||||
if (gInventory.isInventoryUsable())
|
||||
{
|
||||
getChild<LLTextBox>("upload_models")->setText(get_category_path(LLFolderType::FT_OBJECT));
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onChangeTextureFolder()
|
||||
{
|
||||
if (gInventory.isInventoryUsable())
|
||||
{
|
||||
getChild<LLTextBox>("upload_textures")->setText(get_category_path(LLFolderType::FT_TEXTURE));
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onChangeSoundFolder()
|
||||
{
|
||||
if (gInventory.isInventoryUsable())
|
||||
{
|
||||
getChild<LLTextBox>("upload_sounds")->setText(get_category_path(LLFolderType::FT_SOUND));
|
||||
}
|
||||
}
|
||||
|
||||
void LLFloaterPreference::onChangeAnimationFolder()
|
||||
{
|
||||
if (gInventory.isInventoryUsable())
|
||||
{
|
||||
getChild<LLTextBox>("upload_animation")->setText(get_category_path(LLFolderType::FT_ANIMATION));
|
||||
}
|
||||
}
|
||||
|
||||
// FIXME: this will stop you from spawning the sidetray from preferences dialog on login screen
|
||||
// but the UI for this will still be enabled
|
||||
void LLFloaterPreference::onClickBlockList()
|
||||
|
|
|
|||
|
|
@ -242,6 +242,10 @@ public:
|
|||
void onCommitMusicEnabled();
|
||||
void applyResolution();
|
||||
void onChangeMaturity();
|
||||
void onChangeModelFolder();
|
||||
void onChangeTextureFolder();
|
||||
void onChangeSoundFolder();
|
||||
void onChangeAnimationFolder();
|
||||
void onClickBlockList();
|
||||
void onClickProxySettings();
|
||||
void onClickTranslationSettings();
|
||||
|
|
|
|||
|
|
@ -90,6 +90,38 @@ BOOL LLFloaterScriptDebug::postBuild()
|
|||
return FALSE;
|
||||
}
|
||||
|
||||
// <FS:Ansariel> Improved script debug floater
|
||||
//void LLFloaterScriptDebug::setVisible(BOOL visible)
|
||||
//{
|
||||
// if(visible)
|
||||
// {
|
||||
// LLFloaterScriptDebugOutput* floater_output = LLFloaterReg::findTypedInstance<LLFloaterScriptDebugOutput>("script_debug_output", LLUUID::null);
|
||||
// if (floater_output == NULL)
|
||||
// {
|
||||
// floater_output = dynamic_cast<LLFloaterScriptDebugOutput*>(LLFloaterReg::showInstance("script_debug_output", LLUUID::null, FALSE));
|
||||
// if (floater_output)
|
||||
// {
|
||||
// addFloater(floater_output, false);
|
||||
// }
|
||||
// }
|
||||
|
||||
// }
|
||||
// LLMultiFloater::setVisible(visible);
|
||||
//}
|
||||
|
||||
//void LLFloaterScriptDebug::closeFloater(bool app_quitting/* = false*/)
|
||||
//{
|
||||
// if(app_quitting)
|
||||
// {
|
||||
// LLMultiFloater::closeFloater(app_quitting);
|
||||
// }
|
||||
// else
|
||||
// {
|
||||
// setVisible(false);
|
||||
// }
|
||||
//}
|
||||
// </FS:Ansariel>
|
||||
|
||||
// <FS:Ansariel> Script debug icon
|
||||
//LLFloater* LLFloaterScriptDebug::addOutputWindow(const LLUUID &object_id)
|
||||
LLFloater* LLFloaterScriptDebug::addOutputWindow(const LLUUID& object_id, bool show /* = false */)
|
||||
|
|
@ -161,7 +193,7 @@ void LLFloaterScriptDebug::addScriptLine(const LLChat& chat)
|
|||
floater_label = chat.mFromName;
|
||||
}
|
||||
|
||||
addOutputWindow(LLUUID::null);
|
||||
addOutputWindow(LLUUID::null); // <FS:Ansariel> Improved script debug floater
|
||||
// <FS:Kadah> [FSllOwnerSayToScriptDebugWindow]
|
||||
// addOutputWindow(source_id);
|
||||
static LLCachedControl<U32> FSllOwnerSayRouting(gSavedSettings, "FSllOwnerSayToScriptDebugWindowRouting");
|
||||
|
|
|
|||
|
|
@ -39,7 +39,10 @@ public:
|
|||
LLFloaterScriptDebug(const LLSD& key);
|
||||
virtual ~LLFloaterScriptDebug();
|
||||
virtual BOOL postBuild();
|
||||
//virtual void setVisible(BOOL visible); // <FS:Ansariel> Improved script debug floater
|
||||
static void show(const LLUUID& object_id);
|
||||
|
||||
/*virtual*/ //void closeFloater(bool app_quitting = false); // <FS:Ansariel> Improved script debug floater
|
||||
// <FS:Kadah> [FSllOwnerSayToScriptDebugWindow]
|
||||
// static void addScriptLine(const std::string &utf8mesg, const std::string &user_name, const LLColor4& color, const LLUUID& source_id);
|
||||
static void addScriptLine(const LLChat& chat);
|
||||
|
|
|
|||
|
|
@ -4134,6 +4134,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
|
|||
disabled_items.push_back(std::string("New Gesture"));
|
||||
disabled_items.push_back(std::string("New Clothes"));
|
||||
disabled_items.push_back(std::string("New Body Parts"));
|
||||
disabled_items.push_back(std::string("upload_def"));
|
||||
}
|
||||
if (favorites == mUUID)
|
||||
{
|
||||
|
|
@ -4160,6 +4161,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
|
|||
disabled_items.push_back(std::string("New Gesture"));
|
||||
disabled_items.push_back(std::string("New Clothes"));
|
||||
disabled_items.push_back(std::string("New Body Parts"));
|
||||
disabled_items.push_back(std::string("upload_def"));
|
||||
}
|
||||
if (marketplace_listings_id == mUUID)
|
||||
{
|
||||
|
|
@ -4213,6 +4215,7 @@ void LLFolderBridge::buildContextMenuOptions(U32 flags, menuentry_vec_t& items
|
|||
items.push_back(std::string("New Gesture"));
|
||||
items.push_back(std::string("New Clothes"));
|
||||
items.push_back(std::string("New Body Parts"));
|
||||
items.push_back(std::string("upload_def"));
|
||||
}
|
||||
}
|
||||
getClipboardEntries(false, items, disabled_items, flags);
|
||||
|
|
|
|||
|
|
@ -539,6 +539,42 @@ const LLUUID LLInventoryModel::findCategoryUUIDForType(LLFolderType::EType prefe
|
|||
return findCategoryUUIDForTypeInRoot(preferred_type, create_folder, gInventory.getRootFolderID());
|
||||
}
|
||||
|
||||
const LLUUID LLInventoryModel::findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type)
|
||||
{
|
||||
LLUUID cat_id;
|
||||
switch (preferred_type)
|
||||
{
|
||||
case LLFolderType::FT_OBJECT:
|
||||
{
|
||||
cat_id = LLUUID(gSavedPerAccountSettings.getString("ModelUploadFolder"));
|
||||
break;
|
||||
}
|
||||
case LLFolderType::FT_TEXTURE:
|
||||
{
|
||||
cat_id = LLUUID(gSavedPerAccountSettings.getString("TextureUploadFolder"));
|
||||
break;
|
||||
}
|
||||
case LLFolderType::FT_SOUND:
|
||||
{
|
||||
cat_id = LLUUID(gSavedPerAccountSettings.getString("SoundUploadFolder"));
|
||||
break;
|
||||
}
|
||||
case LLFolderType::FT_ANIMATION:
|
||||
{
|
||||
cat_id = LLUUID(gSavedPerAccountSettings.getString("AnimationUploadFolder"));
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
if (cat_id.isNull() || !getCategory(cat_id))
|
||||
{
|
||||
cat_id = findCategoryUUIDForTypeInRoot(preferred_type, true, getRootFolderID());
|
||||
}
|
||||
return cat_id;
|
||||
}
|
||||
|
||||
const LLUUID LLInventoryModel::findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type, bool create_folder)
|
||||
{
|
||||
return findCategoryUUIDForTypeInRoot(preferred_type, create_folder, gInventory.getLibraryRootFolderID());
|
||||
|
|
|
|||
|
|
@ -312,6 +312,9 @@ public:
|
|||
// will search in the user's library folder instead of "My Inventory"
|
||||
const LLUUID findLibraryCategoryUUIDForType(LLFolderType::EType preferred_type,
|
||||
bool create_folder = true);
|
||||
// Returns user specified category for uploads, returns default id if there are no
|
||||
// user specified one or it does not exist, creates default category if it is missing.
|
||||
const LLUUID findUserDefinedCategoryUUIDForType(LLFolderType::EType preferred_type);
|
||||
|
||||
// Get whatever special folder this object is a child of, if any.
|
||||
const LLViewerInventoryCategory *getFirstNondefaultParent(const LLUUID& obj_id) const;
|
||||
|
|
|
|||
|
|
@ -178,8 +178,8 @@ LLInventoryPanel::LLInventoryPanel(const LLInventoryPanel::Params& p) :
|
|||
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&LLInventoryPanel::attachObject, this, _2));
|
||||
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&LLInventoryPanel::beginIMSession, this));
|
||||
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
|
||||
mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&LLInventoryPanel::fileUploadLocation, this, _2));
|
||||
mCommitCallbackRegistrar.add("Inventory.CustomAction", boost::bind(&LLInventoryPanel::onCustomAction, this, _2)); // <FS:Ansariel> Prevent warning "No callback found for: 'Inventory.CustomAction' in control: Find Links"
|
||||
|
||||
}
|
||||
|
||||
LLFolderView * LLInventoryPanel::createFolderRoot(LLUUID root_id )
|
||||
|
|
@ -1320,6 +1320,27 @@ bool LLInventoryPanel::beginIMSession()
|
|||
return true;
|
||||
}
|
||||
|
||||
void LLInventoryPanel::fileUploadLocation(const LLSD& userdata)
|
||||
{
|
||||
const std::string param = userdata.asString();
|
||||
if (param == "model")
|
||||
{
|
||||
gSavedPerAccountSettings.setString("ModelUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
|
||||
}
|
||||
else if (param == "texture")
|
||||
{
|
||||
gSavedPerAccountSettings.setString("TextureUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
|
||||
}
|
||||
else if (param == "sound")
|
||||
{
|
||||
gSavedPerAccountSettings.setString("SoundUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
|
||||
}
|
||||
else if (param == "animation")
|
||||
{
|
||||
gSavedPerAccountSettings.setString("AnimationUploadFolder", LLFolderBridge::sSelf.get()->getUUID().asString());
|
||||
}
|
||||
}
|
||||
|
||||
bool LLInventoryPanel::attachObject(const LLSD& userdata)
|
||||
{
|
||||
// Copy selected item UUIDs to a vector.
|
||||
|
|
|
|||
|
|
@ -210,6 +210,7 @@ public:
|
|||
void onCustomAction(const LLSD& userdata); // <FS:Ansariel> Prevent warning "No callback found for: 'Inventory.CustomAction' in control: Find Links"
|
||||
void doCreate(const LLSD& userdata);
|
||||
bool beginIMSession();
|
||||
void fileUploadLocation(const LLSD& userdata);
|
||||
bool attachObject(const LLSD& userdata);
|
||||
static void idle(void* user_data);
|
||||
|
||||
|
|
|
|||
|
|
@ -2036,8 +2036,8 @@ void LLMeshUploadThread::wholeModelToLLSD(LLSD& dest, bool include_textures)
|
|||
LLSD result;
|
||||
|
||||
LLSD res;
|
||||
result["folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_OBJECT);
|
||||
result["texture_folder_id"] = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
|
||||
result["folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_OBJECT);
|
||||
result["texture_folder_id"] = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
|
||||
result["asset_type"] = "mesh";
|
||||
result["inventory_type"] = "object";
|
||||
result["description"] = "(No Description)";
|
||||
|
|
@ -3582,11 +3582,11 @@ void LLMeshRepository::notifyLoadedMeshes()
|
|||
// Handle addition of texture, if any.
|
||||
if ( data.mResponse.has("new_texture_folder_id") )
|
||||
{
|
||||
const LLUUID& folder_id = data.mResponse["new_texture_folder_id"].asUUID();
|
||||
const LLUUID& new_folder_id = data.mResponse["new_texture_folder_id"].asUUID();
|
||||
|
||||
if ( folder_id.notNull() )
|
||||
if ( new_folder_id.notNull() )
|
||||
{
|
||||
LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TEXTURE);
|
||||
LLUUID parent_id = gInventory.findUserDefinedCategoryUUIDForType(LLFolderType::FT_TEXTURE);
|
||||
|
||||
std::string name;
|
||||
// Check if the server built a different name for the texture folder
|
||||
|
|
@ -3601,7 +3601,7 @@ void LLMeshRepository::notifyLoadedMeshes()
|
|||
|
||||
// Add the category to the internal representation
|
||||
LLPointer<LLViewerInventoryCategory> cat =
|
||||
new LLViewerInventoryCategory(folder_id, parent_id,
|
||||
new LLViewerInventoryCategory(new_folder_id, parent_id,
|
||||
LLFolderType::FT_NONE, name, gAgent.getID());
|
||||
cat->setVersion(LLViewerInventoryCategory::VERSION_UNKNOWN);
|
||||
|
||||
|
|
|
|||
|
|
@ -146,6 +146,9 @@ void LLPanelBlockedList::updateButtons()
|
|||
bool hasSelected = NULL != mBlockedList->getSelectedItem();
|
||||
getChildView("unblock_btn")->setEnabled(hasSelected);
|
||||
getChildView("blocked_gear_btn")->setEnabled(hasSelected);
|
||||
|
||||
getChild<LLUICtrl>("block_limit")->setTextArg("[COUNT]", llformat("%d", mBlockedList->getMuteListSize()));
|
||||
getChild<LLUICtrl>("block_limit")->setTextArg("[LIMIT]", llformat("%d", gSavedSettings.getS32("MuteListLimit")));
|
||||
}
|
||||
|
||||
void LLPanelBlockedList::unblockItem()
|
||||
|
|
|
|||
|
|
@ -750,7 +750,7 @@ void LLPanelFace::getState()
|
|||
updateUI();
|
||||
}
|
||||
|
||||
void LLPanelFace::updateUI()
|
||||
void LLPanelFace::updateUI(bool force_set_values /*false*/)
|
||||
{ //set state of UI to match state of texture entry(ies) (calls setEnabled, setValue, etc, but NOT setVisible)
|
||||
LLViewerObject* objectp = LLSelectMgr::getInstance()->getSelection()->getFirstObject();
|
||||
|
||||
|
|
@ -1146,7 +1146,14 @@ void LLPanelFace::updateUI()
|
|||
mCtrlBumpyScaleV->setEnabled(editable && normmap_id.notNull()
|
||||
&& enable_material_controls); // <FS:CR> Materials alignment
|
||||
|
||||
mCtrlTexScaleV->setValue(diff_scale_t);
|
||||
if (force_set_values)
|
||||
{
|
||||
mCtrlTexScaleV->forceSetValue(diff_scale_t);
|
||||
}
|
||||
else
|
||||
{
|
||||
mCtrlTexScaleV->setValue(diff_scale_t);
|
||||
}
|
||||
mCtrlShinyScaleV->setValue(norm_scale_t);
|
||||
mCtrlBumpyScaleV->setValue(spec_scale_t);
|
||||
|
||||
|
|
@ -1366,9 +1373,18 @@ void LLPanelFace::updateUI()
|
|||
BOOL repeats_tentative = !identical_repeats;
|
||||
|
||||
mCtrlRpt->setEnabled(identical_planar_texgen ? FALSE : enabled);
|
||||
mCtrlRpt->setValue(editable ? repeats : 1.0f);
|
||||
//LLSpinCtrl* rpt_ctrl = getChild<LLSpinCtrl>("rptctrl");
|
||||
if (force_set_values)
|
||||
{
|
||||
//onCommit, previosly edited element updates related ones
|
||||
mCtrlRpt->forceSetValue(editable ? repeats : 1.0f);
|
||||
}
|
||||
else
|
||||
{
|
||||
mCtrlRpt->setValue(editable ? repeats : 1.0f);
|
||||
}
|
||||
mCtrlRpt->setTentative(LLSD(repeats_tentative));
|
||||
|
||||
|
||||
// <FS:CR> FIRE-11407 - Flip buttons
|
||||
getChildView("flipTextureScaleU")->setEnabled(enabled);
|
||||
getChildView("flipTextureScaleV")->setEnabled(enabled);
|
||||
|
|
@ -2115,6 +2131,8 @@ void LLPanelFace::onCommitTextureInfo( LLUICtrl* ctrl, void* userdata )
|
|||
{
|
||||
LLPanelFace* self = (LLPanelFace*) userdata;
|
||||
self->sendTextureInfo();
|
||||
// vertical scale and repeats per meter depends on each other, so force set on changes
|
||||
self->updateUI(true);
|
||||
// <FS:CR> Materials alignment
|
||||
if (gSavedSettings.getBOOL("FSSyncronizeTextureMaps"))
|
||||
{
|
||||
|
|
@ -2185,6 +2203,8 @@ void LLPanelFace::onCommitRepeatsPerMeter(LLUICtrl* ctrl, void* userdata)
|
|||
llassert(false);
|
||||
break;
|
||||
}
|
||||
// vertical scale and repeats per meter depends on each other, so force set on changes
|
||||
self->updateUI(true);
|
||||
}
|
||||
|
||||
struct LLPanelFaceSetMediaFunctor : public LLSelectedTEFunctor
|
||||
|
|
|
|||
|
|
@ -154,7 +154,8 @@ protected:
|
|||
// Make UI reflect state of currently selected material (refresh)
|
||||
// and UI mode (e.g. editing normal map v diffuse map)
|
||||
//
|
||||
void updateUI();
|
||||
// @param force_set_values forces spinners to set value even if they are focused
|
||||
void updateUI(bool force_set_values = false);
|
||||
|
||||
// Convenience func to determine if all faces in selection have
|
||||
// identical planar texgen settings during edits
|
||||
|
|
|
|||
|
|
@ -1655,6 +1655,7 @@ LLPanelObjectInventory::LLPanelObjectInventory(const LLPanelObjectInventory::Par
|
|||
mCommitCallbackRegistrar.add("Inventory.AttachObject", boost::bind(&do_nothing));
|
||||
mCommitCallbackRegistrar.add("Inventory.BeginIMSession", boost::bind(&do_nothing));
|
||||
mCommitCallbackRegistrar.add("Inventory.Share", boost::bind(&LLAvatarActions::shareWithAvatars, this));
|
||||
mCommitCallbackRegistrar.add("Inventory.FileUploadLocation", boost::bind(&do_nothing));
|
||||
mCommitCallbackRegistrar.add("Inventory.CustomAction", boost::bind(&do_nothing)); // <FS:Ansariel> Prevent warning "No callback found for: 'Inventory.CustomAction' in control: Find Links"
|
||||
}
|
||||
|
||||
|
|
@ -2000,6 +2001,7 @@ void LLPanelObjectInventory::refresh()
|
|||
if(mTaskUUID != object->mID)
|
||||
{
|
||||
mTaskUUID = object->mID;
|
||||
mAttachmentUUID = object->getAttachmentItemID();
|
||||
make_request = TRUE;
|
||||
|
||||
// This is a new object so pre-emptively clear the contents
|
||||
|
|
@ -2009,6 +2011,16 @@ void LLPanelObjectInventory::refresh()
|
|||
// Register for updates from this object,
|
||||
registerVOInventoryListener(object,NULL);
|
||||
}
|
||||
else if (mAttachmentUUID != object->getAttachmentItemID())
|
||||
{
|
||||
mAttachmentUUID = object->getAttachmentItemID();
|
||||
if (mAttachmentUUID.notNull())
|
||||
{
|
||||
// Server unsubsribes viewer (deselects object) from property
|
||||
// updates after "ObjectAttach" so we need to resubscribe
|
||||
LLSelectMgr::getInstance()->sendSelect();
|
||||
}
|
||||
}
|
||||
|
||||
// Based on the node information, we may need to dirty the
|
||||
// object inventory and get it again.
|
||||
|
|
@ -2039,6 +2051,7 @@ void LLPanelObjectInventory::refresh()
|
|||
void LLPanelObjectInventory::clearInventoryTask()
|
||||
{
|
||||
mTaskUUID = LLUUID::null;
|
||||
mAttachmentUUID = LLUUID::null;
|
||||
removeVOInventoryListener();
|
||||
clearContents();
|
||||
}
|
||||
|
|
|
|||
|
|
@ -108,6 +108,7 @@ private:
|
|||
LLFolderView* mFolders;
|
||||
|
||||
LLUUID mTaskUUID;
|
||||
LLUUID mAttachmentUUID;
|
||||
BOOL mHaveInventory;
|
||||
BOOL mIsInventoryEmpty;
|
||||
BOOL mInventoryNeedsUpdate;
|
||||
|
|
|
|||
|
|
@ -4576,6 +4576,9 @@ void LLSelectMgr::sendAttach(U8 attachment_point, bool replace)
|
|||
SEND_ONLY_ROOTS );
|
||||
if (!build_mode)
|
||||
{
|
||||
// After "ObjectAttach" server will unsubscribe us from properties updates
|
||||
// so either deselect objects or resend selection after attach packet reaches server
|
||||
// In case of build_mode LLPanelObjectInventory::refresh() will deal with selection
|
||||
deselectAll();
|
||||
}
|
||||
}
|
||||
|
|
@ -7385,7 +7388,7 @@ F32 LLObjectSelection::getSelectedLinksetCost()
|
|||
LLSelectNode* node = *iter;
|
||||
LLViewerObject* object = node->getObject();
|
||||
|
||||
if (object)
|
||||
if (object && !object->isAttachment())
|
||||
{
|
||||
LLViewerObject* root = static_cast<LLViewerObject*>(object->getRoot());
|
||||
if (root)
|
||||
|
|
|
|||
|
|
@ -818,23 +818,7 @@ void LLSidepanelItemInfo::onCommitName()
|
|||
{
|
||||
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
|
||||
new_item->rename(labelItemName->getText());
|
||||
if(mObjectID.isNull())
|
||||
{
|
||||
new_item->updateServer(FALSE);
|
||||
gInventory.updateItem(new_item);
|
||||
gInventory.notifyObservers();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLViewerObject* object = gObjectList.findObject(mObjectID);
|
||||
if(object)
|
||||
{
|
||||
object->updateInventory(
|
||||
new_item,
|
||||
TASK_INVENTORY_ITEM_KEY,
|
||||
false);
|
||||
}
|
||||
}
|
||||
onCommitChanges(new_item);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -855,23 +839,7 @@ void LLSidepanelItemInfo::onCommitDescription()
|
|||
LLPointer<LLViewerInventoryItem> new_item = new LLViewerInventoryItem(item);
|
||||
|
||||
new_item->setDescription(labelItemDesc->getText());
|
||||
if(mObjectID.isNull())
|
||||
{
|
||||
new_item->updateServer(FALSE);
|
||||
gInventory.updateItem(new_item);
|
||||
gInventory.notifyObservers();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLViewerObject* object = gObjectList.findObject(mObjectID);
|
||||
if(object)
|
||||
{
|
||||
object->updateInventory(
|
||||
new_item,
|
||||
TASK_INVENTORY_ITEM_KEY,
|
||||
false);
|
||||
}
|
||||
}
|
||||
onCommitChanges(new_item);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -947,23 +915,7 @@ void LLSidepanelItemInfo::onCommitPermissions()
|
|||
flags |= LLInventoryItemFlags::II_FLAGS_OBJECT_PERM_OVERWRITE_GROUP;
|
||||
}
|
||||
new_item->setFlags(flags);
|
||||
if(mObjectID.isNull())
|
||||
{
|
||||
new_item->updateServer(FALSE);
|
||||
gInventory.updateItem(new_item);
|
||||
gInventory.notifyObservers();
|
||||
}
|
||||
else
|
||||
{
|
||||
LLViewerObject* object = gObjectList.findObject(mObjectID);
|
||||
if(object)
|
||||
{
|
||||
object->updateInventory(
|
||||
new_item,
|
||||
TASK_INVENTORY_ITEM_KEY,
|
||||
false);
|
||||
}
|
||||
}
|
||||
onCommitChanges(new_item);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1047,25 +999,7 @@ void LLSidepanelItemInfo::updateSaleInfo()
|
|||
}
|
||||
|
||||
new_item->setSaleInfo(sale_info);
|
||||
if(mObjectID.isNull())
|
||||
{
|
||||
// This is in the agent's inventory.
|
||||
new_item->updateServer(FALSE);
|
||||
gInventory.updateItem(new_item);
|
||||
gInventory.notifyObservers();
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is in an object's contents.
|
||||
LLViewerObject* object = gObjectList.findObject(mObjectID);
|
||||
if(object)
|
||||
{
|
||||
object->updateInventory(
|
||||
new_item,
|
||||
TASK_INVENTORY_ITEM_KEY,
|
||||
false);
|
||||
}
|
||||
}
|
||||
onCommitChanges(new_item);
|
||||
}
|
||||
else
|
||||
{
|
||||
|
|
@ -1074,6 +1008,45 @@ void LLSidepanelItemInfo::updateSaleInfo()
|
|||
}
|
||||
}
|
||||
|
||||
void LLSidepanelItemInfo::onCommitChanges(LLPointer<LLViewerInventoryItem> item)
|
||||
{
|
||||
if (item.isNull())
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (mObjectID.isNull())
|
||||
{
|
||||
// This is in the agent's inventory.
|
||||
item->updateServer(FALSE);
|
||||
gInventory.updateItem(item);
|
||||
gInventory.notifyObservers();
|
||||
}
|
||||
else
|
||||
{
|
||||
// This is in an object's contents.
|
||||
LLViewerObject* object = gObjectList.findObject(mObjectID);
|
||||
if (object)
|
||||
{
|
||||
object->updateInventory(
|
||||
item,
|
||||
TASK_INVENTORY_ITEM_KEY,
|
||||
false);
|
||||
|
||||
if (object->isSelected())
|
||||
{
|
||||
// Since object is selected (build floater is open) object will
|
||||
// receive properties update, detect serial mismatch, dirty and
|
||||
// reload inventory, meanwhile some other updates will refresh it.
|
||||
// So mark dirty early, this will prevent unnecessary changes
|
||||
// and download will be triggered by LLPanelObjectInventory - it
|
||||
// prevents flashing in content tab and some duplicated request.
|
||||
object->dirtyInventory();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
LLViewerInventoryItem* LLSidepanelItemInfo::findItem() const
|
||||
{
|
||||
LLViewerInventoryItem* item = NULL;
|
||||
|
|
|
|||
|
|
@ -89,6 +89,7 @@ protected:
|
|||
void onCommitSaleInfo();
|
||||
void onCommitSaleType();
|
||||
void updateSaleInfo();
|
||||
void onCommitChanges(LLPointer<LLViewerInventoryItem> item);
|
||||
};
|
||||
|
||||
#endif // LL_LLSIDEPANELITEMINFO_H
|
||||
|
|
|
|||
|
|
@ -3053,7 +3053,7 @@ void login_callback(S32 option, void *userdata)
|
|||
void show_release_notes_if_required()
|
||||
{
|
||||
if (LLVersionInfo::getChannelAndVersion() != gLastRunVersion
|
||||
&& LLVersionInfo::getChannel() != "Second Life Test" // don't show Release Notes for the test builds
|
||||
&& LLVersionInfo::getViewerMaturity() != LLVersionInfo::TEST_VIEWER // don't show Release Notes for the test builds
|
||||
&& gSavedSettings.getBOOL("UpdaterShowReleaseNotes")
|
||||
&& !gSavedSettings.getBOOL("FirstLoginThisInstall"))
|
||||
{
|
||||
|
|
|
|||
|
|
@ -310,10 +310,9 @@ void LLResourceUploadInfo::assignDefaults()
|
|||
mDescription = "(No Description)";
|
||||
}
|
||||
|
||||
mFolderId = gInventory.findCategoryUUIDForType(
|
||||
mFolderId = gInventory.findUserDefinedCategoryUUIDForType(
|
||||
(mDestinationFolderType == LLFolderType::FT_NONE) ?
|
||||
(LLFolderType::EType)mAssetType : mDestinationFolderType);
|
||||
|
||||
}
|
||||
|
||||
std::string LLResourceUploadInfo::getDisplayName() const
|
||||
|
|
|
|||
|
|
@ -204,5 +204,12 @@
|
|||
layout="topleft"
|
||||
help_topic="preferences_backup_tab"
|
||||
name="backup" />
|
||||
<panel
|
||||
class="panel_preference"
|
||||
filename="panel_preferences_uploads.xml"
|
||||
label="Uploads"
|
||||
layout="topleft"
|
||||
help_topic="preferences_uploads_tab"
|
||||
name="uploads" />
|
||||
</tab_container>
|
||||
</floater>
|
||||
|
|
|
|||
|
|
@ -1,7 +1,6 @@
|
|||
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
|
||||
<multi_floater
|
||||
single_instance="true"
|
||||
reuse_instance="true"
|
||||
can_resize="true"
|
||||
height="233"
|
||||
layout="topleft"
|
||||
|
|
@ -9,6 +8,7 @@
|
|||
help_topic="script_debug_floater"
|
||||
save_rect="true"
|
||||
title="Script Warning/Error/Debug"
|
||||
reuse_instance="true"
|
||||
width="450">
|
||||
<tab_container
|
||||
background_visible="false"
|
||||
|
|
|
|||
|
|
@ -321,6 +321,43 @@
|
|||
parameter="eyes" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
<menu
|
||||
label="Use as default for"
|
||||
layout="topleft"
|
||||
name="upload_def">
|
||||
<menu_item_call
|
||||
label="Image uploads"
|
||||
layout="topleft"
|
||||
name="Image uploads">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.FileUploadLocation"
|
||||
parameter="texture" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Sound uploads"
|
||||
layout="topleft"
|
||||
name="Sound uploads">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.FileUploadLocation"
|
||||
parameter="sound" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Animation uploads"
|
||||
layout="topleft"
|
||||
name="Animation uploads">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.FileUploadLocation"
|
||||
parameter="animation" />
|
||||
</menu_item_call>
|
||||
<menu_item_call
|
||||
label="Model uploads"
|
||||
layout="topleft"
|
||||
name="Model uploads">
|
||||
<menu_item_call.on_click
|
||||
function="Inventory.FileUploadLocation"
|
||||
parameter="model" />
|
||||
</menu_item_call>
|
||||
</menu>
|
||||
<menu
|
||||
label="Change Type"
|
||||
layout="topleft"
|
||||
|
|
|
|||
|
|
@ -11042,29 +11042,29 @@ Eject failed because you don't have admin permission for that parcel.
|
|||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="CantMoveObjectParcelFull"
|
||||
name="CMOParcelFull"
|
||||
type="notify">
|
||||
<tag>fail</tag>
|
||||
Can't move object '[OBJECT_NAME]' to
|
||||
[OBJ_POSITION] in region [REGION_NAME] because the parcel is full.
|
||||
Can't move object '[O]' to
|
||||
[P] in region [R] because the parcel is full.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="CantMoveObjectParcelPerms"
|
||||
name="CMOParcelPerms"
|
||||
type="notify">
|
||||
<tag>fail</tag>
|
||||
Can't move object '[OBJECT_NAME]' to
|
||||
[OBJ_POSITION] in region [REGION_NAME] because your objects are not allowed on this parcel.
|
||||
Can't move object '[O]' to
|
||||
[P] in region [R] because your objects are not allowed on this parcel.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="CantMoveObjectParcelResources"
|
||||
name="CMOParcelResources"
|
||||
type="notify">
|
||||
<tag>fail</tag>
|
||||
Can't move object '[OBJECT_NAME]' to
|
||||
[OBJ_POSITION] in region [REGION_NAME] because there are not enough resources for this object on this parcel.
|
||||
Can't move object '[O]' to
|
||||
[P] in region [R] because there are not enough resources for this object on this parcel.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
|
|
@ -11077,29 +11077,29 @@ Copy failed because you lack access to that parcel.
|
|||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="CantMoveObjectRegionVersion"
|
||||
name="CMORegionVersion"
|
||||
type="notify">
|
||||
<tag>fail</tag>
|
||||
Can't move object '[OBJECT_NAME]' to
|
||||
[OBJ_POSITION] in region [REGION_NAME] because the other region is running an older version which does not support receiving this object via region crossing.
|
||||
<tag>fail</tag>
|
||||
Can't move object '[O]' to
|
||||
[P] in region [R] because the other region is running an older version which does not support receiving this object via region crossing.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="CantMoveObjectNavMesh"
|
||||
name="CMONavMesh"
|
||||
type="notify">
|
||||
<tag>fail</tag>
|
||||
Can't move object '[OBJECT_NAME]' to
|
||||
[OBJ_POSITION] in region [REGION_NAME] because you cannot modify the navmesh across region boundaries.
|
||||
Can't move object '[O]' to
|
||||
[P] in region [R] because you cannot modify the navmesh across region boundaries.
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
icon="alertmodal.tga"
|
||||
name="CantMoveObjectWTF"
|
||||
name="CMOWTF"
|
||||
type="notify">
|
||||
<tag>fail</tag>
|
||||
Can't move object '[OBJECT_NAME]' to
|
||||
[OBJ_POSITION] in region [REGION_NAME] because of an unknown reason. ([FAILURE_TYPE])
|
||||
Can't move object '[O]' to
|
||||
[P] in region [R] because of an unknown reason. ([F])
|
||||
</notification>
|
||||
|
||||
<notification
|
||||
|
|
|
|||
|
|
@ -88,13 +88,26 @@
|
|||
top_delta="0"
|
||||
width="31"/>
|
||||
</panel>
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top|right"
|
||||
height="14"
|
||||
layout="topleft"
|
||||
right="-10"
|
||||
top_pad="4"
|
||||
left="3"
|
||||
use_ellipses="true"
|
||||
name="block_limit">
|
||||
[COUNT] entries in your block list, and the limit is [LIMIT].
|
||||
</text>
|
||||
<block_list
|
||||
follows="all"
|
||||
height="273"
|
||||
height="255"
|
||||
layout="topleft"
|
||||
left="3"
|
||||
name="blocked"
|
||||
tool_tip="List of currently blocked Residents"
|
||||
top="31"
|
||||
top_pad="4"
|
||||
right="-1"/>
|
||||
</panel>
|
||||
|
|
|
|||
|
|
@ -0,0 +1,135 @@
|
|||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<panel
|
||||
border="true"
|
||||
follows="all"
|
||||
height="408"
|
||||
label="Uploads"
|
||||
layout="topleft"
|
||||
left="102"
|
||||
name="uploads"
|
||||
top="1"
|
||||
width="517">
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="12"
|
||||
layout="topleft"
|
||||
left="33"
|
||||
name="title"
|
||||
top_pad="10"
|
||||
width="250">
|
||||
Current destination folders for uploads
|
||||
</text>
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="12"
|
||||
layout="topleft"
|
||||
left="37"
|
||||
name="title_models"
|
||||
top_pad="17"
|
||||
width="100">
|
||||
Images
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
use_ellipses="true"
|
||||
follows="left|top"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
font.style="BOLD"
|
||||
left="37"
|
||||
name="upload_textures"
|
||||
top_pad="5"
|
||||
width="350" />
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="12"
|
||||
layout="topleft"
|
||||
left="37"
|
||||
name="title_sounds"
|
||||
top_pad="7"
|
||||
width="100">
|
||||
Sounds
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
use_ellipses="true"
|
||||
follows="left|top"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
font.style="BOLD"
|
||||
left="37"
|
||||
name="upload_sounds"
|
||||
top_pad="5"
|
||||
width="350" />
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="12"
|
||||
layout="topleft"
|
||||
left="37"
|
||||
name="title_animation"
|
||||
top_pad="7"
|
||||
width="100">
|
||||
Animations
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
use_ellipses="true"
|
||||
follows="left|top"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
font.style="BOLD"
|
||||
left="37"
|
||||
name="upload_animation"
|
||||
top_pad="5"
|
||||
width="350" />
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="12"
|
||||
layout="topleft"
|
||||
left="37"
|
||||
name="title_animation"
|
||||
top_pad="7"
|
||||
width="100">
|
||||
Models
|
||||
</text>
|
||||
<text
|
||||
type="string"
|
||||
use_ellipses="true"
|
||||
follows="left|top"
|
||||
height="23"
|
||||
layout="topleft"
|
||||
font.style="BOLD"
|
||||
left="37"
|
||||
name="upload_models"
|
||||
top_pad="5"
|
||||
width="350" />
|
||||
|
||||
<text
|
||||
type="string"
|
||||
length="1"
|
||||
follows="left|top"
|
||||
height="30"
|
||||
layout="topleft"
|
||||
font.style="ITALIC"
|
||||
left="33"
|
||||
name="upload_help"
|
||||
top_pad="6"
|
||||
width="387">
|
||||
To change a destination folder, right click on it in inventory and choose
|
||||
"Use as default for"
|
||||
</text>
|
||||
</panel>
|
||||
Loading…
Reference in New Issue