diff options
141 files changed, 3870 insertions, 347 deletions
diff --git a/doc/contributions.txt b/doc/contributions.txt index 7e8ab46b1a..240bce5719 100755 --- a/doc/contributions.txt +++ b/doc/contributions.txt @@ -185,6 +185,7 @@ Ansariel Hiller BUG-3764 STORM-1984 STORM-1979 + MAINT-4036 Aralara Rajal Arare Chantilly CHUIBUG-191 @@ -757,6 +758,7 @@ Kitty Barnett STORM-1905 VWR-24217 STORM-1804 + MAINT-4036 Kolor Fall Komiko Okamoto Korvel Noh diff --git a/indra/llinventory/llparcel.cpp b/indra/llinventory/llparcel.cpp index e400877b3b..b24e14c72b 100755 --- a/indra/llinventory/llparcel.cpp +++ b/indra/llinventory/llparcel.cpp @@ -793,8 +793,6 @@ BOOL LLParcel::addToAccessList(const LLUUID& agent_id, S32 time) } } - removeFromBanList(agent_id); - LLAccessEntry new_entry; new_entry.mID = agent_id; new_entry.mTime = time; @@ -838,8 +836,6 @@ BOOL LLParcel::addToBanList(const LLUUID& agent_id, S32 time) } } - removeFromAccessList(agent_id); - LLAccessEntry new_entry; new_entry.mID = agent_id; new_entry.mTime = time; diff --git a/indra/llprimitive/llmodel.cpp b/indra/llprimitive/llmodel.cpp index 57a698b98f..b4963225dc 100755 --- a/indra/llprimitive/llmodel.cpp +++ b/indra/llprimitive/llmodel.cpp @@ -191,7 +191,7 @@ LLModel::EModelStatus load_face_from_dom_triangles(std::vector<LLVolumeFace>& fa U32 tc_count = tc_source ? tc.getCount() : 0; U32 norm_count = norm_source ? n.getCount() : 0; - if (vertex_count == 0) + if ((vertex_count == 0) || (tc_count == 0)) { llwarns << "Unable to process mesh with empty position array; invalid model." << llendl; return LLModel::BAD_ELEMENT; diff --git a/indra/llui/llfolderview.cpp b/indra/llui/llfolderview.cpp index cca26f335a..474b545f00 100755 --- a/indra/llui/llfolderview.cpp +++ b/indra/llui/llfolderview.cpp @@ -1371,7 +1371,8 @@ BOOL LLFolderView::search(LLFolderViewItem* first_item, const std::string &searc } } - const std::string current_item_label(search_item->getViewModelItem()->getSearchableName()); + std::string current_item_label(search_item->getViewModelItem()->getSearchableName()); + LLStringUtil::toUpper(current_item_label); S32 search_string_length = llmin(upper_case_string.size(), current_item_label.size()); if (!current_item_label.compare(0, search_string_length, upper_case_string)) { diff --git a/indra/llui/llfolderviewitem.cpp b/indra/llui/llfolderviewitem.cpp index 83254c2840..9a14d0e419 100644 --- a/indra/llui/llfolderviewitem.cpp +++ b/indra/llui/llfolderviewitem.cpp @@ -655,7 +655,7 @@ void LLFolderViewItem::drawOpenFolderArrow(const Params& default_params, const L // const S32 TOP_PAD = default_params.item_top_pad; - if (hasVisibleChildren() || getViewModelItem()->hasChildren()) + if (hasVisibleChildren()) { LLUIImage* arrow_image = default_params.folder_arrow_image; gl_draw_scaled_rotated_image( @@ -970,8 +970,9 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height ) LL_RECORD_BLOCK_TIME(FTM_ARRANGE); // evaluate mHasVisibleChildren - mHasVisibleChildren = false; - if (getViewModelItem()->descendantsPassedFilter()) + bool default_filter = getRoot()->getFolderViewModel()->getFilter().isDefault(); + mHasVisibleChildren = default_filter && (mItems.size() || mFolders.size()); + if (!default_filter && getViewModelItem()->descendantsPassedFilter()) { // We have to verify that there's at least one child that's not filtered out bool found = false; @@ -1022,7 +1023,12 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height ) for(folders_t::iterator fit = mFolders.begin(); fit != mFolders.end(); ++fit) { LLFolderViewFolder* folderp = (*fit); - folderp->setVisible(folderp->passedFilter()); // passed filter or has descendants that passed filter + + // passedFilter() will show everything that passed filter or has descendants that passed filter + // also it will hide all filter-pending folders (they will be shown later if needed). + // but since refreshed folders are 'pending', they can be rendered invisible by passedFilter() + // even if we are not using filter at the moment, default_filter is used to prevent it + folderp->setVisible(default_filter || folderp->passedFilter()); if (folderp->getVisible()) { @@ -1041,7 +1047,7 @@ S32 LLFolderViewFolder::arrange( S32* width, S32* height ) iit != mItems.end(); ++iit) { LLFolderViewItem* itemp = (*iit); - itemp->setVisible(itemp->passedFilter()); + itemp->setVisible(default_filter || itemp->passedFilter()); if (itemp->getVisible()) { diff --git a/indra/llui/lllineeditor.cpp b/indra/llui/lllineeditor.cpp index b09c927782..45f4272aa7 100755 --- a/indra/llui/lllineeditor.cpp +++ b/indra/llui/lllineeditor.cpp @@ -254,6 +254,7 @@ void LLLineEditor::onCommit() setControlValue(getValue()); LLUICtrl::onCommit(); + resetDirty(); // Selection on commit needs to be turned off when evaluating maths // expressions, to allow indication of the error position diff --git a/indra/llui/llstatgraph.cpp b/indra/llui/llstatgraph.cpp index a44bc18733..98962aff9a 100755 --- a/indra/llui/llstatgraph.cpp +++ b/indra/llui/llstatgraph.cpp @@ -44,9 +44,10 @@ LLStatGraph::LLStatGraph(const Params& p) : LLView(p), mMin(p.min), mMax(p.max), - mPerSec(true), + mPerSec(p.per_sec), mPrecision(p.precision), mValue(p.value), + mUnits(p.units), mNewStatFloatp(p.stat.count_stat_float) { setToolTip(p.name()); diff --git a/indra/llui/lltextbase.cpp b/indra/llui/lltextbase.cpp index 71db0ac030..2d7062e71d 100755 --- a/indra/llui/lltextbase.cpp +++ b/indra/llui/lltextbase.cpp @@ -218,7 +218,8 @@ LLTextBase::LLTextBase(const LLTextBase::Params &p) mParseHighlights(p.parse_highlights), mBGVisible(p.bg_visible), mScroller(NULL), - mStyleDirty(true) + mStyleDirty(true), + mDrawRightmostCursor(false) { if(p.allow_scroll) { @@ -1307,14 +1308,14 @@ void LLTextBase::replaceWithSuggestion(U32 index) if ( (it->first <= (U32)mCursorPos) && (it->second >= (U32)mCursorPos) ) { deselect(); - - // Delete the misspelled word - removeStringNoUndo(it->first, it->second - it->first); - // Insert the suggestion in its place LLWString suggestion = utf8str_to_wstring(mSuggestionList[index]); insertStringNoUndo(it->first, utf8str_to_wstring(mSuggestionList[index])); + // Delete the misspelled word + removeStringNoUndo(it->first + (S32)suggestion.length(), it->second - it->first); + + setCursorPos(it->first + (S32)suggestion.length()); break; @@ -1504,6 +1505,11 @@ void LLTextBase::reflow() // find and erase line info structs starting at start_index and going to end of document if (!mLineInfoList.empty()) { + if (mDrawRightmostCursor) + { + start_index--; + } + // find first element whose end comes after start_index line_list_t::iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), start_index, line_end_compare()); line_start_index = iter->mDocIndexStart; @@ -1692,6 +1698,11 @@ S32 LLTextBase::getLineNumFromDocIndex( S32 doc_index, bool include_wordwrap) co } else { + if (mDrawRightmostCursor) + { + doc_index--; + } + line_list_t::const_iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), doc_index, line_end_compare()); if (include_wordwrap) { @@ -1720,6 +1731,11 @@ S32 LLTextBase::getLineOffsetFromDocIndex( S32 startpos, bool include_wordwrap) } else { + if (mDrawRightmostCursor) + { + startpos--; + } + line_list_t::const_iterator iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), startpos, line_end_compare()); return startpos - iter->mDocIndexStart; } @@ -2381,7 +2397,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, // binary search for line that starts before local_y line_list_t::const_iterator line_iter = std::lower_bound(mLineInfoList.begin(), mLineInfoList.end(), doc_y, compare_bottom()); - if (line_iter == mLineInfoList.end()) + if (!mLineInfoList.size() || line_iter == mLineInfoList.end()) { return getLength(); // past the end } @@ -2440,7 +2456,7 @@ S32 LLTextBase::getDocIndexFromLocalCoord( S32 local_x, S32 local_y, BOOL round, } else if (hit_past_end_of_line && segmentp->getEnd() >= line_iter->mDocIndexEnd) { - if (getLineNumFromDocIndex(line_iter->mDocIndexEnd - 1) == line_iter->mLineNum) + if (getLineNumFromDocIndex(line_iter->mDocIndexEnd - 1) == line_iter->mLineNum && !mDrawRightmostCursor) { // if segment wraps to the next line we should step one char back // to compensate for the space char between words @@ -2473,8 +2489,13 @@ LLRect LLTextBase::getDocRectFromDocIndex(S32 pos) const // clamp pos to valid values pos = llclamp(pos, 0, mLineInfoList.back().mDocIndexEnd - 1); - // find line that contains cursor - line_list_t::const_iterator line_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), pos, line_end_compare()); + S32 corrected_pos = pos; + if (mDrawRightmostCursor && pos > 0) + { + corrected_pos--; + } + + line_list_t::const_iterator line_iter = std::upper_bound(mLineInfoList.begin(), mLineInfoList.end(), corrected_pos, line_end_compare()); doc_rect.mLeft = line_iter->mRect.mLeft; doc_rect.mBottom = line_iter->mRect.mBottom; diff --git a/indra/llui/lltextbase.h b/indra/llui/lltextbase.h index 738b4d5b8e..9c3bc3ed98 100755 --- a/indra/llui/lltextbase.h +++ b/indra/llui/lltextbase.h @@ -618,6 +618,7 @@ protected: // cursor S32 mCursorPos; // I-beam is just after the mCursorPos-th character. + bool mDrawRightmostCursor; // When cursor is on the rightmost position on the line S32 mDesiredXPixel; // X pixel position where the user wants the cursor to be LLFrameTimer mCursorBlinkTimer; // timer that controls cursor blinking diff --git a/indra/llui/lltexteditor.cpp b/indra/llui/lltexteditor.cpp index 576e8f7600..9219490bf2 100755 --- a/indra/llui/lltexteditor.cpp +++ b/indra/llui/lltexteditor.cpp @@ -1124,8 +1124,14 @@ void LLTextEditor::addChar(llwchar wc) setCursorPos(new_cursor_pos); } } -} + if (mCursorPos > 0) + { + LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos); + LLRect prev_cursor_rect = getDocRectFromDocIndex(mCursorPos - 1); + mDrawRightmostCursor = current_cursor_rect.mBottom < prev_cursor_rect.mBottom; + } +} void LLTextEditor::addLineBreakChar(BOOL group_together) { @@ -1271,6 +1277,12 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) break; case KEY_HOME: + if(mDrawRightmostCursor && mCursorPos > 0) + { + mCursorPos--; + mDrawRightmostCursor = false; + } + startOfLine(); break; @@ -1285,6 +1297,23 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) case KEY_END: endOfLine(); + { + S32 last_line_index = mLineInfoList.size() - 1; + if (getLineNumFromDocIndex(mCursorPos, true) < last_line_index) + { + mDrawRightmostCursor = true; + setCursorPos(mCursorPos + 1); + } + else if (last_line_index > 0) // only for two and more lines + { + S32 prev_line_width = mLineInfoList[last_line_index - 1].mRect.getWidth(); + S32 last_line_width = mLineInfoList[last_line_index].mRect.getWidth(); + if (prev_line_width <= last_line_width) + { + mDrawRightmostCursor = true; + } + } + } break; case KEY_LEFT: @@ -1296,7 +1325,18 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) { if( 0 < mCursorPos ) { - setCursorPos(mCursorPos - 1); + LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos); + LLRect next_cursor_rect = getDocRectFromDocIndex(mCursorPos - 1); + + if (current_cursor_rect.mBottom < next_cursor_rect.mBottom) + { + mDrawRightmostCursor = true; + } + else + { + mDrawRightmostCursor = false; + setCursorPos(mCursorPos - 1); + } } else { @@ -1314,7 +1354,26 @@ BOOL LLTextEditor::handleNavigationKey(const KEY key, const MASK mask) { if( mCursorPos < getLength() ) { - setCursorPos(mCursorPos + 1); + LLRect current_cursor_rect = getDocRectFromDocIndex(mCursorPos); + LLRect next_cursor_rect = getDocRectFromDocIndex(mCursorPos + 1); + + if (current_cursor_rect.mBottom > next_cursor_rect.mBottom) + { + if (mDrawRightmostCursor) + { + mDrawRightmostCursor = false; + } + else + { + mDrawRightmostCursor = true; + setCursorPos(mCursorPos + 1); + } + } + else + { + mDrawRightmostCursor = false; + setCursorPos(mCursorPos + 1); + } } else { diff --git a/indra/llui/llui.h b/indra/llui/llui.h index b162f25887..c727f75c4f 100755 --- a/indra/llui/llui.h +++ b/indra/llui/llui.h @@ -86,6 +86,7 @@ enum EAcceptance { ACCEPT_POSTPONED, // we are asynchronously determining acceptance ACCEPT_NO, // Uninformative, general purpose denial. + ACCEPT_NO_CUSTOM, // Denial with custom message. ACCEPT_NO_LOCKED, // Operation would be valid, but permissions are set to disallow it. ACCEPT_YES_COPY_SINGLE, // We'll take a copy of a single item ACCEPT_YES_SINGLE, // Accepted. OK to drag and drop single item here. diff --git a/indra/llwindow/llopenglview-objc.mm b/indra/llwindow/llopenglview-objc.mm index 017ea3769c..f7031341eb 100644 --- a/indra/llwindow/llopenglview-objc.mm +++ b/indra/llwindow/llopenglview-objc.mm @@ -398,9 +398,35 @@ attributedStringInfo getSegments(NSAttributedString *str) } } -- (void)flagsChanged:(NSEvent *)theEvent { +- (void)flagsChanged:(NSEvent *)theEvent +{ mModifiers = [theEvent modifierFlags]; callModifier([theEvent modifierFlags]); + + NSInteger mask = 0; + switch([theEvent keyCode]) + { + case 56: + mask = NSShiftKeyMask; + break; + case 58: + mask = NSAlternateKeyMask; + break; + case 59: + mask = NSControlKeyMask; + break; + default: + return; + } + + if (mModifiers & mask) + { + callKeyDown([theEvent keyCode], 0); + } + else + { + callKeyUp([theEvent keyCode], 0); + } } - (BOOL) acceptsFirstResponder diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt index 142665525f..74e4f0b4b0 100755 --- a/indra/newview/CMakeLists.txt +++ b/indra/newview/CMakeLists.txt @@ -249,6 +249,7 @@ set(viewer_SOURCE_FILES llfloaterinspect.cpp llfloaterinventory.cpp llfloaterjoystick.cpp + llfloaterlagmeter.cpp llfloaterland.cpp llfloaterlandholdings.cpp llfloatermap.cpp @@ -853,6 +854,7 @@ set(viewer_HEADER_FILES llfloaterinspect.h llfloaterinventory.h llfloaterjoystick.h + llfloaterlagmeter.h llfloaterland.h llfloaterlandholdings.h llfloatermap.h diff --git a/indra/newview/app_settings/keywords.ini b/indra/newview/app_settings/keywords.ini index 17c70ef1c5..4972472f67 100755 --- a/indra/newview/app_settings/keywords.ini +++ b/indra/newview/app_settings/keywords.ini @@ -628,22 +628,22 @@ RCERR_CAST_TIME_EXCEEDED TODO: add documentation RCERR_SIM_PERF_LOW TODO: add documentation RCERR_UNKNOWN TODO: add documentation -ESTATE_ACCESS_ALLOWED_AGENT_ADD TODO: add documentation -ESTATE_ACCESS_ALLOWED_AGENT_REMOVE TODO: add documentation -ESTATE_ACCESS_ALLOWED_GROUP_ADD TODO: add documentation -ESTATE_ACCESS_ALLOWED_GROUP_REMOVE TODO: add documentation -ESTATE_ACCESS_BANNED_AGENT_ADD TODO: add documentation -ESTATE_ACCESS_BANNED_AGENT_REMOVE TODO: add documentation +ESTATE_ACCESS_ALLOWED_AGENT_ADD Passed to llManageEstateAccess to add the agent to this estate's Allowed Residents list +ESTATE_ACCESS_ALLOWED_AGENT_REMOVE Passed to llManageEstateAccess to remove the agent from this estate's Allowed Residents list +ESTATE_ACCESS_ALLOWED_GROUP_ADD Passed to llManageEstateAccess to add the group to this estate's Allowed groups list +ESTATE_ACCESS_ALLOWED_GROUP_REMOVE Passed to llManageEstateAccess to remove the group from this estate's Allowed groups list +ESTATE_ACCESS_BANNED_AGENT_ADD Passed to llManageEstateAccess to add the agent to this estate's Banned residents list +ESTATE_ACCESS_BANNED_AGENT_REMOVE Passed to llManageEstateAccess to remove the agent from this estate's Banned residents list DENSITY TODO: add documentation FRICTION TODO: add documentation RESTITUTION TODO: add documentation GRAVITY_MULTIPLIER TODO: add documentation -KFM_COMMAND TODO: add documentation -KFM_CMD_PLAY TODO: add documentation -KFM_CMD_STOP TODO: add documentation -KFM_CMD_PAUSE TODO: add documentation +KFM_COMMAND Command used in the options parameter of llSetKeyframedMotion, followed by one of: KFM_CMD_STOP, KFM_CMD_PLAY, KFM_CMD_PAUSE to play, stop or pause the motion +KFM_CMD_PLAY Command used in the options parameter llSetKeyframedMotion. Resumes the animation previously stopped by KFM_CMD_STOP or KFM_CMD_PAUSE +KFM_CMD_STOP Command used in the options parameter llSetKeyframedMotion. Stops the animation and resets it at the start of motion +KFM_CMD_PAUSE Command used in the options parameter llSetKeyframedMotion. Stops the animation but doesn t reset it at the start of motion. KFM_CMD_SET_MODE TODO: add documentation KFM_MODE TODO: add documentation KFM_FORWARD TODO: add documentation @@ -657,18 +657,18 @@ KFM_TRANSLATION TODO: add documentation CHARACTER_CMD_STOP TODO: add documentation CHARACTER_CMD_JUMP TODO: add documentation -CHARACTER_DESIRED_SPEED TODO: add documentation -CHARACTER_RADIUS TODO: add documentation -CHARACTER_LENGTH TODO: add documentation -CHARACTER_ORIENTATION TODO: add documentation -CHARACTER_AVOIDANCE_MODE TODO: add documentation +CHARACTER_DESIRED_SPEED Constant used to indicate that the following argument is the desired speed for a Pathfinding character. +CHARACTER_RADIUS Constant used to indicate that the following argument is the radius of the capsule for a Pathfinding character. +CHARACTER_LENGTH Constant used to indicate that the following argument is the length of the capsule for a Pathfinding character. +CHARACTER_ORIENTATION Constant used to indicate that the following argument is the orientation of the capsule for a Pathfinding character. +CHARACTER_AVOIDANCE_MODE Allows you to specify that a character should not try to avoid other characters, should not try to avoid dynamic obstacles, or both. Is combined with a mask bit flags PURSUIT_OFFSET TODO: add documentation REQUIRE_LINE_OF_SIGHT TODO: add documentation PURSUIT_FUZZ_FACTOR TODO: add documentation PURSUIT_INTERCEPT TODO: add documentation FORCE_DIRECT_PATH TODO: add documentation -VERTICAL TODO: add documentation -HORIZONTAL TODO: add documentation +VERTICAL Constant to indicate that the orientation of the capsule for a Pathfinding character is vertical. +HORIZONTAL Constant to indicate that the orientation of the capsule for a Pathfinding character is horizontal. AVOID_CHARACTERS TODO: add documentation AVOID_DYNAMIC_OBSTACLES TODO: add documentation @@ -683,12 +683,12 @@ PU_FAILURE_UNREACHABLE Goal is no longer reachable for some reason - e PU_GOAL_REACHED Character has reached the goal and will stop or choose a new goal (if wandering). PU_SLOWDOWN_DISTANCE_REACHED Character is near current goal. -CHARACTER_TYPE TODO: add documentation -CHARACTER_TYPE_A TODO: add documentation -CHARACTER_TYPE_B TODO: add documentation -CHARACTER_TYPE_C TODO: add documentation -CHARACTER_TYPE_D TODO: add documentation -CHARACTER_TYPE_NONE TODO: add documentation +CHARACTER_TYPE Specifies which walkability coefficient will be used by this character. Used in combination with one of the character type flags. +CHARACTER_TYPE_A Used for character types that you prefer move in a way consistent with humanoids. +CHARACTER_TYPE_B Used for character types that you prefer move in a way consistent with wild animals or off road vehicles. +CHARACTER_TYPE_C Used for mechanical character types or road going vehicles. +CHARACTER_TYPE_D Used for character types that are not consistent with the A, B, or C type. +CHARACTER_TYPE_NONE Used to set no specific character type. TRAVERSAL_TYPE TODO: add documentation TRAVERSAL_TYPE_SLOW TODO: add documentation diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml index 03b953b6cc..1b507b926a 100755 --- a/indra/newview/app_settings/settings.xml +++ b/indra/newview/app_settings/settings.xml @@ -13212,7 +13212,7 @@ <key>Value</key> <string>Default</string> </map> - <key>UseExternalBrowser</key> + <key>UseExternalBrowser</key> <!-- deprecated (see MAINT-4127) --> <map> <key>Comment</key> <string>Use default browser when opening web pages instead of in-world browser.</string> @@ -13223,6 +13223,17 @@ <key>Value</key> <boolean>1</boolean> </map> + <key>PreferredBrowserBehavior</key> + <map> + <key>Comment</key> + <string>Use system browser for any links (0), use builtin browser for SL links and system one for others (1) or use builtin browser only (2).</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>1</integer> + </map> <key>UseFreezeFrame</key> <map> <key>Comment</key> @@ -14213,6 +14224,17 @@ <key>Value</key> <integer>0</integer> </map> + <key>LeaveMouselook</key> + <map> + <key>Comment</key> + <string>Exit Mouselook mode via S or Down Arrow keys while sitting </string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>Boolean</string> + <key>Value</key> + <integer>0</integer> + </map> <key>TextureLoggingThreshold</key> <map> <key>Comment</key> @@ -15451,6 +15473,17 @@ <key>Value</key> <string /> </map> + <key>WearFolderLimit</key> + <map> + <key>Comment</key> + <string>Limits number of items in the folder that can be replaced/added to current outfit</string> + <key>Persist</key> + <integer>1</integer> + <key>Type</key> + <string>U32</string> + <key>Value</key> + <integer>125</integer> + </map> <key>EveryoneCopy</key> <map> <key>Comment</key> diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp index bd6025feea..e5a90e8a28 100755 --- a/indra/newview/llagent.cpp +++ b/indra/newview/llagent.cpp @@ -3712,6 +3712,12 @@ bool LLAgent::teleportCore(bool is_local) return false; } + // force stand up and stop a sitting animation (if any), see MAINT-3969 + if (isAgentAvatarValid() && gAgentAvatarp->getParent() && gAgentAvatarp->isSitting()) + { + gAgentAvatarp->getOffObject(); + } + #if 0 // This should not exist. It has been added, removed, added, and now removed again. // This change needs to come from the simulator. Otherwise, the agent ends up out of @@ -3887,7 +3893,7 @@ void LLAgent::teleportRequest( bool look_at_from_camera) { LLViewerRegion* regionp = getRegion(); - bool is_local = (region_handle == to_region_handle(getPositionGlobal())); + bool is_local = (region_handle == regionp->getHandle()); if(regionp && teleportCore(is_local)) { LL_INFOS("") << "TeleportLocationRequest: '" << region_handle << "':" @@ -4054,7 +4060,12 @@ void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global) void LLAgent::doTeleportViaLocationLookAt(const LLVector3d& pos_global) { mbTeleportKeepsLookAt = true; - gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction + + if(!gAgentCamera.isfollowCamLocked()) + { + gAgentCamera.setFocusOnAvatar(FALSE, ANIMATE); // detach camera form avatar, so it keeps direction + } + U64 region_handle = to_region_handle(pos_global); LLVector3 pos_local = (LLVector3)(pos_global - from_region_handle(region_handle)); teleportRequest(region_handle, pos_local, getTeleportKeepsLookAt()); diff --git a/indra/newview/llagentcamera.cpp b/indra/newview/llagentcamera.cpp index 7b0496ea45..2356a84688 100755 --- a/indra/newview/llagentcamera.cpp +++ b/indra/newview/llagentcamera.cpp @@ -2721,6 +2721,11 @@ void LLAgentCamera::lookAtLastChat() } } +bool LLAgentCamera::isfollowCamLocked() +{ + return mFollowCam.getPositionLocked(); +} + BOOL LLAgentCamera::setPointAt(EPointAtType target_type, LLViewerObject *object, LLVector3 position) { // disallow pointing at attachments and avatars diff --git a/indra/newview/llagentcamera.h b/indra/newview/llagentcamera.h index 00fa6ea189..4d0f9a80de 100755 --- a/indra/newview/llagentcamera.h +++ b/indra/newview/llagentcamera.h @@ -155,6 +155,7 @@ private: //-------------------------------------------------------------------- public: void setUsingFollowCam(bool using_follow_cam); + bool isfollowCamLocked(); private: LLFollowCam mFollowCam; // Ventrella diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp index 890fc9a8d9..49fedb8df8 100755 --- a/indra/newview/llagentwearables.cpp +++ b/indra/newview/llagentwearables.cpp @@ -1035,6 +1035,7 @@ void LLAgentWearables::setWearableOutfit(const LLInventoryItem::item_array_t& it if (mismatched == 0) { LL_DEBUGS("Avatar") << "no changes, bailing out" << LL_ENDL; + mCOFChangeInProgress = false; return; } diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp index 9451a30341..29534a4382 100755 --- a/indra/newview/llappearancemgr.cpp +++ b/indra/newview/llappearancemgr.cpp @@ -1710,8 +1710,16 @@ bool LLAppearanceMgr::getCanAddToCOF(const LLUUID& outfit_cat_id) return false; } + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ false); - return gInventory.hasMatchingDirectDescendent(outfit_cat_id, not_worn); + gInventory.collectDescendentsIf(outfit_cat_id, + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + not_worn); + + return items.size() > 0; } bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id) @@ -1729,8 +1737,16 @@ bool LLAppearanceMgr::getCanReplaceCOF(const LLUUID& outfit_cat_id) } // Check whether the outfit contains any wearables we aren't wearing already (STORM-702). - LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ true); - return gInventory.hasMatchingDirectDescendent(outfit_cat_id, not_worn); + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLFindWearablesEx is_worn(/*is_worn=*/ false, /*include_body_parts=*/ true); + gInventory.collectDescendentsIf(outfit_cat_id, + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + is_worn); + + return items.size() > 0; } void LLAppearanceMgr::purgeBaseOutfitLink(const LLUUID& category, LLPointer<LLInventoryCallback> cb) diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp index 24150daea4..3a5008507a 100755 --- a/indra/newview/llappviewer.cpp +++ b/indra/newview/llappviewer.cpp @@ -3368,11 +3368,11 @@ LLSD LLAppViewer::getViewerInfo() const // TODO: Implement media plugin version query info["QT_WEBKIT_VERSION"] = "4.7.1 (version number hard-coded)"; - if (gPacketsIn > 0) + S32 packets_in = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_IN); + if (packets_in > 0) { - LLTrace::Recording& last_frame = LLTrace::get_frame_recording().getLastRecording(); - info["PACKETS_LOST"] = last_frame.getSum(LLStatViewer::PACKETS_LOST); - info["PACKETS_IN"] = last_frame.getSum(LLStatViewer::PACKETS_IN); + info["PACKETS_LOST"] = LLViewerStats::instance().getRecording().getSum(LLStatViewer::PACKETS_LOST); + info["PACKETS_IN"] = packets_in; info["PACKETS_PCT"] = 100.f*info["PACKETS_LOST"].asReal() / info["PACKETS_IN"].asReal(); } diff --git a/indra/newview/llavataractions.cpp b/indra/newview/llavataractions.cpp index dad85a016c..8235b13118 100755 --- a/indra/newview/llavataractions.cpp +++ b/indra/newview/llavataractions.cpp @@ -143,7 +143,7 @@ void LLAvatarActions::removeFriendsDialog(const uuid_vec_t& ids) LLAvatarName av_name; if(LLAvatarNameCache::get(agent_id, &av_name)) { - args["NAME"] = av_name.getDisplayName(); + args["NAME"] = av_name.getCompleteName(); } msgType = "RemoveFromFriends"; @@ -381,7 +381,7 @@ void LLAvatarActions::showOnMap(const LLUUID& id) } gFloaterWorldMap->trackAvatar(id, av_name.getDisplayName()); - LLFloaterReg::showInstance("world_map"); + LLFloaterReg::showInstance("world_map", "center"); } // static @@ -533,6 +533,14 @@ void LLAvatarActions::share(const LLUUID& id) { // we should always get here, but check to verify anyways LLIMModel::getInstance()->addMessage(session_id, SYSTEM_FROM, LLUUID::null, LLTrans::getString("share_alert"), false); + + LLFloaterIMSessionTab* session_floater = LLFloaterIMSessionTab::findConversation(session_id); + if (session_floater && session_floater->isMinimized()) + { + session_floater->setMinimized(false); + } + LLFloaterIMContainer *im_container = LLFloaterReg::getTypedInstance<LLFloaterIMContainer>("im_container"); + im_container->selectConversationPair(session_id, true); } } diff --git a/indra/newview/llavatariconctrl.cpp b/indra/newview/llavatariconctrl.cpp index 746b541f9d..b89b0d9900 100755 --- a/indra/newview/llavatariconctrl.cpp +++ b/indra/newview/llavatariconctrl.cpp @@ -247,7 +247,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value) { LLAvatarPropertiesProcessor* app = LLAvatarPropertiesProcessor::getInstance(); - if (mAvatarId.notNull()) + if (mAvatarId.notNull() && mAvatarId != value.asUUID()) { app->removeObserver(mAvatarId, this); } @@ -255,6 +255,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value) if (mAvatarId != value.asUUID()) { mAvatarId = value.asUUID(); + app->addObserver(mAvatarId, this); // *BUG: This will return stale icons if a user changes their // profile picture. However, otherwise we send too many upstream @@ -270,7 +271,7 @@ void LLAvatarIconCtrl::setValue(const LLSD& value) // People API, rather than sending AvatarPropertyRequest // messages. People API already hits the user table. LLIconCtrl::setValue(mDefaultIconName); - app->addObserver(mAvatarId, this); + // duplicated requests are filtered later if there are any app->sendAvatarPropertiesRequest(mAvatarId); } } diff --git a/indra/newview/llfavoritesbar.cpp b/indra/newview/llfavoritesbar.cpp index 1b3cfb5ebd..6c5b5be720 100755 --- a/indra/newview/llfavoritesbar.cpp +++ b/indra/newview/llfavoritesbar.cpp @@ -40,7 +40,6 @@ #include "llagent.h" #include "llavatarnamecache.h" #include "llclipboard.h" -#include "llclipboard.h" #include "llinventorybridge.h" #include "llinventoryfunctions.h" #include "llfloatersidepanelcontainer.h" @@ -51,7 +50,7 @@ #include "lltoggleablemenu.h" #include "llviewerinventory.h" #include "llviewermenu.h" -#include "llviewermenu.h" +#include "llviewernetwork.h" #include "lltooldraganddrop.h" #include "llsdserialize.h" @@ -327,6 +326,7 @@ public: gInventory.updateItem(item); gInventory.notifyObservers(); + LLFavoritesOrderStorage::instance().saveOrder(); } LLView::getWindow()->setCursor(UI_CURSOR_ARROW); @@ -1452,6 +1452,18 @@ void LLFavoritesOrderStorage::getSLURL(const LLUUID& asset_id) void LLFavoritesOrderStorage::destroyClass() { LLFavoritesOrderStorage::instance().cleanup(); + + + std::string old_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + llifstream file; + file.open(old_filename); + if (file.is_open()) + { + std::string new_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml"); + LLFile::copy(old_filename,new_filename); + LLFile::remove(old_filename); + } + if (gSavedPerAccountSettings.getBOOL("ShowFavoritesOnLogin")) { LLFavoritesOrderStorage::instance().saveFavoritesSLURLs(); @@ -1498,7 +1510,7 @@ void LLFavoritesOrderStorage::saveFavoritesSLURLs() return; } - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml"); llifstream in_file; in_file.open(filename); LLSD fav_llsd; @@ -1546,7 +1558,7 @@ void LLFavoritesOrderStorage::saveFavoritesSLURLs() void LLFavoritesOrderStorage::removeFavoritesRecordOfUser() { - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml"); LLSD fav_llsd; llifstream file; file.open(filename); @@ -1641,6 +1653,16 @@ void LLFavoritesOrderStorage::cleanup() mSortIndexes.swap(aTempMap); } +void LLFavoritesOrderStorage::saveOrder() +{ + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLIsType is_type(LLAssetType::AT_LANDMARK); + LLUUID favorites_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_FAVORITE); + gInventory.collectDescendentsIf(favorites_id, cats, items, LLInventoryModel::EXCLUDE_TRASH, is_type); + saveItemsOrder(items); +} + void LLFavoritesOrderStorage::saveItemsOrder( const LLInventoryModel::item_array_t& items ) { int sortField = 0; diff --git a/indra/newview/llfavoritesbar.h b/indra/newview/llfavoritesbar.h index 211d3c4ce3..5ca1d3e8ed 100755 --- a/indra/newview/llfavoritesbar.h +++ b/indra/newview/llfavoritesbar.h @@ -203,6 +203,8 @@ public: // Is used to save order for Favorites folder. void saveItemsOrder(const LLInventoryModel::item_array_t& items); + void saveOrder(); + void rearrangeFavoriteLandmarks(const LLUUID& source_item_id, const LLUUID& target_item_id); /** diff --git a/indra/newview/llfloateravatar.cpp b/indra/newview/llfloateravatar.cpp index bdc5b581a9..31adf5b61e 100755 --- a/indra/newview/llfloateravatar.cpp +++ b/indra/newview/llfloateravatar.cpp @@ -34,6 +34,7 @@ #include "llfloateravatar.h" #include "lluictrlfactory.h" +#include "llmediactrl.h" LLFloaterAvatar::LLFloaterAvatar(const LLSD& key) @@ -43,6 +44,13 @@ LLFloaterAvatar::LLFloaterAvatar(const LLSD& key) LLFloaterAvatar::~LLFloaterAvatar() { + LLMediaCtrl* avatar_picker = findChild<LLMediaCtrl>("avatar_picker_contents"); + if (avatar_picker) + { + avatar_picker->navigateStop(); + avatar_picker->clearCache(); //images are reloading each time already + avatar_picker->unloadMediaSource(); + } } BOOL LLFloaterAvatar::postBuild() diff --git a/indra/newview/llfloaterimcontainer.cpp b/indra/newview/llfloaterimcontainer.cpp index ebb44561da..a4b91e47bb 100755 --- a/indra/newview/llfloaterimcontainer.cpp +++ b/indra/newview/llfloaterimcontainer.cpp @@ -229,7 +229,9 @@ BOOL LLFloaterIMContainer::postBuild() mStubCollapseBtn = getChild<LLButton>("stub_collapse_btn"); mStubCollapseBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onStubCollapseButtonClicked, this)); mSpeakBtn = getChild<LLButton>("speak_btn"); - mSpeakBtn->setClickedCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonClicked, this)); + + mSpeakBtn->setMouseDownCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonPressed, this)); + mSpeakBtn->setMouseUpCallback(boost::bind(&LLFloaterIMContainer::onSpeakButtonReleased, this)); childSetAction("add_btn", boost::bind(&LLFloaterIMContainer::onAddButtonClicked, this)); @@ -352,11 +354,18 @@ void LLFloaterIMContainer::onStubCollapseButtonClicked() collapseMessagesPane(true); } -void LLFloaterIMContainer::onSpeakButtonClicked() +void LLFloaterIMContainer::onSpeakButtonPressed() +{ + LLVoiceClient::getInstance()->inputUserControlState(true); + updateSpeakBtnState(); +} + +void LLFloaterIMContainer::onSpeakButtonReleased() { - LLAgent::toggleMicrophone("speak"); + LLVoiceClient::getInstance()->inputUserControlState(false); updateSpeakBtnState(); } + void LLFloaterIMContainer::onExpandCollapseButtonClicked() { if (mConversationsPane->isCollapsed() && mMessagesPane->isCollapsed() @@ -1271,6 +1280,22 @@ bool LLFloaterIMContainer::enableContextMenuItem(const LLSD& userdata) uuid_vec_t uuids; getParticipantUUIDs(uuids); + + //If there is group or ad-hoc chat in multiselection, everything needs to be disabled + if(uuids.size() > 1) + { + const std::set<LLFolderViewItem*> selectedItems = mConversationsRoot->getSelectionList(); + LLConversationItem * conversationItem; + for(std::set<LLFolderViewItem*>::const_iterator it = selectedItems.begin(); it != selectedItems.end(); ++it) + { + conversationItem = static_cast<LLConversationItem *>((*it)->getViewModelItem()); + if((conversationItem->getType() == LLConversationItem::CONV_SESSION_GROUP) || (conversationItem->getType() == LLConversationItem::CONV_SESSION_AD_HOC)) + { + return false; + } + } + } + if ("conversation_log" == item) { return gSavedPerAccountSettings.getS32("KeepConversationLogTranscripts") > 0; @@ -1376,6 +1401,10 @@ bool LLFloaterIMContainer::enableContextMenuItem(const std::string& item, uuid_v { return LLAvatarActions::canCall(); } + else if ("can_open_voice_conversation" == item) + { + return is_single_select && LLAvatarActions::canCall(); + } else if ("can_zoom_in" == item) { return is_single_select && gObjectList.findObject(single_id); diff --git a/indra/newview/llfloaterimcontainer.h b/indra/newview/llfloaterimcontainer.h index f6d973b9b3..a3e10dc236 100755 --- a/indra/newview/llfloaterimcontainer.h +++ b/indra/newview/llfloaterimcontainer.h @@ -135,7 +135,8 @@ private: void onExpandCollapseButtonClicked(); void onStubCollapseButtonClicked(); void processParticipantsStyleUpdate(); - void onSpeakButtonClicked(); + void onSpeakButtonPressed(); + void onSpeakButtonReleased(); /*virtual*/ void onClickCloseBtn(bool app_quitting = false); /*virtual*/ void closeHostedFloater(); diff --git a/indra/newview/llfloaterimsession.cpp b/indra/newview/llfloaterimsession.cpp index 7852a1f7b3..9def253ba5 100755 --- a/indra/newview/llfloaterimsession.cpp +++ b/indra/newview/llfloaterimsession.cpp @@ -927,8 +927,7 @@ void LLFloaterIMSession::onInputEditorFocusReceived( LLFocusableElement* caller, // Allow enabling the LLFloaterIMSession input editor only if session can accept text LLIMModel::LLIMSession* im_session = LLIMModel::instance().findIMSession(self->mSessionID); - //TODO: While disabled lllineeditor can receive focus we need to check if it is enabled (EK) - if( im_session && im_session->mTextIMPossible && self->mInputEditor->getEnabled()) + if( im_session && im_session->mTextIMPossible && !self->mInputEditor->getReadOnly()) { //in disconnected state IM input editor should be disabled self->mInputEditor->setEnabled(!gDisconnected); diff --git a/indra/newview/llfloaterlagmeter.cpp b/indra/newview/llfloaterlagmeter.cpp new file mode 100644 index 0000000000..f72f2631a1 --- /dev/null +++ b/indra/newview/llfloaterlagmeter.cpp @@ -0,0 +1,378 @@ +/** + * @file llfloaterlagmeter.cpp + * @brief The "Lag-o-Meter" floater used to tell users what is causing lag. + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#include "llviewerprecompiledheaders.h" + +#include "llfloaterlagmeter.h" + +#include "lluictrlfactory.h" +#include "llviewerstats.h" +#include "llviewertexture.h" +#include "llviewercontrol.h" +#include "llappviewer.h" + +#include "lltexturefetch.h" + +#include "llbutton.h" +#include "llfocusmgr.h" +#include "lltextbox.h" + +const std::string LAG_CRITICAL_IMAGE_NAME = "lag_status_critical.tga"; +const std::string LAG_WARNING_IMAGE_NAME = "lag_status_warning.tga"; +const std::string LAG_GOOD_IMAGE_NAME = "lag_status_good.tga"; + +LLFloaterLagMeter::LLFloaterLagMeter(const LLSD& key) + : LLFloater(key) +{ + mCommitCallbackRegistrar.add("LagMeter.ClickShrink", boost::bind(&LLFloaterLagMeter::onClickShrink, this)); +} + +BOOL LLFloaterLagMeter::postBuild() +{ + // Don't let this window take keyboard focus -- it's confusing to + // lose arrow-key driving when testing lag. + setIsChrome(TRUE); + + // were we shrunk last time? + if (isShrunk()) + { + onClickShrink(); + } + + mClientButton = getChild<LLButton>("client_lagmeter"); + mClientText = getChild<LLTextBox>("client_text"); + mClientCause = getChild<LLTextBox>("client_lag_cause"); + + mNetworkButton = getChild<LLButton>("network_lagmeter"); + mNetworkText = getChild<LLTextBox>("network_text"); + mNetworkCause = getChild<LLTextBox>("network_lag_cause"); + + mServerButton = getChild<LLButton>("server_lagmeter"); + mServerText = getChild<LLTextBox>("server_text"); + mServerCause = getChild<LLTextBox>("server_lag_cause"); + + std::string config_string = getString("client_frame_rate_critical_fps", mStringArgs); + mClientFrameTimeCritical = F32Seconds(1.0f / (float)atof( config_string.c_str() )); + config_string = getString("client_frame_rate_warning_fps", mStringArgs); + mClientFrameTimeWarning = F32Seconds(1.0f / (float)atof( config_string.c_str() )); + + config_string = getString("network_packet_loss_critical_pct", mStringArgs); + mNetworkPacketLossCritical = F32Percent((float)atof( config_string.c_str() )); + config_string = getString("network_packet_loss_warning_pct", mStringArgs); + mNetworkPacketLossWarning = F32Percent((float)atof( config_string.c_str() )); + + config_string = getString("network_ping_critical_ms", mStringArgs); + mNetworkPingCritical = F32Milliseconds((float)atof( config_string.c_str() )); + config_string = getString("network_ping_warning_ms", mStringArgs); + mNetworkPingWarning = F32Milliseconds((float)atof( config_string.c_str() )); + config_string = getString("server_frame_rate_critical_fps", mStringArgs); + + mServerFrameTimeCritical = F32Seconds(1.0f / (float)atof( config_string.c_str() )); + config_string = getString("server_frame_rate_warning_fps", mStringArgs); + mServerFrameTimeWarning = F32Seconds(1.0f / (float)atof( config_string.c_str() )); + config_string = getString("server_single_process_max_time_ms", mStringArgs); + mServerSingleProcessMaxTime = F32Seconds((float)atof( config_string.c_str() )); + +// mShrunk = false; + config_string = getString("max_width_px", mStringArgs); + mMaxWidth = atoi( config_string.c_str() ); + config_string = getString("min_width_px", mStringArgs); + mMinWidth = atoi( config_string.c_str() ); + + mStringArgs["[CLIENT_FRAME_RATE_CRITICAL]"] = getString("client_frame_rate_critical_fps"); + mStringArgs["[CLIENT_FRAME_RATE_WARNING]"] = getString("client_frame_rate_warning_fps"); + + mStringArgs["[NETWORK_PACKET_LOSS_CRITICAL]"] = getString("network_packet_loss_critical_pct"); + mStringArgs["[NETWORK_PACKET_LOSS_WARNING]"] = getString("network_packet_loss_warning_pct"); + + mStringArgs["[NETWORK_PING_CRITICAL]"] = getString("network_ping_critical_ms"); + mStringArgs["[NETWORK_PING_WARNING]"] = getString("network_ping_warning_ms"); + + mStringArgs["[SERVER_FRAME_RATE_CRITICAL]"] = getString("server_frame_rate_critical_fps"); + mStringArgs["[SERVER_FRAME_RATE_WARNING]"] = getString("server_frame_rate_warning_fps"); + +// childSetAction("minimize", onClickShrink, this); + updateControls(isShrunk()); // if expanded append colon to the labels (EXT-4079) + + return TRUE; +} +LLFloaterLagMeter::~LLFloaterLagMeter() +{ + // save shrunk status for next time +// gSavedSettings.setBOOL("LagMeterShrunk", mShrunk); + // expand so we save the large window rectangle + if (isShrunk()) + { + onClickShrink(); + } +} + +void LLFloaterLagMeter::draw() +{ + determineClient(); + determineNetwork(); + determineServer(); + + LLFloater::draw(); +} + +void LLFloaterLagMeter::determineClient() +{ + F32Milliseconds client_frame_time = LLTrace::get_frame_recording().getPeriodMean(LLStatViewer::FRAME_STACKTIME); + bool find_cause = false; + + if (!gFocusMgr.getAppHasFocus()) + { + mClientButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME)); + mClientText->setText( getString("client_frame_time_window_bg_msg", mStringArgs) ); + mClientCause->setText( LLStringUtil::null ); + } + else if(client_frame_time >= mClientFrameTimeCritical) + { + mClientButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); + mClientText->setText( getString("client_frame_time_critical_msg", mStringArgs) ); + find_cause = true; + } + else if(client_frame_time >= mClientFrameTimeWarning) + { + mClientButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME)); + mClientText->setText( getString("client_frame_time_warning_msg", mStringArgs) ); + find_cause = true; + } + else + { + mClientButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME)); + mClientText->setText( getString("client_frame_time_normal_msg", mStringArgs) ); + mClientCause->setText( LLStringUtil::null ); + } + + if(find_cause) + { + if(gSavedSettings.getF32("RenderFarClip") > 128) + { + mClientCause->setText( getString("client_draw_distance_cause_msg", mStringArgs) ); + } + else if(LLAppViewer::instance()->getTextureFetch()->getNumRequests() > 2) + { + mClientCause->setText( getString("client_texture_loading_cause_msg", mStringArgs) ); + } + else if(LLViewerTexture::sBoundTextureMemory > LLViewerTexture::sMaxBoundTextureMemory) + { + mClientCause->setText( getString("client_texture_memory_cause_msg", mStringArgs) ); + } + else + { + mClientCause->setText( getString("client_complex_objects_cause_msg", mStringArgs) ); + } + } +} + +void LLFloaterLagMeter::determineNetwork() +{ + LLTrace::PeriodicRecording& frame_recording = LLTrace::get_frame_recording(); + F32Percent packet_loss = frame_recording.getPeriodMean(LLStatViewer::PACKETS_LOST_PERCENT); + F32Milliseconds ping_time = frame_recording.getPeriodMean(LLStatViewer::SIM_PING); + bool find_cause_loss = false; + bool find_cause_ping = false; + + // *FIXME: We can't blame a large ping time on anything in + // particular if the frame rate is low, because a low frame + // rate is a sure recipe for bad ping times right now until + // the network handlers are de-synched from the rendering. + F32Milliseconds client_frame_time = frame_recording.getPeriodMean(LLStatViewer::FRAME_STACKTIME); + + if(packet_loss >= mNetworkPacketLossCritical) + { + mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); + mNetworkText->setText( getString("network_packet_loss_critical_msg", mStringArgs) ); + find_cause_loss = true; + } + else if(ping_time >= mNetworkPingCritical) + { + mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); + if (client_frame_time < mNetworkPingCritical) + { + mNetworkText->setText( getString("network_ping_critical_msg", mStringArgs) ); + find_cause_ping = true; + } + } + else if(packet_loss >= mNetworkPacketLossWarning) + { + mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME)); + mNetworkText->setText( getString("network_packet_loss_warning_msg", mStringArgs) ); + find_cause_loss = true; + } + else if(ping_time >= mNetworkPingWarning) + { + mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME)); + if (client_frame_time < mNetworkPingWarning) + { + mNetworkText->setText( getString("network_ping_warning_msg", mStringArgs) ); + find_cause_ping = true; + } + } + else + { + mNetworkButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME)); + mNetworkText->setText( getString("network_performance_normal_msg", mStringArgs) ); + } + + if(find_cause_loss) + { + mNetworkCause->setText( getString("network_packet_loss_cause_msg", mStringArgs) ); + } + else if(find_cause_ping) + { + mNetworkCause->setText( getString("network_ping_cause_msg", mStringArgs) ); + } + else + { + mNetworkCause->setText( LLStringUtil::null ); + } +} + +void LLFloaterLagMeter::determineServer() +{ + F32Milliseconds sim_frame_time = LLTrace::get_frame_recording().getLastRecording().getLastValue(LLStatViewer::SIM_FRAME_TIME); + bool find_cause = false; + + if(sim_frame_time >= mServerFrameTimeCritical) + { + mServerButton->setImageUnselected(LLUI::getUIImage(LAG_CRITICAL_IMAGE_NAME)); + mServerText->setText( getString("server_frame_time_critical_msg", mStringArgs) ); + find_cause = true; + } + else if(sim_frame_time >= mServerFrameTimeWarning) + { + mServerButton->setImageUnselected(LLUI::getUIImage(LAG_WARNING_IMAGE_NAME)); + mServerText->setText( getString("server_frame_time_warning_msg", mStringArgs) ); + find_cause = true; + } + else + { + mServerButton->setImageUnselected(LLUI::getUIImage(LAG_GOOD_IMAGE_NAME)); + mServerText->setText( getString("server_frame_time_normal_msg", mStringArgs) ); + mServerCause->setText( LLStringUtil::null ); + } + + if(find_cause) + { + LLTrace::Recording& last_recording = LLTrace::get_frame_recording().getLastRecording(); + + if(last_recording.getLastValue(LLStatViewer::SIM_PHYSICS_TIME) > mServerSingleProcessMaxTime) + { + mServerCause->setText( getString("server_physics_cause_msg", mStringArgs) ); + } + else if(last_recording.getLastValue(LLStatViewer::SIM_SCRIPTS_TIME) > mServerSingleProcessMaxTime) + { + mServerCause->setText( getString("server_scripts_cause_msg", mStringArgs) ); + } + else if(last_recording.getLastValue(LLStatViewer::SIM_NET_TIME) > mServerSingleProcessMaxTime) + { + mServerCause->setText( getString("server_net_cause_msg", mStringArgs) ); + } + else if(last_recording.getLastValue(LLStatViewer::SIM_AGENTS_TIME) > mServerSingleProcessMaxTime) + { + mServerCause->setText( getString("server_agent_cause_msg", mStringArgs) ); + } + else if(last_recording.getLastValue(LLStatViewer::SIM_IMAGES_TIME) > mServerSingleProcessMaxTime) + { + mServerCause->setText( getString("server_images_cause_msg", mStringArgs) ); + } + else + { + mServerCause->setText( getString("server_generic_cause_msg", mStringArgs) ); + } + } +} + +void LLFloaterLagMeter::updateControls(bool shrink) +{ +// LLFloaterLagMeter * self = (LLFloaterLagMeter*)data; + + LLButton * button = getChild<LLButton>("minimize"); + S32 delta_width = mMaxWidth -mMinWidth; + LLRect r = getRect(); + + if(!shrink) + { + setTitle(getString("max_title_msg", mStringArgs) ); + // make left edge appear to expand + r.translate(-delta_width, 0); + setRect(r); + reshape(mMaxWidth, getRect().getHeight()); + + getChild<LLUICtrl>("client")->setValue(getString("client_text_msg", mStringArgs) + ":"); + getChild<LLUICtrl>("network")->setValue(getString("network_text_msg",mStringArgs) + ":"); + getChild<LLUICtrl>("server")->setValue(getString("server_text_msg", mStringArgs) + ":"); + + // usually "<<" + button->setLabel( getString("smaller_label", mStringArgs) ); + } + else + { + setTitle( getString("min_title_msg", mStringArgs) ); + // make left edge appear to collapse + r.translate(delta_width, 0); + setRect(r); + reshape(mMinWidth, getRect().getHeight()); + + getChild<LLUICtrl>("client")->setValue(getString("client_text_msg", mStringArgs) ); + getChild<LLUICtrl>("network")->setValue(getString("network_text_msg",mStringArgs) ); + getChild<LLUICtrl>("server")->setValue(getString("server_text_msg", mStringArgs) ); + + // usually ">>" + button->setLabel( getString("bigger_label", mStringArgs) ); + } + // Don't put keyboard focus on the button + button->setFocus(FALSE); + +// self->mClientText->setVisible(self->mShrunk); +// self->mClientCause->setVisible(self->mShrunk); +// self->getChildView("client_help")->setVisible( self->mShrunk); + +// self->mNetworkText->setVisible(self->mShrunk); +// self->mNetworkCause->setVisible(self->mShrunk); +// self->getChildView("network_help")->setVisible( self->mShrunk); + +// self->mServerText->setVisible(self->mShrunk); +// self->mServerCause->setVisible(self->mShrunk); +// self->getChildView("server_help")->setVisible( self->mShrunk); + +// self->mShrunk = !self->mShrunk; +} + +BOOL LLFloaterLagMeter::isShrunk() +{ + return gSavedSettings.getBOOL("LagMeterShrunk"); +} + +void LLFloaterLagMeter::onClickShrink() // toggle "LagMeterShrunk" +{ + bool shrunk = isShrunk(); + updateControls(!shrunk); + gSavedSettings.setBOOL("LagMeterShrunk", !shrunk); +} diff --git a/indra/newview/llfloaterlagmeter.h b/indra/newview/llfloaterlagmeter.h new file mode 100644 index 0000000000..929ea40629 --- /dev/null +++ b/indra/newview/llfloaterlagmeter.h @@ -0,0 +1,80 @@ +/** + * @file llfloaterlagmeter.h + * @brief The "Lag-o-Meter" floater used to tell users what is causing lag. + * + * $LicenseInfo:firstyear=2007&license=viewerlgpl$ + * Second Life Viewer Source Code + * Copyright (C) 2010, Linden Research, Inc. + * + * This library is free software; you can redistribute it and/or + * modify it under the terms of the GNU Lesser General Public + * License as published by the Free Software Foundation; + * version 2.1 of the License only. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + * Lesser General Public License for more details. + * + * You should have received a copy of the GNU Lesser General Public + * License along with this library; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + * + * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA + * $/LicenseInfo$ + */ + +#ifndef LLFLOATERLAGMETER_H +#define LLFLOATERLAGMETER_H + +#include "llfloater.h" + +class LLTextBox; + +class LLFloaterLagMeter : public LLFloater +{ + friend class LLFloaterReg; + +public: + /*virtual*/ void draw(); + /*virtual*/ BOOL postBuild(); +private: + + LLFloaterLagMeter(const LLSD& key); + /*virtual*/ ~LLFloaterLagMeter(); + void determineClient(); + void determineNetwork(); + void determineServer(); + void updateControls(bool shrink); + BOOL isShrunk(); + + void onClickShrink(); + + bool mShrunk; + S32 mMaxWidth, mMinWidth; + + F32Milliseconds mClientFrameTimeCritical; + F32Milliseconds mClientFrameTimeWarning; + LLButton* mClientButton; + LLTextBox* mClientText; + LLTextBox* mClientCause; + + F32Percent mNetworkPacketLossCritical; + F32Percent mNetworkPacketLossWarning; + F32Milliseconds mNetworkPingCritical; + F32Milliseconds mNetworkPingWarning; + LLButton* mNetworkButton; + LLTextBox* mNetworkText; + LLTextBox* mNetworkCause; + + F32Milliseconds mServerFrameTimeCritical; + F32Milliseconds mServerFrameTimeWarning; + F32Milliseconds mServerSingleProcessMaxTime; + LLButton* mServerButton; + LLTextBox* mServerText; + LLTextBox* mServerCause; + + LLStringUtil::format_map_t mStringArgs; +}; + +#endif diff --git a/indra/newview/llfloaterland.cpp b/indra/newview/llfloaterland.cpp index 7213064746..c094eb3180 100755 --- a/indra/newview/llfloaterland.cpp +++ b/indra/newview/llfloaterland.cpp @@ -2776,10 +2776,16 @@ void LLPanelLandAccess::callbackAvatarCBAccess(const uuid_vec_t& ids) { LLUUID id = ids[0]; LLParcel* parcel = mParcel->getParcel(); - if (parcel) + if (parcel && parcel->addToAccessList(id, 0)) { - parcel->addToAccessList(id, 0); - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_ACCESS); + U32 lists_to_update = AL_ACCESS; + // agent was successfully added to access list + // but we also need to check ban list to ensure that agent will not be in two lists simultaneously + if(parcel->removeFromBanList(id)) + { + lists_to_update |= AL_BAN; + } + LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update); refresh(); } } @@ -2828,10 +2834,16 @@ void LLPanelLandAccess::callbackAvatarCBBanned(const uuid_vec_t& ids) { LLUUID id = ids[0]; LLParcel* parcel = mParcel->getParcel(); - if (parcel) + if (parcel && parcel->addToBanList(id, 0)) { - parcel->addToBanList(id, 0); - LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(AL_BAN); + U32 lists_to_update = AL_BAN; + // agent was successfully added to ban list + // but we also need to check access list to ensure that agent will not be in two lists simultaneously + if (parcel->removeFromAccessList(id)) + { + lists_to_update |= AL_ACCESS; + } + LLViewerParcelMgr::getInstance()->sendParcelAccessListUpdate(lists_to_update); refresh(); } } diff --git a/indra/newview/llfloaternotificationsconsole.cpp b/indra/newview/llfloaternotificationsconsole.cpp index c21e4ff7e8..fd03efa061 100755 --- a/indra/newview/llfloaternotificationsconsole.cpp +++ b/indra/newview/llfloaternotificationsconsole.cpp @@ -41,6 +41,7 @@ class LLNotificationChannelPanel : public LLLayoutPanel { public: LLNotificationChannelPanel(const Params& p); + ~LLNotificationChannelPanel(); BOOL postBuild(); private: @@ -57,6 +58,20 @@ LLNotificationChannelPanel::LLNotificationChannelPanel(const LLNotificationChann buildFromFile( "panel_notifications_channel.xml"); } +LLNotificationChannelPanel::~LLNotificationChannelPanel() +{ + // Userdata for all records is a LLNotification* we need to clean up + std::vector<LLScrollListItem*> data_list = getChild<LLScrollListCtrl>("notifications_list")->getAllData(); + std::vector<LLScrollListItem*>::iterator data_itor; + for (data_itor = data_list.begin(); data_itor != data_list.end(); ++data_itor) + { + LLScrollListItem* item = *data_itor; + LLNotification* notification = (LLNotification*)item->getUserdata(); + delete notification; + notification = NULL; + } +} + BOOL LLNotificationChannelPanel::postBuild() { LLButton* header_button = getChild<LLButton>("header"); @@ -124,7 +139,7 @@ bool LLNotificationChannelPanel::update(const LLSD& payload) row["columns"][2]["type"] = "date"; LLScrollListItem* sli = getChild<LLScrollListCtrl>("notifications_list")->addElement(row); - sli->setUserdata(&(*notification)); + sli->setUserdata(new LLNotification(notification->asLLSD())); } return false; diff --git a/indra/newview/llfloatersidepanelcontainer.cpp b/indra/newview/llfloatersidepanelcontainer.cpp index c5248719e9..aee20ff706 100755 --- a/indra/newview/llfloatersidepanelcontainer.cpp +++ b/indra/newview/llfloatersidepanelcontainer.cpp @@ -57,7 +57,7 @@ void LLFloaterSidePanelContainer::onOpen(const LLSD& key) getChild<LLPanel>(sMainPanelName)->onOpen(key); } -void LLFloaterSidePanelContainer::onClickCloseBtn(bool) +void LLFloaterSidePanelContainer::closeFloater(bool app_quitting) { LLPanelOutfitEdit* panel_outfit_edit = dynamic_cast<LLPanelOutfitEdit*>(LLFloaterSidePanelContainer::getPanel("appearance", "panel_outfit_edit")); @@ -75,7 +75,7 @@ void LLFloaterSidePanelContainer::onClickCloseBtn(bool) } } - LLFloater::onClickCloseBtn(); + LLFloater::closeFloater(app_quitting); } LLPanel* LLFloaterSidePanelContainer::openChildPanel(const std::string& panel_name, const LLSD& params) diff --git a/indra/newview/llfloatersidepanelcontainer.h b/indra/newview/llfloatersidepanelcontainer.h index 13b17e8867..d7ecd52e57 100755 --- a/indra/newview/llfloatersidepanelcontainer.h +++ b/indra/newview/llfloatersidepanelcontainer.h @@ -51,7 +51,7 @@ public: /*virtual*/ void onOpen(const LLSD& key); - /*virtual*/ void onClickCloseBtn(bool app_quitting = false); + /*virtual*/ void closeFloater(bool app_quitting = false); LLPanel* openChildPanel(const std::string& panel_name, const LLSD& params); diff --git a/indra/newview/llfloatertools.cpp b/indra/newview/llfloatertools.cpp index bd5d2207b4..7477b02867 100755 --- a/indra/newview/llfloatertools.cpp +++ b/indra/newview/llfloatertools.cpp @@ -888,6 +888,9 @@ void LLFloaterTools::onClose(bool app_quitting) // hide the advanced object weights floater LLFloaterReg::hideInstance("object_weights"); + + // prepare content for next call + mPanelContents->clearContents(); } void click_popup_info(void*) diff --git a/indra/newview/llfloaterurlentry.cpp b/indra/newview/llfloaterurlentry.cpp index e26f1e9ea5..e02e8eeb5a 100755 --- a/indra/newview/llfloaterurlentry.cpp +++ b/indra/newview/llfloaterurlentry.cpp @@ -204,6 +204,10 @@ void LLFloaterURLEntry::onBtnOK( void* userdata ) LLURLHistory::addURL("parcel", media_url); } + // show progress bar here? + getWindow()->incBusyCount(); + self->getChildView("loading_label")->setVisible( true); + // leading whitespace causes problems with the MIME-type detection so strip it LLStringUtil::trim( media_url ); @@ -233,10 +237,6 @@ void LLFloaterURLEntry::onBtnOK( void* userdata ) self->getChildView("ok_btn")->setEnabled(false); self->getChildView("cancel_btn")->setEnabled(false); self->getChildView("media_entry")->setEnabled(false); - - // show progress bar here? - getWindow()->incBusyCount(); - self->getChildView("loading_label")->setVisible( true); } // static diff --git a/indra/newview/llfloaterwebcontent.cpp b/indra/newview/llfloaterwebcontent.cpp index 7f599073d5..3f3d87b564 100755 --- a/indra/newview/llfloaterwebcontent.cpp +++ b/indra/newview/llfloaterwebcontent.cpp @@ -293,7 +293,7 @@ void LLFloaterWebContent::onOpen(const LLSD& key) void LLFloaterWebContent::onClose(bool app_quitting) { // If we close the web browsing window showing the facebook login, we need to signal to this object that the connection will not happen - LLFloater* fbc_web = LLFloaterReg::getInstance("fbc_web"); + LLFloater* fbc_web = LLFloaterReg::findInstance("fbc_web"); if (fbc_web == this) { if (!LLFacebookConnect::instance().isConnected()) diff --git a/indra/newview/llfolderviewmodelinventory.cpp b/indra/newview/llfolderviewmodelinventory.cpp index 7339398fa5..11d49ff784 100755 --- a/indra/newview/llfolderviewmodelinventory.cpp +++ b/indra/newview/llfolderviewmodelinventory.cpp @@ -129,13 +129,15 @@ void LLFolderViewModelItemInventory::requestSort() void LLFolderViewModelItemInventory::setPassedFilter(bool passed, S32 filter_generation, std::string::size_type string_offset, std::string::size_type string_size) { + bool init_state = getLastFilterGeneration() < 0; LLFolderViewModelItemCommon::setPassedFilter(passed, filter_generation, string_offset, string_size); bool before = mPrevPassedAllFilters; mPrevPassedAllFilters = passedFilter(filter_generation); - if (before != mPrevPassedAllFilters) + if (before != mPrevPassedAllFilters || (init_state && before && !mFolderViewItem->getVisible())) { - // Need to rearrange the folder if the filtered state of the item changed + // Need to rearrange the folder if the filtered state of the item changed + // or folder was hidden during update as filter-dirty (MAINT-4218) LLFolderViewFolder* parent_folder = mFolderViewItem->getParentFolder(); if (parent_folder) { diff --git a/indra/newview/llgesturemgr.cpp b/indra/newview/llgesturemgr.cpp index b15556d73d..119872ec29 100755 --- a/indra/newview/llgesturemgr.cpp +++ b/indra/newview/llgesturemgr.cpp @@ -1406,7 +1406,7 @@ BOOL LLGestureMgr::matchPrefix(const std::string& in_str, std::string* out_str) } if (rest_of_match.compare("") == 0) { - return FALSE; + return TRUE; } if (buf.compare("") != 0) { diff --git a/indra/newview/llgiveinventory.cpp b/indra/newview/llgiveinventory.cpp index 813d2081ce..b2fc41526e 100755 --- a/indra/newview/llgiveinventory.cpp +++ b/indra/newview/llgiveinventory.cpp @@ -328,8 +328,10 @@ void LLGiveInventory::logInventoryOffer(const LLUUID& to_agent, const LLUUID &im { // Build a new format username or firstname_lastname for legacy names // to use it for a history log filename. - full_name = LLCacheName::buildUsername(full_name); - LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im")); + if (LLLogChat::buildIMP2PLogFilename(to_agent, LLStringUtil::null, full_name)) + { + LLIMModel::instance().logToFile(full_name, LLTrans::getString("SECOND_LIFE"), im_session_id, LLTrans::getString("inventory_item_offered-im")); + } } } } diff --git a/indra/newview/llgroupactions.cpp b/indra/newview/llgroupactions.cpp index f514729aa1..913efd6434 100755 --- a/indra/newview/llgroupactions.cpp +++ b/indra/newview/llgroupactions.cpp @@ -149,7 +149,7 @@ public: void changed(LLGroupChange gc) { - if (gc == GC_MEMBER_DATA && !mRequestProcessed) + if (gc == GC_PROPERTIES && !mRequestProcessed) { LLGroupMgrGroupData* gdatap = LLGroupMgr::getInstance()->getGroupData(mGroupId); if (!gdatap) @@ -159,9 +159,6 @@ public: else if (!gdatap->isMemberDataComplete()) { LL_WARNS() << "LLGroupMgr::getInstance()->getGroupData()->isMemberDataComplete() was FALSE" << LL_ENDL; - } - else - { processGroupData(); mRequestProcessed = true; } diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp index 87335cd5e6..13236ea7d9 100755 --- a/indra/newview/llinventorybridge.cpp +++ b/indra/newview/llinventorybridge.cpp @@ -103,6 +103,7 @@ bool move_task_inventory_callback(const LLSD& notification, const LLSD& response bool confirm_attachment_rez(const LLSD& notification, const LLSD& response); void teleport_via_landmark(const LLUUID& asset_id); static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_current_outfit); +static BOOL can_move_to_landmarks(LLInventoryItem* inv_item); static bool check_category(LLInventoryModel* model, const LLUUID& cat_id, LLInventoryPanel* active_panel, @@ -2216,13 +2217,18 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, && (LLToolDragAndDrop::SOURCE_AGENT == source); BOOL accept = FALSE; + U64 filter_types = filter->getFilterTypes(); + BOOL use_filter = filter_types && (filter_types&LLInventoryFilter::FILTERTYPE_DATE || (filter_types&LLInventoryFilter::FILTERTYPE_OBJECT)==0); + if (is_agent_inventory) { const LLUUID &trash_id = model->findCategoryUUIDForType(LLFolderType::FT_TRASH, false); const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); + const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false); const BOOL move_is_into_trash = (mUUID == trash_id) || model->isObjectDescendentOf(mUUID, trash_id); - const BOOL move_is_into_outfit = getCategory() && (getCategory()->getPreferredType() == LLFolderType::FT_OUTFIT); + const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); + const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); //-------------------------------------------------------------------------------- @@ -2414,7 +2420,7 @@ BOOL LLFolderBridge::dragCategoryIntoFolder(LLInventoryCategory* inv_cat, is_movable = active_folder_view != NULL; } - if (is_movable) + if (is_movable && use_filter) { // Check whether the folder being dragged from active inventory panel // passes the filter of the destination panel. @@ -2552,6 +2558,12 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, BOOL accept = FALSE; BOOL is_move = FALSE; + BOOL use_filter = FALSE; + if (filter) + { + U64 filter_types = filter->getFilterTypes(); + use_filter = filter_types && (filter_types&LLInventoryFilter::FILTERTYPE_DATE || (filter_types&LLInventoryFilter::FILTERTYPE_OBJECT)==0); + } // coming from a task. Need to figure out if the person can // move/copy this item. @@ -2584,7 +2596,7 @@ BOOL move_inv_category_world_to_agent(const LLUUID& object_id, accept = TRUE; } - if (filter && accept) + if (accept && use_filter) { accept = filter->check(item); } @@ -2797,7 +2809,7 @@ void LLInventoryCopyAndWearObserver::changed(U32 mask) mContentsCount) { gInventory.removeObserver(this); - LLAppearanceMgr::instance().wearInventoryCategory(category, FALSE, FALSE); + LLAppearanceMgr::instance().wearInventoryCategory(category, FALSE, TRUE); delete this; } } @@ -2815,7 +2827,7 @@ void LLFolderBridge::performAction(LLInventoryModel* model, std::string action) LLFolderViewFolder *f = dynamic_cast<LLFolderViewFolder *>(mInventoryPanel.get()->getItemByID(mUUID)); if (f) { - f->setOpen(TRUE); + f->toggleOpen(); } return; @@ -3097,10 +3109,14 @@ void LLFolderBridge::pasteFromClipboard() { const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); + const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false); + const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false); const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); + const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); + const BOOL move_is_into_favorites = (mUUID == favorites_id); std::vector<LLUUID> objects; LLClipboard::instance().pasteFromClipboard(objects); @@ -3158,11 +3174,18 @@ void LLFolderBridge::pasteFromClipboard() { if (move_is_into_current_outfit || move_is_into_outfit) { - if (can_move_to_outfit(item, move_is_into_current_outfit)) + if (item && can_move_to_outfit(item, move_is_into_current_outfit)) { dropToOutfit(item, move_is_into_current_outfit); } } + else if (move_is_into_favorites) + { + if (item && can_move_to_landmarks(item)) + { + dropToFavorites(item); + } + } else if (LLClipboard::instance().isCutMode()) { // Do a move to "paste" a "cut" @@ -3225,9 +3248,11 @@ void LLFolderBridge::pasteLinkFromClipboard() { const LLUUID ¤t_outfit_id = model->findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT, false); const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); + const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false); const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); - const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); + const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); if (move_is_into_outbox) @@ -3729,6 +3754,28 @@ void LLFolderBridge::modifyOutfit(BOOL append) LLViewerInventoryCategory* cat = getCategory(); if(!cat) return; + // checking amount of items to wear + U32 max_items = gSavedSettings.getU32("WearFolderLimit"); + if (cat->getDescendentCount() > max_items) + { + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ false); + gInventory.collectDescendentsIf(cat->getUUID(), + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + not_worn); + + if (items.size() > max_items) + { + LLSD args; + args["AMOUNT"] = llformat("%d", max_items); + LLNotificationsUtil::add("TooManyWearables", args); + return; + } + } + LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, append ); } @@ -3783,6 +3830,12 @@ static BOOL can_move_to_outfit(LLInventoryItem* inv_item, BOOL move_is_into_curr return FALSE; } + U32 flags = inv_item->getFlags(); + if(flags & LLInventoryItemFlags::II_FLAGS_OBJECT_HAS_MULTIPLE_ITEMS) + { + return FALSE; + } + if (move_is_into_current_outfit && get_is_item_worn(inv_item->getUUID())) { return FALSE; @@ -3868,16 +3921,22 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, const LLUUID &favorites_id = model->findCategoryUUIDForType(LLFolderType::FT_FAVORITE, false); const LLUUID &landmarks_id = model->findCategoryUUIDForType(LLFolderType::FT_LANDMARK, false); const LLUUID &outbox_id = model->findCategoryUUIDForType(LLFolderType::FT_OUTBOX, false); + const LLUUID &my_outifts_id = model->findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS, false); const BOOL move_is_into_current_outfit = (mUUID == current_outfit_id); const BOOL move_is_into_favorites = (mUUID == favorites_id); - const BOOL move_is_into_outfit = (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); + const BOOL move_is_into_my_outfits = (mUUID == my_outifts_id) || model->isObjectDescendentOf(mUUID, my_outifts_id); + const BOOL move_is_into_outfit = move_is_into_my_outfits || (getCategory() && getCategory()->getPreferredType()==LLFolderType::FT_OUTFIT); const BOOL move_is_into_landmarks = (mUUID == landmarks_id) || model->isObjectDescendentOf(mUUID, landmarks_id); const BOOL move_is_into_outbox = model->isObjectDescendentOf(mUUID, outbox_id); const BOOL move_is_from_outbox = model->isObjectDescendentOf(inv_item->getUUID(), outbox_id); LLToolDragAndDrop::ESource source = LLToolDragAndDrop::getInstance()->getSource(); BOOL accept = FALSE; + U64 filter_types = filter->getFilterTypes(); + // We shouldn't allow to drop non recent items into recent tab (or some similar transactions) + // while we are allowing to interact with regular filtered inventory + BOOL use_filter = filter_types && (filter_types&LLInventoryFilter::FILTERTYPE_DATE || (filter_types&LLInventoryFilter::FILTERTYPE_OBJECT)==0); LLViewerObject* object = NULL; if(LLToolDragAndDrop::SOURCE_AGENT == source) { @@ -3976,7 +4035,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // Check whether the item being dragged from active inventory panel // passes the filter of the destination panel. - if (accept && active_panel) + if (accept && active_panel && use_filter) { LLFolderViewItem* fv_item = active_panel->getItemByID(inv_item->getUUID()); if (!fv_item) return false; @@ -4114,7 +4173,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // Check whether the item being dragged from in world // passes the filter of the destination panel. - if (accept) + if (accept && use_filter) { accept = filter->check(inv_item); } @@ -4158,7 +4217,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // Check whether the item being dragged from notecard // passes the filter of the destination panel. - if (accept) + if (accept && use_filter) { accept = filter->check(inv_item); } @@ -4198,7 +4257,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item, // Check whether the item being dragged from the library // passes the filter of the destination panel. - if (accept && active_panel) + if (accept && active_panel && use_filter) { LLFolderViewItem* fv_item = active_panel->getItemByID(inv_item->getUUID()); if (!fv_item) return false; diff --git a/indra/newview/llinventorybridge.h b/indra/newview/llinventorybridge.h index 7dac830098..833fbbadbb 100755 --- a/indra/newview/llinventorybridge.h +++ b/indra/newview/llinventorybridge.h @@ -158,7 +158,7 @@ protected: BOOL isAgentInventory() const; // false if lost or in the inventory library BOOL isCOFFolder() const; // true if COF or descendant of BOOL isInboxFolder() const; // true if COF or descendant of marketplace inbox - BOOL isOutboxFolder() const; // true if COF or descendant of marketplace outbox + BOOL isOutboxFolderDirectParent() const; const LLUUID getOutboxFolder() const; @@ -172,6 +172,10 @@ protected: const LLUUID& new_parent, BOOL restamp); void removeBatchNoCheck(std::vector<LLFolderViewModelItem*>& batch); + +public: + BOOL isOutboxFolder() const; // true if COF or descendant of marketplace outbox + protected: LLHandle<LLInventoryPanel> mInventoryPanel; LLFolderView* mRoot; diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp index 000eee3317..370392b2f2 100755 --- a/indra/newview/llinventoryfilter.cpp +++ b/indra/newview/llinventoryfilter.cpp @@ -177,6 +177,7 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent // Pass if this item's type is of the correct filter type if (filterTypes & FILTERTYPE_OBJECT) { + // If it has no type, pass it, unless it's a link. if (object_type == LLInventoryType::IT_NONE) { @@ -244,13 +245,25 @@ bool LLInventoryFilter::checkAgainstFilterType(const LLFolderViewModelItemInvent bool is_hidden_if_empty = LLViewerFolderType::lookupIsHiddenIfEmpty(listener->getPreferredType()); if (is_hidden_if_empty) { - // Force the fetching of those folders so they are hidden iff they really are empty... + // Force the fetching of those folders so they are hidden if they really are empty... gInventory.fetchDescendentsOf(object_id); - return FALSE; + + LLInventoryModel::cat_array_t* cat_array = NULL; + LLInventoryModel::item_array_t* item_array = NULL; + gInventory.getDirectDescendentsOf(object_id,cat_array,item_array); + S32 descendents_actual = 0; + if(cat_array && item_array) + { + descendents_actual = cat_array->size() + item_array->size(); + } + if (descendents_actual == 0) + { + return FALSE; + } } } } - + return TRUE; } @@ -972,6 +985,11 @@ void LLInventoryFilter::fromParams(const Params& params) setDateRangeLastLogoff(params.since_logoff); } +U64 LLInventoryFilter::getFilterTypes() const +{ + return mFilterOps.mFilterTypes; +} + U64 LLInventoryFilter::getFilterObjectTypes() const { return mFilterOps.mFilterObjectTypes; diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h index ce516af0b9..094fda7707 100755 --- a/indra/newview/llinventoryfilter.h +++ b/indra/newview/llinventoryfilter.h @@ -151,6 +151,7 @@ public: // +-------------------------------------------------------------------+ // + Parameters // +-------------------------------------------------------------------+ + U64 getFilterTypes() const; U64 getFilterObjectTypes() const; U64 getFilterCategoryTypes() const; U64 getFilterWearableTypes() const; diff --git a/indra/newview/llinventoryfunctions.cpp b/indra/newview/llinventoryfunctions.cpp index 1e7825a13e..1abc09bf3b 100755 --- a/indra/newview/llinventoryfunctions.cpp +++ b/indra/newview/llinventoryfunctions.cpp @@ -881,7 +881,7 @@ bool LLFindWearablesEx::operator()(LLInventoryCategory* cat, LLInventoryItem* it if (!vitem) return false; // Skip non-wearables. - if (!vitem->isWearableType() && vitem->getType() != LLAssetType::AT_OBJECT) + if (!vitem->isWearableType() && vitem->getType() != LLAssetType::AT_OBJECT && vitem->getType() != LLAssetType::AT_GESTURE) { return false; } diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp index a4a85e2e8d..adfdfebae7 100755 --- a/indra/newview/llinventorypanel.cpp +++ b/indra/newview/llinventorypanel.cpp @@ -336,7 +336,15 @@ LLInventoryFilter& LLInventoryPanel::getFilter() void LLInventoryPanel::setFilterTypes(U64 types, LLInventoryFilter::EFilterType filter_type) { if (filter_type == LLInventoryFilter::FILTERTYPE_OBJECT) + { + //Don't show folder without recent item in it + if ("Recent Items" == getName()) + { + types &= ~(0x1 << LLInventoryType::IT_CATEGORY); + } + getFilter().setFilterObjectTypes(types); + } if (filter_type == LLInventoryFilter::FILTERTYPE_CATEGORY) getFilter().setFilterCategoryTypes(types); } @@ -581,6 +589,11 @@ void LLInventoryPanel::modelChanged(U32 mask) } } } + + if ("Recent Items" == getName()) + { + getFilter().setModified(); + } } LLUUID LLInventoryPanel::getRootFolderID() @@ -1390,6 +1403,17 @@ BOOL LLInventoryPanel::handleKeyHere( KEY key, MASK mask ) // Open selected items if enter key hit on the inventory panel if (mask == MASK_NONE) { + //Don't allow attaching or opening items from Merchant Outbox + LLFolderViewItem* folder_item = mFolderRoot.get()->getCurSelectedItem(); + if(folder_item) + { + LLInvFVBridge* bridge = (LLInvFVBridge*)folder_item->getViewModelItem(); + if(bridge && bridge->isOutboxFolder() && (bridge->getInventoryType() != LLInventoryType::IT_CATEGORY)) + { + return handled; + } + } + LLInventoryAction::doToSelected(mInventory, mFolderRoot.get(), "open"); handled = TRUE; } @@ -1457,6 +1481,8 @@ public: getFilter().setFilterCategoryTypes(getFilter().getFilterCategoryTypes() | (1ULL << LLFolderType::FT_INBOX)); } + /*virtual*/ void onVisibilityChange(BOOL new_visibility); + protected: LLInventoryRecentItemsPanel (const Params&); friend class LLUICtrlFactory; @@ -1469,6 +1495,13 @@ LLInventoryRecentItemsPanel::LLInventoryRecentItemsPanel( const Params& params) mInvFVBridgeBuilder = &RECENT_ITEMS_BUILDER; } +void LLInventoryRecentItemsPanel::onVisibilityChange(BOOL new_visibility) +{ + if(new_visibility) + { + getFilter().setModified(); + } +} namespace LLInitParam { void TypeValues<LLFolderType::EType>::declareValues() diff --git a/indra/newview/lllocalbitmaps.cpp b/indra/newview/lllocalbitmaps.cpp index b91e37d596..897ee8429a 100755 --- a/indra/newview/lllocalbitmaps.cpp +++ b/indra/newview/lllocalbitmaps.cpp @@ -61,7 +61,9 @@ #include "llnotificationsutil.h" #include "pipeline.h" #include "llmaterialmgr.h" - +#include "llimagedimensionsinfo.h" +#include "llviewercontrol.h" +#include "lltrans.h" /*=======================================*/ /* Formal declarations, constants, etc. */ /*=======================================*/ @@ -845,6 +847,12 @@ bool LLLocalBitmapMgr::addUnit() std::string filename = picker.getFirstFile(); while(!filename.empty()) { + if(!checkTextureDimensions(filename)) + { + filename = picker.getNextFile(); + continue; + } + LLLocalBitmap* unit = new LLLocalBitmap(filename); if (unit->getValid()) @@ -874,6 +882,37 @@ bool LLLocalBitmapMgr::addUnit() return add_successful; } +bool LLLocalBitmapMgr::checkTextureDimensions(std::string filename) +{ + std::string exten = gDirUtilp->getExtension(filename); + U32 codec = LLImageBase::getCodecFromExtension(exten); + std::string mImageLoadError; + LLImageDimensionsInfo image_info; + if (!image_info.load(filename,codec)) + { + return false; + } + + S32 max_width = gSavedSettings.getS32("max_texture_dimension_X"); + S32 max_height = gSavedSettings.getS32("max_texture_dimension_Y"); + + if ((image_info.getWidth() > max_width) || (image_info.getHeight() > max_height)) + { + LLStringUtil::format_map_t args; + args["WIDTH"] = llformat("%d", max_width); + args["HEIGHT"] = llformat("%d", max_height); + mImageLoadError = LLTrans::getString("texture_load_dimensions_error", args); + + LLSD notif_args; + notif_args["REASON"] = mImageLoadError; + LLNotificationsUtil::add("CannotUploadTexture", notif_args); + + return false; + } + + return true; +} + void LLLocalBitmapMgr::delUnit(LLUUID tracking_id) { if (!sBitmapList.empty()) diff --git a/indra/newview/lllocalbitmaps.h b/indra/newview/lllocalbitmaps.h index a15ea10801..59467922b4 100755 --- a/indra/newview/lllocalbitmaps.h +++ b/indra/newview/lllocalbitmaps.h @@ -120,6 +120,7 @@ class LLLocalBitmapMgr static void cleanupClass(); static bool addUnit(); static void delUnit(LLUUID tracking_id); + static bool checkTextureDimensions(std::string filename); static LLUUID getWorldID(LLUUID tracking_id); static std::string getFilename(LLUUID tracking_id); diff --git a/indra/newview/lllogchat.cpp b/indra/newview/lllogchat.cpp index 06e517a861..743bb8973b 100755 --- a/indra/newview/lllogchat.cpp +++ b/indra/newview/lllogchat.cpp @@ -261,6 +261,46 @@ std::string LLLogChat::cleanFileName(std::string filename) return filename; } +bool LLLogChat::buildIMP2PLogFilename(const LLUUID& idAgent, const std::string& strName, std::string& strFilename) +{ + static LLCachedControl<bool> fLegacyFilenames(gSavedSettings, "UseLegacyIMLogNames", true); + + // If we have the name cached then we can simply return the username + LLAvatarName avName; + if (LLAvatarNameCache::get(idAgent, &avName)) + { + if (!fLegacyFilenames) + { + strFilename = avName.getUserName(); + } + else + { + strFilename = LLCacheName::cleanFullName(avName.getLegacyName()); + } + return true; + } + else + { + // Try and get it from the legacy cache if we can + std::string strLegacyName; + if (gCacheName->getFullName(idAgent, strLegacyName)) + strLegacyName = strName; + + if (!fLegacyFilenames) + { + // If we don't have it cached 'strName' *should* be a legacy name (or a complete name) and we can construct a username from that + strFilename = LLCacheName::buildUsername(strName); + return strName != strFilename; // If the assumption above was wrong then the two will match which signals failure + } + else + { + // Strip any possible mention of a username + strFilename = LLCacheName::buildLegacyName(strName); + return (!strFilename.empty()); // Assume success as long as the filename isn't an empty string + } + } +} + std::string LLLogChat::timestamp(bool withdate) { std::string timeStr; @@ -570,13 +610,6 @@ void LLLogChat::findTranscriptFiles(std::string pattern, std::vector<std::string LLFILE * filep = LLFile::fopen(fullname, "rb"); if (NULL != filep) { - if(makeLogFileName("chat")== fullname) - { - //Add Nearby chat history to the list of transcriptions - list_of_transcriptions.push_back(gDirUtilp->add(dirname, filename)); - LLFile::close(filep); - continue; - } char buffer[LOG_RECALL_SIZE]; fseek(filep, 0, SEEK_END); // seek to end of file @@ -749,59 +782,34 @@ void LLLogChat::deleteTranscripts() // static bool LLLogChat::isTranscriptExist(const LLUUID& avatar_id, bool is_group) { - std::vector<std::string> list_of_transcriptions; - LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); + std::string strFileName; + if (!is_group) + buildIMP2PLogFilename(avatar_id, LLStringUtil::null, strFileName); + else + gCacheName->getGroupName(avatar_id, strFileName); - if (list_of_transcriptions.size() > 0) + std::string strFilePath = makeLogFileName(strFileName); + if ( (!strFilePath.empty()) && (LLFile::isfile(strFilePath)) ) { - LLAvatarName avatar_name; - LLAvatarNameCache::get(avatar_id, &avatar_name); - std::string avatar_user_name = avatar_name.getAccountName(); - if(!is_group) - { - std::replace(avatar_user_name.begin(), avatar_user_name.end(), '.', '_'); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) - { - if (std::string::npos != transcript_file_name.find(avatar_user_name)) - { - return true; - } - } - } - else - { - std::string file_name; - gCacheName->getGroupName(avatar_id, file_name); - file_name = makeLogFileName(file_name); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) - { - if (transcript_file_name == file_name) - { - return true; - } - } - } - + return true; } - return false; + // If a dated file existed it'll return a valid path; otherwise, it returns the undated unverified path so we do need to check it + strFilePath = oldLogFileName(strFileName); + return (!strFilePath.empty()) && (LLFile::isfile(strFilePath)); } bool LLLogChat::isNearbyTranscriptExist() { - std::vector<std::string> list_of_transcriptions; - LLLogChat::getListOfTranscriptFiles(list_of_transcriptions); - - std::string file_name; - file_name = makeLogFileName("chat"); - BOOST_FOREACH(std::string& transcript_file_name, list_of_transcriptions) + std::string strFilePath = makeLogFileName("chat"); + if ( (!strFilePath.empty()) && (LLFile::isfile(strFilePath)) ) { - if (transcript_file_name == file_name) - { - return true; - } + return true; } - return false; + + // If a dated file existed it'll return a valid path; otherwise, it returns the undated unverified path so we do need to check it + strFilePath = oldLogFileName("chat"); + return (!strFilePath.empty()) && (LLFile::isfile(strFilePath)); } //*TODO mark object's names in a special way so that they will be distinguishable form avatar name diff --git a/indra/newview/lllogchat.h b/indra/newview/lllogchat.h index ca597599dd..d1dbf2d119 100755 --- a/indra/newview/lllogchat.h +++ b/indra/newview/lllogchat.h @@ -92,6 +92,12 @@ public: static std::string timestamp(bool withdate = false); static std::string makeLogFileName(std::string(filename)); + + /** + * Attempts to build the correct IM P2P log filename for the specified agent UUID and agent name + */ + static bool buildIMP2PLogFilename(const LLUUID& idAgent, const std::string& strName, std::string& strFilename); + /** *Add functions to get old and non date stamped file names when needed */ diff --git a/indra/newview/llmanip.cpp b/indra/newview/llmanip.cpp index bbcdcb126d..0935691ebc 100755 --- a/indra/newview/llmanip.cpp +++ b/indra/newview/llmanip.cpp @@ -62,7 +62,7 @@ F32 LLManip::sHelpTextFadeTime = 2.f; S32 LLManip::sNumTimesHelpTextShown = 0; S32 LLManip::sMaxTimesShowHelpText = 5; F32 LLManip::sGridMaxSubdivisionLevel = 32.f; -F32 LLManip::sGridMinSubdivisionLevel = 1.f; +F32 LLManip::sGridMinSubdivisionLevel = 1.f / 32.f; LLVector2 LLManip::sTickLabelSpacing(60.f, 25.f); @@ -176,7 +176,7 @@ BOOL LLManip::getManipAxis(LLViewerObject* object, EManipPart manip, LLVector3 & return TRUE; } -F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing) +F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing, F32 min_subdivisions, F32 max_subdivisions) { //update current snap subdivision level LLVector3 cam_to_reference; @@ -192,7 +192,8 @@ F32 LLManip::getSubdivisionLevel(const LLVector3 &reference_point, const LLVecto F32 projected_translation_axis_length = (translate_axis % cam_to_reference).magVec(); F32 subdivisions = llmax(projected_translation_axis_length * grid_scale / (current_range / LLViewerCamera::getInstance()->getPixelMeterRatio() * min_pixel_spacing), 0.f); - subdivisions = llclamp((F32)pow(2.f, llfloor(log(subdivisions) / log(2.f))), 1.f / 32.f, 32.f); + // figure out nearest power of 2 that subdivides grid_scale with result > min_pixel_spacing + subdivisions = llclamp((F32)pow(2.f, llfloor(log(subdivisions) / log(2.f))), min_subdivisions, max_subdivisions); return subdivisions; } @@ -548,37 +549,31 @@ void LLManip::renderTickValue(const LLVector3& pos, F32 value, const std::string BOOL hud_selection = mObjectSelection->getSelectType() == SELECT_TYPE_HUD; gGL.matrixMode(LLRender::MM_MODELVIEW); gGL.pushMatrix(); - LLVector3 render_pos = pos; - if (hud_selection) { - F32 zoom_amt = gAgentCamera.mHUDCurZoom; - F32 inv_zoom_amt = 1.f / zoom_amt; - // scale text back up to counter-act zoom level - render_pos = pos * zoom_amt; - gGL.scalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt); - } - - LLColor4 shadow_color = LLColor4::black; - shadow_color.mV[VALPHA] = color.mV[VALPHA] * 0.5f; + LLVector3 render_pos = pos; + if (hud_selection) + { + F32 zoom_amt = gAgentCamera.mHUDCurZoom; + F32 inv_zoom_amt = 1.f / zoom_amt; + // scale text back up to counter-act zoom level + render_pos = pos * zoom_amt; + gGL.scalef(inv_zoom_amt, inv_zoom_amt, inv_zoom_amt); + } - if (fractional_portion != 0) - { - fraction_string = llformat("%c%02d%s", LLResMgr::getInstance()->getDecimalPoint(), fractional_portion, suffix.c_str()); + LLColor4 shadow_color = LLColor4::black; + shadow_color.mV[VALPHA] = color.mV[VALPHA] * 0.5f; - gViewerWindow->setup3DViewport(1, -1); - hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -1.f * big_fontp->getWidthF32(val_string), 3.f, shadow_color, hud_selection); - hud_render_utf8text(fraction_string, render_pos, *small_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 1.f, 3.f, shadow_color, hud_selection); + if (fractional_portion != 0) + { + fraction_string = llformat("%c%02d%s", LLResMgr::getInstance()->getDecimalPoint(), fractional_portion, suffix.c_str()); - gViewerWindow->setup3DViewport(); - hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -1.f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection); - hud_render_utf8text(fraction_string, render_pos, *small_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, 1.f, 3.f, color, hud_selection); - } - else - { - gViewerWindow->setup3DViewport(1, -1); - hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(val_string), 3.f, shadow_color, hud_selection); - gViewerWindow->setup3DViewport(); - hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, -0.5f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection); + hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW, -1.f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection); + hud_render_utf8text(fraction_string, render_pos, *small_fontp, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW, 1.f, 3.f, color, hud_selection); + } + else + { + hud_render_utf8text(val_string, render_pos, *big_fontp, LLFontGL::NORMAL, LLFontGL::DROP_SHADOW, -0.5f * big_fontp->getWidthF32(val_string), 3.f, color, hud_selection); + } } gGL.popMatrix(); } diff --git a/indra/newview/llmanip.h b/indra/newview/llmanip.h index 6263e4244f..1fb05e047a 100755 --- a/indra/newview/llmanip.h +++ b/indra/newview/llmanip.h @@ -137,7 +137,7 @@ protected: LLVector3 getPivotPoint(); void getManipNormal(LLViewerObject* object, EManipPart manip, LLVector3 &normal); BOOL getManipAxis(LLViewerObject* object, EManipPart manip, LLVector3 &axis); - F32 getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing = MIN_DIVISION_PIXEL_WIDTH); + F32 getSubdivisionLevel(const LLVector3 &reference_point, const LLVector3 &translate_axis, F32 grid_scale, S32 min_pixel_spacing = MIN_DIVISION_PIXEL_WIDTH, F32 min_subdivisions = sGridMinSubdivisionLevel, F32 max_subdivisions = sGridMaxSubdivisionLevel); void renderTickValue(const LLVector3& pos, F32 value, const std::string& suffix, const LLColor4 &color); void renderTickText(const LLVector3& pos, const std::string& suffix, const LLColor4 &color); void updateGridSettings(); diff --git a/indra/newview/llmaniptranslate.cpp b/indra/newview/llmaniptranslate.cpp index 8a89131c43..d22672bc16 100755 --- a/indra/newview/llmaniptranslate.cpp +++ b/indra/newview/llmaniptranslate.cpp @@ -374,7 +374,7 @@ BOOL LLManipTranslate::handleMouseDownOnPart( S32 x, S32 y, MASK mask ) //LLVector3 select_center_agent = gAgent.getPosAgentFromGlobal(LLSelectMgr::getInstance()->getSelectionCenterGlobal()); // TomY: The above should (?) be identical to the below LLVector3 select_center_agent = getPivotPoint(); - mSubdivisions = llclamp(getSubdivisionLevel(select_center_agent, axis_exists ? axis : LLVector3::z_axis, getMinGridScale()), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); + mSubdivisions = getSubdivisionLevel(select_center_agent, axis_exists ? axis : LLVector3::z_axis, getMinGridScale()); // if we clicked on a planar manipulator, recenter mouse cursor if (mManipPart >= LL_YZ_PLANE && mManipPart <= LL_XY_PLANE) @@ -516,7 +516,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) LLSelectMgr::getInstance()->updateSelectionCenter(); LLVector3d current_pos_global = gAgent.getPosGlobalFromAgent(getPivotPoint()); - mSubdivisions = llclamp(getSubdivisionLevel(getPivotPoint(), axis_f, getMinGridScale()), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); + mSubdivisions = getSubdivisionLevel(getPivotPoint(), axis_f, getMinGridScale()); // Project the cursor onto that plane LLVector3d relative_move; @@ -606,7 +606,7 @@ BOOL LLManipTranslate::handleHover(S32 x, S32 y, MASK mask) max_grid_scale = mGridScale.mV[VZ]; } - F32 num_subdivisions = llclamp(getSubdivisionLevel(getPivotPoint(), camera_projected_dir, max_grid_scale), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); + F32 num_subdivisions = getSubdivisionLevel(getPivotPoint(), camera_projected_dir, max_grid_scale); F32 grid_scale_a; F32 grid_scale_b; @@ -1254,6 +1254,7 @@ void LLManipTranslate::renderSnapGuides() for (S32 pass = 0; pass < 3; pass++) { LLColor4 line_color = setupSnapGuideRenderPass(pass); + LLGLDepthTest gls_depth(pass != 1); gGL.begin(LLRender::LINES); { @@ -1285,7 +1286,7 @@ void LLManipTranslate::renderSnapGuides() { tick_start = selection_center + (translate_axis * (smallest_grid_unit_scale * (F32)i - offset_nearest_grid_unit)); - F32 cur_subdivisions = llclamp(getSubdivisionLevel(tick_start, translate_axis, getMinGridScale()), sGridMinSubdivisionLevel, sGridMaxSubdivisionLevel); + F32 cur_subdivisions = getSubdivisionLevel(tick_start, translate_axis, getMinGridScale()); if (fmodf((F32)(i + sub_div_offset), (max_subdivisions / cur_subdivisions)) != 0.f) { @@ -1383,7 +1384,7 @@ void LLManipTranslate::renderSnapGuides() tick_scale *= 0.7f; } - if (fmodf((F32)(i + sub_div_offset), (max_subdivisions / llmin(sGridMaxSubdivisionLevel, getSubdivisionLevel(tick_pos, translate_axis, getMinGridScale(), tick_label_spacing)))) == 0.f) + if (fmodf((F32)(i + sub_div_offset), (max_subdivisions / getSubdivisionLevel(tick_pos, translate_axis, getMinGridScale(), tick_label_spacing))) == 0.f) { F32 snap_offset_meters; diff --git a/indra/newview/llmediactrl.cpp b/indra/newview/llmediactrl.cpp index 086bc1c186..f4e08dc790 100755 --- a/indra/newview/llmediactrl.cpp +++ b/indra/newview/llmediactrl.cpp @@ -509,6 +509,16 @@ void LLMediaCtrl::navigateForward() //////////////////////////////////////////////////////////////////////////////// // +void LLMediaCtrl::navigateStop() +{ + if (mMediaSource && mMediaSource->hasMedia()) + { + mMediaSource->getMediaPlugin()->browse_stop(); + } +} + +//////////////////////////////////////////////////////////////////////////////// +// bool LLMediaCtrl::canNavigateBack() { if (mMediaSource) diff --git a/indra/newview/llmediactrl.h b/indra/newview/llmediactrl.h index b6ed0f3fab..785c57b78a 100755 --- a/indra/newview/llmediactrl.h +++ b/indra/newview/llmediactrl.h @@ -99,6 +99,7 @@ public: void navigateBack(); void navigateHome(); void navigateForward(); + void navigateStop(); void navigateToLocalPage( const std::string& subdir, const std::string& filename_in ); bool canNavigateBack(); bool canNavigateForward(); diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp index 2923221c90..e9970de58c 100755 --- a/indra/newview/llnotificationstorage.cpp +++ b/indra/newview/llnotificationstorage.cpp @@ -103,19 +103,21 @@ bool LLNotificationStorage::writeNotifications(const LLSD& pNotificationData) co return didFileOpen; } -bool LLNotificationStorage::readNotifications(LLSD& pNotificationData) const +bool LLNotificationStorage::readNotifications(LLSD& pNotificationData, bool is_new_filename) const { - LL_INFOS("LLNotificationStorage") << "starting read '" << mFileName << "'" << LL_ENDL; + std::string filename = is_new_filename? mFileName : mOldFileName; + + LL_INFOS("LLNotificationStorage") << "starting read '" << filename << "'" << LL_ENDL; bool didFileRead; pNotificationData.clear(); - llifstream notifyFile(mFileName.c_str()); + llifstream notifyFile(filename.c_str()); didFileRead = notifyFile.is_open(); if (!didFileRead) { - LL_WARNS("LLNotificationStorage") << "Failed to open file '" << mFileName << "'" << LL_ENDL; + LL_WARNS("LLNotificationStorage") << "Failed to open file '" << filename << "'" << LL_ENDL; } else { @@ -128,7 +130,19 @@ bool LLNotificationStorage::readNotifications(LLSD& pNotificationData) const } } - LL_INFOS("LLNotificationStorage") << "ending read '" << mFileName << "'" << LL_ENDL; + LL_INFOS("LLNotificationStorage") << "ending read '" << filename << "'" << LL_ENDL; + if (!didFileRead) + { + if(is_new_filename) + { + didFileRead = readNotifications(pNotificationData, false); + if(didFileRead) + { + writeNotifications(pNotificationData); + LLFile::remove(mOldFileName); + } + } + } return didFileRead; } diff --git a/indra/newview/llnotificationstorage.h b/indra/newview/llnotificationstorage.h index 53fd898ea4..21d7123747 100755 --- a/indra/newview/llnotificationstorage.h +++ b/indra/newview/llnotificationstorage.h @@ -43,13 +43,15 @@ public: protected: bool writeNotifications(const LLSD& pNotificationData) const; - bool readNotifications(LLSD& pNotificationData) const; + bool readNotifications(LLSD& pNotificationData, bool is_new_filename = true) const; void setFileName(std::string pFileName) {mFileName = pFileName;} + void setOldFileName(std::string pFileName) {mOldFileName = pFileName;} LLNotificationResponderInterface* createResponder(const std::string& pNotificationName, const LLSD& pParams) const; private: std::string mFileName; + std::string mOldFileName; }; #endif // LL_NOTIFICATIONSTORAGE_H diff --git a/indra/newview/llpanelcontents.cpp b/indra/newview/llpanelcontents.cpp index 89a9e0dc16..407cbfc47b 100755 --- a/indra/newview/llpanelcontents.cpp +++ b/indra/newview/llpanelcontents.cpp @@ -142,6 +142,13 @@ void LLPanelContents::refresh() } } +void LLPanelContents::clearContents() +{ + if (mPanelInventoryObject) + { + mPanelInventoryObject->clearInventoryTask(); + } +} // diff --git a/indra/newview/llpanelcontents.h b/indra/newview/llpanelcontents.h index ad62e13bc2..6ecc78afa0 100755 --- a/indra/newview/llpanelcontents.h +++ b/indra/newview/llpanelcontents.h @@ -48,6 +48,7 @@ public: virtual ~LLPanelContents(); void refresh(); + void clearContents(); static void onClickNewScript(void*); diff --git a/indra/newview/llpaneleditwearable.cpp b/indra/newview/llpaneleditwearable.cpp index ac00c5d986..19a86cdcea 100755 --- a/indra/newview/llpaneleditwearable.cpp +++ b/indra/newview/llpaneleditwearable.cpp @@ -860,10 +860,8 @@ void LLPanelEditWearable::draw() void LLPanelEditWearable::onClose() { - if ( isDirty() ) - { - revertChanges(); - } + // any unsaved changes should be reverted at this point + revertChanges(); } void LLPanelEditWearable::setVisible(BOOL visible) @@ -951,7 +949,7 @@ void LLPanelEditWearable::onCommitSexChange() gAgentAvatarp->updateSexDependentLayerSets(); gAgentAvatarp->updateVisualParams(); - + showWearable(mWearablePtr, TRUE, TRUE); updateScrollingPanelUI(); } diff --git a/indra/newview/llpanelgroupinvite.cpp b/indra/newview/llpanelgroupinvite.cpp index dd13e8abf4..7b8ed9c631 100755 --- a/indra/newview/llpanelgroupinvite.cpp +++ b/indra/newview/llpanelgroupinvite.cpp @@ -260,7 +260,7 @@ void LLPanelGroupInvite::impl::addRoleNames(LLGroupMgrGroupData* gdatap) //else if they have the limited add to roles power //we add every role the user is in //else we just add to everyone - bool is_owner = member_data->isInRole(gdatap->mOwnerRole); + bool is_owner = member_data->isOwner(); bool can_assign_any = gAgent.hasPowerInGroup(mGroupID, GP_ROLE_ASSIGN_MEMBER); bool can_assign_limited = gAgent.hasPowerInGroup(mGroupID, @@ -579,7 +579,7 @@ void LLPanelGroupInvite::updateLists() { waiting = true; } - if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete()) + if (gdatap->isRoleDataComplete() && gdatap->isMemberDataComplete() && gdatap->isRoleMemberDataComplete()) { if ( mImplementation->mRoleNames ) { @@ -607,6 +607,7 @@ void LLPanelGroupInvite::updateLists() { LLGroupMgr::getInstance()->sendGroupPropertiesRequest(mImplementation->mGroupID); LLGroupMgr::getInstance()->sendGroupRoleDataRequest(mImplementation->mGroupID); + LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mImplementation->mGroupID); LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mImplementation->mGroupID); } mPendingUpdate = TRUE; diff --git a/indra/newview/llpanelgrouproles.cpp b/indra/newview/llpanelgrouproles.cpp index 9ca3d7e96e..40ebed029c 100755 --- a/indra/newview/llpanelgrouproles.cpp +++ b/indra/newview/llpanelgrouproles.cpp @@ -1783,7 +1783,7 @@ LLPanelGroupRolesSubTab::LLPanelGroupRolesSubTab() mMemberVisibleCheck(NULL), mDeleteRoleButton(NULL), mCreateRoleButton(NULL), - + mFirstOpen(TRUE), mHasRoleChange(FALSE) { } @@ -1885,6 +1885,7 @@ void LLPanelGroupRolesSubTab::deactivate() LL_DEBUGS() << "LLPanelGroupRolesSubTab::deactivate()" << LL_ENDL; LLPanelGroupSubTab::deactivate(); + mFirstOpen = FALSE; } bool LLPanelGroupRolesSubTab::needsApply(std::string& mesg) @@ -1902,7 +1903,7 @@ bool LLPanelGroupRolesSubTab::apply(std::string& mesg) LL_DEBUGS() << "LLPanelGroupRolesSubTab::apply()" << LL_ENDL; saveRoleChanges(true); - + mFirstOpen = FALSE; LLGroupMgr::getInstance()->sendGroupRoleChanges(mGroupID); notifyObservers(); @@ -2039,14 +2040,17 @@ void LLPanelGroupRolesSubTab::update(LLGroupChange gc) } } - if (!gdatap || !gdatap->isMemberDataComplete()) + if(!mFirstOpen) { - LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); - } - - if (!gdatap || !gdatap->isRoleMemberDataComplete()) - { - LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID); + if (!gdatap || !gdatap->isMemberDataComplete()) + { + LLGroupMgr::getInstance()->sendCapGroupMembersRequest(mGroupID); + } + + if (!gdatap || !gdatap->isRoleMemberDataComplete()) + { + LLGroupMgr::getInstance()->sendGroupRoleMembersRequest(mGroupID); + } } if ((GC_ROLE_MEMBER_DATA == gc || GC_MEMBER_DATA == gc) @@ -2677,7 +2681,7 @@ void LLPanelGroupRoles::setGroupID(const LLUUID& id) if(mSubTabContainer) mSubTabContainer->selectTab(1); - + group_roles_tab->mFirstOpen = TRUE; activate(); } diff --git a/indra/newview/llpanelgrouproles.h b/indra/newview/llpanelgrouproles.h index baa2d40c7e..aa6d45fa36 100755 --- a/indra/newview/llpanelgrouproles.h +++ b/indra/newview/llpanelgrouproles.h @@ -260,6 +260,9 @@ public: void saveRoleChanges(bool select_saved_role); virtual void setGroupID(const LLUUID& id); + + BOOL mFirstOpen; + protected: void handleActionCheck(LLUICtrl* ctrl, bool force); LLSD createRoleItem(const LLUUID& role_id, std::string name, std::string title, S32 members); diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp index 088eaa8e0d..abdfa89f50 100755 --- a/indra/newview/llpanellogin.cpp +++ b/indra/newview/llpanellogin.cpp @@ -225,11 +225,16 @@ void LLPanelLogin::addUsersWithFavoritesToUsername() { LLComboBox* combo = getChild<LLComboBox>("username_combo"); if (!combo) return; - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml"); + std::string old_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); LLSD fav_llsd; llifstream file; file.open(filename); - if (!file.is_open()) return; + if (!file.is_open()) + { + file.open(old_filename); + if (!file.is_open()) return; + } LLSDSerialize::fromXML(fav_llsd, file); for (LLSD::map_const_iterator iter = fav_llsd.beginMap(); iter != fav_llsd.endMap(); ++iter) @@ -251,11 +256,17 @@ void LLPanelLogin::addFavoritesToStartLocation() // Load favorites into the combo. std::string user_defined_name = getChild<LLComboBox>("username_combo")->getSimple(); - std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); + std::replace(user_defined_name.begin(), user_defined_name.end(), '.', ' '); + std::string filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites_" + LLGridManager::getInstance()->getGrid() + ".xml"); + std::string old_filename = gDirUtilp->getExpandedFilename(LL_PATH_USER_SETTINGS, "stored_favorites.xml"); LLSD fav_llsd; llifstream file; file.open(filename); - if (!file.is_open()) return; + if (!file.is_open()) + { + file.open(old_filename); + if (!file.is_open()) return; + } LLSDSerialize::fromXML(fav_llsd, file); for (LLSD::map_const_iterator iter = fav_llsd.beginMap(); iter != fav_llsd.endMap(); ++iter) @@ -954,11 +965,12 @@ void LLPanelLogin::onSelectServer() // The user twiddled with the grid choice ui. // apply the selection to the grid setting. LLPointer<LLCredential> credential; - + LLComboBox* server_combo = getChild<LLComboBox>("server_combo"); LLSD server_combo_val = server_combo->getSelectedValue(); LL_INFOS("AppInit") << "grid "<<server_combo_val.asString()<< LL_ENDL; LLGridManager::getInstance()->setGridChoice(server_combo_val.asString()); + addFavoritesToStartLocation(); /* * Determine whether or not the value in the start_location_combo makes sense diff --git a/indra/newview/llpanelmaininventory.cpp b/indra/newview/llpanelmaininventory.cpp index b02298090a..2378e09979 100755 --- a/indra/newview/llpanelmaininventory.cpp +++ b/indra/newview/llpanelmaininventory.cpp @@ -183,6 +183,13 @@ BOOL LLPanelMainInventory::postBuild() } + if (recent_items_panel) + { + U64 types = recent_items_panel->getFilter().getFilterObjectTypes(); + types &= ~(0x1 << LLInventoryType::IT_CATEGORY); + recent_items_panel->getFilter().setFilterObjectTypes(types); + } + mFilterEditor = getChild<LLFilterEditor>("inventory search editor"); if (mFilterEditor) { @@ -382,9 +389,11 @@ BOOL LLPanelMainInventory::filtersVisible(void* user_data) void LLPanelMainInventory::onClearSearch() { + BOOL initially_active = FALSE; LLFloater *finder = getFinder(); if (mActivePanel) { + initially_active = mActivePanel->getFilter().isNotDefault(); mActivePanel->setFilterSubString(LLStringUtil::null); mActivePanel->setFilterTypes(0xffffffffffffffffULL); mActivePanel->setFilterLinks(LLInventoryFilter::FILTERLINK_INCLUDE_LINKS); @@ -395,8 +404,8 @@ void LLPanelMainInventory::onClearSearch() LLFloaterInventoryFinder::selectAllTypes(finder); } - // re-open folders that were initially open - if (mActivePanel) + // re-open folders that were initially open in case filter was active + if (mActivePanel && (mFilterSubString.size() || initially_active)) { mSavedFolderState->setApply(TRUE); mActivePanel->getRootFolder()->applyFunctorRecursively(*mSavedFolderState); diff --git a/indra/newview/llpanelobjectinventory.cpp b/indra/newview/llpanelobjectinventory.cpp index 665b9ab294..6b74d90708 100755 --- a/indra/newview/llpanelobjectinventory.cpp +++ b/indra/newview/llpanelobjectinventory.cpp @@ -1862,14 +1862,19 @@ void LLPanelObjectInventory::refresh() } if(!has_inventory) { - mTaskUUID = LLUUID::null; - removeVOInventoryListener(); - clearContents(); + clearInventoryTask(); } mInventoryViewModel.setTaskID(mTaskUUID); //LL_INFOS() << "LLPanelObjectInventory::refresh() " << mTaskUUID << LL_ENDL; } +void LLPanelObjectInventory::clearInventoryTask() +{ + mTaskUUID = LLUUID::null; + removeVOInventoryListener(); + clearContents(); +} + void LLPanelObjectInventory::removeSelectedItem() { if(mFolders) diff --git a/indra/newview/llpanelobjectinventory.h b/indra/newview/llpanelobjectinventory.h index 9559f7e886..3de49242ac 100755 --- a/indra/newview/llpanelobjectinventory.h +++ b/indra/newview/llpanelobjectinventory.h @@ -62,6 +62,7 @@ public: void refresh(); const LLUUID& getTaskUUID() { return mTaskUUID;} + void clearInventoryTask(); void removeSelectedItem(); void startRenamingSelectedItem(); diff --git a/indra/newview/llpanelpeoplemenus.cpp b/indra/newview/llpanelpeoplemenus.cpp index 6979ae06e0..a5f59dbf4a 100755 --- a/indra/newview/llpanelpeoplemenus.cpp +++ b/indra/newview/llpanelpeoplemenus.cpp @@ -90,7 +90,7 @@ LLContextMenu* PeopleContextMenu::createMenu() // Set up for multi-selected People // registrar.add("Avatar.AddFriend", boost::bind(&LLAvatarActions::requestFriendshipDialog, mUUIDs)); // *TODO: unimplemented - registrar.add("Avatar.IM", boost::bind(&LLAvatarActions::startConference, mUUIDs, LLUUID::null)); + registrar.add("Avatar.IM", boost::bind(&PeopleContextMenu::startConference, this)); registrar.add("Avatar.Call", boost::bind(&LLAvatarActions::startAdhocCall, mUUIDs, LLUUID::null)); registrar.add("Avatar.OfferTeleport", boost::bind(&PeopleContextMenu::offerTeleport, this)); registrar.add("Avatar.RemoveFriend", boost::bind(&LLAvatarActions::removeFriendsDialog, mUUIDs)); @@ -272,6 +272,19 @@ void PeopleContextMenu::offerTeleport() LLAvatarActions::offerTeleport(mUUIDs); } +void PeopleContextMenu::startConference() +{ + uuid_vec_t uuids; + for (uuid_vec_t::const_iterator it = mUUIDs.begin(); it != mUUIDs.end(); ++it) + { + if(*it != gAgentID) + { + uuids.push_back(*it); + } + } + LLAvatarActions::startConference(uuids); +} + //== NearbyPeopleContextMenu =============================================================== void NearbyPeopleContextMenu::buildContextMenu(class LLMenuGL& menu, U32 flags) diff --git a/indra/newview/llpanelpeoplemenus.h b/indra/newview/llpanelpeoplemenus.h index 945382ebc5..9767bab89f 100755 --- a/indra/newview/llpanelpeoplemenus.h +++ b/indra/newview/llpanelpeoplemenus.h @@ -47,6 +47,7 @@ private: bool enableContextMenuItem(const LLSD& userdata); bool checkContextMenuItem(const LLSD& userdata); void offerTeleport(); + void startConference(); void requestTeleport(); }; diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp index 0817b677bc..ed91d277dd 100755 --- a/indra/newview/llpanelplaceprofile.cpp +++ b/indra/newview/llpanelplaceprofile.cpp @@ -488,8 +488,9 @@ void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel, gCacheName->getGroup(parcel->getGroupID(), boost::bind(&LLPanelPlaceInfo::onNameCache, mRegionGroupText, _2)); - gCacheName->getGroup(parcel->getGroupID(), - boost::bind(&LLPanelPlaceInfo::onNameCache, mParcelOwner, _2)); + std::string owner = + LLSLURL("group", parcel->getGroupID(), "inspect").getSLURLString(); + mParcelOwner->setText(owner); } else { diff --git a/indra/newview/llpersistentnotificationstorage.cpp b/indra/newview/llpersistentnotificationstorage.cpp index 8658921dc4..9e4f50b7a7 100755 --- a/indra/newview/llpersistentnotificationstorage.cpp +++ b/indra/newview/llpersistentnotificationstorage.cpp @@ -35,7 +35,7 @@ #include "llscreenchannel.h" #include "llscriptfloater.h" #include "llviewermessage.h" - +#include "llviewernetwork.h" LLPersistentNotificationStorage::LLPersistentNotificationStorage() : LLSingleton<LLPersistentNotificationStorage>() , LLNotificationStorage("") @@ -158,7 +158,10 @@ void LLPersistentNotificationStorage::loadNotifications() void LLPersistentNotificationStorage::initialize() { - setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml")); + std::string file_name = "open_notifications_" + LLGridManager::getInstance()->getGrid() + ".xml"; + setFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, file_name)); + setOldFileName(gDirUtilp->getExpandedFilename(LL_PATH_PER_SL_ACCOUNT, "open_notifications.xml")); + LLNotifications::instance().getChannel("Persistent")-> connectChanged(boost::bind(&LLPersistentNotificationStorage::onPersistentChannelChanged, this, _1)); } diff --git a/indra/newview/llpreviewnotecard.cpp b/indra/newview/llpreviewnotecard.cpp index c4858e241e..337a63e627 100755 --- a/indra/newview/llpreviewnotecard.cpp +++ b/indra/newview/llpreviewnotecard.cpp @@ -474,12 +474,17 @@ bool LLPreviewNotecard::saveIfNeeded(LLInventoryItem* copyitem) &onSaveComplete, (void*)info, FALSE); + return true; } else // !gAssetStorage { LL_WARNS() << "Not connected to an asset storage system." << LL_ENDL; return false; } + if(mCloseAfterSave) + { + closeFloater(); + } } } return true; diff --git a/indra/newview/llpreviewscript.cpp b/indra/newview/llpreviewscript.cpp index 9411b8265b..8eea5ea73e 100755 --- a/indra/newview/llpreviewscript.cpp +++ b/indra/newview/llpreviewscript.cpp @@ -1166,7 +1166,7 @@ void LLScriptEdCore::onBtnSaveToFile( void* userdata ) if( self->mSaveCallback ) { LLFilePicker& file_picker = LLFilePicker::instance(); - if( file_picker.getSaveFile( LLFilePicker::FFSAVE_SCRIPT ) ) + if( file_picker.getSaveFile( LLFilePicker::FFSAVE_SCRIPT, self->mScriptName ) ) { std::string filename = file_picker.getFirstFile(); std::string scriptText=self->mEditor->getText(); @@ -1948,6 +1948,7 @@ void LLLiveLSLEditor::loadScriptText(LLVFS *vfs, const LLUUID &uuid, LLAssetType mScriptEd->setScriptText(LLStringExplicit(&buffer[0]), TRUE); mScriptEd->mEditor->makePristine(); + mScriptEd->setScriptName(getItem()->getName()); } diff --git a/indra/newview/llpreviewscript.h b/indra/newview/llpreviewscript.h index 9ea191e928..515f277c4a 100755 --- a/indra/newview/llpreviewscript.h +++ b/indra/newview/llpreviewscript.h @@ -114,6 +114,8 @@ public: virtual bool hasAccelerators() const { return true; } + void setScriptName(const std::string& name){mScriptName = name;}; + private: void onBtnHelp(); void onBtnDynamicHelp(); @@ -138,6 +140,7 @@ protected: private: std::string mSampleText; + std::string mScriptName; LLScriptEditor* mEditor; void (*mLoadCallback)(void* userdata); void (*mSaveCallback)(void* userdata, BOOL close_after_save); diff --git a/indra/newview/llpreviewsound.cpp b/indra/newview/llpreviewsound.cpp index 11b81a58fc..105c5e8cbe 100755 --- a/indra/newview/llpreviewsound.cpp +++ b/indra/newview/llpreviewsound.cpp @@ -95,7 +95,6 @@ void LLPreviewSound::auditionSound( void *userdata ) if(item && gAudiop) { - LLVector3d lpos_global = gAgent.getPositionGlobal(); - gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_SFX, lpos_global); + gAudiop->triggerSound(item->getAssetUUID(), gAgent.getID(), SOUND_GAIN, LLAudioEngine::AUDIO_TYPE_SFX); } } diff --git a/indra/newview/llscenemonitor.cpp b/indra/newview/llscenemonitor.cpp index 7f705e44d2..5b37fdf41b 100644 --- a/indra/newview/llscenemonitor.cpp +++ b/indra/newview/llscenemonitor.cpp @@ -711,7 +711,13 @@ void LLSceneMonitorView::onClose(bool app_quitting) void LLSceneMonitorView::onVisibilityChange(BOOL visible) { - visible = visible && LLGLSLShader::sNoFixedFunction; + if (!LLGLSLShader::sNoFixedFunction && visible) + { + visible = false; + // keep Scene monitor and its view in sycn + setVisible(false); + LL_WARNS("SceneMonitor") << "Incompatible graphical settings, Scene Monitor can't be turned on" << LL_ENDL; + } LLSceneMonitor::getInstance()->setDebugViewerVisible(visible); } diff --git a/indra/newview/llsceneview.cpp b/indra/newview/llsceneview.cpp index 32f327b762..112fa5b4e1 100755 --- a/indra/newview/llsceneview.cpp +++ b/indra/newview/llsceneview.cpp @@ -56,6 +56,10 @@ void LLSceneView::onClose(bool) setVisible(false); } +void LLSceneView::onClickCloseBtn(bool) +{ + setVisible(false); +} void LLSceneView::draw() { diff --git a/indra/newview/llsceneview.h b/indra/newview/llsceneview.h index 6d839bcf08..e077c358b4 100755 --- a/indra/newview/llsceneview.h +++ b/indra/newview/llsceneview.h @@ -39,6 +39,7 @@ public: protected: virtual void onClose(bool app_qutting = false); + virtual void onClickCloseBtn(bool app_qutting = false); }; diff --git a/indra/newview/llstartup.cpp b/indra/newview/llstartup.cpp index 0c282a19a5..74df18810c 100755 --- a/indra/newview/llstartup.cpp +++ b/indra/newview/llstartup.cpp @@ -2226,7 +2226,6 @@ bool idle_startup() return TRUE; } - LL_WARNS("AppInit") << "Reached end of idle_startup for state " << LLStartUp::getStartupState() << LL_ENDL; return TRUE; } diff --git a/indra/newview/llstatusbar.cpp b/indra/newview/llstatusbar.cpp index 047538a32a..eedb829b48 100755 --- a/indra/newview/llstatusbar.cpp +++ b/indra/newview/llstatusbar.cpp @@ -200,6 +200,7 @@ BOOL LLStatusBar::postBuild() sgp.stat.count_stat_float(&LLStatViewer::ACTIVE_MESSAGE_DATA_RECEIVED); sgp.units("Kbps"); sgp.precision(0); + sgp.per_sec(true); mSGBandwidth = LLUICtrlFactory::create<LLStatGraph>(sgp); addChild(mSGBandwidth); x -= SIM_STAT_WIDTH + 2; diff --git a/indra/newview/lltextureview.cpp b/indra/newview/lltextureview.cpp index aa1f680a1e..edc2139527 100755 --- a/indra/newview/lltextureview.cpp +++ b/indra/newview/lltextureview.cpp @@ -501,7 +501,7 @@ private: void LLGLTexMemBar::draw() { S32Megabytes bound_mem = LLViewerTexture::sBoundTextureMemory; - S32Megabytes max_bound_mem = LLViewerTexture::sMaxBoundTextureMem; + S32Megabytes max_bound_mem = LLViewerTexture::sMaxBoundTextureMemory; S32Megabytes total_mem = LLViewerTexture::sTotalTextureMemory; S32Megabytes max_total_mem = LLViewerTexture::sMaxTotalTextureMem; F32 discard_bias = LLViewerTexture::sDesiredDiscardBias; diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp index 1b5b44423f..63ede7f8ac 100755 --- a/indra/newview/lltoast.cpp +++ b/indra/newview/lltoast.cpp @@ -234,6 +234,8 @@ void LLToast::closeToast() { mOnDeleteToastSignal(this); + setSoundFlags(SILENT); + closeFloater(); } diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp index 8fd0eb5931..c82894a5cc 100755 --- a/indra/newview/lltoastalertpanel.cpp +++ b/indra/newview/lltoastalertpanel.cpp @@ -266,6 +266,11 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal mLineEditor->setMaxTextChars(edit_text_max_chars); mLineEditor->setText(edit_text_contents); + if("SaveOutfitAs" == mNotification->getName()) + { + mLineEditor->setPrevalidate(&LLTextValidate::validateASCII); + } + // decrease limit of line editor of teleport offer dialog to avoid truncation of // location URL in invitation message, see EXT-6891 if ("OfferTeleport" == mNotification->getName()) diff --git a/indra/newview/lltoolbrush.cpp b/indra/newview/lltoolbrush.cpp index 56f0f8be25..e3eb8ba7af 100755 --- a/indra/newview/lltoolbrush.cpp +++ b/indra/newview/lltoolbrush.cpp @@ -52,7 +52,7 @@ #include "llworld.h" #include "llappviewer.h" #include "llparcel.h" - +#include "roles_constants.h" #include "llglheaders.h" const std::string REGION_BLOCKS_TERRAFORM_MSG = "This region does not allow terraforming.\n" @@ -239,9 +239,9 @@ void LLToolBrushLand::modifyLandInSelectionGlobal() iter != mLastAffectedRegions.end(); ++iter) { LLViewerRegion* regionp = *iter; - if (!canTerraform(regionp)) + if (!canTerraformRegion(regionp)) { - alertNoTerraform(regionp); + alertNoTerraformRegion(regionp); return; } } @@ -376,12 +376,17 @@ BOOL LLToolBrushLand::handleMouseDown(S32 x, S32 y, MASK mask) LLRegionPosition region_position( spot ); LLViewerRegion* regionp = region_position.getRegion(); - if (!canTerraform(regionp)) + if (!canTerraformRegion(regionp)) { - alertNoTerraform(regionp); + alertNoTerraformRegion(regionp); return TRUE; } + if (!canTerraformParcel(regionp)) + { + alertNoTerraformParcel(); + } + LLVector3 pos_region = region_position.getPositionRegion(); U32 grids = regionp->getLand().mGridsPerEdge; S32 i = llclamp( (S32)pos_region.mV[VX], 0, (S32)grids ); @@ -408,6 +413,16 @@ BOOL LLToolBrushLand::handleHover( S32 x, S32 y, MASK mask ) mMouseY = y; mGotHover = TRUE; gViewerWindow->setCursor(UI_CURSOR_TOOLLAND); + + LLVector3d spot; + if( gViewerWindow->mousePointOnLandGlobal( mMouseX, mMouseY, &spot ) ) + { + + spot.mdV[VX] = floor( spot.mdV[VX] + 0.5 ); + spot.mdV[VY] = floor( spot.mdV[VY] + 0.5 ); + + LLViewerParcelMgr::getInstance()->setHoverParcel(spot); + } return TRUE; } @@ -653,7 +668,7 @@ void LLToolBrushLand::redo() }*/ // static -bool LLToolBrushLand::canTerraform(LLViewerRegion* regionp) const +bool LLToolBrushLand::canTerraformRegion(LLViewerRegion* regionp) const { if (!regionp) return false; if (regionp->canManageEstate()) return true; @@ -661,7 +676,22 @@ bool LLToolBrushLand::canTerraform(LLViewerRegion* regionp) const } // static -void LLToolBrushLand::alertNoTerraform(LLViewerRegion* regionp) +bool LLToolBrushLand::canTerraformParcel(LLViewerRegion* regionp) const +{ + LLParcel* selected_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel(); + bool is_terraform_allowed = false; + if (selected_parcel) + { + BOOL owner_release = LLViewerParcelMgr::isParcelOwnedByAgent(selected_parcel, GP_LAND_ALLOW_EDIT_LAND); + is_terraform_allowed = ( gAgent.canManageEstate() || (selected_parcel->getOwnerID() == regionp->getOwner()) || owner_release); + } + + return is_terraform_allowed; +} + + +// static +void LLToolBrushLand::alertNoTerraformRegion(LLViewerRegion* regionp) { if (!regionp) return; @@ -671,6 +701,19 @@ void LLToolBrushLand::alertNoTerraform(LLViewerRegion* regionp) } +// static +void LLToolBrushLand::alertNoTerraformParcel() +{ + LLParcel* selected_parcel = LLViewerParcelMgr::getInstance()->getHoverParcel(); + if (selected_parcel) + { + LLSD args; + args["PARCEL"] = selected_parcel->getName(); + LLNotificationsUtil::add("ParcelNoTerraforming", args); + } + +} + ///============================================================================ /// Local function definitions ///============================================================================ diff --git a/indra/newview/lltoolbrush.h b/indra/newview/lltoolbrush.h index 1c7f198900..2ec6911de9 100755 --- a/indra/newview/lltoolbrush.h +++ b/indra/newview/lltoolbrush.h @@ -81,10 +81,14 @@ protected: const LLVector3& pos_world); // Does region allow terraform, or are we a god? - bool canTerraform(LLViewerRegion* regionp) const; + bool canTerraformRegion(LLViewerRegion* regionp) const; + + bool canTerraformParcel(LLViewerRegion* regionp) const; // Modal dialog that you can't terraform the region - void alertNoTerraform(LLViewerRegion* regionp); + void alertNoTerraformRegion(LLViewerRegion* regionp); + + void alertNoTerraformParcel(); protected: F32 mStartingZ; diff --git a/indra/newview/lltoolcomp.cpp b/indra/newview/lltoolcomp.cpp index b75d6b3dcb..4bda9072d0 100755 --- a/indra/newview/lltoolcomp.cpp +++ b/indra/newview/lltoolcomp.cpp @@ -126,12 +126,20 @@ void LLToolComposite::handleSelect() mSelected = TRUE; } +void LLToolComposite::handleDeselect() +{ + mCur->handleDeselect(); + mCur = mDefault; + mSelected = FALSE; +} + //---------------------------------------------------------------------------- // LLToolCompInspect //---------------------------------------------------------------------------- LLToolCompInspect::LLToolCompInspect() -: LLToolComposite(std::string("Inspect")) +: LLToolComposite(std::string("Inspect")), + mIsToolCameraActive(FALSE) { mSelectRect = new LLToolSelectRect(this); mDefault = mSelectRect; @@ -146,42 +154,87 @@ LLToolCompInspect::~LLToolCompInspect() BOOL LLToolCompInspect::handleMouseDown(S32 x, S32 y, MASK mask) { - mMouseDown = TRUE; - gViewerWindow->pickAsync(x, y, mask, pickCallback); - return TRUE; + BOOL handled = FALSE; + + if (mCur == LLToolCamera::getInstance()) + { + handled = mCur->handleMouseDown(x, y, mask); + } + else + { + mMouseDown = TRUE; + gViewerWindow->pickAsync(x, y, mask, pickCallback); + handled = TRUE; + } + + return handled; +} + +BOOL LLToolCompInspect::handleMouseUp(S32 x, S32 y, MASK mask) +{ + BOOL handled = LLToolComposite::handleMouseUp(x, y, mask); + mIsToolCameraActive = getCurrentTool() == LLToolCamera::getInstance(); + return handled; } void LLToolCompInspect::pickCallback(const LLPickInfo& pick_info) { LLViewerObject* hit_obj = pick_info.getObject(); + LLToolCompInspect * tool_inspectp = LLToolCompInspect::getInstance(); - if (!LLToolCompInspect::getInstance()->mMouseDown) + if (!tool_inspectp->mMouseDown) { // fast click on object, but mouse is already up...just do select - LLToolCompInspect::getInstance()->mSelectRect->handleObjectSelection(pick_info, gSavedSettings.getBOOL("EditLinkedParts"), FALSE); + tool_inspectp->mSelectRect->handleObjectSelection(pick_info, gSavedSettings.getBOOL("EditLinkedParts"), FALSE); return; } - if( hit_obj ) - { - if (LLSelectMgr::getInstance()->getSelection()->getObjectCount()) - { - LLEditMenuHandler::gEditMenuHandler = LLSelectMgr::getInstance(); - } - LLToolCompInspect::getInstance()->setCurrentTool( LLToolCompInspect::getInstance()->mSelectRect ); - LLToolCompInspect::getInstance()->mSelectRect->handlePick( pick_info ); + LLSelectMgr * mgr_selectp = LLSelectMgr::getInstance(); + if( hit_obj && mgr_selectp->getSelection()->getObjectCount()) { + LLEditMenuHandler::gEditMenuHandler = mgr_selectp; + } + + tool_inspectp->setCurrentTool( tool_inspectp->mSelectRect ); + tool_inspectp->mIsToolCameraActive = FALSE; + tool_inspectp->mSelectRect->handlePick( pick_info ); +} + +BOOL LLToolCompInspect::handleDoubleClick(S32 x, S32 y, MASK mask) +{ + return TRUE; +} + +BOOL LLToolCompInspect::handleKey(KEY key, MASK mask) +{ + BOOL handled = FALSE; + if(KEY_ALT == key) + { + setCurrentTool(LLToolCamera::getInstance()); + mIsToolCameraActive = TRUE; + handled = TRUE; } else { - LLToolCompInspect::getInstance()->setCurrentTool( LLToolCompInspect::getInstance()->mSelectRect ); - LLToolCompInspect::getInstance()->mSelectRect->handlePick( pick_info ); + handled = LLToolComposite::handleKey(key, mask); } + + return handled; } -BOOL LLToolCompInspect::handleDoubleClick(S32 x, S32 y, MASK mask) +void LLToolCompInspect::onMouseCaptureLost() { - return TRUE; + LLToolComposite::onMouseCaptureLost(); + mIsToolCameraActive = FALSE; +} + +void LLToolCompInspect::keyUp(KEY key, MASK mask) +{ + if (KEY_ALT == key && mCur == LLToolCamera::getInstance()) + { + setCurrentTool(mDefault); + mIsToolCameraActive = FALSE; + } } //---------------------------------------------------------------------------- diff --git a/indra/newview/lltoolcomp.h b/indra/newview/lltoolcomp.h index bbb5ed5797..e75d3c22e2 100755 --- a/indra/newview/lltoolcomp.h +++ b/indra/newview/lltoolcomp.h @@ -62,7 +62,7 @@ public: virtual BOOL clipMouseWhenDown() { return mCur->clipMouseWhenDown(); } virtual void handleSelect(); - virtual void handleDeselect() { mCur->handleDeselect(); mCur = mDefault; mSelected = FALSE; } + virtual void handleDeselect(); virtual void render() { mCur->render(); } virtual void draw() { mCur->draw(); } @@ -78,9 +78,10 @@ public: { mCur->localPointToScreen(local_x, local_y, screen_x, screen_y); } BOOL isSelecting(); + LLTool* getCurrentTool() { return mCur; } + protected: void setCurrentTool( LLTool* new_tool ); - LLTool* getCurrentTool() { return mCur; } // In hover handler, call this to auto-switch tools void setToolFromMask( MASK mask, LLTool *normal ); @@ -108,9 +109,18 @@ public: // Overridden from LLToolComposite virtual BOOL handleMouseDown(S32 x, S32 y, MASK mask); + virtual BOOL handleMouseUp(S32 x, S32 y, MASK mask); virtual BOOL handleDoubleClick(S32 x, S32 y, MASK mask); + virtual BOOL handleKey(KEY key, MASK mask); + virtual void onMouseCaptureLost(); + void keyUp(KEY key, MASK mask); static void pickCallback(const LLPickInfo& pick_info); + + BOOL isToolCameraActive() const { return mIsToolCameraActive; } + +private: + BOOL mIsToolCameraActive; }; //----------------------------------------------------------------------- diff --git a/indra/newview/lltooldraganddrop.cpp b/indra/newview/lltooldraganddrop.cpp index eabf6f0497..575e5c5c52 100755 --- a/indra/newview/lltooldraganddrop.cpp +++ b/indra/newview/lltooldraganddrop.cpp @@ -513,6 +513,7 @@ void LLToolDragAndDrop::onMouseCaptureLost() mSource = SOURCE_AGENT; mSourceID.setNull(); mObjectID.setNull(); + mCustomMsg.clear(); } BOOL LLToolDragAndDrop::handleMouseUp( S32 x, S32 y, MASK mask ) @@ -556,6 +557,12 @@ ECursorType LLToolDragAndDrop::acceptanceToCursor( EAcceptance acceptance ) mCursor = UI_CURSOR_NOLOCKED; break; + case ACCEPT_NO_CUSTOM: + mToolTipMsg = mCustomMsg; + mCursor = UI_CURSOR_NO; + break; + + case ACCEPT_NO: mCursor = UI_CURSOR_NO; break; @@ -630,6 +637,7 @@ BOOL LLToolDragAndDrop::handleToolTip(S32 x, S32 y, MASK mask) void LLToolDragAndDrop::handleDeselect() { mToolTipMsg.clear(); + mCustomMsg.clear(); LLToolTipMgr::instance().blockToolTips(); } @@ -2164,6 +2172,26 @@ EAcceptance LLToolDragAndDrop::dad3dWearCategory( // TODO: investigate wearables may not be loaded at this point EXT-8231 } + U32 max_items = gSavedSettings.getU32("WearFolderLimit"); + if (category->getDescendentCount()>max_items) + { + LLInventoryModel::cat_array_t cats; + LLInventoryModel::item_array_t items; + LLFindWearablesEx not_worn(/*is_worn=*/ false, /*include_body_parts=*/ false); + gInventory.collectDescendentsIf(category->getUUID(), + cats, + items, + LLInventoryModel::EXCLUDE_TRASH, + not_worn); + if (items.size() > max_items) + { + LLStringUtil::format_map_t args; + args["AMOUNT"] = llformat("%d", max_items); + mCustomMsg = LLTrans::getString("TooltipTooManyWearables",args); + return ACCEPT_NO_CUSTOM; + } + } + if(mSource == SOURCE_AGENT) { const LLUUID trash_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_TRASH); diff --git a/indra/newview/lltooldraganddrop.h b/indra/newview/lltooldraganddrop.h index 99b794ce58..de501ea32a 100755 --- a/indra/newview/lltooldraganddrop.h +++ b/indra/newview/lltooldraganddrop.h @@ -149,6 +149,7 @@ protected: BOOL mDrop; S32 mCurItemIndex; std::string mToolTipMsg; + std::string mCustomMsg; enddrag_signal_t mEndDragSignal; diff --git a/indra/newview/lltoolfocus.cpp b/indra/newview/lltoolfocus.cpp index ee4ec112f8..58073d1186 100755 --- a/indra/newview/lltoolfocus.cpp +++ b/indra/newview/lltoolfocus.cpp @@ -53,6 +53,7 @@ #include "llmorphview.h" #include "llfloaterreg.h" #include "llfloatercamera.h" +#include "llmenugl.h" // Globals BOOL gCameraBtnZoom = TRUE; @@ -75,6 +76,7 @@ LLToolCamera::LLToolCamera() mOutsideSlopX(FALSE), mOutsideSlopY(FALSE), mValidClickPoint(FALSE), + mValidSelection(FALSE), mMouseSteering(FALSE), mMouseUpX(0), mMouseUpY(0), @@ -91,6 +93,8 @@ void LLToolCamera::handleSelect() if (gFloaterTools) { gFloaterTools->setStatusText("camera"); + // in case we start from tools floater, we count any selection as valid + mValidSelection = gFloaterTools->getVisible(); } } @@ -98,6 +102,14 @@ void LLToolCamera::handleSelect() void LLToolCamera::handleDeselect() { // gAgent.setLookingAtAvatar(FALSE); + + // Make sure that temporary selection won't pass anywhere except pie tool. + MASK override_mask = gKeyboard ? gKeyboard->currentMask(TRUE) : 0; + if (!mValidSelection && (override_mask != MASK_NONE || (gFloaterTools && gFloaterTools->getVisible()))) + { + LLMenuGL::sMenuContainer->hideMenus(); + LLSelectMgr::getInstance()->validateSelection(); + } } BOOL LLToolCamera::handleMouseDown(S32 x, S32 y, MASK mask) diff --git a/indra/newview/lltoolfocus.h b/indra/newview/lltoolfocus.h index b1ac42e33f..d23eb2cce6 100755 --- a/indra/newview/lltoolfocus.h +++ b/indra/newview/lltoolfocus.h @@ -65,6 +65,7 @@ protected: BOOL mOutsideSlopX; BOOL mOutsideSlopY; BOOL mValidClickPoint; + BOOL mValidSelection; BOOL mMouseSteering; S32 mMouseUpX; // needed for releaseMouse() S32 mMouseUpY; diff --git a/indra/newview/lltoolgrab.cpp b/indra/newview/lltoolgrab.cpp index 493c970141..fa6694b93b 100755 --- a/indra/newview/lltoolgrab.cpp +++ b/indra/newview/lltoolgrab.cpp @@ -56,6 +56,7 @@ #include "llviewerregion.h" #include "llvoavatarself.h" #include "llworld.h" +#include "llmenugl.h" const S32 SLOP_DIST_SQ = 4; @@ -83,6 +84,7 @@ LLToolGrab::LLToolGrab( LLToolComposite* composite ) mLastFace(0), mSpinGrabbing( FALSE ), mSpinRotation(), + mClickedInMouselook( FALSE ), mHideBuildHighlight(FALSE) { } @@ -97,6 +99,8 @@ void LLToolGrab::handleSelect() { // viewer can crash during startup if we don't check. gFloaterTools->setStatusText("grab"); + // in case we start from tools floater, we count any selection as valid + mValidSelection = gFloaterTools->getVisible(); } gGrabBtnVertical = FALSE; gGrabBtnSpin = FALSE; @@ -109,6 +113,14 @@ void LLToolGrab::handleDeselect() setMouseCapture( FALSE ); } + // Make sure that temporary(invalid) selection won't pass anywhere except pie tool. + MASK override_mask = gKeyboard ? gKeyboard->currentMask(TRUE) : 0; + if (!mValidSelection && (override_mask != MASK_NONE || (gFloaterTools && gFloaterTools->getVisible()))) + { + LLMenuGL::sMenuContainer->hideMenus(); + LLSelectMgr::getInstance()->validateSelection(); + } + } BOOL LLToolGrab::handleDoubleClick(S32 x, S32 y, MASK mask) @@ -136,6 +148,7 @@ BOOL LLToolGrab::handleMouseDown(S32 x, S32 y, MASK mask) // can grab transparent objects (how touch event propagates, scripters rely on this) gViewerWindow->pickAsync(x, y, mask, pickCallback, TRUE); } + mClickedInMouselook = gAgentCamera.cameraMouselook(); return TRUE; } @@ -926,13 +939,21 @@ BOOL LLToolGrab::handleMouseUp(S32 x, S32 y, MASK mask) { setMouseCapture( FALSE ); } + mMode = GRAB_INACTIVE; - // HACK: Make some grabs temporary - if (gGrabTransientTool) + if(mClickedInMouselook && !gAgentCamera.cameraMouselook()) { - gBasicToolset->selectTool( gGrabTransientTool ); - gGrabTransientTool = NULL; + mClickedInMouselook = FALSE; + } + else + { + // HACK: Make some grabs temporary + if (gGrabTransientTool) + { + gBasicToolset->selectTool( gGrabTransientTool ); + gGrabTransientTool = NULL; + } } //gAgent.setObjectTracking(gSavedSettings.getBOOL("TrackFocusObject")); diff --git a/indra/newview/lltoolgrab.h b/indra/newview/lltoolgrab.h index 06a3b662c8..4e22732124 100755 --- a/indra/newview/lltoolgrab.h +++ b/indra/newview/lltoolgrab.h @@ -119,6 +119,7 @@ private: BOOL mHasMoved; // has mouse moved off center at all? BOOL mOutsideSlop; // has mouse moved outside center 5 pixels? BOOL mDeselectedThisClick; + BOOL mValidSelection; S32 mLastFace; LLVector2 mLastUVCoords; @@ -133,6 +134,8 @@ private: LLQuaternion mSpinRotation; BOOL mHideBuildHighlight; + + BOOL mClickedInMouselook; }; extern BOOL gGrabBtnVertical; diff --git a/indra/newview/lltoolmgr.cpp b/indra/newview/lltoolmgr.cpp index aa55caf7ec..175227173f 100755 --- a/indra/newview/lltoolmgr.cpp +++ b/indra/newview/lltoolmgr.cpp @@ -34,6 +34,7 @@ //#include "llfirstuse.h" // tools and manipulators +#include "llfloaterinspect.h" #include "lltool.h" #include "llmanipscale.h" #include "llselectmgr.h" @@ -218,7 +219,20 @@ LLTool* LLToolMgr::getCurrentTool() } if (cur_tool) { - cur_tool->handleSelect(); + if ( LLToolCompInspect::getInstance()->isToolCameraActive() + && prev_tool == LLToolCamera::getInstance() + && cur_tool == LLToolPie::getInstance() ) + { + LLFloaterInspect * inspect_instance = LLFloaterReg::getTypedInstance<LLFloaterInspect>("inspect"); + if(inspect_instance && inspect_instance->getVisible()) + { + setTransientTool(LLToolCompInspect::getInstance()); + } + } + else + { + cur_tool->handleSelect(); + } } } diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp index 6881ec4563..eec9760d2d 100755 --- a/indra/newview/lltoolpie.cpp +++ b/indra/newview/lltoolpie.cpp @@ -439,8 +439,12 @@ ECursorType LLToolPie::cursorFromObject(LLViewerObject* object) break; case CLICK_ACTION_BUY: if ( mClickActionBuyEnabled ) - { - cursor = UI_CURSOR_TOOLBUY; + { + LLSelectNode* node = LLSelectMgr::getInstance()->getHoverNode(); + if (!node || node->mSaleInfo.isForSale()) + { + cursor = UI_CURSOR_TOOLBUY; + } } break; case CLICK_ACTION_OPEN: @@ -544,6 +548,7 @@ BOOL LLToolPie::handleHover(S32 x, S32 y, MASK mask) mHoverPick = gViewerWindow->pickImmediate(x, y, FALSE); LLViewerObject *parent = NULL; LLViewerObject *object = mHoverPick.getObject(); + LLSelectMgr::getInstance()->setHoverObject(object, mHoverPick.mObjectFace); if (object) { parent = object->getRootEdit(); @@ -1306,7 +1311,16 @@ void LLToolPie::handleDeselect() } // remove temporary selection for pie menu LLSelectMgr::getInstance()->setHoverObject(NULL); - LLSelectMgr::getInstance()->validateSelection(); + + // Menu may be still up during transfer to different tool. + // toolfocus and toolgrab should retain menu, they will clear it if needed + MASK override_mask = gKeyboard ? gKeyboard->currentMask(TRUE) : 0; + if (!gMenuHolder->getVisible() || (override_mask & (MASK_ALT | MASK_CONTROL)) == 0) + { + // in most cases menu is useless without correct selection, so either keep both or discard both + gMenuHolder->hideMenus(); + LLSelectMgr::getInstance()->validateSelection(); + } } LLTool* LLToolPie::getOverrideTool(MASK mask) @@ -1686,6 +1700,12 @@ BOOL LLToolPie::handleRightClickPick() } } + // non UI object - put focus back "in world" + if (gFocusMgr.getKeyboardFocus()) + { + gFocusMgr.setKeyboardFocus(NULL); + } + LLTool::handleRightMouseDown(x, y, mask); // We handled the event. return TRUE; diff --git a/indra/newview/lltoolselect.cpp b/indra/newview/lltoolselect.cpp index 0a9153eecb..812abe9dbd 100755 --- a/indra/newview/lltoolselect.cpp +++ b/indra/newview/lltoolselect.cpp @@ -36,6 +36,7 @@ #include "llmanip.h" #include "llmenugl.h" #include "llselectmgr.h" +#include "llviewermediafocus.h" #include "lltoolmgr.h" #include "llfloaterscriptdebug.h" #include "llviewercamera.h" @@ -110,6 +111,21 @@ LLObjectSelectionHandle LLToolSelect::handleObjectSelection(const LLPickInfo& pi { BOOL already_selected = object->isSelected(); + if (already_selected && + object->getNumTEs() > 0 && + !LLSelectMgr::getInstance()->getSelection()->contains(object,SELECT_ALL_TES)) + { + const LLTextureEntry* tep = object->getTE(pick.mObjectFace); + if (tep && !tep->isSelected() && !LLViewerMediaFocus::getInstance()->getFocusedObjectID().isNull()) + { + // we were interacting with media and clicked on non selected face, drop media focus + LLViewerMediaFocus::getInstance()->clearFocus(); + // selection was removed and zoom preserved by clearFocus(), continue with regular selection + already_selected = false; + extend_select = true; + } + } + if ( extend_select ) { if ( already_selected ) diff --git a/indra/newview/llurldispatcher.cpp b/indra/newview/llurldispatcher.cpp index 615064c782..78268944fc 100755 --- a/indra/newview/llurldispatcher.cpp +++ b/indra/newview/llurldispatcher.cpp @@ -278,13 +278,13 @@ public: tokens[2].asReal(), tokens[3].asReal()); } - - LLSD args; - args["LOCATION"] = tokens[0]; // Region names may be %20 escaped. std::string region_name = LLURI::unescape(tokens[0]); + LLSD args; + args["LOCATION"] = region_name; + LLSD payload; payload["region_name"] = region_name; payload["callback_url"] = LLSLURL(region_name, coords).getSLURLString(); diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp index 4e491f257d..e19fe9ca75 100755 --- a/indra/newview/llviewerfloaterreg.cpp +++ b/indra/newview/llviewerfloaterreg.cpp @@ -76,6 +76,7 @@ #include "llfloaterinspect.h" #include "llfloaterinventory.h" #include "llfloaterjoystick.h" +#include "llfloaterlagmeter.h" #include "llfloaterland.h" #include "llfloaterlandholdings.h" #include "llfloatermap.h" @@ -237,6 +238,7 @@ void LLViewerFloaterReg::registerFloaters() LLNotificationsUI::registerFloater(); LLFloaterDisplayNameUtil::registerFloater(); + LLFloaterReg::add("lagmeter", "floater_lagmeter.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLagMeter>); LLFloaterReg::add("land_holdings", "floater_land_holdings.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterLandHoldings>); LLFloaterReg::add("mem_leaking", "floater_mem_leaking.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterMemLeak>); diff --git a/indra/newview/llviewerkeyboard.cpp b/indra/newview/llviewerkeyboard.cpp index 160478788c..b0f4802e20 100755 --- a/indra/newview/llviewerkeyboard.cpp +++ b/indra/newview/llviewerkeyboard.cpp @@ -162,7 +162,7 @@ void agent_push_backward( EKeystate s ) { camera_move_backward(s); } - else if (!gAgent.backwardGrabbed() && gAgentAvatarp->isSitting()) + else if (!gAgent.backwardGrabbed() && gAgentAvatarp->isSitting() && gSavedSettings.getBOOL("LeaveMouselook")) { gAgentCamera.changeCameraToThirdPerson(); } diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp index 8c9429c05d..38aaff9279 100755 --- a/indra/newview/llviewermenu.cpp +++ b/indra/newview/llviewermenu.cpp @@ -64,6 +64,7 @@ #include "llfloaterinventory.h" #include "llfloaterimcontainer.h" #include "llfloaterland.h" +#include "llfloaterimnearbychat.h" #include "llfloaterpathfindingcharacters.h" #include "llfloaterpathfindinglinksets.h" #include "llfloaterpay.h" @@ -92,6 +93,7 @@ #include "llparcel.h" #include "llrootview.h" #include "llsceneview.h" +#include "llscenemonitor.h" #include "llselectmgr.h" #include "llspellcheckmenuhandler.h" #include "llstatusbar.h" @@ -533,6 +535,10 @@ class LLAdvancedToggleConsole : public view_listener_t { toggle_visibility( (void*)gSceneView); } + else if ("scene monitor" == console_type) + { + toggle_visibility( (void*)gSceneMonitorView); + } return true; } @@ -559,6 +565,10 @@ class LLAdvancedCheckConsole : public view_listener_t { new_value = get_visibility( (void*) gSceneView); } + else if ("scene monitor" == console_type) + { + new_value = get_visibility( (void*) gSceneMonitorView); + } return new_value; } @@ -5660,6 +5670,25 @@ void toggle_debug_menus(void*) // gExportDialog = LLUploadDialog::modalUploadDialog("Exporting selected objects..."); // } // + +class LLCommunicateNearbyChat : public view_listener_t +{ + bool handleEvent(const LLSD& userdata) + { + LLFloaterIMContainer* im_box = LLFloaterIMContainer::getInstance(); + bool nearby_visible = LLFloaterReg::getTypedInstance<LLFloaterIMNearbyChat>("nearby_chat")->isInVisibleChain(); + if(nearby_visible && im_box->getSelectedSession() == LLUUID() && im_box->getConversationListItemSize() > 1) + { + im_box->selectNextorPreviousConversation(false); + } + else + { + LLFloaterReg::toggleInstanceOrBringToFront("nearby_chat"); + } + return true; + } +}; + class LLWorldSetHomeLocation : public view_listener_t { bool handleEvent(const LLSD& userdata) @@ -6176,7 +6205,7 @@ class LLPromptShowURL : public view_listener_t std::string alert = param.substr(0, offset); std::string url = param.substr(offset+1); - if(gSavedSettings.getBOOL("UseExternalBrowser")) + if (LLWeb::useExternalBrowser(url)) { LLSD payload; payload["url"] = url; @@ -7796,7 +7825,7 @@ void handle_web_content_test(const LLSD& param) void handle_show_url(const LLSD& param) { std::string url = param.asString(); - if(gSavedSettings.getBOOL("UseExternalBrowser")) + if (LLWeb::useExternalBrowser(url)) { LLWeb::loadURLExternal(url); } @@ -8233,9 +8262,9 @@ class LLWorldEnableEnvSettings : public view_listener_t bool result = false; std::string tod = userdata.asString(); - if (tod == "region") + if (LLEnvManagerNew::instance().getUseRegionSettings()) { - return LLEnvManagerNew::instance().getUseRegionSettings(); + return (tod == "region"); } if (LLEnvManagerNew::instance().getUseFixedSky()) @@ -8578,6 +8607,9 @@ void initialize_menus() // Me > Movement view_listener_t::addMenu(new LLAdvancedAgentFlyingInfo(), "Agent.getFlying"); + //Communicate Nearby chat + view_listener_t::addMenu(new LLCommunicateNearbyChat(), "Communicate.NearbyChat"); + // Communicate > Voice morphing > Subscribe... commit.add("Communicate.VoiceMorphing.Subscribe", boost::bind(&handle_voice_morphing_subscribe)); LLVivoxVoiceClient * voice_clientp = LLVivoxVoiceClient::getInstance(); diff --git a/indra/newview/llviewermenufile.cpp b/indra/newview/llviewermenufile.cpp index 80f47ecab2..b2a37694fe 100755 --- a/indra/newview/llviewermenufile.cpp +++ b/indra/newview/llviewermenufile.cpp @@ -477,8 +477,10 @@ class LLFileEnableCloseWindow : public view_listener_t { bool handleEvent(const LLSD& userdata) { - bool new_value = NULL != gFloaterView->getFrontmostClosableFloater(); - return new_value; + bool frontmost_fl_exists = (NULL != gFloaterView->getFrontmostClosableFloater()); + bool frontmost_snapshot_fl_exists = (NULL != gSnapshotFloaterView->getFrontmostClosableFloater()); + + return frontmost_fl_exists || frontmost_snapshot_fl_exists; } }; @@ -486,7 +488,21 @@ class LLFileCloseWindow : public view_listener_t { bool handleEvent(const LLSD& userdata) { - LLFloater::closeFrontmostFloater(); + bool frontmost_fl_exists = (NULL != gFloaterView->getFrontmostClosableFloater()); + LLFloater* snapshot_floater = gSnapshotFloaterView->getFrontmostClosableFloater(); + + if(snapshot_floater && (!frontmost_fl_exists || snapshot_floater->hasFocus())) + { + snapshot_floater->closeFloater(); + if (gFocusMgr.getKeyboardFocus() == NULL) + { + gFloaterView->focusFrontFloater(); + } + } + else + { + LLFloater::closeFrontmostFloater(); + } return true; } }; diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp index 9d5c3c4d4a..703c6d87c6 100755 --- a/indra/newview/llviewermessage.cpp +++ b/indra/newview/llviewermessage.cpp @@ -3767,6 +3767,15 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data) LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args); } + // don't call notification for debug messages from not owned objects + if (chat.mChatType == CHAT_TYPE_DEBUG_MSG) + { + if (gAgentID != chat.mOwnerID) + { + return; + } + } + LLSD msg_notify = LLSD(LLSD::emptyMap()); msg_notify["session_id"] = LLUUID(); msg_notify["from_id"] = chat.mFromID; diff --git a/indra/newview/llviewerobject.cpp b/indra/newview/llviewerobject.cpp index 80592f01ce..4f992fc184 100755 --- a/indra/newview/llviewerobject.cpp +++ b/indra/newview/llviewerobject.cpp @@ -2792,8 +2792,8 @@ void LLViewerObject::dirtyInventory() mInventory->clear(); // will deref and delete entries delete mInventory; mInventory = NULL; - mInventoryDirty = TRUE; } + mInventoryDirty = TRUE; } void LLViewerObject::registerInventoryListener(LLVOInventoryListener* listener, void* user_data) @@ -2830,12 +2830,15 @@ void LLViewerObject::clearInventoryListeners() void LLViewerObject::requestInventory() { - mInventoryDirty = FALSE; + if(mInventoryDirty && mInventory && !mInventoryCallbacks.empty()) + { + mInventory->clear(); // will deref and delete entries + delete mInventory; + mInventory = NULL; + mInventoryDirty = FALSE; //since we are going to request it now + } if(mInventory) { - //mInventory->clear() // will deref and delete it - //delete mInventory; - //mInventory = NULL; doInventoryCallback(); } // throw away duplicate requests diff --git a/indra/newview/llviewerparcelmgr.cpp b/indra/newview/llviewerparcelmgr.cpp index cdb08f4707..7c94442f09 100755 --- a/indra/newview/llviewerparcelmgr.cpp +++ b/indra/newview/llviewerparcelmgr.cpp @@ -117,6 +117,7 @@ LLViewerParcelMgr::LLViewerParcelMgr() mHoverRequestResult(0), mHoverWestSouth(), mHoverEastNorth(), + mTeleportInProgressPosition(), mRenderCollision(FALSE), mRenderSelection(TRUE), mCollisionBanned(0), @@ -1320,12 +1321,6 @@ void LLViewerParcelMgr::setHoverParcel(const LLVector3d& pos) static U32 last_west, last_south; - // only request parcel info when tooltip is shown - if (!gSavedSettings.getBOOL("ShowLandHoverTip")) - { - return; - } - // only request parcel info if position has changed outside of the // last parcel grid step U32 west_parcel_step = (U32) floor( pos.mdV[VX] / PARCEL_GRID_STEP_METERS ); @@ -1585,7 +1580,15 @@ void LLViewerParcelMgr::processParcelProperties(LLMessageSystem *msg, void **use if (instance->mTeleportInProgress) { instance->mTeleportInProgress = FALSE; - instance->mTeleportFinishedSignal(gAgent.getPositionGlobal(), false); + if(instance->mTeleportInProgressPosition.isNull()) + { + //initial update + instance->mTeleportFinishedSignal(gAgent.getPositionGlobal(), false); + } + else + { + instance->mTeleportFinishedSignal(instance->mTeleportInProgressPosition, false); + } } } } @@ -2494,6 +2497,7 @@ void LLViewerParcelMgr::onTeleportFinished(bool local, const LLVector3d& new_pos // Non-local teleport (inter-region or between different parcels of the same region). // The agent parcel data has not been updated yet. // Let's wait for the update and then emit the signal. + mTeleportInProgressPosition = new_pos; mTeleportInProgress = TRUE; } } diff --git a/indra/newview/llviewerparcelmgr.h b/indra/newview/llviewerparcelmgr.h index 58d398e141..b5b269abdf 100755 --- a/indra/newview/llviewerparcelmgr.h +++ b/indra/newview/llviewerparcelmgr.h @@ -335,6 +335,7 @@ private: std::vector<LLParcelObserver*> mObservers; BOOL mTeleportInProgress; + LLVector3d mTeleportInProgressPosition; teleport_finished_signal_t mTeleportFinishedSignal; teleport_failed_signal_t mTeleportFailedSignal; diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp index ba89aafc84..3f6d244af1 100755 --- a/indra/newview/llviewertexture.cpp +++ b/indra/newview/llviewertexture.cpp @@ -88,7 +88,7 @@ F32 LLViewerTexture::sDesiredDiscardBias = 0.f; F32 LLViewerTexture::sDesiredDiscardScale = 1.1f; S32Bytes LLViewerTexture::sBoundTextureMemory; S32Bytes LLViewerTexture::sTotalTextureMemory; -S32Megabytes LLViewerTexture::sMaxBoundTextureMem; +S32Megabytes LLViewerTexture::sMaxBoundTextureMemory; S32Megabytes LLViewerTexture::sMaxTotalTextureMem; S32Bytes LLViewerTexture::sMaxDesiredTextureMem; S8 LLViewerTexture::sCameraMovingDiscardBias = 0; @@ -534,11 +534,11 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity sBoundTextureMemory = LLImageGL::sBoundTextureMemory; sTotalTextureMemory = LLImageGL::sGlobalTextureMemory; - sMaxBoundTextureMem = gTextureList.getMaxResidentTexMem(); + sMaxBoundTextureMemory = gTextureList.getMaxResidentTexMem(); sMaxTotalTextureMem = gTextureList.getMaxTotalTextureMem(); sMaxDesiredTextureMem = sMaxTotalTextureMem; //in Bytes, by default and when total used texture memory is small. - if (sBoundTextureMemory >= sMaxBoundTextureMem || + if (sBoundTextureMemory >= sMaxBoundTextureMemory || sTotalTextureMemory >= sMaxTotalTextureMem) { //when texture memory overflows, lower down the threshold to release the textures more aggressively. @@ -558,7 +558,7 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity sEvaluationTimer.reset(); } else if (sDesiredDiscardBias > 0.0f && - sBoundTextureMemory < sMaxBoundTextureMem * texmem_lower_bound_scale && + sBoundTextureMemory < sMaxBoundTextureMemory * texmem_lower_bound_scale && sTotalTextureMemory < sMaxTotalTextureMem * texmem_lower_bound_scale) { // If we are using less texture memory than we should, @@ -576,7 +576,7 @@ void LLViewerTexture::updateClass(const F32 velocity, const F32 angular_velocity sCameraMovingBias = llmax(0.2f * camera_moving_speed, 2.0f * camera_angular_speed - 1); sCameraMovingDiscardBias = (S8)(sCameraMovingBias); - LLViewerTexture::sFreezeImageScalingDown = (sBoundTextureMemory < 0.75f * sMaxBoundTextureMem * texmem_middle_bound_scale) && + LLViewerTexture::sFreezeImageScalingDown = (sBoundTextureMemory < 0.75f * sMaxBoundTextureMemory * texmem_middle_bound_scale) && (sTotalTextureMemory < 0.75f * sMaxTotalTextureMem * texmem_middle_bound_scale); } @@ -1480,6 +1480,17 @@ void LLViewerFetchedTexture::processTextureStats() { mDesiredDiscardLevel = 0; } + else if (mDontDiscard && (mBoostLevel == LLGLTexture::BOOST_UI || mBoostLevel == LLGLTexture::BOOST_ICON)) + { + if (mFullWidth > MAX_IMAGE_SIZE_DEFAULT || mFullHeight > MAX_IMAGE_SIZE_DEFAULT) + { + mDesiredDiscardLevel = 1; // MAX_IMAGE_SIZE_DEFAULT = 1024 and max size ever is 2048 + } + else + { + mDesiredDiscardLevel = 0; + } + } else if(!mFullWidth || !mFullHeight) { mDesiredDiscardLevel = llmin(getMaxDiscardLevel(), (S32)mLoadedCallbackDesiredDiscardLevel); @@ -3074,7 +3085,7 @@ void LLViewerLODTexture::processTextureStats() scaleDown(); } // Limit the amount of GL memory bound each frame - else if ( sBoundTextureMemory > sMaxBoundTextureMem * texmem_middle_bound_scale && + else if ( sBoundTextureMemory > sMaxBoundTextureMemory * texmem_middle_bound_scale && (!getBoundRecently() || mDesiredDiscardLevel >= mCachedRawDiscardLevel)) { scaleDown(); diff --git a/indra/newview/llviewertexture.h b/indra/newview/llviewertexture.h index 307204da60..05912404e4 100755 --- a/indra/newview/llviewertexture.h +++ b/indra/newview/llviewertexture.h @@ -210,7 +210,7 @@ public: static F32 sDesiredDiscardScale; static S32Bytes sBoundTextureMemory; static S32Bytes sTotalTextureMemory; - static S32Megabytes sMaxBoundTextureMem; + static S32Megabytes sMaxBoundTextureMemory; static S32Megabytes sMaxTotalTextureMem; static S32Bytes sMaxDesiredTextureMem ; static S8 sCameraMovingDiscardBias; diff --git a/indra/newview/llviewerwindow.cpp b/indra/newview/llviewerwindow.cpp index 4d263c118b..d042bd847e 100755 --- a/indra/newview/llviewerwindow.cpp +++ b/indra/newview/llviewerwindow.cpp @@ -1392,6 +1392,13 @@ BOOL LLViewerWindow::handleTranslatedKeyUp(KEY key, MASK mask) // Let the voice chat code check for its PTT key. Note that this never affects event processing. LLVoiceClient::getInstance()->keyUp(key, mask); + // Let the inspect tool code check for ALT key to set LLToolSelectRect active instead LLToolCamera + LLToolCompInspect * tool_inspectp = LLToolCompInspect::getInstance(); + if (LLToolMgr::getInstance()->getCurrentTool() == tool_inspectp) + { + tool_inspectp->keyUp(key, mask); + } + return FALSE; } @@ -3216,6 +3223,8 @@ void LLViewerWindow::updateUI() } append_xui_tooltip(tooltip_view, params); + params.styled_message.add().text("\n"); + screen_sticky_rect.intersectWith(tooltip_view->calcScreenRect()); params.sticky_rect = screen_sticky_rect; @@ -3265,7 +3274,7 @@ void LLViewerWindow::updateUI() updateLayout(); - saveLastMouse(mCurrentMousePoint); + mLastMousePoint = mCurrentMousePoint; // cleanup unused selections when no modal dialogs are open if (LLModalDialog::activeCount() == 0) @@ -3505,8 +3514,6 @@ void LLViewerWindow::saveLastMouse(const LLCoordGL &point) // Store last mouse location. // If mouse leaves window, pretend last point was on edge of window - mLastMousePoint = mCurrentMousePoint; - if (point.mX < 0) { mCurrentMousePoint.mX = 0; diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp index 9f42776d78..22b979aa09 100755 --- a/indra/newview/llvoavatar.cpp +++ b/indra/newview/llvoavatar.cpp @@ -2068,7 +2068,7 @@ void LLVOAvatar::idleUpdate(LLAgent &agent, const F64 &time) } if (!(gPipeline.hasRenderType(LLPipeline::RENDER_TYPE_AVATAR)) - && !(gSavedSettings.getBOOL("DisableAllRenderTypes"))) + && !(gSavedSettings.getBOOL("DisableAllRenderTypes")) && !isSelf()) { return; } diff --git a/indra/newview/llvoicechannel.cpp b/indra/newview/llvoicechannel.cpp index 3c3dc33772..9a84cae403 100755 --- a/indra/newview/llvoicechannel.cpp +++ b/indra/newview/llvoicechannel.cpp @@ -280,14 +280,14 @@ void LLVoiceChannel::deactivate() if (callStarted()) { setState(STATE_HUNG_UP); - + //Default mic is OFF when leaving voice calls - if (gSavedSettings.getBOOL("AutoDisengageMic") && + if (gSavedSettings.getBOOL("AutoDisengageMic") && sCurrentVoiceChannel == this && LLVoiceClient::getInstance()->getUserPTTState()) { gSavedSettings.setBOOL("PTTCurrentlyEnabled", true); - LLVoiceClient::getInstance()->inputUserControlState(true); + LLVoiceClient::getInstance()->setUserPTTState(false); } } LLVoiceClient::getInstance()->removeObserver(this); diff --git a/indra/newview/llvoiceclient.cpp b/indra/newview/llvoiceclient.cpp index 815965fb0a..0bf373f478 100755 --- a/indra/newview/llvoiceclient.cpp +++ b/indra/newview/llvoiceclient.cpp @@ -36,6 +36,7 @@ #include "llsdserialize.h" #include "llui.h" #include "llkeyboard.h" +#include "llagent.h" const F32 LLVoiceClient::OVERDRIVEN_POWER_LEVEL = 0.7f; @@ -635,7 +636,7 @@ void LLVoiceClient::keyDown(KEY key, MASK mask) return; } - if(!mPTTIsMiddleMouse) + if(!mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak")) { bool down = (mPTTKey != KEY_NONE) && gKeyboard->getKeyDown(mPTTKey); @@ -654,12 +655,9 @@ void LLVoiceClient::keyUp(KEY key, MASK mask) } void LLVoiceClient::middleMouseState(bool down) { - if(mPTTIsMiddleMouse) + if(mPTTIsMiddleMouse && LLAgent::isActionAllowed("speak")) { - if(mPTTIsMiddleMouse) - { - inputUserControlState(down); - } + inputUserControlState(down); } } diff --git a/indra/newview/llweb.cpp b/indra/newview/llweb.cpp index 665671a38f..0312972a22 100755 --- a/indra/newview/llweb.cpp +++ b/indra/newview/llweb.cpp @@ -50,6 +50,8 @@ #include "llviewerwindow.h" #include "llnotificationsutil.h" +#include <boost/regex.hpp> + bool on_load_url_external_response(const LLSD& notification, const LLSD& response, bool async ); @@ -87,7 +89,8 @@ void LLWeb::loadURL(const std::string& url, const std::string& target, const std // Force load in the internal browser, as if with a blank target. loadURLInternal(url, "", uuid); } - else if (gSavedSettings.getBOOL("UseExternalBrowser") || (target == "_external")) + + else if (useExternalBrowser(url) || (target == "_external")) { loadURLExternal(url); } @@ -225,3 +228,19 @@ std::string LLWeb::expandURLSubstitutions(const std::string &url, return LLWeb::escapeURL(expanded_url); } + +//static +bool LLWeb::useExternalBrowser(const std::string &url) +{ + if (gSavedSettings.getU32("PreferredBrowserBehavior") == BROWSER_EXTERNAL_ONLY) + { + return true; + } + else if (gSavedSettings.getU32("PreferredBrowserBehavior") == BROWSER_INT_LL_EXT_OTHERS) + { + boost::regex pattern = boost::regex("\\b(lindenlab.com|secondlife.com)\\b", boost::regex::perl|boost::regex::icase); + boost::match_results<std::string::const_iterator> matches; + return !(boost::regex_search(url, matches, pattern)); + } + return false; +} diff --git a/indra/newview/llweb.h b/indra/newview/llweb.h index 0b95f664d6..7c90badbfe 100755 --- a/indra/newview/llweb.h +++ b/indra/newview/llweb.h @@ -40,6 +40,13 @@ class LLWeb { public: + enum PreferredBrowser + { + BROWSER_EXTERNAL_ONLY = 0, + BROWSER_INT_LL_EXT_OTHERS = 1, + BROWSER_INTERNAL_ONLY = 2 + }; + static void initClass(); /// Load the given url in the operating system's web browser, async if we want to return immediately @@ -57,6 +64,7 @@ public: /// Expands various strings like [LANG], [VERSION], etc. in a URL static std::string expandURLSubstitutions(const std::string &url, const LLSD &default_subs); + static bool useExternalBrowser(const std::string &url); }; #endif diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp index a770352f86..7cb53a0706 100755 --- a/indra/newview/llworldmapview.cpp +++ b/indra/newview/llworldmapview.cpp @@ -1694,6 +1694,8 @@ BOOL LLWorldMapView::handleHover( S32 x, S32 y, MASK mask ) sPanY += delta_y; sTargetPanX = sPanX; sTargetPanY = sPanY; + + gViewerWindow->moveCursorToCenter(); } // doesn't matter, cursor should be hidden diff --git a/indra/newview/skins/default/xui/da/floater_lagmeter.xml b/indra/newview/skins/default/xui/da/floater_lagmeter.xml new file mode 100644 index 0000000000..149d174c34 --- /dev/null +++ b/indra/newview/skins/default/xui/da/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="LAG METER"> + <floater.string name="max_title_msg"> + Lag måler + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Lag + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + Klient + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Normal, vindue i baggrund + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Klients billeder/sek under [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Klients billeder/sek mellem [CLIENT_FRAME_RATE_CRITICAL] og [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Mulig årsag: 'Vis afstand' sat for højt i grafik indstillinger + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Mulig årsag: Billeder hentes + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Mulig årsag: For mange billeder i hukommelse + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Mulig årsag: For mange komplekse objekter i scenariet + </floater.string> + <floater.string name="network_text_msg"> + Netværk + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + Forbindelsen mister over [NETWORK_PACKET_LOSS_CRITICAL]% pakker + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + Forbindelsen mister [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% pakker + </floater.string> + <floater.string name="network_performance_normal_msg"> + Normal + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Forbindelsens ping tider er over [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_ping_warning_msg"> + Forbindelsens ping tider er [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Muligvis dårlig forbindelse eller 'båndbredde' sat for højt i netværksopsætning. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Muligvis dårlig forbindelse eller fil delings program. + </floater.string> + <floater.string name="server_text_msg"> + Server + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Simulator framerate er under [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Simulator framerate er mellem [SERVER_FRAME_RATE_CRITICAL] og [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="server_physics_cause_msg"> + Mulig årsag: For mange fysiske objekter + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Mulig årsag: For mange objekter med script + </floater.string> + <floater.string name="server_net_cause_msg"> + Mulig årsag: For meget netværks trafik + </floater.string> + <floater.string name="server_agent_cause_msg"> + Mulig årsag: For mange avatarer i bevægelse i regionen + </floater.string> + <floater.string name="server_images_cause_msg"> + Mulig årsag: For mange billed udregninger + </floater.string> + <floater.string name="server_generic_cause_msg"> + Mulig årsag: Simulator belastning for stor + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Status for klient lag"/> + <text name="client"> + Klient + </text> + <text name="client_text"> + Normal + </text> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/> + <text name="network"> + Netværk + </text> + <text name="network_text"> + Normal + </text> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Status for server lag"/> + <text name="server"> + Server + </text> + <text name="server_text"> + Normal + </text> + <button label=">>" name="minimize" tool_tip="Ændre størrelse"/> +</floater> diff --git a/indra/newview/skins/default/xui/de/floater_lagmeter.xml b/indra/newview/skins/default/xui/de/floater_lagmeter.xml new file mode 100644 index 0000000000..45ff37c147 --- /dev/null +++ b/indra/newview/skins/default/xui/de/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="LAG METER"> + <floater.string name="max_title_msg"> + Lag-Anzeige + </floater.string> + <floater.string name="max_width_px"> + 350 + </floater.string> + <floater.string name="min_title_msg"> + Lag + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + Client + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Normal, Fenster im Hintergrund + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Client-Frame-Rate unter [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Client-Frame-Rate zwischen [CLIENT_FRAME_RATE_CRITICAL] und [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Mögliche Ursache: Sichtweite zu groß + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Mögliche Ursache: Bilder werden geladen + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Mögliche Ursache: Zu viele Bilder im Speicher + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Mögliche Ursache: Zu viele komplexe Objekte in der Szene + </floater.string> + <floater.string name="network_text_msg"> + Netzwerk + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + Paketverlust der Verbindung übersteigt [NETWORK_PACKET_LOSS_CRITICAL]% + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + Paketverlust der Verbindung liegt bei [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% + </floater.string> + <floater.string name="network_performance_normal_msg"> + Normal + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Ping-Zeit der Verbindung übersteigt [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_ping_warning_msg"> + Ping-Zeit der Verbindung liegt bei [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Möglicherweise schlechte Verbindung oder zu hoher Wert für „Bandbreite“. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Möglicherweise schlechte Verbindung oder File-Sharing-Anwendung. + </floater.string> + <floater.string name="server_text_msg"> + Server + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Simulator-Frame-Rate liegt unter [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Simulator-Frame-Rate liegt zwischen [SERVER_FRAME_RATE_CRITICAL] und [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="server_physics_cause_msg"> + Mögliche Ursache: Zu viele physische Objekte + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Mögliche Ursache: Zu viele geskriptete Objekte + </floater.string> + <floater.string name="server_net_cause_msg"> + Mögliche Ursache: Zu viel Netzwerktraffic + </floater.string> + <floater.string name="server_agent_cause_msg"> + Mögliche Ursache: Zu viele Personen in Bewegung in der Region + </floater.string> + <floater.string name="server_images_cause_msg"> + Mögliche Ursache: Zu viele Bildberechnungen + </floater.string> + <floater.string name="server_generic_cause_msg"> + Mögliche Ursache: Zu hohe Simulator-Last + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button name="client_lagmeter" tool_tip="Client-Lag-Status"/> + <text name="client"> + Client + </text> + <text name="client_text"> + Normal + </text> + <button name="network_lagmeter" tool_tip="Netzwerk-Lag-Status"/> + <text name="network"> + Netzwerk + </text> + <text name="network_text"> + Normal + </text> + <button name="server_lagmeter" tool_tip="Server-Lag-Status"/> + <text name="server"> + Server + </text> + <text name="server_text"> + Normal + </text> + <button label=">> " name="minimize" tool_tip="Fenstergröße ändern"/> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml index dad81aca4f..c64ee5565a 100755 --- a/indra/newview/skins/default/xui/en/floater_im_session.xml +++ b/indra/newview/skins/default/xui/en/floater_im_session.xml @@ -209,7 +209,7 @@ default_tab_group="3" tab_group="2" name="right_part_holder" - min_width="230"> + min_width="207"> <layout_stack animate="true" follows="all" diff --git a/indra/newview/skins/default/xui/en/floater_lagmeter.xml b/indra/newview/skins/default/xui/en/floater_lagmeter.xml new file mode 100644 index 0000000000..b24c745bdd --- /dev/null +++ b/indra/newview/skins/default/xui/en/floater_lagmeter.xml @@ -0,0 +1,336 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes" ?> +<floater + legacy_header_height="18" + height="170" + layout="topleft" + name="floater_lagmeter" + help_topic="floater_lagmeter" + save_rect="true" + title="LAG METER" + width="350"> + <floater.string + name="max_title_msg"> + Lag Meter + </floater.string> + <floater.string + name="max_width_px"> + 360 + </floater.string> + <floater.string + name="min_title_msg"> + Lag + </floater.string> + <floater.string + name="min_width_px"> + 90 + </floater.string> + <floater.string + name="client_text_msg"> + Client + </floater.string> + <floater.string + name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string + name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string + name="client_frame_time_window_bg_msg"> + Normal, window in background + </floater.string> + <floater.string + name="client_frame_time_critical_msg"> + Client frame rate below [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string + name="client_frame_time_warning_msg"> + Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string + name="client_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string + name="client_draw_distance_cause_msg"> + Possible cause: Draw distance set too high + </floater.string> + <floater.string + name="client_texture_loading_cause_msg"> + Possible cause: Images loading + </floater.string> + <floater.string + name="client_texture_memory_cause_msg"> + Possible cause: Too many images in memory + </floater.string> + <floater.string + name="client_complex_objects_cause_msg"> + Possible cause: Too many complex objects in scene + </floater.string> + <floater.string + name="network_text_msg"> + Network + </floater.string> + <floater.string + name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string + name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string + name="network_packet_loss_critical_msg"> + Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets + </floater.string> + <floater.string + name="network_packet_loss_warning_msg"> + Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets + </floater.string> + <floater.string + name="network_performance_normal_msg"> + Normal + </floater.string> + <floater.string + name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string + name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string + name="network_ping_critical_msg"> + Connection ping time is over [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string + name="network_ping_warning_msg"> + Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string + name="network_packet_loss_cause_msg"> + Possible bad connection or 'Bandwidth' pref too high. + </floater.string> + <floater.string + name="network_ping_cause_msg"> + Possible bad connection or file-sharing app. + </floater.string> + <floater.string + name="server_text_msg"> + Server + </floater.string> + <floater.string + name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string + name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string + name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string + name="server_frame_time_critical_msg"> + Simulator framerate below [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string + name="server_frame_time_warning_msg"> + Simulator framerate between [SERVER_FRAME_RATE_CRITICAL] and [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string + name="server_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string + name="server_physics_cause_msg"> + Possible Cause: Too many physical objects + </floater.string> + <floater.string + name="server_scripts_cause_msg"> + Possible Cause: Too many scripted objects + </floater.string> + <floater.string + name="server_net_cause_msg"> + Possible Cause: Too much network traffic + </floater.string> + <floater.string + name="server_agent_cause_msg"> + Possible Cause: Too many moving people in region + </floater.string> + <floater.string + name="server_images_cause_msg"> + Possible Cause: Too many image calculations + </floater.string> + <floater.string + name="server_generic_cause_msg"> + Possible Cause: Simulator load too heavy + </floater.string> + <floater.string + name="smaller_label"> + >> + </floater.string> + <floater.string + name="bigger_label"> + << + </floater.string> + <button + follows="top|left" + height="16" + image_selected="lag_status_good.tga" + image_unselected="lag_status_good.tga" + layout="topleft" + left="8" + name="client_lagmeter" + tab_stop="false" + tool_tip="Client lag status" + top="24" + width="16" /> + <text + type="string" + length="1" + follows="left|top" + font="SansSerif" + height="16" + layout="topleft" + left_pad="3" + name="client" + top_delta="0" + width="128"> + Client + </text> + <text + invisiblity_control="LagMeterShrunk" + type="string" + length="1" + bottom="40" + follows="left|top" + font="SansSerif" + height="16" + layout="topleft" + left="110" + name="client_text" + right="-10"> + Normal + </text> + <text + invisiblity_control="LagMeterShrunk" + bottom="56" + follows="left|top" + height="16" + layout="topleft" + left="40" + name="client_lag_cause" + right="-32" /> + <button + follows="top|left" + height="16" + image_selected="lag_status_good.tga" + image_unselected="lag_status_good.tga" + layout="topleft" + left="8" + name="network_lagmeter" + tab_stop="false" + tool_tip="Network lag status" + top="64" + width="16" /> + <text + type="string" + length="1" + follows="left|top" + font="SansSerif" + height="16" + layout="topleft" + left_pad="3" + name="network" + top_delta="0" + width="128"> + Network + </text> + <text + invisiblity_control="LagMeterShrunk" + type="string" + length="1" + bottom="80" + follows="left|top" + font="SansSerif" + height="16" + layout="topleft" + left="110" + name="network_text" + right="-10"> + Normal + </text> + <text + invisiblity_control="LagMeterShrunk" + bottom="96" + follows="left|top" + height="16" + layout="topleft" + left="40" + name="network_lag_cause" + right="-32" /> + <button + follows="top|left" + height="16" + image_selected="lag_status_good.tga" + image_unselected="lag_status_good.tga" + layout="topleft" + left="8" + name="server_lagmeter" + tab_stop="false" + tool_tip="Server lag status" + top="104" + width="16" /> + <text + type="string" + length="1" + follows="left|top" + font="SansSerif" + height="16" + layout="topleft" + left_pad="3" + name="server" + top_delta="0" + width="60"> + Server + </text> + <text + invisiblity_control="LagMeterShrunk" + type="string" + length="1" + bottom="120" + follows="left|top" + font="SansSerif" + height="16" + layout="topleft" + left="110" + name="server_text" + right="-10"> + Normal + </text> + <text + invisiblity_control="LagMeterShrunk" + bottom="136" + follows="left|top" + height="16" + layout="topleft" + left="40" + name="server_lag_cause" + right="-32" /> + <button + follows="left|top" + height="20" + label=">>" + layout="topleft" + left="10" + name="minimize" + tool_tip="Toggle floater size" + top_delta="24" + width="40"> + <button.commit_callback + function="LagMeter.ClickShrink" /> + </button> +</floater> diff --git a/indra/newview/skins/default/xui/en/floater_openobject.xml b/indra/newview/skins/default/xui/en/floater_openobject.xml index f526970ad0..bf6e0c4917 100755 --- a/indra/newview/skins/default/xui/en/floater_openobject.xml +++ b/indra/newview/skins/default/xui/en/floater_openobject.xml @@ -6,7 +6,7 @@ height="350" layout="topleft" min_height="160" - min_width="270" + min_width="280" name="objectcontents" help_topic="objectcontents" save_rect="true" @@ -40,10 +40,10 @@ <button follows="bottom|left" height="23" - label="Copy To Inventory" - label_selected="Copy To Inventory" + label="Copy to inventory" + label_selected="Copy to inventory" layout="topleft" - left="20" + left="15" name="copy_to_inventory_button" tab_group="1" top_pad="5" @@ -54,12 +54,12 @@ <button follows="bottom|left" height="23" - label="Copy And Wear" - label_selected="Copy And Wear" + label="Copy and add to outfit" + label_selected="Copy and add to outfit" layout="topleft" - left_pad="10" + left_pad="5" name="copy_and_wear_button" - width="120"> + width="135"> <button.commit_callback function="OpenObject.MoveAndWear" /> </button> diff --git a/indra/newview/skins/default/xui/en/floater_snapshot.xml b/indra/newview/skins/default/xui/en/floater_snapshot.xml index 771035b40d..f5d5d7e075 100755 --- a/indra/newview/skins/default/xui/en/floater_snapshot.xml +++ b/indra/newview/skins/default/xui/en/floater_snapshot.xml @@ -7,6 +7,7 @@ height="500" layout="topleft" name="Snapshot" + single_instance="true" help_topic="snapshot" save_rect="true" save_visibility="false" diff --git a/indra/newview/skins/default/xui/en/floater_stats.xml b/indra/newview/skins/default/xui/en/floater_stats.xml index bee570d5d0..c9a6e1c9c3 100755 --- a/indra/newview/skins/default/xui/en/floater_stats.xml +++ b/indra/newview/skins/default/xui/en/floater_stats.xml @@ -267,7 +267,9 @@ stat="simsimskippedsilhouettesteps" unit_label="/sec"/> <stat_bar name="simsimpctsteppedcharacters" + label="Characters Updated" stat="simsimpctsteppedcharacters" + unit_label="%" decimal_digits="1"/> </stat_view> <stat_bar name="siminpps" diff --git a/indra/newview/skins/default/xui/en/menu_conversation.xml b/indra/newview/skins/default/xui/en/menu_conversation.xml index 31b1d091ee..f5a493c064 100755 --- a/indra/newview/skins/default/xui/en/menu_conversation.xml +++ b/indra/newview/skins/default/xui/en/menu_conversation.xml @@ -17,6 +17,7 @@ layout="topleft" name="open_voice_conversation"> <on_click function="Avatar.DoToSelected" parameter="open_voice_conversation"/> + <on_enable function="Avatar.EnableItem" parameter="can_open_voice_conversation"/> </menu_item_call> <menu_item_call label="Disconnect from voice" diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml index c8fcda9858..de441983d0 100755 --- a/indra/newview/skins/default/xui/en/menu_viewer.xml +++ b/indra/newview/skins/default/xui/en/menu_viewer.xml @@ -251,8 +251,7 @@ function="Floater.Visible" parameter="nearby_chat" /> <menu_item_check.on_click - function="Floater.ToggleOrBringToFront" - parameter="nearby_chat" /> + function="Communicate.NearbyChat"/> </menu_item_check> <menu_item_check label="Speak" @@ -377,13 +376,16 @@ function="SideTray.PanelPeopleTab" parameter="nearby_panel" /> </menu_item_check> - <menu_item_call + <menu_item_check label="Block List" name="Block List"> - <menu_item_call.on_click + <menu_item_check.on_check + function="SideTray.CheckPanelPeopleTab" + parameter="blocked_panel" /> + <menu_item_check.on_click function="SideTray.PanelPeopleTab" parameter="blocked_panel" /> - </menu_item_call> + </menu_item_check> <menu_item_separator/> <menu_item_check name="Do Not Disturb" @@ -1222,7 +1224,7 @@ name="Grid Options" shortcut="control|shift|B"> <menu_item_call.on_click - function="Floater.Show" + function="Floater.Toggle" parameter="build_options" /> <menu_item_call.on_enable function="Tools.EnableToolNotPie" /> diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml index a585069faa..f5f2223330 100755 --- a/indra/newview/skins/default/xui/en/mime_types.xml +++ b/indra/newview/skins/default/xui/en/mime_types.xml @@ -101,6 +101,27 @@ true </allow_looping> </widgetset> + <widgetset name="none"> + <label name="none_label"> + No Content + </label> + <default_type> + none/none + </default_type> + <icon> + icn_media_web.tga + </icon> + <tooltip name="none_tooltip"> + No media here + </tooltip> + <playtip name="none_playtip" /> + <allow_resize> + false + </allow_resize> + <allow_looping> + false + </allow_looping> + </widgetset> <scheme name="rtsp"> <label name="rtsp_label"> Real Time Streaming diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml index e95b371d00..84aeaf3b54 100755 --- a/indra/newview/skins/default/xui/en/mime_types_linux.xml +++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml @@ -101,6 +101,27 @@ true </allow_looping> </widgetset> + <widgetset name="none"> + <label name="none_label"> + No Content + </label> + <default_type> + none/none + </default_type> + <icon> + icn_media_web.tga + </icon> + <tooltip name="none_tooltip"> + No media here + </tooltip> + <playtip name="none_playtip" /> + <allow_resize> + false + </allow_resize> + <allow_looping> + false + </allow_looping> + </widgetset> <scheme name="rtsp"> <label name="rtsp_label"> Real Time Streaming diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml index 7931e55c0a..90230f12dd 100755 --- a/indra/newview/skins/default/xui/en/mime_types_mac.xml +++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml @@ -101,6 +101,27 @@ true </allow_looping> </widgetset> + <widgetset name="none"> + <label name="none_label"> + No Content + </label> + <default_type> + none/none + </default_type> + <icon> + icn_media_web.tga + </icon> + <tooltip name="none_tooltip"> + No media here + </tooltip> + <playtip name="none_playtip" /> + <allow_resize> + false + </allow_resize> + <allow_looping> + false + </allow_looping> + </widgetset> <scheme name="rtsp"> <label name="rtsp_label"> Real Time Streaming diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml index f49f300868..d606893fc7 100755 --- a/indra/newview/skins/default/xui/en/notifications.xml +++ b/indra/newview/skins/default/xui/en/notifications.xml @@ -1389,6 +1389,14 @@ Graphics Quality can be raised in Preferences > Graphics. The region [REGION] does not allow terraforming. <tag>fail</tag> </notification> + + <notification + icon="alertmodal.tga" + name="ParcelNoTerraforming" + type="notify"> +You are not allowed to terraform parcel [PARCEL]. + <tag>fail</tag> + </notification> <notification icon="alertmodal.tga" @@ -3747,6 +3755,28 @@ Leave Group? </notification> <notification + icon="aler.tga" + name="GroupDepartError" + type="alert"> +Unable to leave group: [reason]. + <tag>reason</tag> + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + + <notification + icon="alert.tga" + name="GroupDepart" + type="alert"> +You have left the group [group_name]. + <tag>group_name</tag> + <usetemplate + name="okbutton" + yestext="OK"/> + </notification> + + <notification icon="alert.tga" name="ConfirmKick" type="alert"> @@ -5346,6 +5376,14 @@ Do you want to replace it with the selected object? </notification> <notification + icon="alertmodal.tga" + name="TooManyWearables" + type="alertmodal"> + You can't wear a folder containing more than [AMOUNT] items. You can change this limit in Advanced > Show Debug Settings > WearFolderLimit. + <tag>fail</tag> + </notification> + + <notification icon="alert.tga" label="Do Not Disturb Mode Warning" name="DoNotDisturbModePay" @@ -6950,11 +6988,11 @@ If you stay in this region you will be logged out. name="LoadWebPage" show_toast="false" type="notify"> -Load web page [URL]? +Load web page [URL] ? [MESSAGE] -From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME]? +From object: <nolink>[OBJECTNAME]</nolink>, owner: [NAME] <tag>confirm</tag> <form name="form"> <button @@ -7850,7 +7888,16 @@ You uploaded a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] second ( [EXISTENCE] seconds alive ) You locally updated a [RESOLUTION] baked texture for '[BODYREGION]' after [TIME] seconds. </notification> - + + <notification + icon="alertmodal.tga" + name="CannotUploadTexture" + type="alertmodal"> +Unable to upload texture. +[REASON] + <tag>fail</tag> + </notification> + <notification icon="alertmodal.tga" name="LivePreviewUnavailable" diff --git a/indra/newview/skins/default/xui/en/panel_place_profile.xml b/indra/newview/skins/default/xui/en/panel_place_profile.xml index 30239d6d01..0dd75b1b55 100755 --- a/indra/newview/skins/default/xui/en/panel_place_profile.xml +++ b/indra/newview/skins/default/xui/en/panel_place_profile.xml @@ -295,14 +295,14 @@ value="SampleParcel, Name Long (145, 228, 26)" width="285" /> <expandable_text - follows="left|top|right" + follows="left|top" height="50" layout="topleft" left="5" name="description" top_pad="10" value="Du waltz die spritz" - width="300" /> + width="285" /> <text follows="left|top" height="14" diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml index dd4533ae74..1e9a1aa27c 100755 --- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml +++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml @@ -106,7 +106,7 @@ width="300"> Web: </text> - <radio_group + <!-- <radio_group control_name="UseExternalBrowser" draw_border="false" follows="top|left" @@ -136,6 +136,48 @@ tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." top_delta="20" width="480" /> + </radio_group> --> + + <radio_group + control_name="PreferredBrowserBehavior" + draw_border="false" + follows="left|top" + height="60" + layout="topleft" + left_delta="50" + name="preferred_browser_behavior" + top_pad="0" + width="480"> + <radio_item + height="20" + label="Use my browser (Chrome, Firefox, IE) for all links" + layout="topleft" + left="0" + name="internal" + value="0" + tool_tip="Use the default system web browser for help, web links, etc. Not recommended if running full screen." + top="0" + width="480" /> + <radio_item + height="20" + label="Use built-in browser for Second Life links only" + layout="topleft" + left_delta="0" + name="external" + value="1" + tool_tip="Use the default system web browser for help, web links, etc. Builtin browser will be used only for LindenLab/SecondLife links." + top_delta="20" + width="480" /> + <radio_item + height="20" + label="Use built-in browser for all links" + layout="topleft" + left="0" + name="internal" + value="2" + tool_tip="Use the built-in web browser for help, web links, etc. This browser opens as a new window inside [APP_NAME]." + top_delta="20" + width="480" /> </radio_group> <check_box diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml index ba95d701ab..97bcdb40b3 100755 --- a/indra/newview/skins/default/xui/en/strings.xml +++ b/indra/newview/skins/default/xui/en/strings.xml @@ -233,6 +233,7 @@ Please try logging in again in a minute.</string> <string name="TooltipFlagNoScripts">No Scripts</string> <string name="TooltipLand">Land:</string> <string name="TooltipMustSingleDrop">Only a single item can be dragged here</string> + <string name="TooltipTooManyWearables">You can't wear a folder containing more than [AMOUNT] items. You can change this limit in Advanced > Show Debug Settings > WearFolderLimit.</string> <string name="TooltipPrice" value="L$[AMOUNT]: "/> <string name="TooltipOutboxDragToWorld">You can not rez items in your merchant outbox</string> diff --git a/indra/newview/skins/default/xui/es/floater_lagmeter.xml b/indra/newview/skins/default/xui/es/floater_lagmeter.xml new file mode 100644 index 0000000000..227689a194 --- /dev/null +++ b/indra/newview/skins/default/xui/es/floater_lagmeter.xml @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="MEDIDOR DEL LAG"> + <floater.string name="max_title_msg"> + Medidor del lag + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Lag + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + Cliente + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Normal, ventana en segundo plano + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Frames del cliente valorados por debajo de [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Frames del cliente valorados entre [CLIENT_FRAME_RATE_CRITICAL] y [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Posible causa: distancia de dibujo fijada muy alta + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Posible causa: imágenes cargándose + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Posible causa: demasiadas imágenes en la memoria + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Posible causa: demasiados objetos complejos en la escena + </floater.string> + <floater.string name="network_text_msg"> + Red + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + La conexión deja caer más del [NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + La conexión deja caer [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de los paquetes + </floater.string> + <floater.string name="network_performance_normal_msg"> + Normal + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + El tiempo de conexión -ping- supera los [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_ping_warning_msg"> + El tiempo de conexión -ping- es de [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Quizá una mala conexión o un ancho de banda fijado demasiado alto. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Quizá una mala conexión o una aplicación de archivos compartidos. + </floater.string> + <floater.string name="server_text_msg"> + Servidor + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Frecuencia (framerate) por debajo de [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Frecuencia (framerate) entre [SERVER_FRAME_RATE_CRITICAL] y [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="server_physics_cause_msg"> + Posible causa: demasiados objetos físicos + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Posible causa: demasiados objetos con script + </floater.string> + <floater.string name="server_net_cause_msg"> + Posible causa: demasiado tráfico en la red + </floater.string> + <floater.string name="server_agent_cause_msg"> + Posible causa: demasiada gente moviéndose en la región + </floater.string> + <floater.string name="server_images_cause_msg"> + Posible causa: demasiados cálculos de imáganes + </floater.string> + <floater.string name="server_generic_cause_msg"> + Posible causa: carga del simulador muy pesada + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Estado del lag del cliente"/> + <text name="client"> + Cliente + </text> + <text font="SansSerifSmall" name="client_text"> + Normal + </text> + <text left="30" name="client_lag_cause" right="-10"/> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Estado del lag de la red"/> + <text name="network"> + Red + </text> + <text font="SansSerifSmall" name="network_text"> + Normal + </text> + <text left="30" name="network_lag_cause" right="-10"/> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Estado del lag del servidor"/> + <text name="server"> + Servidor + </text> + <text font="SansSerifSmall" name="server_text"> + Normal + </text> + <text left="30" name="server_lag_cause" right="-32"/> + <button label=">>" name="minimize" tool_tip="Cambia el tamaño de la ventana"/> +</floater> diff --git a/indra/newview/skins/default/xui/fr/floater_lagmeter.xml b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml new file mode 100644 index 0000000000..39a861d8bd --- /dev/null +++ b/indra/newview/skins/default/xui/fr/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="MESURE DU LAG"> + <floater.string name="max_title_msg"> + Mesure du lag + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Lag + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + Client + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Normal, fenêtre en arrière-plan + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Taux de défilement [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Taux de défilement entre [CLIENT_FRAME_RATE_CRITICAL] et [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Cause possible : limite d'affichage trop élevée + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Cause possible : images en cours de chargement + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Cause possible : trop d'images en mémoire + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Cause possible : trop d'objets complexes + </floater.string> + <floater.string name="network_text_msg"> + Réseau + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + La connexion perd plus de [NETWORK_PACKET_LOSS_CRITICAL] % de paquets + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + La connexion perd entre [NETWORK_PACKET_LOSS_WARNING] % et [NETWORK_PACKET_LOSS_CRITICAL] % de paquets + </floater.string> + <floater.string name="network_performance_normal_msg"> + Normal + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Connexion ping > [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_ping_warning_msg"> + Connexion ping entre [NETWORK_PING_WARNING] et [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Mauvaise connexion possible ou réglage de la bande passante trop élevé. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Mauvaise connexion possible ou app. de partage des fichiers + </floater.string> + <floater.string name="server_text_msg"> + Serveur + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Défilement du simulateur < [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Défilement simulateur entre [SERVER_FRAME_RATE_CRITICAL] et [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="server_physics_cause_msg"> + Cause possible : trop d'objets physiques + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Cause possible : trop d'objets scriptés + </floater.string> + <floater.string name="server_net_cause_msg"> + Cause possible : trop de trafic réseau + </floater.string> + <floater.string name="server_agent_cause_msg"> + Cause possible : trop de personnes en mouvement + </floater.string> + <floater.string name="server_images_cause_msg"> + Cause possible : trop de calculs d'images + </floater.string> + <floater.string name="server_generic_cause_msg"> + Cause possible : charge simulateur trop lourde + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button name="client_lagmeter" tool_tip="Statut du lag client"/> + <text name="client"> + Client + </text> + <text name="client_text"> + Normal + </text> + <button name="network_lagmeter" tool_tip="Statut du lag réseau"/> + <text name="network"> + Réseau + </text> + <text name="network_text"> + Normal + </text> + <button name="server_lagmeter" tool_tip="Statut du lag serveur"/> + <text name="server"> + Serveur + </text> + <text name="server_text"> + Normal + </text> + <button label=">>" name="minimize" tool_tip="Activer/désactiver la taille du floater"/> +</floater> diff --git a/indra/newview/skins/default/xui/it/floater_lagmeter.xml b/indra/newview/skins/default/xui/it/floater_lagmeter.xml new file mode 100644 index 0000000000..f7b2b1ab4a --- /dev/null +++ b/indra/newview/skins/default/xui/it/floater_lagmeter.xml @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="MISURATORE LAG"> + <floater.string name="max_title_msg"> + Misuratore del lag + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Lag + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + Programma in locale + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Normale, finestra sullo sfondo + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Velocità dei frame al di sotto di [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Velocità dei frame tra [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + Normale + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Possibile causa: Campo visivo impostato troppo alto + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Possibile causa: Caricamento immagini + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Possibile causa: Troppe immagini in memoria + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Possibile causa: Troppi oggetti complessi intorno + </floater.string> + <floater.string name="network_text_msg"> + Network + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + La connessione sta calando al di sotto del [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + La connessione sta calando tra il [NETWORK_PACKET_LOSS_WARNING]% e il [NETWORK_PACKET_LOSS_CRITICAL]% di pacchetti + </floater.string> + <floater.string name="network_performance_normal_msg"> + Normale + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Il tempo di ping della connessione è al di sopra di [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_ping_warning_msg"> + Il tempo di ping della connessione è tra [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Possibile cattiva connessione o la larghezza di banda impostata nelle preferenze troppo alta. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Possibile cattiva connessione o l'apertura di un programma di scambio files. + </floater.string> + <floater.string name="server_text_msg"> + Server + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Velocità dei frame al di sotto di [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Velocità dei frame tra [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + Normale + </floater.string> + <floater.string name="server_physics_cause_msg"> + Possibile causa: troppi oggetti fisici + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Possibile causa: troppi oggetti scriptati + </floater.string> + <floater.string name="server_net_cause_msg"> + Possibile causa: eccessivo traffico sulla rete + </floater.string> + <floater.string name="server_agent_cause_msg"> + Possibile causa: troppi residenti in movimento nella regione + </floater.string> + <floater.string name="server_images_cause_msg"> + Possibile causa: troppe elaborazioni di immagini + </floater.string> + <floater.string name="server_generic_cause_msg"> + Possibile causa: carico eccessivo del simulatore + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Stato del lag del programma in locale"/> + <text name="client"> + Client + </text> + <text font="SansSerifSmall" left="145" name="client_text"> + Normale + </text> + <text left="30" name="client_lag_cause" right="-10"/> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Stato del lag del network"/> + <text name="network"> + Rete + </text> + <text font="SansSerifSmall" name="network_text"> + Normale + </text> + <text left="30" name="network_lag_cause" right="-10"/> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Stato del lag del server"/> + <text name="server"> + Server + </text> + <text font="SansSerifSmall" name="server_text"> + Normale + </text> + <text left="30" name="server_lag_cause" right="-32"/> + <button label=">>" name="minimize" tool_tip="Cambia dimensioni floater"/> +</floater> diff --git a/indra/newview/skins/default/xui/ja/floater_lagmeter.xml b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml new file mode 100644 index 0000000000..e3546cd837 --- /dev/null +++ b/indra/newview/skins/default/xui/ja/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="ラグメーター"> + <floater.string name="max_title_msg"> + ラグ メーター + </floater.string> + <floater.string name="max_width_px"> + 350 + </floater.string> + <floater.string name="min_title_msg"> + ラグ + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + クライアント + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + ノーマル、ウィンドウは背景に + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + クライアント フレームレート < [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + クライアント フレームレート: [CLIENT_FRAME_RATE_CRITICAL] ~ [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + ノーマル + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + 考えられる原因: 描画距離の設定が大きすぎる + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + 考えられる原因: 画像のロード中 + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + 考えられる原因: メモリ内の画像数が多すぎる + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + 考えられる原因: 画面に含まれる複雑なオブジェクトが多すぎる + </floater.string> + <floater.string name="network_text_msg"> + ネットワーク + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + 接続でドロップされるパケットの割合: > [NETWORK_PACKET_LOSS_CRITICAL] + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + 接続でドロップされるパケットの割合:[NETWORK_PACKET_LOSS_WARNING] ~ [NETWORK_PACKET_LOSS_CRITICAL] + </floater.string> + <floater.string name="network_performance_normal_msg"> + ノーマル + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + 接続の ping 時間: > [NETWORK_PING_CRITICAL] ミリ秒 + </floater.string> + <floater.string name="network_ping_warning_msg"> + 接続の ping 時間: [NETWORK_PING_WARNING] ~ [NETWORK_PING_CRITICAL] ミリ秒 + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + 接続不良になっているか、帯域幅設定が高すぎます。 + </floater.string> + <floater.string name="network_ping_cause_msg"> + 接続不良になっているか、ファイル共有アプリケーションに問題があります。 + </floater.string> + <floater.string name="server_text_msg"> + サーバー + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + シミュレーターのフレームレート: < [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + シミュレーターのフレームレート: [SERVER_FRAME_RATE_CRITICAL] ~ [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + ノーマル + </floater.string> + <floater.string name="server_physics_cause_msg"> + 考えられる原因: 物理的オブジェクトが多すぎる + </floater.string> + <floater.string name="server_scripts_cause_msg"> + 考えられる原因: スクリプトを含むオブジェクトが多すぎる + </floater.string> + <floater.string name="server_net_cause_msg"> + 考えられる原因: ネットワーク トラフィック過大 + </floater.string> + <floater.string name="server_agent_cause_msg"> + 考えられる原因: 地域内にて動いているアバターが多すぎる + </floater.string> + <floater.string name="server_images_cause_msg"> + 考えられる原因: 画像計算が多すぎる + </floater.string> + <floater.string name="server_generic_cause_msg"> + 考えられる原因: シミュレーターの過負荷 + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button name="client_lagmeter" tool_tip="クライアント ラグ ステータス"/> + <text name="client"> + クライアント + </text> + <text name="client_text"> + ノーマル + </text> + <button name="network_lagmeter" tool_tip="ネットワーク ラグ ステータス"/> + <text name="network"> + ネットワーク + </text> + <text name="network_text"> + ノーマル + </text> + <button name="server_lagmeter" tool_tip="サーバー ラグ ステータス"/> + <text name="server"> + サーバー + </text> + <text name="server_text"> + ノーマル + </text> + <button label=">> " name="minimize" tool_tip="フローターのサイズをトグル"/> +</floater> diff --git a/indra/newview/skins/default/xui/pl/floater_lagmeter.xml b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml new file mode 100644 index 0000000000..8038550bcb --- /dev/null +++ b/indra/newview/skins/default/xui/pl/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="POMIAR LAGÓW"> + <floater.string name="max_title_msg"> + Pomiar lagów + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Lag + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + Klient + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + W normie, okno w tle + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Ilość klatek na sekundę klienta poniżej [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Ilość klatek na sekundę pomiędzy [CLIENT_FRAME_RATE_CRITICAL] i [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + W normie + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Przyczyna: dystans rysowania jest za wysoki + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Przyczyna: ładowanie obrazu + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Przyczyna: za dużo obrazów w pamięci + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Przyczyna: za dużo złożonych obiektów + </floater.string> + <floater.string name="network_text_msg"> + Sieć + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + Utrata pakietów przekracza [NETWORK_PACKET_LOSS_CRITICAL]% + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + Utrata pakietów przekracza [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% + </floater.string> + <floater.string name="network_performance_normal_msg"> + W normie + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Fatalny ping - [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_ping_warning_msg"> + Wolny ping - [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Złe połączenie lub przepustowość. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Złe połączenie lub aplikacja współdzieląca pliki. + </floater.string> + <floater.string name="server_text_msg"> + Serwer + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Ilość klatek na sekundę poniżej [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Ilość klatek na sekundę pomiędzy [SERVER_FRAME_RATE_CRITICAL] i [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + W normie + </floater.string> + <floater.string name="server_physics_cause_msg"> + Przyczyna: za dużo obiektów fizycznych + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Przyczyna: za dużo obieków skryptowanych + </floater.string> + <floater.string name="server_net_cause_msg"> + Przyczyna: za duży ruch w sieci + </floater.string> + <floater.string name="server_agent_cause_msg"> + Przyczyna: za dużo poruszających się awatarów w regionie + </floater.string> + <floater.string name="server_images_cause_msg"> + Przyczyna: za dużo kalkulacji obrazu + </floater.string> + <floater.string name="server_generic_cause_msg"> + Przyczyna: symulator ładuje się zbyt powoli + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Status lagów klienta"/> + <text name="client"> + Klient + </text> + <text name="client_text"> + W normie + </text> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Network lag status"/> + <text name="network"> + Sieć + </text> + <text name="network_text"> + W normie + </text> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Server lag status"/> + <text name="server"> + Serwer + </text> + <text name="server_text"> + W normie + </text> + <button label=">>" name="minimize" tool_tip="Złącz rozmiar pliku xml"/> +</floater> diff --git a/indra/newview/skins/default/xui/pt/floater_lagmeter.xml b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml new file mode 100644 index 0000000000..9932318293 --- /dev/null +++ b/indra/newview/skins/default/xui/pt/floater_lagmeter.xml @@ -0,0 +1,154 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="LAG - Índice"> + <floater.string name="max_title_msg"> + Medidor de Atraso + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Atraso + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + Cliente + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Normal, janela por baixo + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Taxa de quadros do Cliente abaixo de [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Taxa de quadros do Cliente entre [CLIENT_FRAME_RATE_CRITICAL] e [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Causa possível: Distância de desenho ajustada muito alta + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Causa possível: Carregamento de Imagens + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Causa possível: Muitas imagens na memória + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Causa possível: Muitos objetos complexos na cena + </floater.string> + <floater.string name="network_text_msg"> + Rede + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + Conexão está caindo para cerca de [NETWORK_PACKET_LOSS_CRITICAL]% de pacotes + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + Conexão está caindo [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% de pacotes + </floater.string> + <floater.string name="network_performance_normal_msg"> + Normal + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Tempo de conexão de ping é cerca de [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_ping_warning_msg"> + Tempo de conexão de ping é [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Possível conexão ruim ou 'Largura de Banda' escolhida muito alta. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Possível conexão ruim ou aplicativos compartilhando arquivos. + </floater.string> + <floater.string name="server_text_msg"> + Servidor + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Taxa de quadros abaixo de [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Taxa de quadros entre [SERVER_FRAME_RATE_CRITICAL] e [SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="server_physics_cause_msg"> + Causa possível: Muitos objetos físicos + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Causa possível: Muitos objetos com scripts + </floater.string> + <floater.string name="server_net_cause_msg"> + Causa possível: Muito tráfego na rede + </floater.string> + <floater.string name="server_agent_cause_msg"> + Causa possível: Muitas pessoas se movendo na região + </floater.string> + <floater.string name="server_images_cause_msg"> + Causa possível: Muitos cálculos de imagem + </floater.string> + <floater.string name="server_generic_cause_msg"> + Causa possível: Carga no simulador muito pesada + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button label="" label_selected="" name="client_lagmeter" tool_tip="Status de atraso no Cliente"/> + <text name="client"> + Cliente + </text> + <text font="SansSerifSmall" name="client_text"> + Normal + </text> + <text left="30" name="client_lag_cause" right="-10"/> + <button label="" label_selected="" name="network_lagmeter" tool_tip="Status de atraso na rede"/> + <text name="network"> + Rede + </text> + <text font="SansSerifSmall" name="network_text"> + Normal + </text> + <text left="30" name="network_lag_cause" right="-10"/> + <button label="" label_selected="" name="server_lagmeter" tool_tip="Status de atraso no servidor"/> + <text name="server"> + Servidor + </text> + <text font="SansSerifSmall" name="server_text"> + Normal + </text> + <text left="30" name="server_lag_cause" right="-32"/> + <button label=">>" name="minimize" tool_tip="Alternar o tamanho da janela"/> +</floater> diff --git a/indra/newview/skins/default/xui/ru/floater_lagmeter.xml b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml new file mode 100644 index 0000000000..c420006a03 --- /dev/null +++ b/indra/newview/skins/default/xui/ru/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="УРОВЕНЬ ЛАГОВ"> + <floater.string name="max_title_msg"> + Уровень лагов + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Лаг + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + Клиент + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Нормально, окно в фоне + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Частота кадров клиента ниже [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Частота кадров клиента от [CLIENT_FRAME_RATE_CRITICAL] до [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + Нормально + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Возможная причина: дальность отрисовки слишком велика + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Возможная причина: загрузка изображений + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Возможная причина: слишком много изображений в памяти + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Возможная причина: слишком много сложных объектов в сцене + </floater.string> + <floater.string name="network_text_msg"> + Сеть + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + Сеть теряет более [NETWORK_PACKET_LOSS_CRITICAL]% пакетов + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + Сеть теряет [NETWORK_PACKET_LOSS_WARNING]–[NETWORK_PACKET_LOSS_CRITICAL]% пакетов + </floater.string> + <floater.string name="network_performance_normal_msg"> + Нормально + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Пинг соединения более [NETWORK_PING_CRITICAL] мс + </floater.string> + <floater.string name="network_ping_warning_msg"> + Пинг соединения [NETWORK_PING_WARNING]–[NETWORK_PING_CRITICAL] мс + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Возможно, плохое соединение, или параметр «Ширина канала» слишком велик. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Возможно, плохое соединение или есть работающие файлообменные программы. + </floater.string> + <floater.string name="server_text_msg"> + Сервер + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Частота кадров сервера ниже [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Частота кадров сервера [SERVER_FRAME_RATE_CRITICAL]–[SERVER_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + Нормально + </floater.string> + <floater.string name="server_physics_cause_msg"> + Возможная причина: слишком много физических объектов + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Возможная причина: слишком много скриптовых объектов + </floater.string> + <floater.string name="server_net_cause_msg"> + Возможная причина: слишком большой сетевой трафик + </floater.string> + <floater.string name="server_agent_cause_msg"> + Возможная причина: слишком много людей в регионе + </floater.string> + <floater.string name="server_images_cause_msg"> + Возможная причина: слишком много изображений + </floater.string> + <floater.string name="server_generic_cause_msg"> + Возможная причина: сервер сильно загружен + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button name="client_lagmeter" tool_tip="Уровень лагов клиента"/> + <text name="client"> + Клиент + </text> + <text name="client_text"> + Нормально + </text> + <button name="network_lagmeter" tool_tip="Уровень лагов сети"/> + <text name="network"> + Сеть + </text> + <text name="network_text"> + Нормально + </text> + <button name="server_lagmeter" tool_tip="Уровень лагов сервера"/> + <text name="server"> + Сервер + </text> + <text name="server_text"> + Нормально + </text> + <button label=">>" name="minimize" tool_tip="Переключение размера"/> +</floater> diff --git a/indra/newview/skins/default/xui/tr/floater_lagmeter.xml b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml new file mode 100644 index 0000000000..736c50be90 --- /dev/null +++ b/indra/newview/skins/default/xui/tr/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="GECİKME ÖLÇER"> + <floater.string name="max_title_msg"> + Gecikme Ölçer + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Gecikme + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + İstemci + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Normal, pencere alt zeminde + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] altında + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + İstemci kare hızı [CLIENT_FRAME_RATE_CRITICAL] ile [CLIENT_FRAME_RATE_WARNING] arasınad + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Muhtemel neden: Çizme mesafesi çok yüksek + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Muhtemel neden: Görüntüler yükleniyor + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Muhtemel neden: Bellekte çok fazla görüntü + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Muhtemel neden: Sahnede çok fazla karmaşık nesne + </floater.string> + <floater.string name="network_text_msg"> + Ağ + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + Bağlantı paketlerin % [NETWORK_PACKET_LOSS_CRITICAL]'sinden fazlasını bırakıyor + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + Bağlantı paketlerin % [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]'sini bırakıyor + </floater.string> + <floater.string name="network_performance_normal_msg"> + Normal + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Bağlantı ping süresi [NETWORK_PING_CRITICAL] ms.den fazla + </floater.string> + <floater.string name="network_ping_warning_msg"> + Bağlantı ping süresi [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Muhtemel yetersiz bağlantı veya 'Bant Genişliği' tercihi çok yüksek. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Muhtemel yetersiz bağlantı veya dosya paylaşım uygulaması. + </floater.string> + <floater.string name="server_text_msg"> + Sunucu + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] altında + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + Simülatör kare hızı [SERVER_FRAME_RATE_CRITICAL] ve [SERVER_FRAME_RATE_WARNING] arasında + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + Normal + </floater.string> + <floater.string name="server_physics_cause_msg"> + Muhtemel Neden: Çok fazla fiziki nesne + </floater.string> + <floater.string name="server_scripts_cause_msg"> + Muhtemel Neden: Çok fazla komut dosyalı nesne + </floater.string> + <floater.string name="server_net_cause_msg"> + Muhtemel Neden: Çok fazla ağ trafiği + </floater.string> + <floater.string name="server_agent_cause_msg"> + Muhtemel Neden: Bölgede hareket eden çok fazla insan var + </floater.string> + <floater.string name="server_images_cause_msg"> + Muhtemel Neden: Çok fazla görüntü hesabı + </floater.string> + <floater.string name="server_generic_cause_msg"> + Muhtemel Neden: Simülatör yükü çok ağır + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button name="client_lagmeter" tool_tip="İstemci gecikme durumu"/> + <text name="client"> + İstemci + </text> + <text name="client_text"> + Normal + </text> + <button name="network_lagmeter" tool_tip="Ağ gecikme durumu"/> + <text name="network"> + Ağ + </text> + <text name="network_text"> + Normal + </text> + <button name="server_lagmeter" tool_tip="Sunucu gecikme durumu"/> + <text name="server"> + Sunucu + </text> + <text name="server_text"> + Normal + </text> + <button label=">>" name="minimize" tool_tip="Gezdirici büyüklüğünü değiştir"/> +</floater> diff --git a/indra/newview/skins/default/xui/zh/floater_lagmeter.xml b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml new file mode 100644 index 0000000000..6e58e7332f --- /dev/null +++ b/indra/newview/skins/default/xui/zh/floater_lagmeter.xml @@ -0,0 +1,151 @@ +<?xml version="1.0" encoding="utf-8" standalone="yes"?> +<floater name="floater_lagmeter" title="LAG 測量器"> + <floater.string name="max_title_msg"> + Lag 測量器 + </floater.string> + <floater.string name="max_width_px"> + 360 + </floater.string> + <floater.string name="min_title_msg"> + Lag + </floater.string> + <floater.string name="min_width_px"> + 90 + </floater.string> + <floater.string name="client_text_msg"> + 客戶端 + </floater.string> + <floater.string name="client_frame_rate_critical_fps"> + 10 + </floater.string> + <floater.string name="client_frame_rate_warning_fps"> + 15 + </floater.string> + <floater.string name="client_frame_time_window_bg_msg"> + Normal, window in background + </floater.string> + <floater.string name="client_frame_time_critical_msg"> + Client frame rate below [CLIENT_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="client_frame_time_warning_msg"> + Client frame rate between [CLIENT_FRAME_RATE_CRITICAL] and [CLIENT_FRAME_RATE_WARNING] + </floater.string> + <floater.string name="client_frame_time_normal_msg"> + 正常 + </floater.string> + <floater.string name="client_draw_distance_cause_msg"> + Possible cause: Draw distance set too high + </floater.string> + <floater.string name="client_texture_loading_cause_msg"> + Possible cause: Images loading + </floater.string> + <floater.string name="client_texture_memory_cause_msg"> + Possible cause: Too many images in memory + </floater.string> + <floater.string name="client_complex_objects_cause_msg"> + Possible cause: Too many complex objects in scene + </floater.string> + <floater.string name="network_text_msg"> + 網路 + </floater.string> + <floater.string name="network_packet_loss_critical_pct"> + 10 + </floater.string> + <floater.string name="network_packet_loss_warning_pct"> + 5 + </floater.string> + <floater.string name="network_packet_loss_critical_msg"> + Connection is dropping over [NETWORK_PACKET_LOSS_CRITICAL]% of packets + </floater.string> + <floater.string name="network_packet_loss_warning_msg"> + Connection is dropping [NETWORK_PACKET_LOSS_WARNING]%-[NETWORK_PACKET_LOSS_CRITICAL]% of packets + </floater.string> + <floater.string name="network_performance_normal_msg"> + 正常 + </floater.string> + <floater.string name="network_ping_critical_ms"> + 600 + </floater.string> + <floater.string name="network_ping_warning_ms"> + 300 + </floater.string> + <floater.string name="network_ping_critical_msg"> + Connection ping time is over [NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_ping_warning_msg"> + Connection ping time is [NETWORK_PING_WARNING]-[NETWORK_PING_CRITICAL] ms + </floater.string> + <floater.string name="network_packet_loss_cause_msg"> + Possible bad connection or 'Bandwidth' pref too high. + </floater.string> + <floater.string name="network_ping_cause_msg"> + Possible bad connection or file-sharing app. + </floater.string> + <floater.string name="server_text_msg"> + 伺服器 + </floater.string> + <floater.string name="server_frame_rate_critical_fps"> + 20 + </floater.string> + <floater.string name="server_frame_rate_warning_fps"> + 30 + </floater.string> + <floater.string name="server_single_process_max_time_ms"> + 20 + </floater.string> + <floater.string name="server_frame_time_critical_msg"> + 模擬器 framerate 低於 [SERVER_FRAME_RATE_CRITICAL] + </floater.string> + <floater.string name="server_frame_time_warning_msg"> + 模擬器 framerate 介於 [SERVER_FRAME_RATE_CRITICAL] 與 [SERVER_FRAME_RATE_WARNING] 之間 + </floater.string> + <floater.string name="server_frame_time_normal_msg"> + 正常 + </floater.string> + <floater.string name="server_physics_cause_msg"> + 可能原因:太多物理物件 + </floater.string> + <floater.string name="server_scripts_cause_msg"> + 可能原因:太多腳本物件 + </floater.string> + <floater.string name="server_net_cause_msg"> + 可能原因:太多網路流量 + </floater.string> + <floater.string name="server_agent_cause_msg"> + 可能原因:地區有太多移動的人 + </floater.string> + <floater.string name="server_images_cause_msg"> + 可能原因:太多圖像計算 + </floater.string> + <floater.string name="server_generic_cause_msg"> + 可能原因:模擬器負載過重 + </floater.string> + <floater.string name="smaller_label"> + >> + </floater.string> + <floater.string name="bigger_label"> + << + </floater.string> + <button name="client_lagmeter" tool_tip="客戶端 lag 狀態"/> + <text name="client"> + 客戶端 + </text> + <text name="client_text"> + 正常 + </text> + <button name="network_lagmeter" tool_tip="網路 lag 狀態"/> + <text name="network"> + 網路 + </text> + <text name="network_text"> + 正常 + </text> + <button name="server_lagmeter" tool_tip="伺服器 lag 狀態"/> + <text name="server"> + 伺服器 + </text> + <text name="server_text"> + 正常 + </text> + <button label=">>" name="minimize" tool_tip="切換浮動視窗尺寸"/> +</floater> |