Merge branch 'master' of https://github.com/FirestormViewer/phoenix-firestorm
commit
1002a28e39
|
|
@ -660,7 +660,7 @@ bool LLAudioEngine::preloadSound(const LLUUID &uuid)
|
||||||
LL_DEBUGS("AudioEngine")<<"( "<<uuid<<" )"<<LL_ENDL;
|
LL_DEBUGS("AudioEngine")<<"( "<<uuid<<" )"<<LL_ENDL;
|
||||||
|
|
||||||
// <FS:ND> Protect against corrupted sounds. Just do a quick exit instead of trying to preload over and over again.
|
// <FS:ND> Protect against corrupted sounds. Just do a quick exit instead of trying to preload over and over again.
|
||||||
if( gAudiop->isCorruptSound( uuid ) )
|
if (gAudiop && gAudiop->isCorruptSound(uuid))
|
||||||
return false;
|
return false;
|
||||||
// </FS:ND>
|
// </FS:ND>
|
||||||
|
|
||||||
|
|
@ -1317,7 +1317,7 @@ std::map<LLUUID, LLSoundHistoryItem> gSoundHistory;
|
||||||
void LLAudioSource::logSoundPlay(const LLUUID& id, LLVector3d position, S32 type, const LLUUID& assetid, const LLUUID& ownerid, const LLUUID& sourceid, bool is_trigger, bool is_looped)
|
void LLAudioSource::logSoundPlay(const LLUUID& id, LLVector3d position, S32 type, const LLUUID& assetid, const LLUUID& ownerid, const LLUUID& sourceid, bool is_trigger, bool is_looped)
|
||||||
{
|
{
|
||||||
// <FS:ND> Corrupt asset, do not bother
|
// <FS:ND> Corrupt asset, do not bother
|
||||||
if( gAudiop->isCorruptSound( assetid ) )
|
if (gAudiop && gAudiop->isCorruptSound(assetid))
|
||||||
return;
|
return;
|
||||||
// </FS:ND>
|
// </FS:ND>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -1073,7 +1073,13 @@ bool LLInventoryItem::fromLLSD(const LLSD& sd, bool is_new)
|
||||||
// TODO - figure out if this should be moved into the noclobber fields above
|
// TODO - figure out if this should be moved into the noclobber fields above
|
||||||
mThumbnailUUID.setNull();
|
mThumbnailUUID.setNull();
|
||||||
mFavorite = false;
|
mFavorite = false;
|
||||||
mPermissions.init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null);
|
// <FS:TJ> [FIRE-36028] Fix OpenSim object permissions
|
||||||
|
//mPermissions.init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null);
|
||||||
|
if (!LLPermissions::getIsInOpenSim())
|
||||||
|
{
|
||||||
|
mPermissions.init(LLUUID::null, LLUUID::null, LLUUID::null, LLUUID::null);
|
||||||
|
}
|
||||||
|
// </FS:TJ>
|
||||||
|
|
||||||
// iterate as map to avoid making unnecessary temp copies of everything
|
// iterate as map to avoid making unnecessary temp copies of everything
|
||||||
LLSD::map_const_iterator i, end;
|
LLSD::map_const_iterator i, end;
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,8 @@
|
||||||
|
|
||||||
const LLPermissions LLPermissions::DEFAULT;
|
const LLPermissions LLPermissions::DEFAULT;
|
||||||
|
|
||||||
|
bool LLPermissions::sIsInOpenSim = false; // <FS:TJ/> [FIRE-36028] Fix OpenSim object permissions
|
||||||
|
|
||||||
// No creator = created by system
|
// No creator = created by system
|
||||||
LLPermissions::LLPermissions()
|
LLPermissions::LLPermissions()
|
||||||
{
|
{
|
||||||
|
|
|
||||||
|
|
@ -103,6 +103,8 @@ private:
|
||||||
// values.
|
// values.
|
||||||
bool mIsGroupOwned;
|
bool mIsGroupOwned;
|
||||||
|
|
||||||
|
static bool sIsInOpenSim; // <FS:TJ/> [FIRE-36028] Fix OpenSim object permissions
|
||||||
|
|
||||||
// Correct for fair use - you can never take away the right to
|
// Correct for fair use - you can never take away the right to
|
||||||
// move stuff you own, and you can never take away the right to
|
// move stuff you own, and you can never take away the right to
|
||||||
// transfer something you cannot otherwise copy.
|
// transfer something you cannot otherwise copy.
|
||||||
|
|
@ -288,6 +290,11 @@ public:
|
||||||
inline bool allowOpenSimExportBy(const LLUUID& agent_id) const; // <FS:CR> OpenSim export permission
|
inline bool allowOpenSimExportBy(const LLUUID& agent_id) const; // <FS:CR> OpenSim export permission
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// <FS:TJ> [FIRE-36028] Fix OpenSim object permissions
|
||||||
|
static bool getIsInOpenSim() { return sIsInOpenSim; }
|
||||||
|
static void setupIsInOpenSim(bool is_in_open_sim) { sIsInOpenSim = is_in_open_sim; }
|
||||||
|
// </FS:TJ>
|
||||||
|
|
||||||
//
|
//
|
||||||
// MISC METHODS and OPERATORS
|
// MISC METHODS and OPERATORS
|
||||||
//
|
//
|
||||||
|
|
|
||||||
|
|
@ -303,8 +303,11 @@ void LLAccordionCtrl::ctrlSetLeftTopAndSize(LLView* panel, S32 left, S32 top, S3
|
||||||
return;
|
return;
|
||||||
LLRect panel_rect = panel->getRect();
|
LLRect panel_rect = panel->getRect();
|
||||||
panel_rect.setLeftTopAndSize( left, top, width, height);
|
panel_rect.setLeftTopAndSize( left, top, width, height);
|
||||||
panel->reshape( width, height, 1);
|
if (panel->getRect() != panel_rect)
|
||||||
panel->setRect(panel_rect);
|
{
|
||||||
|
panel->reshape( width, height, 1);
|
||||||
|
panel->setRect(panel_rect);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLAccordionCtrl::ctrlShiftVertical(LLView* panel, S32 delta)
|
void LLAccordionCtrl::ctrlShiftVertical(LLView* panel, S32 delta)
|
||||||
|
|
@ -494,6 +497,7 @@ void LLAccordionCtrl::arrangeMultiple()
|
||||||
|
|
||||||
void LLAccordionCtrl::arrange()
|
void LLAccordionCtrl::arrange()
|
||||||
{
|
{
|
||||||
|
LL_PROFILE_ZONE_SCOPED;
|
||||||
updateNoTabsHelpTextVisibility();
|
updateNoTabsHelpTextVisibility();
|
||||||
|
|
||||||
if (mAccordionTabs.empty())
|
if (mAccordionTabs.empty())
|
||||||
|
|
|
||||||
|
|
@ -248,10 +248,22 @@ void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::draw()
|
||||||
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::reshape(S32 width, S32 height, bool called_from_parent /* = true */)
|
void LLAccordionCtrlTab::LLAccordionCtrlTabHeader::reshape(S32 width, S32 height, bool called_from_parent /* = true */)
|
||||||
{
|
{
|
||||||
S32 header_height = mHeaderTextbox->getTextPixelHeight();
|
S32 header_height = mHeaderTextbox->getTextPixelHeight();
|
||||||
|
LLRect old_header_rect = mHeaderTextbox->getRect();
|
||||||
|
|
||||||
LLRect textboxRect(HEADER_TEXT_LEFT_OFFSET, (height + header_height) / 2, width, (height - header_height) / 2);
|
LLRect textboxRect(HEADER_TEXT_LEFT_OFFSET, (height + header_height) / 2, width, (height - header_height) / 2);
|
||||||
mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight());
|
if (old_header_rect.getHeight() != textboxRect.getHeight()
|
||||||
mHeaderTextbox->setRect(textboxRect);
|
|| old_header_rect.mLeft != textboxRect.mLeft
|
||||||
|
|| old_header_rect.mTop != textboxRect.mTop
|
||||||
|
|| old_header_rect.getWidth() > textboxRect.getWidth() // reducing header's width
|
||||||
|
|| (old_header_rect.getWidth() < textboxRect.getWidth() && old_header_rect.getWidth() < mHeaderTextbox->getTextPixelWidth()))
|
||||||
|
{
|
||||||
|
// Expensive text reflow
|
||||||
|
// Update if position or height changes
|
||||||
|
// Update if width reduces
|
||||||
|
// But do not update if text already fits and width increases (arguably LLTextBox::reshape should be smarter, not Accordion)
|
||||||
|
mHeaderTextbox->reshape(textboxRect.getWidth(), textboxRect.getHeight());
|
||||||
|
mHeaderTextbox->setRect(textboxRect);
|
||||||
|
}
|
||||||
|
|
||||||
if (mHeaderTextbox->getTextPixelWidth() > mHeaderTextbox->getRect().getWidth())
|
if (mHeaderTextbox->getTextPixelWidth() > mHeaderTextbox->getRect().getWidth())
|
||||||
{
|
{
|
||||||
|
|
@ -416,8 +428,11 @@ void LLAccordionCtrlTab::reshape(S32 width, S32 height, bool called_from_parent
|
||||||
LLRect headerRect;
|
LLRect headerRect;
|
||||||
|
|
||||||
headerRect.setLeftTopAndSize(0, height, width, HEADER_HEIGHT);
|
headerRect.setLeftTopAndSize(0, height, width, HEADER_HEIGHT);
|
||||||
mHeader->setRect(headerRect);
|
if (mHeader->getRect() != headerRect)
|
||||||
mHeader->reshape(headerRect.getWidth(), headerRect.getHeight());
|
{
|
||||||
|
mHeader->setRect(headerRect);
|
||||||
|
mHeader->reshape(headerRect.getWidth(), headerRect.getHeight());
|
||||||
|
}
|
||||||
|
|
||||||
if (!mDisplayChildren)
|
if (!mDisplayChildren)
|
||||||
return;
|
return;
|
||||||
|
|
@ -932,7 +947,7 @@ void LLAccordionCtrlTab::adjustContainerPanel(const LLRect& child_rect)
|
||||||
show_hide_scrollbar(child_rect);
|
show_hide_scrollbar(child_rect);
|
||||||
updateLayout(child_rect);
|
updateLayout(child_rect);
|
||||||
}
|
}
|
||||||
else
|
else if (mContainerPanel->getRect() != child_rect)
|
||||||
{
|
{
|
||||||
mContainerPanel->reshape(child_rect.getWidth(), child_rect.getHeight());
|
mContainerPanel->reshape(child_rect.getWidth(), child_rect.getHeight());
|
||||||
mContainerPanel->setRect(child_rect);
|
mContainerPanel->setRect(child_rect);
|
||||||
|
|
|
||||||
|
|
@ -39,6 +39,13 @@ bool LLChatMentionHelper::isActive(const LLUICtrl* ctrl) const
|
||||||
|
|
||||||
bool LLChatMentionHelper::isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos) const
|
bool LLChatMentionHelper::isCursorInNameMention(const LLWString& wtext, S32 cursor_pos, S32* mention_start_pos) const
|
||||||
{
|
{
|
||||||
|
// <FS:PP> Enable auto-completion of @ mentions
|
||||||
|
static LLUICachedControl<bool> useMentionAutoComplete("FSUseChatMentionAutoComplete", true);
|
||||||
|
if (!useMentionAutoComplete)
|
||||||
|
{
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
// </FS:PP>
|
||||||
if (cursor_pos <= 0 || cursor_pos > static_cast<S32>(wtext.size()))
|
if (cursor_pos <= 0 || cursor_pos > static_cast<S32>(wtext.size()))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -58,7 +58,7 @@ bool LLEmojiHelper::isActive(const LLUICtrl* ctrl_p) const
|
||||||
bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S32* pShortCodePos)
|
bool LLEmojiHelper::isCursorInEmojiCode(const LLWString& wtext, S32 cursorPos, S32* pShortCodePos)
|
||||||
{
|
{
|
||||||
// <FS:PP> FIRE-33735: Option to suppress emoji chooser window from automatically popping up while typing in chat bars
|
// <FS:PP> FIRE-33735: Option to suppress emoji chooser window from automatically popping up while typing in chat bars
|
||||||
static LLUICachedControl<bool> FSEnableEmojiWindowPopupWhileTyping("FSEnableEmojiWindowPopupWhileTyping");
|
static LLUICachedControl<bool> FSEnableEmojiWindowPopupWhileTyping("FSEnableEmojiWindowPopupWhileTyping", true);
|
||||||
if (!FSEnableEmojiWindowPopupWhileTyping)
|
if (!FSEnableEmojiWindowPopupWhileTyping)
|
||||||
{
|
{
|
||||||
return false;
|
return false;
|
||||||
|
|
|
||||||
|
|
@ -1592,6 +1592,8 @@ void LLTextBase::reshape(S32 width, S32 height, bool called_from_parent)
|
||||||
// up-to-date mVisibleTextRect
|
// up-to-date mVisibleTextRect
|
||||||
updateRects();
|
updateRects();
|
||||||
|
|
||||||
|
// Todo: This might be wrong. updateRects already sets needsReflow conditionaly.
|
||||||
|
// Reflow is expensive and doing it at any twith can be too much.
|
||||||
needsReflow();
|
needsReflow();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
|
|
@ -353,6 +353,7 @@ void LLWebRTCImpl::init()
|
||||||
//updateDevices();
|
//updateDevices();
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLWebRTCImpl::terminate()
|
void LLWebRTCImpl::terminate()
|
||||||
|
|
|
||||||
|
|
@ -758,7 +758,7 @@
|
||||||
<key>version</key>
|
<key>version</key>
|
||||||
<map>
|
<map>
|
||||||
<key>value</key>
|
<key>value</key>
|
||||||
<integer>5</integer>
|
<integer>6</integer>
|
||||||
</map>
|
</map>
|
||||||
</map>
|
</map>
|
||||||
</llsd>
|
</llsd>
|
||||||
|
|
@ -26469,6 +26469,17 @@ Change of this parameter will affect the layout of buttons in notification toast
|
||||||
<key>Value</key>
|
<key>Value</key>
|
||||||
<integer>1</integer>
|
<integer>1</integer>
|
||||||
</map>
|
</map>
|
||||||
|
<key>FSUseChatMentionAutoComplete</key>
|
||||||
|
<map>
|
||||||
|
<key>Comment</key>
|
||||||
|
<string>Enable auto-completion when typing @ mentions in chat.</string>
|
||||||
|
<key>Persist</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
<key>Type</key>
|
||||||
|
<string>Boolean</string>
|
||||||
|
<key>Value</key>
|
||||||
|
<integer>1</integer>
|
||||||
|
</map>
|
||||||
<key>FSUseBWEmojis</key>
|
<key>FSUseBWEmojis</key>
|
||||||
<map>
|
<map>
|
||||||
<key>Comment</key>
|
<key>Comment</key>
|
||||||
|
|
|
||||||
|
|
@ -462,28 +462,32 @@ void FSFloaterPoser::createUserPoseDirectoryIfNeeded()
|
||||||
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, POSE_SAVE_SUBDIRECTORY);
|
gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, POSE_SAVE_SUBDIRECTORY);
|
||||||
|
|
||||||
std::string userHandPresetsPath = userPath + gDirUtilp->getDirDelimiter() + std::string(POSE_PRESETS_HANDS_SUBDIRECTORY);
|
std::string userHandPresetsPath = userPath + gDirUtilp->getDirDelimiter() + std::string(POSE_PRESETS_HANDS_SUBDIRECTORY);
|
||||||
if (gDirUtilp->fileExists(userHandPresetsPath))
|
|
||||||
return;
|
|
||||||
|
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
if (!gDirUtilp->fileExists(userPath))
|
|
||||||
{
|
|
||||||
LL_WARNS("Poser") << "Couldn't find folder: " << userPath << " - creating one." << LL_ENDL;
|
|
||||||
LLFile::mkdir(userPath);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!gDirUtilp->fileExists(userHandPresetsPath))
|
if (!gDirUtilp->fileExists(userHandPresetsPath))
|
||||||
{
|
{
|
||||||
LL_WARNS("Poser") << "Couldn't find folder: " << userHandPresetsPath << " - creating one." << LL_ENDL;
|
if (!gDirUtilp->fileExists(userPath))
|
||||||
LLFile::mkdir(userHandPresetsPath);
|
{
|
||||||
|
LL_WARNS("Poser") << "Couldn't find folder: " << userPath << " - creating one." << LL_ENDL;
|
||||||
|
LLFile::mkdir(userPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!gDirUtilp->fileExists(userHandPresetsPath))
|
||||||
|
{
|
||||||
|
LL_WARNS("Poser") << "Couldn't find folder: " << userHandPresetsPath << " - creating one." << LL_ENDL;
|
||||||
|
LLFile::mkdir(userHandPresetsPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string sourcePresetPath =
|
std::string sourcePresetPath =
|
||||||
gDirUtilp->getExpandedFilename(LL_PATH_EXECUTABLE, POSE_SAVE_SUBDIRECTORY, std::string(POSE_PRESETS_HANDS_SUBDIRECTORY));
|
gDirUtilp->getExpandedFilename(LL_PATH_APP_SETTINGS, POSE_SAVE_SUBDIRECTORY, std::string(POSE_PRESETS_HANDS_SUBDIRECTORY));
|
||||||
|
|
||||||
if (!gDirUtilp->fileExists(sourcePresetPath))
|
if (!gDirUtilp->fileExists(sourcePresetPath))
|
||||||
|
{
|
||||||
|
LL_WARNS("Poser") << "Can not copy poser presets because failed to find path: " << sourcePresetPath << LL_ENDL;
|
||||||
return;
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
auto posesToCopy = gDirUtilp->getFilesInDir(sourcePresetPath);
|
auto posesToCopy = gDirUtilp->getFilesInDir(sourcePresetPath);
|
||||||
for (const auto& pose : posesToCopy)
|
for (const auto& pose : posesToCopy)
|
||||||
|
|
@ -491,13 +495,24 @@ void FSFloaterPoser::createUserPoseDirectoryIfNeeded()
|
||||||
std::string source = sourcePresetPath + gDirUtilp->getDirDelimiter() + pose;
|
std::string source = sourcePresetPath + gDirUtilp->getDirDelimiter() + pose;
|
||||||
std::string destination = userHandPresetsPath + gDirUtilp->getDirDelimiter() + pose;
|
std::string destination = userHandPresetsPath + gDirUtilp->getDirDelimiter() + pose;
|
||||||
|
|
||||||
|
S32 sourceVersion = tryGetPoseVersion(source);
|
||||||
|
S32 destinationVersion = tryGetPoseVersion(destination);
|
||||||
|
if (destinationVersion >= sourceVersion)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (gDirUtilp->fileExists(destination))
|
||||||
|
{
|
||||||
|
LL_WARNS("Poser") << "Removing pose file " << destination << " to replace with updated version " << LL_ENDL;
|
||||||
|
LLFile::remove(destination);
|
||||||
|
}
|
||||||
|
|
||||||
if (!LLFile::copy(source, destination))
|
if (!LLFile::copy(source, destination))
|
||||||
LL_WARNS("Poser") << "Failed to copy " << source << " to " << destination << LL_ENDL;
|
LL_WARNS("Poser") << "Failed to copy " << source << " to " << destination << LL_ENDL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
catch (const std::exception& e)
|
catch (const std::exception& e)
|
||||||
{
|
{
|
||||||
LL_WARNS("Posing") << "Exception caught trying to create: " << userPath << e.what() << LL_ENDL;
|
LL_WARNS("Posing") << "Exception caught trying to create/update poses: " << e.what() << LL_ENDL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -947,6 +962,51 @@ void FSFloaterPoser::onClickLoadRightHandPose()
|
||||||
onClickLoadHandPose(true);
|
onClickLoadHandPose(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
S32 FSFloaterPoser::tryGetPoseVersion(std::string pathToPoseFile)
|
||||||
|
{
|
||||||
|
S32 version = -1;
|
||||||
|
if (pathToPoseFile.empty())
|
||||||
|
return version;
|
||||||
|
|
||||||
|
if (!gDirUtilp->fileExists(pathToPoseFile))
|
||||||
|
return version;
|
||||||
|
|
||||||
|
try
|
||||||
|
{
|
||||||
|
LLSD pose;
|
||||||
|
llifstream infile;
|
||||||
|
|
||||||
|
infile.open(pathToPoseFile);
|
||||||
|
if (!infile.is_open())
|
||||||
|
return version;
|
||||||
|
|
||||||
|
while (!infile.eof())
|
||||||
|
{
|
||||||
|
S32 lineCount = LLSDSerialize::fromXML(pose, infile);
|
||||||
|
if (lineCount == LLSDParser::PARSE_FAILURE)
|
||||||
|
{
|
||||||
|
LL_WARNS("Posing") << "Failed to parse pose file: " << pathToPoseFile << LL_ENDL;
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
|
for (LLSD::map_const_iterator itr = pose.beginMap(); itr != pose.endMap(); ++itr)
|
||||||
|
{
|
||||||
|
std::string const& name = itr->first;
|
||||||
|
LLSD const& control_map = itr->second;
|
||||||
|
|
||||||
|
if (name == "version")
|
||||||
|
return (S32)control_map["value"].asInteger();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (const std::exception& e)
|
||||||
|
{
|
||||||
|
LL_WARNS("Posing") << "Threw an exception trying read the pose file: " << pathToPoseFile << " exception: " << e.what() << LL_ENDL;
|
||||||
|
}
|
||||||
|
|
||||||
|
return version;
|
||||||
|
}
|
||||||
|
|
||||||
void FSFloaterPoser::onClickLoadHandPose(bool isRightHand)
|
void FSFloaterPoser::onClickLoadHandPose(bool isRightHand)
|
||||||
{
|
{
|
||||||
LLScrollListItem* item = mHandPresetsScrollList->getFirstSelected();
|
LLScrollListItem* item = mHandPresetsScrollList->getFirstSelected();
|
||||||
|
|
|
||||||
|
|
@ -231,6 +231,7 @@ public:
|
||||||
void onPoseMenuAction(const LLSD& param);
|
void onPoseMenuAction(const LLSD& param);
|
||||||
bool loadPoseFromXml(LLVOAvatar* avatar, const std::string& poseFileName, E_LoadPoseMethods loadMethod);
|
bool loadPoseFromXml(LLVOAvatar* avatar, const std::string& poseFileName, E_LoadPoseMethods loadMethod);
|
||||||
bool poseFileStartsFromTeePose(const std::string& poseFileName);
|
bool poseFileStartsFromTeePose(const std::string& poseFileName);
|
||||||
|
S32 tryGetPoseVersion(std::string pathToPoseFile);
|
||||||
void setPoseSaveFileTextBoxToUiSelectedAvatarSaveFileName();
|
void setPoseSaveFileTextBoxToUiSelectedAvatarSaveFileName();
|
||||||
void setUiSelectedAvatarSaveFileName(const std::string& saveFileName);
|
void setUiSelectedAvatarSaveFileName(const std::string& saveFileName);
|
||||||
void timedReload();
|
void timedReload();
|
||||||
|
|
|
||||||
|
|
@ -931,7 +931,9 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
|
||||||
if (!isItemMovable() || !canMenuCut())
|
if (!isItemMovable() || !canMenuCut())
|
||||||
{
|
{
|
||||||
disabled_items.push_back(std::string("Cut"));
|
disabled_items.push_back(std::string("Cut"));
|
||||||
disabled_items.push_back(std::string("New folder from selected"));
|
// <FS:TJ> [FIRE-35996] Restore allowing creating folder from selected on recent and favorites panels
|
||||||
|
//disabled_items.push_back(std::string("New folder from selected"));
|
||||||
|
// </FS:TJ>
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
|
@ -984,7 +986,9 @@ void LLInvFVBridge::getClipboardEntries(bool show_asset_id,
|
||||||
if (!isItemMovable() || !canMenuCut())
|
if (!isItemMovable() || !canMenuCut())
|
||||||
{
|
{
|
||||||
disabled_items.push_back(std::string("Cut"));
|
disabled_items.push_back(std::string("Cut"));
|
||||||
disabled_items.push_back(std::string("New folder from selected"));
|
// <FS:TJ> [FIRE-35996] Restore allowing creating folder from selected on recent and favorites panels
|
||||||
|
//disabled_items.push_back(std::string("New folder from selected"));
|
||||||
|
// </FS:TJ>
|
||||||
}
|
}
|
||||||
|
|
||||||
if (canListOnMarketplace() && !isMarketplaceListingsFolder() && !isInboxFolder())
|
if (canListOnMarketplace() && !isMarketplaceListingsFolder() && !isInboxFolder())
|
||||||
|
|
|
||||||
|
|
@ -40,6 +40,10 @@
|
||||||
#include "llinventorymodel.h"
|
#include "llinventorymodel.h"
|
||||||
#include "llviewerinventory.h"
|
#include "llviewerinventory.h"
|
||||||
|
|
||||||
|
bool LLInventoryItemsList::sListIdleRegistered = false;
|
||||||
|
LLInventoryItemsList::all_list_t LLInventoryItemsList::sAllLists;
|
||||||
|
LLInventoryItemsList::all_list_t::iterator LLInventoryItemsList::sAllListIter;
|
||||||
|
|
||||||
LLInventoryItemsList::Params::Params()
|
LLInventoryItemsList::Params::Params()
|
||||||
{}
|
{}
|
||||||
|
|
||||||
|
|
@ -55,13 +59,39 @@ LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p
|
||||||
|
|
||||||
setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems"));
|
setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems"));
|
||||||
|
|
||||||
gIdleCallbacks.addFunction(idle, this);
|
sAllLists.push_back(this);
|
||||||
|
sAllListIter = sAllLists.begin();
|
||||||
|
|
||||||
|
if (!sListIdleRegistered)
|
||||||
|
{
|
||||||
|
sAllListIter = sAllLists.begin();
|
||||||
|
gIdleCallbacks.addFunction(idle, nullptr);
|
||||||
|
|
||||||
|
LLEventPumps::instance().obtain("LLApp").listen(
|
||||||
|
"LLInventoryItemsList",
|
||||||
|
[](const LLSD& stat)
|
||||||
|
{
|
||||||
|
std::string status(stat["status"]);
|
||||||
|
if (status != "running")
|
||||||
|
{
|
||||||
|
// viewer is starting shutdown
|
||||||
|
gIdleCallbacks.deleteFunction(idle, nullptr);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
sListIdleRegistered = true;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// virtual
|
// virtual
|
||||||
LLInventoryItemsList::~LLInventoryItemsList()
|
LLInventoryItemsList::~LLInventoryItemsList()
|
||||||
{
|
{
|
||||||
gIdleCallbacks.deleteFunction(idle, this);
|
auto it = std::find(sAllLists.begin(), sAllLists.end(), this);
|
||||||
|
if (it != sAllLists.end())
|
||||||
|
{
|
||||||
|
sAllLists.erase(it);
|
||||||
|
sAllListIter = sAllLists.begin();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array)
|
void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array)
|
||||||
|
|
@ -111,25 +141,55 @@ void LLInventoryItemsList::updateSelection()
|
||||||
mSelectTheseIDs.clear();
|
mSelectTheseIDs.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
void LLInventoryItemsList::doIdle()
|
bool LLInventoryItemsList::doIdle()
|
||||||
{
|
{
|
||||||
if (mRefreshState == REFRESH_COMPLETE) return;
|
if (mRefreshState == REFRESH_COMPLETE) return true; // done
|
||||||
|
|
||||||
if (isInVisibleChain() || mForceRefresh || !getFilterSubString().empty())
|
if (isInVisibleChain() || mForceRefresh || !getFilterSubString().empty())
|
||||||
{
|
{
|
||||||
refresh();
|
refresh();
|
||||||
|
|
||||||
mRefreshCompleteSignal(this, LLSD());
|
mRefreshCompleteSignal(this, LLSD());
|
||||||
|
return false; // keep going
|
||||||
}
|
}
|
||||||
|
return true; // done
|
||||||
}
|
}
|
||||||
|
|
||||||
//static
|
//static
|
||||||
void LLInventoryItemsList::idle(void* user_data)
|
void LLInventoryItemsList::idle(void* user_data)
|
||||||
{
|
{
|
||||||
LLInventoryItemsList* self = static_cast<LLInventoryItemsList*>(user_data);
|
if (sAllLists.empty())
|
||||||
if ( self )
|
return;
|
||||||
{ // Do the real idle
|
|
||||||
self->doIdle();
|
LL_PROFILE_ZONE_SCOPED;
|
||||||
|
|
||||||
|
using namespace std::chrono;
|
||||||
|
auto start = steady_clock::now();
|
||||||
|
const milliseconds time_limit = milliseconds(3);
|
||||||
|
const auto end_time = start + time_limit;
|
||||||
|
S32 max_update_count = 50;
|
||||||
|
|
||||||
|
if (sAllListIter == sAllLists.end())
|
||||||
|
{
|
||||||
|
sAllListIter = sAllLists.begin();
|
||||||
|
}
|
||||||
|
|
||||||
|
S32 updated = 0;
|
||||||
|
while (steady_clock::now() < end_time
|
||||||
|
&& updated < max_update_count
|
||||||
|
&& sAllListIter != sAllLists.end())
|
||||||
|
{
|
||||||
|
LLInventoryItemsList* list = *sAllListIter;
|
||||||
|
// Refresh is split into multiple separate parts,
|
||||||
|
// so keep repeating it while there is time, until done.
|
||||||
|
// Todo: refresh() split is pointless now?
|
||||||
|
// Or still useful for large folders?
|
||||||
|
if (list->doIdle())
|
||||||
|
{
|
||||||
|
// Item is done
|
||||||
|
++sAllListIter;
|
||||||
|
updated++;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
@ -141,6 +201,7 @@ void LLInventoryItemsList::refresh()
|
||||||
{
|
{
|
||||||
case REFRESH_ALL:
|
case REFRESH_ALL:
|
||||||
{
|
{
|
||||||
|
LL_PROFILE_ZONE_NAMED("items_refresh_all");
|
||||||
mAddedItems.clear();
|
mAddedItems.clear();
|
||||||
mRemovedItems.clear();
|
mRemovedItems.clear();
|
||||||
computeDifference(getIDs(), mAddedItems, mRemovedItems);
|
computeDifference(getIDs(), mAddedItems, mRemovedItems);
|
||||||
|
|
@ -163,6 +224,7 @@ void LLInventoryItemsList::refresh()
|
||||||
}
|
}
|
||||||
case REFRESH_LIST_ERASE:
|
case REFRESH_LIST_ERASE:
|
||||||
{
|
{
|
||||||
|
LL_PROFILE_ZONE_NAMED("items_refresh_erase");
|
||||||
uuid_vec_t::const_iterator it = mRemovedItems.begin();
|
uuid_vec_t::const_iterator it = mRemovedItems.begin();
|
||||||
for (; mRemovedItems.end() != it; ++it)
|
for (; mRemovedItems.end() != it; ++it)
|
||||||
{
|
{
|
||||||
|
|
@ -175,6 +237,7 @@ void LLInventoryItemsList::refresh()
|
||||||
}
|
}
|
||||||
case REFRESH_LIST_APPEND:
|
case REFRESH_LIST_APPEND:
|
||||||
{
|
{
|
||||||
|
LL_PROFILE_ZONE_NAMED("items_refresh_append");
|
||||||
static const unsigned ADD_LIMIT = 25; // Note: affects perfomance
|
static const unsigned ADD_LIMIT = 25; // Note: affects perfomance
|
||||||
|
|
||||||
unsigned int nadded = 0;
|
unsigned int nadded = 0;
|
||||||
|
|
@ -239,6 +302,7 @@ void LLInventoryItemsList::refresh()
|
||||||
}
|
}
|
||||||
case REFRESH_LIST_SORT:
|
case REFRESH_LIST_SORT:
|
||||||
{
|
{
|
||||||
|
LL_PROFILE_ZONE_NAMED("items_refresh_sort");
|
||||||
// Filter, sort, rearrange and notify parent about shape changes
|
// Filter, sort, rearrange and notify parent about shape changes
|
||||||
filterItems(true, true);
|
filterItems(true, true);
|
||||||
|
|
||||||
|
|
@ -255,7 +319,10 @@ void LLInventoryItemsList::refresh()
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
break;
|
{
|
||||||
|
mRefreshState = REFRESH_COMPLETE;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
setForceRefresh(mRefreshState != REFRESH_COMPLETE);
|
setForceRefresh(mRefreshState != REFRESH_COMPLETE);
|
||||||
|
|
|
||||||
|
|
@ -59,7 +59,10 @@ public:
|
||||||
* Sets the flag indicating that the list needs to be refreshed even if it is
|
* Sets the flag indicating that the list needs to be refreshed even if it is
|
||||||
* not currently visible.
|
* not currently visible.
|
||||||
*/
|
*/
|
||||||
void setForceRefresh(bool force_refresh) { mForceRefresh = force_refresh; }
|
void setForceRefresh(bool force_refresh)
|
||||||
|
{
|
||||||
|
mForceRefresh = force_refresh;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* If refreshes when invisible.
|
* If refreshes when invisible.
|
||||||
|
|
@ -76,7 +79,7 @@ public:
|
||||||
* This is needed for example to filter items of the list hidden by closed
|
* This is needed for example to filter items of the list hidden by closed
|
||||||
* accordion tab.
|
* accordion tab.
|
||||||
*/
|
*/
|
||||||
virtual void doIdle(); // Real idle routine
|
bool doIdle(); // Real idle routine
|
||||||
static void idle(void* user_data); // static glue to doIdle()
|
static void idle(void* user_data); // static glue to doIdle()
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
|
@ -126,6 +129,12 @@ private:
|
||||||
bool mForceRefresh;
|
bool mForceRefresh;
|
||||||
|
|
||||||
commit_signal_t mRefreshCompleteSignal;
|
commit_signal_t mRefreshCompleteSignal;
|
||||||
|
|
||||||
|
// Update synchronization
|
||||||
|
typedef std::vector<LLInventoryItemsList*> all_list_t;
|
||||||
|
static all_list_t sAllLists;
|
||||||
|
static all_list_t::iterator sAllListIter;
|
||||||
|
static bool sListIdleRegistered;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif //LL_LLINVENTORYITEMSLIST_H
|
#endif //LL_LLINVENTORYITEMSLIST_H
|
||||||
|
|
|
||||||
|
|
@ -818,6 +818,7 @@ void LLOutfitGallery::getCurrentCategories(uuid_vec_t& vcur)
|
||||||
|
|
||||||
void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
|
void LLOutfitGallery::updateAddedCategory(LLUUID cat_id)
|
||||||
{
|
{
|
||||||
|
LL_PROFILE_ZONE_SCOPED;
|
||||||
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
|
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
|
||||||
if (!cat) return;
|
if (!cat) return;
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -189,6 +189,7 @@ void LLOutfitsList::onOpen(const LLSD& info)
|
||||||
|
|
||||||
void LLOutfitsList::updateAddedCategory(LLUUID cat_id)
|
void LLOutfitsList::updateAddedCategory(LLUUID cat_id)
|
||||||
{
|
{
|
||||||
|
LL_PROFILE_ZONE_SCOPED;
|
||||||
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
|
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
|
||||||
if (!cat) return;
|
if (!cat) return;
|
||||||
|
|
||||||
|
|
@ -260,7 +261,9 @@ void LLOutfitsList::updateAddedCategory(LLUUID cat_id)
|
||||||
|
|
||||||
if (AISAPI::isAvailable() && LLInventoryModelBackgroundFetch::instance().folderFetchActive())
|
if (AISAPI::isAvailable() && LLInventoryModelBackgroundFetch::instance().folderFetchActive())
|
||||||
{
|
{
|
||||||
// for reliability just fetch it whole, linked items included
|
// For reliability just fetch it whole, linked items included
|
||||||
|
// Todo: list is not warrantied to exist once callback arrives
|
||||||
|
// Fix it!
|
||||||
LLInventoryModelBackgroundFetch::instance().fetchFolderAndLinks(cat_id, [cat_id, list]
|
LLInventoryModelBackgroundFetch::instance().fetchFolderAndLinks(cat_id, [cat_id, list]
|
||||||
{
|
{
|
||||||
if (list)
|
if (list)
|
||||||
|
|
@ -1153,6 +1156,7 @@ void LLOutfitListBase::onIdle(void* userdata)
|
||||||
|
|
||||||
void LLOutfitListBase::onIdleRefreshList()
|
void LLOutfitListBase::onIdleRefreshList()
|
||||||
{
|
{
|
||||||
|
LL_PROFILE_ZONE_SCOPED;
|
||||||
if (LLAppViewer::instance()->quitRequested())
|
if (LLAppViewer::instance()->quitRequested())
|
||||||
{
|
{
|
||||||
mRefreshListState.CategoryUUID.setNull();
|
mRefreshListState.CategoryUUID.setNull();
|
||||||
|
|
|
||||||
|
|
@ -4909,6 +4909,10 @@ bool process_login_success_response(U32 &first_sim_size_x, U32 &first_sim_size_y
|
||||||
// <FS:TJ> [FIRE-34775] Use PST/PDT when logged into OpenSim
|
// <FS:TJ> [FIRE-34775] Use PST/PDT when logged into OpenSim
|
||||||
LLStringOps::setupUsingPacificTime(!LLGridManager::getInstance()->isInSecondLife());
|
LLStringOps::setupUsingPacificTime(!LLGridManager::getInstance()->isInSecondLife());
|
||||||
// </FS:TJ>
|
// </FS:TJ>
|
||||||
|
// <FS:TJ> [FIRE-36028] Fix OpenSim object permissions
|
||||||
|
LLPermissions::setupIsInOpenSim(!LLGridManager::getInstance()->isInSecondLife());
|
||||||
|
// </FS:TJ>
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// set up the voice configuration. Ultimately, we should pass this up as part of each voice
|
// set up the voice configuration. Ultimately, we should pass this up as part of each voice
|
||||||
|
|
|
||||||
|
|
@ -4897,7 +4897,7 @@ void process_preload_sound(LLMessageSystem *msg, void **user_data)
|
||||||
msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id);
|
msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id);
|
||||||
|
|
||||||
// <FS:ND> Protect against corrupted sounds
|
// <FS:ND> Protect against corrupted sounds
|
||||||
if (gAudiop->isCorruptSound(sound_id))
|
if (gAudiop && gAudiop->isCorruptSound(sound_id))
|
||||||
return;
|
return;
|
||||||
// </FS:ND>
|
// </FS:ND>
|
||||||
|
|
||||||
|
|
@ -4952,7 +4952,7 @@ void process_attached_sound(LLMessageSystem *msg, void **user_data)
|
||||||
msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id);
|
msg->getUUIDFast(_PREHASH_DataBlock, _PREHASH_OwnerID, owner_id);
|
||||||
|
|
||||||
// <FS:ND> Protect against corrupted sounds
|
// <FS:ND> Protect against corrupted sounds
|
||||||
if (gAudiop->isCorruptSound(sound_id))
|
if (gAudiop && gAudiop->isCorruptSound(sound_id))
|
||||||
return;
|
return;
|
||||||
// </FS:ND>
|
// </FS:ND>
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -281,6 +281,7 @@ void LLWebRTCVoiceClient::initWebRTC()
|
||||||
llwebrtc::init(this);
|
llwebrtc::init(this);
|
||||||
|
|
||||||
mWebRTCDeviceInterface = llwebrtc::getDeviceInterface();
|
mWebRTCDeviceInterface = llwebrtc::getDeviceInterface();
|
||||||
|
mWebRTCDeviceInterface->unsetDevicesObserver(this); // <FS:Ansariel> initWebRTC() can get multiple times - make sure to unset previous observers before re-adding
|
||||||
mWebRTCDeviceInterface->setDevicesObserver(this);
|
mWebRTCDeviceInterface->setDevicesObserver(this);
|
||||||
mMainQueue = LL::WorkQueue::getInstance("mainloop");
|
mMainQueue = LL::WorkQueue::getInstance("mainloop");
|
||||||
refreshDeviceLists();
|
refreshDeviceLists();
|
||||||
|
|
|
||||||
|
|
@ -148,7 +148,8 @@
|
||||||
<check_box label="Automatische Namensvorhersage in „Chat in der Nähe“-Eingabezeile aktivieren" name="FSChatbarNamePrediction"/>
|
<check_box label="Automatische Namensvorhersage in „Chat in der Nähe“-Eingabezeile aktivieren" name="FSChatbarNamePrediction"/>
|
||||||
<check_box name="AllowMUpose" label="„:“ als Synonym für "/me" verwenden"/>
|
<check_box name="AllowMUpose" label="„:“ als Synonym für "/me" verwenden"/>
|
||||||
<check_box name="AutoCloseOOC" label="((OOC))-Klammern automatisch schließen"/>
|
<check_box name="AutoCloseOOC" label="((OOC))-Klammern automatisch schließen"/>
|
||||||
<check_box name="FSEnableEmojiWindowPopupWhileTyping" label="Automatisches Emoji-Auswahlfenster beim Chateingabe aktivieren"/>
|
<check_box name="FSUseChatMentionAutoComplete" label="Automatische @-Erwähnungen bei Chateingabe aktivieren"/>
|
||||||
|
<check_box name="FSEnableEmojiWindowPopupWhileTyping" label="Automatisches Emoji-Auswahlfenster bei Chateingabe aktivieren"/>
|
||||||
<check_box name="FSShowEmojiButton" label="Emoji-Button in Eingabezeile für Lokaler Chat IM-Sitzungen anzeigen"/>
|
<check_box name="FSShowEmojiButton" label="Emoji-Button in Eingabezeile für Lokaler Chat IM-Sitzungen anzeigen"/>
|
||||||
<check_box name="FSShowIMSendButton" label="Senden-Button in Eingabezeile für IM-Sitzungen anzeigen"/>
|
<check_box name="FSShowIMSendButton" label="Senden-Button in Eingabezeile für IM-Sitzungen anzeigen"/>
|
||||||
<check_box name="FSNearbyChatbar" label="Eingabezeile zum Fenster Lokaler Chat hinzufügen"/>
|
<check_box name="FSNearbyChatbar" label="Eingabezeile zum Fenster Lokaler Chat hinzufügen"/>
|
||||||
|
|
|
||||||
|
|
@ -916,6 +916,14 @@
|
||||||
top_pad="1"
|
top_pad="1"
|
||||||
height="16"
|
height="16"
|
||||||
width="400" />
|
width="400" />
|
||||||
|
<check_box
|
||||||
|
layout="topleft"
|
||||||
|
top_pad="1"
|
||||||
|
height="16"
|
||||||
|
width="400"
|
||||||
|
control_name="FSUseChatMentionAutoComplete"
|
||||||
|
name="FSUseChatMentionAutoComplete"
|
||||||
|
label="Enable automatic @ mentions window while typing in chat bars"/>
|
||||||
<check_box
|
<check_box
|
||||||
layout="topleft"
|
layout="topleft"
|
||||||
top_pad="1"
|
top_pad="1"
|
||||||
|
|
|
||||||
|
|
@ -46,7 +46,7 @@
|
||||||
</layout_panel>
|
</layout_panel>
|
||||||
<layout_panel name="layout_panel_msg">
|
<layout_panel name="layout_panel_msg">
|
||||||
<text name="currency_links">
|
<text name="currency_links">
|
||||||
[https://accounts.secondlife.com/billing_information/ 支払い情報]|[https://www.secondlife.com/my/lindex/buy.php L$の購入]
|
[https://accounts.secondlife.com/billing_information/?lang=ja-JP 支払い情報]|[https://www.secondlife.com/my/lindex/buy.php?lang=ja-JP L$の購入]
|
||||||
</text>
|
</text>
|
||||||
<text name="exchange_rate_note">
|
<text name="exchange_rate_note">
|
||||||
金額を再入力して、最新の為替レートを確認してください。
|
金額を再入力して、最新の為替レートを確認してください。
|
||||||
|
|
|
||||||
|
|
@ -17,7 +17,7 @@
|
||||||
<menu_item_call label="ズームイン" name="zoom_in"/>
|
<menu_item_call label="ズームイン" name="zoom_in"/>
|
||||||
<menu_item_call label="マップ" name="map"/>
|
<menu_item_call label="マップ" name="map"/>
|
||||||
<menu_item_call label="共有" name="share"/>
|
<menu_item_call label="共有" name="share"/>
|
||||||
<menu_item_call label="支払い" name="pay"/>
|
<menu_item_call label="支払う" name="pay"/>
|
||||||
<menu_item_call label="嫌がらせの報告" name="report_abuse"/>
|
<menu_item_call label="嫌がらせの報告" name="report_abuse"/>
|
||||||
<menu_item_check label="ボイスをブロック" name="block_unblock"/>
|
<menu_item_check label="ボイスをブロック" name="block_unblock"/>
|
||||||
<menu_item_check label="テキストをブロックする" name="MuteText"/>
|
<menu_item_check label="テキストをブロックする" name="MuteText"/>
|
||||||
|
|
|
||||||
|
|
@ -12,6 +12,6 @@
|
||||||
<menu_item_call label="グループに招待…." name="Invite"/>
|
<menu_item_call label="グループに招待…." name="Invite"/>
|
||||||
<menu_item_call label="マップ" name="Map"/>
|
<menu_item_call label="マップ" name="Map"/>
|
||||||
<menu_item_call label="共有" name="Share"/>
|
<menu_item_call label="共有" name="Share"/>
|
||||||
<menu_item_call label="支払い" name="Pay"/>
|
<menu_item_call label="支払う" name="Pay"/>
|
||||||
<menu_item_check label="ブロック/ブロック解除" name="Block/Unblock"/>
|
<menu_item_check label="ブロック/ブロック解除" name="Block/Unblock"/>
|
||||||
</toggleable_menu>
|
</toggleable_menu>
|
||||||
|
|
|
||||||
|
|
@ -9,7 +9,7 @@
|
||||||
<menu_item_call label="ズームイン" name="zoom_in"/>
|
<menu_item_call label="ズームイン" name="zoom_in"/>
|
||||||
<menu_item_call label="マップ" name="map"/>
|
<menu_item_call label="マップ" name="map"/>
|
||||||
<menu_item_call label="共有" name="Share"/>
|
<menu_item_call label="共有" name="Share"/>
|
||||||
<menu_item_call label="支払い" name="Pay"/>
|
<menu_item_call label="支払う" name="Pay"/>
|
||||||
<menu_item_call label="嫌がらせの報告" name="Report Abuse"/>
|
<menu_item_call label="嫌がらせの報告" name="Report Abuse"/>
|
||||||
<menu_item_check label="ボイスのブロック/解除" name="Block/Unblock"/>
|
<menu_item_check label="ボイスのブロック/解除" name="Block/Unblock"/>
|
||||||
<menu_item_check label="テキストをブロックする" name="MuteText"/>
|
<menu_item_check label="テキストをブロックする" name="MuteText"/>
|
||||||
|
|
|
||||||
|
|
@ -11,7 +11,7 @@
|
||||||
<menu_item_call label="権限" name="agent_permissions"/>
|
<menu_item_call label="権限" name="agent_permissions"/>
|
||||||
<menu_item_call label="マップ" name="map"/>
|
<menu_item_call label="マップ" name="map"/>
|
||||||
<menu_item_call label="共有" name="share"/>
|
<menu_item_call label="共有" name="share"/>
|
||||||
<menu_item_call label="支払い" name="pay"/>
|
<menu_item_call label="支払う" name="pay"/>
|
||||||
<menu_item_check label="ブロック/解除" name="block_unblock"/>
|
<menu_item_check label="ブロック/解除" name="block_unblock"/>
|
||||||
<menu_item_call label="表示名をコピー" name="copy_display_name"/>
|
<menu_item_call label="表示名をコピー" name="copy_display_name"/>
|
||||||
<menu_item_call label="エージェント名をコピー" name="copy_name"/>
|
<menu_item_call label="エージェント名をコピー" name="copy_name"/>
|
||||||
|
|
|
||||||
|
|
@ -147,7 +147,8 @@
|
||||||
<check_box name="FSChatbarNamePrediction" label="近くのチャットで周りにいる人の名前の自動補完を行う"/>
|
<check_box name="FSChatbarNamePrediction" label="近くのチャットで周りにいる人の名前の自動補完を行う"/>
|
||||||
<check_box label="「:」を「/me」の代わりに使う" name="AllowMUpose"/>
|
<check_box label="「:」を「/me」の代わりに使う" name="AllowMUpose"/>
|
||||||
<check_box label="((OOC))のかっこを自動的に閉じる" name="AutoCloseOOC"/>
|
<check_box label="((OOC))のかっこを自動的に閉じる" name="AutoCloseOOC"/>
|
||||||
<check_box name="FSEnableEmojiWindowPopupWhileTyping" label="チャットバーに入力中に自動絵文字ピッカーウィンドウを有効にする"/>
|
<check_box name="FSUseChatMentionAutoComplete" label="チャットバー入力時に@入力で自動的にメンションウィンドウが表示されるのを有効にする"/>
|
||||||
|
<check_box name="FSEnableEmojiWindowPopupWhileTyping" label="チャットバー入力時に自動的に絵文字ピッカーウィンドウが表示されるのを有効にする"/>
|
||||||
<check_box name="FSShowEmojiButton" label="IMセッションと近くのチャットのチャットバーに絵文字ボタンを表示する"/>
|
<check_box name="FSShowEmojiButton" label="IMセッションと近くのチャットのチャットバーに絵文字ボタンを表示する"/>
|
||||||
<check_box name="FSShowIMSendButton" label="IMのチャットバーに「送信」ボタンを表示する"/>
|
<check_box name="FSShowIMSendButton" label="IMのチャットバーに「送信」ボタンを表示する"/>
|
||||||
<check_box label="近くのチャットウインドウにチャットバーを表示する" name="FSNearbyChatbar"/>
|
<check_box label="近くのチャットウインドウにチャットバーを表示する" name="FSNearbyChatbar"/>
|
||||||
|
|
|
||||||
|
|
@ -82,7 +82,7 @@
|
||||||
</text>
|
</text>
|
||||||
<spinner name="_NACL_AntiSpamSoundPreloadMulti" tool_tip="サウンドプリロード要求のイベント乗数を指定します。(デフォルト:4)"/>
|
<spinner name="_NACL_AntiSpamSoundPreloadMulti" tool_tip="サウンドプリロード要求のイベント乗数を指定します。(デフォルト:4)"/>
|
||||||
<button name="AntiSpamUnblock" label="スパム源は全て無視する"/>
|
<button name="AntiSpamUnblock" label="スパム源は全て無視する"/>
|
||||||
<check_box label="支払い前に確認する。閾値:" name="FSConfirmPayments" tool_tip="支払う金額の合計が閾値より大きい場合に確認ダイアログを表示します。確認ダイアログを毎回必ず表示するには、閾値を「0」に設定します。"/>
|
<check_box label="支払う前に確認する閾値:" name="FSConfirmPayments" tool_tip="支払う金額の合計が閾値より大きい場合に確認ダイアログを表示します。確認ダイアログを毎回必ず表示するには、閾値を「0」に設定します。"/>
|
||||||
<spinner name="FSPaymentConfirmationThreshold" tool_tip="支払う金額の合計が閾値より大きい場合に確認ダイアログを表示します。確認ダイアログを毎回必ず表示するには、閾値を「0」に設定します。"/>
|
<spinner name="FSPaymentConfirmationThreshold" tool_tip="支払う金額の合計が閾値より大きい場合に確認ダイアログを表示します。確認ダイアログを毎回必ず表示するには、閾値を「0」に設定します。"/>
|
||||||
</panel>
|
</panel>
|
||||||
<!-- アバター -->
|
<!-- アバター -->
|
||||||
|
|
|
||||||
|
|
@ -636,7 +636,7 @@ https://secondlife.com/viewer-access-faq
|
||||||
IM
|
IM
|
||||||
</string>
|
</string>
|
||||||
<string name="SLappAgentPay">
|
<string name="SLappAgentPay">
|
||||||
支払い
|
支払う
|
||||||
</string>
|
</string>
|
||||||
<string name="SLappAgentOfferTeleport">
|
<string name="SLappAgentOfferTeleport">
|
||||||
次の場所へのテレポートのオファーを送ります:
|
次の場所へのテレポートのオファーを送ります:
|
||||||
|
|
@ -1824,12 +1824,12 @@ https://support.secondlife.com よりSecond Lifeのサポートまでお問い
|
||||||
</string>
|
</string>
|
||||||
<!-- use value="" because they have preceding spaces -->
|
<!-- use value="" because they have preceding spaces -->
|
||||||
<string name="active" value="(アクティブ)"/>
|
<string name="active" value="(アクティブ)"/>
|
||||||
<string name="no_transfer" value=" (再販・譲渡不可)"/>
|
<string name="no_transfer" value="(再販・譲渡不可)"/>
|
||||||
<string name="no_modify" value=" (編集不可)"/>
|
<string name="no_modify" value="(編集不可)"/>
|
||||||
<string name="no_copy" value=" (コピー不可)"/>
|
<string name="no_copy" value="(コピー不可)"/>
|
||||||
<string name="worn" value=" (着用中)"/>
|
<string name="worn" value="(着用中)"/>
|
||||||
<string name="link" value=" リンク"/>
|
<string name="link" value=" リンク"/>
|
||||||
<string name="broken_link" value=" 壊れたリンク"/>
|
<string name="broken_link" value=" 壊れたリンク"/>
|
||||||
<string name="no_transfer_lbl" value=" 再販・譲渡不可"/>
|
<string name="no_transfer_lbl" value=" 再販・譲渡不可"/>
|
||||||
<string name="no_modify_lbl" value=" 編集不可"/>
|
<string name="no_modify_lbl" value=" 編集不可"/>
|
||||||
<string name="no_copy_lbl" value=" コピー不可"/>
|
<string name="no_copy_lbl" value=" コピー不可"/>
|
||||||
|
|
@ -1839,7 +1839,7 @@ https://support.secondlife.com よりSecond Lifeのサポートまでお問い
|
||||||
<string name="NoContents">
|
<string name="NoContents">
|
||||||
コンテンツなし
|
コンテンツなし
|
||||||
</string>
|
</string>
|
||||||
<string name="WornOnAttachmentPoint" value=" ([ATTACHMENT_POINT]に装着中)"/>
|
<string name="WornOnAttachmentPoint" value="([ATTACHMENT_POINT]に装着中)"/>
|
||||||
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
|
<string name="AttachmentErrorMessage" value="([ATTACHMENT_ERROR])"/>
|
||||||
<string name="ActiveGesture" value="[GESLABEL](アクティブ)"/>
|
<string name="ActiveGesture" value="[GESLABEL](アクティブ)"/>
|
||||||
<!-- Inventory permissions -->
|
<!-- Inventory permissions -->
|
||||||
|
|
@ -1853,7 +1853,7 @@ https://support.secondlife.com よりSecond Lifeのサポートまでお問い
|
||||||
<!-- use value="" because they have preceding spaces -->
|
<!-- use value="" because they have preceding spaces -->
|
||||||
<string name="Chat Message" value=" チャット:"/>
|
<string name="Chat Message" value=" チャット:"/>
|
||||||
<string name="Sound" value=" サウンド:"/>
|
<string name="Sound" value=" サウンド:"/>
|
||||||
<string name="Wait" value="- 待機:"/>
|
<string name="Wait" value="-待機:"/>
|
||||||
<string name="AnimFlagStop" value=" アニメーションを停止:"/>
|
<string name="AnimFlagStop" value=" アニメーションを停止:"/>
|
||||||
<string name="AnimFlagStart" value=" アニメーションを開始:"/>
|
<string name="AnimFlagStart" value=" アニメーションを開始:"/>
|
||||||
<string name="Wave" value=" 手を振る"/>
|
<string name="Wave" value=" 手を振る"/>
|
||||||
|
|
@ -2254,11 +2254,6 @@ https://support.secondlife.com よりSecond Lifeのサポートまでお問い
|
||||||
<string name="hud_render_textures_warning">
|
<string name="hud_render_textures_warning">
|
||||||
[HUD_DETAILS]は、使用されているテクスチャが多すぎます。
|
[HUD_DETAILS]は、使用されているテクスチャが多すぎます。
|
||||||
</string>
|
</string>
|
||||||
<!-- AgeYearsA = singular,
|
|
||||||
AgeYearsB = plural,
|
|
||||||
AgeYearsC = plural for non-English languages like Russian
|
|
||||||
For example, LLTrans::getCountString("AgeYears", 3) is plural form B
|
|
||||||
in English and form C in Russian -->
|
|
||||||
<string name="AgeYearsA">
|
<string name="AgeYearsA">
|
||||||
[COUNT]年
|
[COUNT]年
|
||||||
</string>
|
</string>
|
||||||
|
|
@ -2476,8 +2471,6 @@ https://support.secondlife.com よりSecond Lifeのサポートまでお問い
|
||||||
<string name="AlreadyInGroup">
|
<string name="AlreadyInGroup">
|
||||||
すでにグループに入っています:
|
すでにグループに入っています:
|
||||||
</string>
|
</string>
|
||||||
<!-- floater IM bonus_info: When a Linden with Admin/god status receives a new IM this displays the estate (Mainland vs. teen grid) of the source avatar.
|
|
||||||
This is to help Lindens when answering questions. -->
|
|
||||||
<string name="IMParentEstate">
|
<string name="IMParentEstate">
|
||||||
親の不動産
|
親の不動産
|
||||||
</string>
|
</string>
|
||||||
|
|
@ -4718,7 +4711,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||||
皺
|
皺
|
||||||
</string>
|
</string>
|
||||||
<!-- Navigation bar location input control.
|
<!-- Navigation bar location input control.
|
||||||
Strings are here because widget xml is not localizable -->
|
Strings are here because widget xml is not localizable -->
|
||||||
<string name="LocationCtrlAddLandmarkTooltip">
|
<string name="LocationCtrlAddLandmarkTooltip">
|
||||||
ランドマークに追加
|
ランドマークに追加
|
||||||
</string>
|
</string>
|
||||||
|
|
@ -5411,8 +5404,6 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||||
<string name="dateTimeWeekdaysShortNames">
|
<string name="dateTimeWeekdaysShortNames">
|
||||||
日:月:火:水:木:金:土
|
日:月:火:水:木:金:土
|
||||||
</string>
|
</string>
|
||||||
<!-- overriding datetime formating.
|
|
||||||
didn't translate if this is not needed for current localization -->
|
|
||||||
<string name="dateTimeMonthNames">
|
<string name="dateTimeMonthNames">
|
||||||
1:2:3:4:5:6:7:8:9:10:11:12
|
1:2:3:4:5:6:7:8:9:10:11:12
|
||||||
</string>
|
</string>
|
||||||
|
|
@ -5548,18 +5539,6 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||||
<string name="Divide">
|
<string name="Divide">
|
||||||
除算
|
除算
|
||||||
</string>
|
</string>
|
||||||
<string name="-">
|
|
||||||
-
|
|
||||||
</string>
|
|
||||||
<string name="=">
|
|
||||||
=
|
|
||||||
</string>
|
|
||||||
<string name="`">
|
|
||||||
`
|
|
||||||
</string>
|
|
||||||
<string name=";">
|
|
||||||
;
|
|
||||||
</string>
|
|
||||||
<!-- Key names end -->
|
<!-- Key names end -->
|
||||||
<!-- Mouse button names (short) begin -->
|
<!-- Mouse button names (short) begin -->
|
||||||
<string name="LMB">
|
<string name="LMB">
|
||||||
|
|
@ -5758,7 +5737,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||||
アバターの容姿を変更します。
|
アバターの容姿を変更します。
|
||||||
</string>
|
</string>
|
||||||
<string name="Command_Avatar_Tooltip">
|
<string name="Command_Avatar_Tooltip">
|
||||||
アバター一式を選択します。
|
アバターウェルカムパックを開きます。
|
||||||
</string>
|
</string>
|
||||||
<string name="Command_Build_Tooltip">
|
<string name="Command_Build_Tooltip">
|
||||||
オブジェクトのビルドや地形の変形をします。
|
オブジェクトのビルドや地形の変形をします。
|
||||||
|
|
@ -6126,7 +6105,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||||
(全[MAXEXPERIENCES]件中[EXPERIENCES]件)
|
(全[MAXEXPERIENCES]件中[EXPERIENCES]件)
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermission1">
|
<string name="ExperiencePermission1">
|
||||||
コントロールを引き継ぐ
|
操作を引き継ぐ
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermission3">
|
<string name="ExperiencePermission3">
|
||||||
アバターでアニメーションをトリガー
|
アバターでアニメーションをトリガー
|
||||||
|
|
@ -6135,10 +6114,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||||
アバターに装着
|
アバターに装着
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermission9">
|
<string name="ExperiencePermission9">
|
||||||
カメラ追従
|
カメラの追従
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermission10">
|
<string name="ExperiencePermission10">
|
||||||
カメラのコントロール
|
カメラの制御
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermission11">
|
<string name="ExperiencePermission11">
|
||||||
あなたをテレポート
|
あなたをテレポート
|
||||||
|
|
@ -6156,7 +6135,7 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||||
が、不明な操作を実行しました:[Permission]
|
が、不明な操作を実行しました:[Permission]
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermissionShort1">
|
<string name="ExperiencePermissionShort1">
|
||||||
コントロールする
|
操作する
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermissionShort3">
|
<string name="ExperiencePermissionShort3">
|
||||||
アニメーションをトリガー
|
アニメーションをトリガー
|
||||||
|
|
@ -6165,10 +6144,10 @@ www.secondlife.com から最新バージョンをダウンロードしてくだ
|
||||||
取り付ける
|
取り付ける
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermissionShort9">
|
<string name="ExperiencePermissionShort9">
|
||||||
カメラを追跡
|
カメラ追跡
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermissionShort10">
|
<string name="ExperiencePermissionShort10">
|
||||||
カメラを制御
|
カメラ制御
|
||||||
</string>
|
</string>
|
||||||
<string name="ExperiencePermissionShort11">
|
<string name="ExperiencePermissionShort11">
|
||||||
テレポート
|
テレポート
|
||||||
|
|
@ -6357,8 +6336,8 @@ Rez時間:[OBJECT_REZ_TIME]
|
||||||
<!-- <FS:Zi> Quick preferences default options -->
|
<!-- <FS:Zi> Quick preferences default options -->
|
||||||
<string name="QP Draw Distance">描画距離</string>
|
<string name="QP Draw Distance">描画距離</string>
|
||||||
<string name="QP Max Particles">最大パーティクル</string>
|
<string name="QP Max Particles">最大パーティクル</string>
|
||||||
<string name="QP Avatar Physics LOD">アバター物理効果LOD</string>
|
<string name="QP Avatar Physics LOD">アバター物理効果LoD</string>
|
||||||
<string name="QP LOD Factor">LOD係数</string>
|
<string name="QP LOD Factor">LoD係数</string>
|
||||||
<string name="QP Max Avatars">最大アバター数</string>
|
<string name="QP Max Avatars">最大アバター数</string>
|
||||||
<string name="QP Tags Offset">名前タグのオフセット位置</string>
|
<string name="QP Tags Offset">名前タグのオフセット位置</string>
|
||||||
<string name="QP Name Tags">名前タグの表示</string>
|
<string name="QP Name Tags">名前タグの表示</string>
|
||||||
|
|
|
||||||
|
|
@ -142,6 +142,7 @@
|
||||||
<check_box label="Włącz automatyczne odgadywanie imion w pasku czatu w pobliżu" name="FSChatbarNamePrediction"/>
|
<check_box label="Włącz automatyczne odgadywanie imion w pasku czatu w pobliżu" name="FSChatbarNamePrediction"/>
|
||||||
<check_box name="AllowMUpose" label="":" synonimem dla "/me""/>
|
<check_box name="AllowMUpose" label="":" synonimem dla "/me""/>
|
||||||
<check_box name="AutoCloseOOC" label="Domykaj ((nawiasy)) dla czatu OOC"/>
|
<check_box name="AutoCloseOOC" label="Domykaj ((nawiasy)) dla czatu OOC"/>
|
||||||
|
<check_box name="FSUseChatMentionAutoComplete" label="Automatyczne wyświetlanie okna wzmianek @ podczas pisania w paskach czatu"/>
|
||||||
<check_box name="FSEnableEmojiWindowPopupWhileTyping" label="Automatyczne wyświetlanie okna wyboru emoji podczas pisania w paskach czatu"/>
|
<check_box name="FSEnableEmojiWindowPopupWhileTyping" label="Automatyczne wyświetlanie okna wyboru emoji podczas pisania w paskach czatu"/>
|
||||||
<check_box name="FSShowEmojiButton" label="Przycisk emoji w pasku czatu dla sesji IM i czatu w pobliżu"/>
|
<check_box name="FSShowEmojiButton" label="Przycisk emoji w pasku czatu dla sesji IM i czatu w pobliżu"/>
|
||||||
<check_box name="FSShowIMSendButton" label="Przycisk wysyłania wiadomości w pasku czatu dla sesji IM"/>
|
<check_box name="FSShowIMSendButton" label="Przycisk wysyłania wiadomości w pasku czatu dla sesji IM"/>
|
||||||
|
|
|
||||||
|
|
@ -114,7 +114,7 @@
|
||||||
<check_box name="FSChatbarNamePrediction" label="在本地聊天中啟用名稱自動完成" />
|
<check_box name="FSChatbarNamePrediction" label="在本地聊天中啟用名稱自動完成" />
|
||||||
<check_box name="AllowMUpose" label="':' 為 '/me' 的同義詞" />
|
<check_box name="AllowMUpose" label="':' 為 '/me' 的同義詞" />
|
||||||
<check_box name="AutoCloseOOC" label="自動關閉雙括號 ((OOC))" />
|
<check_box name="AutoCloseOOC" label="自動關閉雙括號 ((OOC))" />
|
||||||
<check_box name="FSSuppressEmojiWindowPopupWhileTyping" label="在聊天欄輸入時阻止表情選擇視窗自動彈出" />
|
<check_box name="FSUseChatMentionAutoComplete" label="在聊天欄輸入@時自動打開提及視窗"/>
|
||||||
<check_box name="FSEnableEmojiWindowPopupWhileTyping" label="在聊天欄輸入時自動打開表情選擇視窗" />
|
<check_box name="FSEnableEmojiWindowPopupWhileTyping" label="在聊天欄輸入時自動打開表情選擇視窗" />
|
||||||
<check_box name="FSShowEmojiButton" label="在私聊和附近聊天中顯示表情符號按鈕" />
|
<check_box name="FSShowEmojiButton" label="在私聊和附近聊天中顯示表情符號按鈕" />
|
||||||
<check_box name="FSShowIMSendButton" label="在私聊中顯示傳送按鈕" />
|
<check_box name="FSShowIMSendButton" label="在私聊中顯示傳送按鈕" />
|
||||||
|
|
|
||||||
|
|
@ -128,6 +128,9 @@ class ViewerManifest(LLManifest,FSViewerManifest):
|
||||||
self.path("beams")
|
self.path("beams")
|
||||||
self.path("beamsColors")
|
self.path("beamsColors")
|
||||||
|
|
||||||
|
# <FS:AR> Poser Presets
|
||||||
|
self.path("poses")
|
||||||
|
|
||||||
# <FS:Beq> package static_assets folder
|
# <FS:Beq> package static_assets folder
|
||||||
if self.fs_is_opensim():
|
if self.fs_is_opensim():
|
||||||
self.path("static_assets")
|
self.path("static_assets")
|
||||||
|
|
@ -194,10 +197,6 @@ class ViewerManifest(LLManifest,FSViewerManifest):
|
||||||
with self.prefix(src_dst="fs_resources"):
|
with self.prefix(src_dst="fs_resources"):
|
||||||
self.path("*.lsltxt")
|
self.path("*.lsltxt")
|
||||||
self.path("*.dae") # <FS:Beq> FIRE-30963 - better physics defaults
|
self.path("*.dae") # <FS:Beq> FIRE-30963 - better physics defaults
|
||||||
|
|
||||||
# <FS:AR> Poser Presets
|
|
||||||
with self.prefix(src_dst="poses/hand_presets"):
|
|
||||||
self.path("*.xml")
|
|
||||||
|
|
||||||
# skins
|
# skins
|
||||||
with self.prefix(src_dst="skins"):
|
with self.prefix(src_dst="skins"):
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue