summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt9
-rw-r--r--indra/newview/app_settings/settings.xml44
-rw-r--r--indra/newview/llagent.cpp61
-rw-r--r--indra/newview/llagent.h9
-rw-r--r--indra/newview/llappviewer.cpp3
-rw-r--r--indra/newview/llavatarlist.cpp17
-rw-r--r--indra/newview/llavatarlist.h5
-rw-r--r--indra/newview/llavatarlistitem.cpp99
-rw-r--r--indra/newview/llavatarlistitem.h28
-rw-r--r--indra/newview/llbottomtray.cpp16
-rw-r--r--indra/newview/llbottomtray.h8
-rw-r--r--indra/newview/llcallingcard.h2
-rw-r--r--indra/newview/llchatbar.cpp8
-rw-r--r--indra/newview/llchathistory.cpp2
-rw-r--r--indra/newview/llcofwearables.cpp19
-rw-r--r--indra/newview/llexpandabletextbox.cpp1
-rw-r--r--indra/newview/llfloatersidetraytab.cpp45
-rw-r--r--indra/newview/llfloatersidetraytab.h47
-rw-r--r--indra/newview/llgroupmgr.cpp4
-rw-r--r--indra/newview/llimpanel.cpp2
-rw-r--r--indra/newview/llinventorypanel.cpp21
-rw-r--r--indra/newview/llnearbychat.cpp6
-rw-r--r--indra/newview/llnotificationhandlerutil.cpp2
-rw-r--r--indra/newview/lloutfitslist.cpp57
-rw-r--r--indra/newview/lloutfitslist.h7
-rw-r--r--indra/newview/llpanelappearancetab.cpp51
-rw-r--r--indra/newview/llpanelappearancetab.h8
-rw-r--r--indra/newview/llpanelgroup.cpp14
-rw-r--r--indra/newview/llpanelgroup.h2
-rw-r--r--indra/newview/llpanellandmarks.cpp46
-rw-r--r--indra/newview/llpanellandmarks.h4
-rw-r--r--indra/newview/llpanelpeople.cpp10
-rw-r--r--indra/newview/llpanelplaceprofile.cpp10
-rw-r--r--indra/newview/llpanelwearing.cpp40
-rw-r--r--indra/newview/llpanelwearing.h4
-rw-r--r--indra/newview/llsidepanelappearance.cpp2
-rw-r--r--indra/newview/llsidepaneliteminfo.cpp69
-rw-r--r--indra/newview/llsidepaneliteminfo.h5
-rw-r--r--indra/newview/llsidetray.cpp70
-rw-r--r--indra/newview/llsidetray.h13
-rw-r--r--indra/newview/lltoastnotifypanel.cpp8
-rw-r--r--indra/newview/lltoastnotifypanel.h4
-rw-r--r--indra/newview/lltoolpie.cpp19
-rw-r--r--indra/newview/lltranslate.cpp123
-rw-r--r--indra/newview/lltranslate.h124
-rw-r--r--indra/newview/llviewerdisplay.cpp13
-rw-r--r--indra/newview/llviewerfloaterreg.cpp3
-rw-r--r--indra/newview/llviewermenu.cpp10
-rw-r--r--indra/newview/llviewermessage.cpp93
-rw-r--r--indra/newview/llvoavatar.cpp2
-rw-r--r--indra/newview/llvocache.cpp3
-rw-r--r--indra/newview/llvoicevivox.cpp37
-rw-r--r--indra/newview/llvoicevivox.h5
-rw-r--r--indra/newview/llvosky.h6
-rw-r--r--indra/newview/skins/default/textures/icons/Generic_Group_Large.pngbin7061 -> 7507 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Generic_Person_Large.pngbin1630 -> 51508 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml7
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_chat.xml23
-rw-r--r--indra/newview/skins/default/xui/da/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/da/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/de/panel_preferences_chat.xml23
-rw-r--r--indra/newview/skins/default/xui/de/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/en/floater_day_cycle_options.xml24
-rw-r--r--indra/newview/skins/default/xui/en/floater_nearby_chat.xml16
-rw-r--r--indra/newview/skins/default/xui/en/floater_side_bar_tab.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml8
-rw-r--r--indra/newview/skins/default/xui/en/menu_viewer.xml18
-rw-r--r--indra/newview/skins/default/xui/en/menu_wearing_gear.xml10
-rw-r--r--indra/newview/skins/default/xui/en/panel_avatar_list_item.xml48
-rw-r--r--indra/newview/skins/default/xui/en/panel_edit_profile.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml26
-rw-r--r--indra/newview/skins/default/xui/en/panel_landmark_info.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_me.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml75
-rw-r--r--indra/newview/skins/default/xui/en/panel_notes.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_picks.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_chat.xml120
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml24
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile_view.xml2
-rw-r--r--indra/newview/skins/default/xui/en/sidepanel_item_info.xml653
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml2
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_chat.xml23
-rw-r--r--indra/newview/skins/default/xui/es/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/es/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml18
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_chat.xml23
-rw-r--r--indra/newview/skins/default/xui/fr/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_chat.xml23
-rw-r--r--indra/newview/skins/default/xui/it/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/it/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/ja/panel_preferences_chat.xml23
-rw-r--r--indra/newview/skins/default/xui/ja/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/nl/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/nl/strings.xml3
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_chat.xml23
-rw-r--r--indra/newview/skins/default/xui/pl/panel_preferences_general.xml2
-rw-r--r--indra/newview/skins/default/xui/pl/strings.xml6
-rw-r--r--indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml4
-rw-r--r--indra/newview/skins/default/xui/pt/panel_preferences_chat.xml23
-rw-r--r--indra/newview/skins/default/xui/pt/strings.xml3
-rw-r--r--indra/newview/viewer_manifest.py1
105 files changed, 1967 insertions, 654 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index 88dfb1a081..382bbaeba1 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -13,6 +13,7 @@ include(ELFIO)
include(FMOD)
include(OPENAL)
include(FindOpenGL)
+include(JsonCpp)
include(LLAudio)
include(LLCharacter)
include(LLCommon)
@@ -44,6 +45,7 @@ include(CMakeCopyIfDifferent)
include_directories(
${DBUSGLIB_INCLUDE_DIRS}
${ELFIO_INCLUDE_DIR}
+ ${JSONCPP_INCLUDE_DIRS}
${LLAUDIO_INCLUDE_DIRS}
${LLCHARACTER_INCLUDE_DIRS}
${LLCOMMON_INCLUDE_DIRS}
@@ -204,6 +206,7 @@ set(viewer_SOURCE_FILES
llfloatersearch.cpp
llfloatersellland.cpp
llfloatersettingsdebug.cpp
+ llfloatersidetraytab.cpp
llfloatersnapshot.cpp
llfloatertelehub.cpp
llfloatertestinspectors.cpp
@@ -309,6 +312,7 @@ set(viewer_SOURCE_FILES
lloutfitslist.cpp
lloutfitobserver.cpp
lloutputmonitorctrl.cpp
+ llpanelappearancetab.cpp
llpanelavatar.cpp
llpanelavatartag.cpp
llpanelblockedlist.cpp
@@ -457,6 +461,7 @@ set(viewer_SOURCE_FILES
lltracker.cpp
lltransientdockablefloater.cpp
lltransientfloatermgr.cpp
+ lltranslate.cpp
lluilistener.cpp
lluploaddialog.cpp
llurl.cpp
@@ -729,6 +734,7 @@ set(viewer_HEADER_FILES
llfloatersearch.h
llfloatersellland.h
llfloatersettingsdebug.h
+ llfloatersidetraytab.h
llfloatersnapshot.h
llfloatertelehub.h
llfloatertestinspectors.h
@@ -981,6 +987,7 @@ set(viewer_HEADER_FILES
lltracker.h
lltransientdockablefloater.h
lltransientfloatermgr.h
+ lltranslate.h
lluiconstants.h
lluilistener.h
lluploaddialog.h
@@ -1478,6 +1485,7 @@ if (WINDOWS)
${GOOGLE_PERF_TOOLS_SOURCE}
${CMAKE_CURRENT_SOURCE_DIR}/licenses-win32.txt
${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
+ ${CMAKE_CURRENT_SOURCE_DIR}/featuretable_xp.txt
${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll
${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll
${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll
@@ -1650,6 +1658,7 @@ target_link_libraries(${VIEWER_BINARY_NAME}
${OPENGL_LIBRARIES}
${FMODWRAPPER_LIBRARY} # must come after LLAudio
${OPENGL_LIBRARIES}
+ ${JSONCPP_LIBRARIES}
${SDL_LIBRARY}
${SMARTHEAP_LIBRARY}
${UI_LIBRARIES}
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index e76874e3cb..916657b97d 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -2688,6 +2688,17 @@
<key>Value</key>
<integer>0</integer>
</map>
+ <key>DoubleClickTeleport</key>
+ <map>
+ <key>Comment</key>
+ <string>Enable double-click to teleport where allowed</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>DragAndDropToolTipDelay</key>
<map>
<key>Comment</key>
@@ -8923,6 +8934,17 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>FriendsListShowPermissions</key>
+ <map>
+ <key>Comment</key>
+ <string>Show/hide permission icons in the friend list</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>1</integer>
+ </map>
<key>NearbyListShowIcons</key>
<map>
<key>Comment</key>
@@ -9880,6 +9902,28 @@
<key>Value</key>
<integer>1</integer>
</map>
+ <key>TranslateLanguage</key>
+ <map>
+ <key>Comment</key>
+ <string>Translate Language specifier</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>String</string>
+ <key>Value</key>
+ <string>default</string>
+ </map>
+ <key>TranslateChat</key>
+ <map>
+ <key>Comment</key>
+ <string>Translate incoming chat messages</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>Boolean</string>
+ <key>Value</key>
+ <integer>0</integer>
+ </map>
<key>TutorialURL</key>
<map>
<key>Comment</key>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index fe7e883d83..b202cb5098 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -167,6 +167,7 @@ LLAgent::LLAgent() :
mbAlwaysRun(false),
mbRunning(false),
+ mbTeleportKeepsLookAt(false),
mAgentAccess(gSavedSettings),
mTeleportState( TELEPORT_NONE ),
@@ -3249,7 +3250,11 @@ bool LLAgent::teleportCore(bool is_local)
// local logic
LLViewerStats::getInstance()->incStat(LLViewerStats::ST_TELEPORT_COUNT);
- if (!is_local)
+ if (is_local)
+ {
+ gAgent.setTeleportState( LLAgent::TELEPORT_LOCAL );
+ }
+ else
{
gTeleportDisplay = TRUE;
gAgent.setTeleportState( LLAgent::TELEPORT_START );
@@ -3268,13 +3273,15 @@ bool LLAgent::teleportCore(bool is_local)
void LLAgent::teleportRequest(
const U64& region_handle,
- const LLVector3& pos_local)
+ const LLVector3& pos_local,
+ bool look_at_from_camera)
{
LLViewerRegion* regionp = getRegion();
- if(regionp && teleportCore())
+ bool is_local = (region_handle == to_region_handle(getPositionGlobal()));
+ if(regionp && teleportCore(is_local))
{
- llinfos << "TeleportRequest: '" << region_handle << "':" << pos_local
- << llendl;
+ LL_INFOS("") << "TeleportLocationRequest: '" << region_handle << "':"
+ << pos_local << LL_ENDL;
LLMessageSystem* msg = gMessageSystem;
msg->newMessage("TeleportLocationRequest");
msg->nextBlockFast(_PREHASH_AgentData);
@@ -3284,6 +3291,10 @@ void LLAgent::teleportRequest(
msg->addU64("RegionHandle", region_handle);
msg->addVector3("Position", pos_local);
LLVector3 look_at(0,1,0);
+ if (look_at_from_camera)
+ {
+ look_at = LLViewerCamera::getInstance()->getAtAxis();
+ }
msg->addVector3("LookAt", look_at);
sendReliableMessage();
}
@@ -3395,6 +3406,16 @@ void LLAgent::teleportViaLocation(const LLVector3d& pos_global)
}
}
+// Teleport to global position, but keep facing in the same direction
+void LLAgent::teleportViaLocationLookAt(const LLVector3d& pos_global)
+{
+ mbTeleportKeepsLookAt = true;
+ 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());
+}
+
void LLAgent::setTeleportState(ETeleportState state)
{
mTeleportState = state;
@@ -3402,18 +3423,28 @@ void LLAgent::setTeleportState(ETeleportState state)
{
LLFloaterReg::hideInstance("snapshot");
}
- if (mTeleportState == TELEPORT_MOVING)
- {
- // We're outa here. Save "back" slurl.
- LLAgentUI::buildSLURL(mTeleportSourceSLURL);
- }
- else if(mTeleportState == TELEPORT_ARRIVING)
+
+ switch (mTeleportState)
{
- // First two position updates after a teleport tend to be weird
- LLViewerStats::getInstance()->mAgentPositionSnaps.mCountOfNextUpdatesToIgnore = 2;
+ case TELEPORT_NONE:
+ mbTeleportKeepsLookAt = false;
+ break;
+
+ case TELEPORT_MOVING:
+ // We're outa here. Save "back" slurl.
+ LLAgentUI::buildSLURL(mTeleportSourceSLURL);
+ break;
- // Let the interested parties know we've teleported.
- LLViewerParcelMgr::getInstance()->onTeleportFinished(false, getPositionGlobal());
+ case TELEPORT_ARRIVING:
+ // First two position updates after a teleport tend to be weird
+ LLViewerStats::getInstance()->mAgentPositionSnaps.mCountOfNextUpdatesToIgnore = 2;
+
+ // Let the interested parties know we've teleported.
+ LLViewerParcelMgr::getInstance()->onTeleportFinished(false, getPositionGlobal());
+ break;
+
+ default:
+ break;
}
}
diff --git a/indra/newview/llagent.h b/indra/newview/llagent.h
index c643cef78f..30685461b9 100644
--- a/indra/newview/llagent.h
+++ b/indra/newview/llagent.h
@@ -339,6 +339,7 @@ public:
private:
bool mbAlwaysRun; // Should the avatar run by default rather than walk?
bool mbRunning; // Is the avatar trying to run right now?
+ bool mbTeleportKeepsLookAt; // Try to keep look-at after teleport is complete
//--------------------------------------------------------------------
// Sit and stand
@@ -506,7 +507,8 @@ public:
TELEPORT_REQUESTED = 2, // Waiting for source simulator to respond
TELEPORT_MOVING = 3, // Viewer has received destination location from source simulator
TELEPORT_START_ARRIVAL = 4, // Transition to ARRIVING. Viewer has received avatar update, etc., from destination simulator
- TELEPORT_ARRIVING = 5 // Make the user wait while content "pre-caches"
+ TELEPORT_ARRIVING = 5, // Make the user wait while content "pre-caches"
+ TELEPORT_LOCAL = 6 // Teleporting in-sim without showing the progress screen
};
public:
@@ -524,12 +526,15 @@ private:
//--------------------------------------------------------------------
public:
void teleportRequest(const U64& region_handle,
- const LLVector3& pos_local); // Go to a named location home
+ const LLVector3& pos_local, // Go to a named location home
+ bool look_at_from_camera = false);
void teleportViaLandmark(const LLUUID& landmark_id); // Teleport to a landmark
void teleportHome() { teleportViaLandmark(LLUUID::null); } // Go home
void teleportViaLure(const LLUUID& lure_id, BOOL godlike); // To an invited location
void teleportViaLocation(const LLVector3d& pos_global); // To a global location - this will probably need to be deprecated
+ void teleportViaLocationLookAt(const LLVector3d& pos_global);// To a global location, preserving camera rotation
void teleportCancel(); // May or may not be allowed by server
+ bool getTeleportKeepsLookAt() { return mbTeleportKeepsLookAt; } // Whether look-at reset after teleport
protected:
bool teleportCore(bool is_local = false); // Stuff for all teleports; returns true if the teleport can proceed
diff --git a/indra/newview/llappviewer.cpp b/indra/newview/llappviewer.cpp
index fd6b8b739d..92a9b83bc5 100644
--- a/indra/newview/llappviewer.cpp
+++ b/indra/newview/llappviewer.cpp
@@ -928,8 +928,9 @@ bool LLAppViewer::init()
//EXT-7013 - On windows for some locale (Japanese) standard
//datetime formatting functions didn't support some parameters such as "weekday".
+ //Names for days and months localized in xml are also useful for Polish locale(STORM-107).
std::string language = LLControlGroup::getInstance(sGlobalSettingsName)->getString("Language");
- if(language == "ja")
+ if(language == "ja" || language == "pl")
{
LLStringOps::setupWeekDaysNames(LLTrans::getString("dateTimeWeekdaysNames"));
LLStringOps::setupWeekDaysShortNames(LLTrans::getString("dateTimeWeekdaysShortNames"));
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 1cd705c2f9..5241f20c0e 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -90,6 +90,20 @@ void LLAvatarList::setSpeakingIndicatorsVisible(bool visible)
}
}
+void LLAvatarList::showPermissions(bool visible)
+{
+ // Save the value for new items to use.
+ mShowPermissions = visible;
+
+ // Enable or disable showing permissions icons for all existing items.
+ std::vector<LLPanel*> items;
+ getItems(items);
+ for(std::vector<LLPanel*>::const_iterator it = items.begin(), end_it = items.end(); it != end_it; ++it)
+ {
+ static_cast<LLAvatarListItem*>(*it)->setShowPermissions(mShowPermissions);
+ }
+}
+
static bool findInsensitive(std::string haystack, const std::string& needle_upper)
{
LLStringUtil::toUpper(haystack);
@@ -107,6 +121,7 @@ LLAvatarList::Params::Params()
, show_info_btn("show_info_btn", true)
, show_profile_btn("show_profile_btn", true)
, show_speaking_indicator("show_speaking_indicator", true)
+, show_permissions_granted("show_permissions_granted", false)
{
}
@@ -121,6 +136,7 @@ LLAvatarList::LLAvatarList(const Params& p)
, mShowInfoBtn(p.show_info_btn)
, mShowProfileBtn(p.show_profile_btn)
, mShowSpeakingIndicator(p.show_speaking_indicator)
+, mShowPermissions(p.show_permissions_granted)
{
setCommitOnSelectionChange(true);
@@ -377,6 +393,7 @@ void LLAvatarList::addNewItem(const LLUUID& id, const std::string& name, BOOL is
item->setShowInfoBtn(mShowInfoBtn);
item->setShowProfileBtn(mShowProfileBtn);
item->showSpeakingIndicator(mShowSpeakingIndicator);
+ item->setShowPermissions(mShowPermissions);
item->setDoubleClickCallback(boost::bind(&LLAvatarList::onItemDoubleClicked, this, _1, _2, _3, _4));
diff --git a/indra/newview/llavatarlist.h b/indra/newview/llavatarlist.h
index 83faa53c28..9d3dcb75f3 100644
--- a/indra/newview/llavatarlist.h
+++ b/indra/newview/llavatarlist.h
@@ -54,7 +54,8 @@ public:
show_last_interaction_time, // show most recent interaction time. *HACK: move this to a derived class
show_info_btn,
show_profile_btn,
- show_speaking_indicator;
+ show_speaking_indicator,
+ show_permissions_granted;
Params();
};
@@ -78,6 +79,7 @@ public:
void toggleIcons();
void setSpeakingIndicatorsVisible(bool visible);
+ void showPermissions(bool visible);
void sortByName();
void setShowIcons(std::string param_name);
bool getIconsVisible() const { return mShowIcons; }
@@ -115,6 +117,7 @@ private:
bool mShowInfoBtn;
bool mShowProfileBtn;
bool mShowSpeakingIndicator;
+ bool mShowPermissions;
LLTimer* mLITUpdateTimer; // last interaction time update timer
std::string mIconParamName;
diff --git a/indra/newview/llavatarlistitem.cpp b/indra/newview/llavatarlistitem.cpp
index 341913edf7..8fc4ad6763 100644
--- a/indra/newview/llavatarlistitem.cpp
+++ b/indra/newview/llavatarlistitem.cpp
@@ -60,12 +60,17 @@ LLAvatarListItem::LLAvatarListItem(bool not_from_ui_factory/* = true*/)
mAvatarIcon(NULL),
mAvatarName(NULL),
mLastInteractionTime(NULL),
+ mIconPermissionOnline(NULL),
+ mIconPermissionMap(NULL),
+ mIconPermissionEditMine(NULL),
+ mIconPermissionEditTheirs(NULL),
mSpeakingIndicator(NULL),
mInfoBtn(NULL),
mProfileBtn(NULL),
mOnlineStatus(E_UNKNOWN),
mShowInfoBtn(true),
- mShowProfileBtn(true)
+ mShowProfileBtn(true),
+ mShowPermissions(false)
{
if (not_from_ui_factory)
{
@@ -86,7 +91,16 @@ BOOL LLAvatarListItem::postBuild()
mAvatarIcon = getChild<LLAvatarIconCtrl>("avatar_icon");
mAvatarName = getChild<LLTextBox>("avatar_name");
mLastInteractionTime = getChild<LLTextBox>("last_interaction");
-
+
+ mIconPermissionOnline = getChild<LLIconCtrl>("permission_online_icon");
+ mIconPermissionMap = getChild<LLIconCtrl>("permission_map_icon");
+ mIconPermissionEditMine = getChild<LLIconCtrl>("permission_edit_mine_icon");
+ mIconPermissionEditTheirs = getChild<LLIconCtrl>("permission_edit_theirs_icon");
+ mIconPermissionOnline->setVisible(false);
+ mIconPermissionMap->setVisible(false);
+ mIconPermissionEditMine->setVisible(false);
+ mIconPermissionEditTheirs->setVisible(false);
+
mSpeakingIndicator = getChild<LLOutputMonitorCtrl>("speaking_indicator");
mInfoBtn = getChild<LLButton>("info_btn");
mProfileBtn = getChild<LLButton>("profile_btn");
@@ -125,8 +139,10 @@ void LLAvatarListItem::onMouseEnter(S32 x, S32 y, MASK mask)
mInfoBtn->setVisible(mShowInfoBtn);
mProfileBtn->setVisible(mShowProfileBtn);
+ mHovered = true;
LLPanel::onMouseEnter(x, y, mask);
+ showPermissions(mShowPermissions);
updateChildren();
}
@@ -136,8 +152,10 @@ void LLAvatarListItem::onMouseLeave(S32 x, S32 y, MASK mask)
mInfoBtn->setVisible(false);
mProfileBtn->setVisible(false);
+ mHovered = false;
LLPanel::onMouseLeave(x, y, mask);
+ showPermissions(false);
updateChildren();
}
@@ -146,6 +164,12 @@ void LLAvatarListItem::changed(U32 mask)
{
// no need to check mAvatarId for null in this case
setOnline(LLAvatarTracker::instance().isBuddyOnline(mAvatarId));
+
+ if (mask & LLFriendObserver::POWERS)
+ {
+ showPermissions(mShowPermissions && mHovered);
+ updateChildren();
+ }
}
void LLAvatarListItem::setOnline(bool online)
@@ -230,10 +254,7 @@ void LLAvatarListItem::setAvatarId(const LLUUID& id, const LLUUID& session_id, b
void LLAvatarListItem::showLastInteractionTime(bool show)
{
- if (show)
- return;
-
- mLastInteractionTime->setVisible(false);
+ mLastInteractionTime->setVisible(show);
updateChildren();
}
@@ -244,17 +265,11 @@ void LLAvatarListItem::setLastInteractionTime(U32 secs_since)
void LLAvatarListItem::setShowInfoBtn(bool show)
{
- // Already done? Then do nothing.
- if(mShowInfoBtn == show)
- return;
mShowInfoBtn = show;
}
void LLAvatarListItem::setShowProfileBtn(bool show)
{
- // Already done? Then do nothing.
- if(mShowProfileBtn == show)
- return;
mShowProfileBtn = show;
}
@@ -273,7 +288,9 @@ void LLAvatarListItem::setAvatarIconVisible(bool visible)
{
// Already done? Then do nothing.
if (mAvatarIcon->getVisible() == (BOOL)visible)
+ {
return;
+ }
// Show/hide avatar icon.
mAvatarIcon->setVisible(visible);
@@ -322,7 +339,7 @@ const std::string LLAvatarListItem::getAvatarName() const
return mAvatarName->getValue();
}
-//== PRIVATE SECITON ==========================================================
+//== PRIVATE SECTION ==========================================================
void LLAvatarListItem::setNameInternal(const std::string& name, const std::string& highlight)
{
@@ -432,10 +449,22 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
//info btn width + padding
S32 info_btn_width = avatar_item->mProfileBtn->getRect().mLeft - avatar_item->mInfoBtn->getRect().mLeft;
+ // edit their objects permission icon width + padding
+ S32 permission_edit_theirs_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mIconPermissionEditTheirs->getRect().mLeft;
+
+ // edit my objects permission icon width + padding
+ S32 permission_edit_mine_width = avatar_item->mIconPermissionEditTheirs->getRect().mLeft - avatar_item->mIconPermissionEditMine->getRect().mLeft;
+
+ // map permission icon width + padding
+ S32 permission_map_width = avatar_item->mIconPermissionEditMine->getRect().mLeft - avatar_item->mIconPermissionMap->getRect().mLeft;
+
+ // online permission icon width + padding
+ S32 permission_online_width = avatar_item->mIconPermissionMap->getRect().mLeft - avatar_item->mIconPermissionOnline->getRect().mLeft;
+
// last interaction time textbox width + padding
- S32 last_interaction_time_width = avatar_item->mInfoBtn->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
+ S32 last_interaction_time_width = avatar_item->mIconPermissionOnline->getRect().mLeft - avatar_item->mLastInteractionTime->getRect().mLeft;
- // icon width + padding
+ // avatar icon width + padding
S32 icon_width = avatar_item->mAvatarName->getRect().mLeft - avatar_item->mAvatarIcon->getRect().mLeft;
sLeftPadding = avatar_item->mAvatarIcon->getRect().mLeft;
@@ -445,9 +474,14 @@ void LLAvatarListItem::initChildrenWidths(LLAvatarListItem* avatar_item)
sChildrenWidths[--index] = icon_width;
sChildrenWidths[--index] = 0; // for avatar name we don't need its width, it will be calculated as "left available space"
sChildrenWidths[--index] = last_interaction_time_width;
+ sChildrenWidths[--index] = permission_online_width;
+ sChildrenWidths[--index] = permission_map_width;
+ sChildrenWidths[--index] = permission_edit_mine_width;
+ sChildrenWidths[--index] = permission_edit_theirs_width;
sChildrenWidths[--index] = info_btn_width;
sChildrenWidths[--index] = profile_btn_width;
sChildrenWidths[--index] = speaking_indicator_width;
+ llassert(index == 0);
}
void LLAvatarListItem::updateChildren()
@@ -526,6 +560,27 @@ void LLAvatarListItem::updateChildren()
LL_DEBUGS("AvatarItemReshape") << "name rect after: " << name_view_rect << LL_ENDL;
}
+bool LLAvatarListItem::showPermissions(bool visible)
+{
+ const LLRelationship* relation = LLAvatarTracker::instance().getBuddyInfo(getAvatarId());
+ if(relation && visible)
+ {
+ mIconPermissionOnline->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_ONLINE_STATUS));
+ mIconPermissionMap->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_MAP_LOCATION));
+ mIconPermissionEditMine->setVisible(relation->isRightGrantedTo(LLRelationship::GRANT_MODIFY_OBJECTS));
+ mIconPermissionEditTheirs->setVisible(relation->isRightGrantedFrom(LLRelationship::GRANT_MODIFY_OBJECTS));
+ }
+ else
+ {
+ mIconPermissionOnline->setVisible(false);
+ mIconPermissionMap->setVisible(false);
+ mIconPermissionEditMine->setVisible(false);
+ mIconPermissionEditTheirs->setVisible(false);
+ }
+
+ return NULL != relation;
+}
+
LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_index)
{
LLView* child_view = mAvatarName;
@@ -542,7 +597,19 @@ LLView* LLAvatarListItem::getItemChildView(EAvatarListItemChildIndex child_view_
child_view = mLastInteractionTime;
break;
case ALIC_SPEAKER_INDICATOR:
- child_view = mSpeakingIndicator;
+ child_view = mSpeakingIndicator;
+ break;
+ case ALIC_PERMISSION_ONLINE:
+ child_view = mIconPermissionOnline;
+ break;
+ case ALIC_PERMISSION_MAP:
+ child_view = mIconPermissionMap;
+ break;
+ case ALIC_PERMISSION_EDIT_MINE:
+ child_view = mIconPermissionEditMine;
+ break;
+ case ALIC_PERMISSION_EDIT_THEIRS:
+ child_view = mIconPermissionEditTheirs;
break;
case ALIC_INFO_BUTTON:
child_view = mInfoBtn;
diff --git a/indra/newview/llavatarlistitem.h b/indra/newview/llavatarlistitem.h
index e252e69ea9..ffb988b2ab 100644
--- a/indra/newview/llavatarlistitem.h
+++ b/indra/newview/llavatarlistitem.h
@@ -36,6 +36,7 @@
#include "llcallingcard.h" // for LLFriendObserver
class LLAvatarIconCtrl;
+class LLIconCtrl;
class LLAvatarListItem : public LLPanel, public LLFriendObserver
{
@@ -94,6 +95,7 @@ public:
void setShowProfileBtn(bool show);
void setShowInfoBtn(bool show);
void showSpeakingIndicator(bool show);
+ void setShowPermissions(bool show) { mShowPermissions = show; };
void showLastInteractionTime(bool show);
void setAvatarIconVisible(bool visible);
@@ -113,6 +115,15 @@ protected:
LLAvatarIconCtrl* mAvatarIcon;
+ /// Indicator for permission to see me online.
+ LLIconCtrl* mIconPermissionOnline;
+ /// Indicator for permission to see my position on the map.
+ LLIconCtrl* mIconPermissionMap;
+ /// Indicator for permission to edit my objects.
+ LLIconCtrl* mIconPermissionEditMine;
+ /// Indicator for permission to edit their objects.
+ LLIconCtrl* mIconPermissionEditTheirs;
+
private:
typedef enum e_online_status {
@@ -132,6 +143,10 @@ private:
ALIC_SPEAKER_INDICATOR,
ALIC_PROFILE_BUTTON,
ALIC_INFO_BUTTON,
+ ALIC_PERMISSION_EDIT_THEIRS,
+ ALIC_PERMISSION_EDIT_MINE,
+ ALIC_PERMISSION_MAP,
+ ALIC_PERMISSION_ONLINE,
ALIC_INTERACTION_TIME,
ALIC_NAME,
ALIC_ICON,
@@ -159,6 +174,13 @@ private:
void updateChildren();
/**
+ * Update visibility of active permissions icons.
+ *
+ * Need to call updateChildren() afterwards to sort out their layout.
+ */
+ bool showPermissions(bool visible);
+
+ /**
* Gets child view specified by index.
*
* This method implemented via switch by all EAvatarListItemChildIndex values.
@@ -181,6 +203,12 @@ private:
bool mShowInfoBtn;
bool mShowProfileBtn;
+ /// indicates whether to show icons representing permissions granted
+ bool mShowPermissions;
+
+ /// true when the mouse pointer is hovering over this item
+ bool mHovered;
+
static bool sStaticInitialized; // this variable is introduced to improve code readability
static S32 sLeftPadding; // padding to first left visible child (icon or name)
static S32 sRightNamePadding; // right padding from name to next visible child
diff --git a/indra/newview/llbottomtray.cpp b/indra/newview/llbottomtray.cpp
index f3ade83d00..29f4311ea4 100644
--- a/indra/newview/llbottomtray.cpp
+++ b/indra/newview/llbottomtray.cpp
@@ -67,7 +67,7 @@ BOOL LLBottomtrayButton::handleHover(S32 x, S32 y, MASK mask)
S32 screenX, screenY;
localPointToScreen(x, y, &screenX, &screenY);
// pass hover to bottomtray
- LLBottomTray::getInstance()->handleHover(screenX, screenY, mask);
+ LLBottomTray::getInstance()->onDraggableButtonHover(screenX, screenY);
return FALSE;
}
//virtual
@@ -76,7 +76,7 @@ BOOL LLBottomtrayButton::handleMouseUp(S32 x, S32 y, MASK mask)
S32 screenX, screenY;
localPointToScreen(x, y, &screenX, &screenY);
// pass mouse up to bottomtray
- LLBottomTray::getInstance()->onDraggableButtonMouseUp(this,screenX, screenY, mask);
+ LLBottomTray::getInstance()->onDraggableButtonMouseUp(this, screenX, screenY);
LLButton::handleMouseUp(x, y, mask);
return FALSE;
}
@@ -86,7 +86,7 @@ BOOL LLBottomtrayButton::handleMouseDown(S32 x, S32 y, MASK mask)
S32 screenX, screenY;
localPointToScreen(x, y, &screenX, &screenY);
// pass mouse up to bottomtray
- LLBottomTray::getInstance()->onDraggableButtonMouseDown(this,screenX, screenY, mask);
+ LLBottomTray::getInstance()->onDraggableButtonMouseDown(this, screenX, screenY);
LLButton::handleMouseDown(x, y, mask);
return FALSE;
}
@@ -561,7 +561,7 @@ BOOL LLBottomTray::postBuild()
//Drag-n-drop
-void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
+void LLBottomTray::onDraggableButtonMouseDown(LLUICtrl* ctrl, S32 x, S32 y)
{
if (ctrl == NULL) return;
LLView* parent_view = ctrl->getParent();
@@ -607,7 +607,7 @@ LLPanel* LLBottomTray::findChildPanelByLocalCoords(S32 x, S32 y)
return ctrl;
}
-BOOL LLBottomTray::handleHover(S32 x, S32 y, MASK mask)
+void LLBottomTray::onDraggableButtonHover(S32 x, S32 y)
{
// if mouse down on draggable item was done, check whether we should start DnD
if (mCheckForDrag)
@@ -634,8 +634,6 @@ BOOL LLBottomTray::handleHover(S32 x, S32 y, MASK mask)
gViewerWindow->getWindow()->setCursor(UI_CURSOR_NO);
}
}
-
- return TRUE;
}
bool LLBottomTray::isCursorOverDraggableArea(S32 x, S32 y)
@@ -767,7 +765,7 @@ void LLBottomTray::loadButtonsOrder()
mToolbarStack->movePanel(mNearbyChatBar, NULL, true);
}
-void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y, MASK mask)
+void LLBottomTray::onDraggableButtonMouseUp(LLUICtrl* ctrl, S32 x, S32 y)
{
//if mouse up happened over area where drop is possible, change order of buttons
if (mLandingTab != NULL && mDraggedItem != NULL && mDragStarted)
@@ -1526,7 +1524,7 @@ void LLBottomTray::setButtonsControlsAndListeners()
// set control name for Build button. It is not enough to link it with Button.SetFloaterToggle in xml
std::string vis_control_name = LLFloaterReg::declareVisibilityControl("build");
// Set the button control value (toggle state) to the floater visibility control (Sets the value as well)
- build_btn->setControlVariable(LLUI::sSettingGroups["floater"]->getControl(vis_control_name));
+ build_btn->setControlVariable(LLFloater::getControlGroup()->getControl(vis_control_name));
}
bool LLBottomTray::toggleShowButton(LLBottomTray::EResizeState button_type, const LLSD& new_visibility)
diff --git a/indra/newview/llbottomtray.h b/indra/newview/llbottomtray.h
index 14a29895f5..1197c5a10a 100644
--- a/indra/newview/llbottomtray.h
+++ b/indra/newview/llbottomtray.h
@@ -131,10 +131,12 @@ public:
/**
* These three methods handle drag'n'drop, they may be called directly from child buttons.
+ * handleHover and other virtual handle* couldn't be used here, because we should call LLPanel::handle*,
+ * but x and y here are often outside of bottomtray.
*/
- /*virtual*/ BOOL handleHover(S32 x, S32 y, MASK mask);
- void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y, MASK mask);
- void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y, MASK mask);
+ void onDraggableButtonHover(S32 x, S32 y);
+ void onDraggableButtonMouseDown(LLUICtrl* button, S32 x, S32 y);
+ void onDraggableButtonMouseUp(LLUICtrl* button, S32 x, S32 y);
private:
diff --git a/indra/newview/llcallingcard.h b/indra/newview/llcallingcard.h
index 617f8fe27b..15ca51743a 100644
--- a/indra/newview/llcallingcard.h
+++ b/indra/newview/llcallingcard.h
@@ -45,7 +45,7 @@ class LLFriendObserver
public:
// This enumeration is a way to refer to what changed in a more
// human readable format. You can mask the value provided by
- // chaged() to see if the observer is interested in the change.
+ // changed() to see if the observer is interested in the change.
enum
{
NONE = 0,
diff --git a/indra/newview/llchatbar.cpp b/indra/newview/llchatbar.cpp
index 7d82ec3a71..d251931eca 100644
--- a/indra/newview/llchatbar.cpp
+++ b/indra/newview/llchatbar.cpp
@@ -126,7 +126,7 @@ BOOL LLChatBar::postBuild()
mInputEditor->setPassDelete(TRUE);
mInputEditor->setReplaceNewlinesWithSpaces(FALSE);
- mInputEditor->setMaxTextLength(1023);
+ mInputEditor->setMaxTextLength(DB_CHAT_MSG_STR_LEN);
mInputEditor->setEnableLineHistory(TRUE);
mIsBuilt = TRUE;
@@ -569,8 +569,12 @@ void LLChatBar::sendChatFromViewer(const LLWString &wtext, EChatType type, BOOL
S32 channel = 0;
LLWString out_text = stripChannelNumber(wtext, &channel);
std::string utf8_out_text = wstring_to_utf8str(out_text);
- std::string utf8_text = wstring_to_utf8str(wtext);
+ if (!utf8_out_text.empty())
+ {
+ utf8_out_text = utf8str_truncate(utf8_out_text, MAX_MSG_STR_LEN);
+ }
+ std::string utf8_text = wstring_to_utf8str(wtext);
utf8_text = utf8str_trim(utf8_text);
if (!utf8_text.empty())
{
diff --git a/indra/newview/llchathistory.cpp b/indra/newview/llchathistory.cpp
index 1f67a659bd..dfb1db523d 100644
--- a/indra/newview/llchathistory.cpp
+++ b/indra/newview/llchathistory.cpp
@@ -760,7 +760,7 @@ void LLChatHistory::appendMessage(const LLChat& chat, const LLSD &args, const LL
if (notification != NULL)
{
LLIMToastNotifyPanel* notify_box = new LLIMToastNotifyPanel(
- notification, chat.mSessionID);
+ notification, chat.mSessionID, LLRect::null, !use_plain_text_chat_history);
//we can't set follows in xml since it broke toasts behavior
notify_box->setFollowsLeft();
notify_box->setFollowsRight();
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index b1e11e1a2a..84c560639e 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -397,12 +397,20 @@ void LLCOFWearables::refresh()
mCOFVersion = catp->getVersion();
+ // Save current scrollbar position.
+ typedef std::map<LLFlatListView*, LLRect> scroll_pos_map_t;
+ scroll_pos_map_t saved_scroll_pos;
+
+ saved_scroll_pos[mAttachments] = mAttachments->getVisibleContentRect();
+ saved_scroll_pos[mClothing] = mClothing->getVisibleContentRect();
+ saved_scroll_pos[mBodyParts] = mBodyParts->getVisibleContentRect();
+
+ // Save current selection.
typedef std::vector<LLSD> values_vector_t;
typedef std::map<LLFlatListView*, values_vector_t> selection_map_t;
selection_map_t preserve_selection;
- // Save current selection
mAttachments->getSelectedValues(preserve_selection[mAttachments]);
mClothing->getSelectedValues(preserve_selection[mClothing]);
mBodyParts->getSelectedValues(preserve_selection[mBodyParts]);
@@ -450,6 +458,15 @@ void LLCOFWearables::refresh()
list->setCommitOnSelectionChange(true);
}
+
+ // Restore previous scrollbar position.
+ for (scroll_pos_map_t::const_iterator it = saved_scroll_pos.begin(); it != saved_scroll_pos.end(); ++it)
+ {
+ LLFlatListView* list = it->first;
+ LLRect scroll_pos = it->second;
+
+ list->scrollToShowRect(scroll_pos);
+ }
}
diff --git a/indra/newview/llexpandabletextbox.cpp b/indra/newview/llexpandabletextbox.cpp
index f0c2469977..5e10f60aba 100644
--- a/indra/newview/llexpandabletextbox.cpp
+++ b/indra/newview/llexpandabletextbox.cpp
@@ -121,7 +121,6 @@ LLExpandableTextBox::LLTextBoxEx::LLTextBoxEx(const Params& p)
void LLExpandableTextBox::LLTextBoxEx::reshape(S32 width, S32 height, BOOL called_from_parent)
{
- hideExpandText();
LLTextEditor::reshape(width, height, called_from_parent);
if (getTextPixelHeight() > getRect().getHeight())
diff --git a/indra/newview/llfloatersidetraytab.cpp b/indra/newview/llfloatersidetraytab.cpp
new file mode 100644
index 0000000000..f13b4db3a0
--- /dev/null
+++ b/indra/newview/llfloatersidetraytab.cpp
@@ -0,0 +1,45 @@
+/**
+ * @file llfloatersidetraytab.cpp
+ * @brief LLFloaterSideTrayTab class definition
+ *
+ * $LicenseInfo:firstyear=2010&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 "llfloatersidetraytab.h"
+
+// newview includes
+#include "lltransientfloatermgr.h"
+
+LLFloaterSideTrayTab::LLFloaterSideTrayTab(const LLSD& key, const Params& params)
+: LLFloater(key, params)
+{
+ // Prevent transient floaters (e.g. IM windows) from hiding
+ // when this floater is clicked.
+ LLTransientFloaterMgr::getInstance()->addControlView(LLTransientFloaterMgr::GLOBAL, this);
+}
+
+LLFloaterSideTrayTab::~LLFloaterSideTrayTab()
+{
+ LLTransientFloaterMgr::getInstance()->removeControlView(LLTransientFloaterMgr::GLOBAL, this);
+}
diff --git a/indra/newview/llfloatersidetraytab.h b/indra/newview/llfloatersidetraytab.h
new file mode 100644
index 0000000000..e47f82e8ba
--- /dev/null
+++ b/indra/newview/llfloatersidetraytab.h
@@ -0,0 +1,47 @@
+/**
+ * @file llfloatersidetraytab.h
+ * @brief LLFloaterSideTrayTab class definition
+ *
+ * $LicenseInfo:firstyear=2010&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 LL_LLFLOATERSIDETRAYTAB_H
+#define LL_LLFLOATERSIDETRAYTAB_H
+
+#include "llfloater.h"
+
+/**
+ * When a side tray tab gets detached, it's wrapped in an instance of this class.
+ *
+ * This class helps to make sure that clicking a detached side tray tab doesn't
+ * make transient floaters (e.g. IM windows) hide, so that it's possible to
+ * drag an inventory item from detached My Inventory window to a docked IM window,
+ * i.e. share the item (see VWR-22891).
+ */
+class LLFloaterSideTrayTab : public LLFloater
+{
+public:
+ LLFloaterSideTrayTab(const LLSD& key, const Params& params = getDefaultParams());
+ ~LLFloaterSideTrayTab();
+};
+
+#endif // LL_LLFLOATERSIDETRAYTAB_H
diff --git a/indra/newview/llgroupmgr.cpp b/indra/newview/llgroupmgr.cpp
index 85e45d012b..7546c070ea 100644
--- a/indra/newview/llgroupmgr.cpp
+++ b/indra/newview/llgroupmgr.cpp
@@ -1175,8 +1175,8 @@ void LLGroupMgr::processGroupRoleMembersReply(LLMessageSystem* msg, void** data)
}
else
{
- if (!rd) llwarns << "Received role data for unkown role " << role_id << " in group " << group_id << llendl;
- if (!md) llwarns << "Received role data for unkown member " << member_id << " in group " << group_id << llendl;
+ if (!rd) llwarns << "Received role data for unknown role " << role_id << " in group " << group_id << llendl;
+ if (!md) llwarns << "Received role data for unknown member " << member_id << " in group " << group_id << llendl;
}
}
}
diff --git a/indra/newview/llimpanel.cpp b/indra/newview/llimpanel.cpp
index 5f7d1a2ffa..b3b0c93b99 100644
--- a/indra/newview/llimpanel.cpp
+++ b/indra/newview/llimpanel.cpp
@@ -168,7 +168,7 @@ LLFloaterIMPanel::LLFloaterIMPanel(const std::string& session_label,
LLUICtrlFactory::getInstance()->buildFloater(this, xml_filename, NULL);
setTitle(mSessionLabel);
- mInputEditor->setMaxTextLength(1023);
+ mInputEditor->setMaxTextLength(DB_IM_MSG_STR_LEN);
// enable line history support for instant message bar
mInputEditor->setEnableLineHistory(TRUE);
diff --git a/indra/newview/llinventorypanel.cpp b/indra/newview/llinventorypanel.cpp
index 820520df9e..50adae09c0 100644
--- a/indra/newview/llinventorypanel.cpp
+++ b/indra/newview/llinventorypanel.cpp
@@ -916,6 +916,8 @@ BOOL is_inventorysp_active()
// static
LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
{
+ S32 z_min = S32_MAX;
+ LLInventoryPanel* res = NULL;
// A. If the inventory side panel is open, use that preferably.
if (is_inventorysp_active())
{
@@ -925,11 +927,26 @@ LLInventoryPanel* LLInventoryPanel::getActiveInventoryPanel(BOOL auto_open)
return inventorySP->getActivePanel();
}
}
+ // or if it is in floater undocked from sidetray get it and remember z order of floater to later compare it
+ // with other inventory floaters order.
+ else if (!LLSideTray::getInstance()->isTabAttached("sidebar_inventory"))
+ {
+ LLSidepanelInventory *inventorySP =
+ dynamic_cast<LLSidepanelInventory *>(LLSideTray::getInstance()->getPanel("sidepanel_inventory"));
+ LLFloater* inv_floater = LLFloaterReg::findInstance("side_bar_tab", LLSD("sidebar_inventory"));
+ if (inventorySP && inv_floater)
+ {
+ res = inventorySP->getActivePanel();
+ z_min = gFloaterView->getZOrder(inv_floater);
+ }
+ else
+ {
+ llwarns << "Inventory tab is detached from sidetray, but either panel or floater were not found!" << llendl;
+ }
+ }
// B. Iterate through the inventory floaters and return whichever is on top.
LLFloaterReg::const_instance_list_t& inst_list = LLFloaterReg::getFloaterList("inventory");
- S32 z_min = S32_MAX;
- LLInventoryPanel* res = NULL;
for (LLFloaterReg::const_instance_list_t::const_iterator iter = inst_list.begin(); iter != inst_list.end(); ++iter)
{
LLFloaterInventory* iv = dynamic_cast<LLFloaterInventory*>(*iter);
diff --git a/indra/newview/llnearbychat.cpp b/indra/newview/llnearbychat.cpp
index 5f71d7100b..28aea7ae3d 100644
--- a/indra/newview/llnearbychat.cpp
+++ b/indra/newview/llnearbychat.cpp
@@ -115,7 +115,7 @@ void LLNearbyChat::applySavedVariables()
{
if (mRectControl.size() > 1)
{
- const LLRect& rect = LLUI::sSettingGroups["floater"]->getRect(mRectControl);
+ const LLRect& rect = LLFloater::getControlGroup()->getRect(mRectControl);
if(!rect.isEmpty() && rect.isValid())
{
reshape(rect.getWidth(), rect.getHeight());
@@ -124,7 +124,7 @@ void LLNearbyChat::applySavedVariables()
}
- if(!LLUI::sSettingGroups["floater"]->controlExists(mDocStateControl))
+ if(!LLFloater::getControlGroup()->controlExists(mDocStateControl))
{
setDocked(true);
}
@@ -132,7 +132,7 @@ void LLNearbyChat::applySavedVariables()
{
if (mDocStateControl.size() > 1)
{
- bool dockState = LLUI::sSettingGroups["floater"]->getBOOL(mDocStateControl);
+ bool dockState = LLFloater::getControlGroup()->getBOOL(mDocStateControl);
setDocked(dockState);
}
}
diff --git a/indra/newview/llnotificationhandlerutil.cpp b/indra/newview/llnotificationhandlerutil.cpp
index b5683296eb..4231a73af1 100644
--- a/indra/newview/llnotificationhandlerutil.cpp
+++ b/indra/newview/llnotificationhandlerutil.cpp
@@ -353,7 +353,7 @@ void LLHandlerUtil::logGroupNoticeToIMGroup(
if (!gAgent.getGroupData(payload["group_id"].asUUID(), groupData))
{
llwarns
- << "Group notice for unkown group: "
+ << "Group notice for unknown group: "
<< payload["group_id"].asUUID() << llendl;
return;
}
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index a0ef43ea80..c0f7fa4abf 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -85,7 +85,7 @@ public:
registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenu::onAdd, this));
- enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitsList::isActionEnabled, mOutfitList, _2));
+ enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitListGearMenu::onEnable, this, _2));
enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2));
mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
@@ -155,27 +155,11 @@ private:
void onTakeOff()
{
- // Take off selected items if there are any
- if (mOutfitList->hasItemSelected())
- {
- uuid_vec_t selected_uuids;
- mOutfitList->getSelectedItemsUUIDs(selected_uuids);
-
- for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it)
- {
- if (get_is_item_worn(*it))
- {
- LLAppearanceMgr::instance().removeItemFromAvatar(*it);
- }
- }
- }
- else // or take off the whole selected outfit if no items specified.
+ // Take off selected outfit.
+ const LLUUID& selected_outfit_id = getSelectedOutfitID();
+ if (selected_outfit_id.notNull())
{
- const LLUUID& selected_outfit_id = getSelectedOutfitID();
- if (selected_outfit_id.notNull())
- {
- LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id);
- }
+ LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id);
}
}
@@ -209,6 +193,20 @@ private:
LLAgentWearables::createWearable(type, true);
}
+ bool onEnable(LLSD::String param)
+ {
+ // Handle the "Wear - Replace Current Outfit" menu option specially
+ // because LLOutfitList::isActionEnabled() checks whether it's allowed
+ // to wear selected outfit OR selected items, while we're only
+ // interested in the outfit (STORM-183).
+ if ("wear" == param)
+ {
+ return LLAppearanceMgr::instance().getCanReplaceCOF(mOutfitList->getSelectedOutfitUUID());
+ }
+
+ return mOutfitList->isActionEnabled(param);
+ }
+
bool onVisible(LLSD::String param)
{
const LLUUID& selected_outfit_id = getSelectedOutfitID();
@@ -972,23 +970,6 @@ void LLOutfitsList::applyFilterToTab(
}
}
-bool LLOutfitsList::canTakeOffSelected()
-{
- uuid_vec_t selected_uuids;
- getSelectedItemsUUIDs(selected_uuids);
-
- LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false);
-
- for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it)
- {
- LLViewerInventoryItem* item = gInventory.getItem(*it);
- if (!item) continue;
-
- if (is_worn(NULL, item)) return true;
- }
- return false;
-}
-
bool LLOutfitsList::canWearSelected()
{
uuid_vec_t selected_items;
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 37b909c93e..faf6f7ce1e 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -98,7 +98,7 @@ public:
const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; }
- void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;
+ /*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;
boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb);
@@ -174,11 +174,6 @@ private:
void applyFilterToTab(const LLUUID& category_id, LLAccordionCtrlTab* tab, const std::string& filter_substring);
/**
- * Returns true if there are any items that can be taken off among currently selected, otherwise false.
- */
- bool canTakeOffSelected();
-
- /**
* Returns true if all selected items can be worn.
*/
bool canWearSelected();
diff --git a/indra/newview/llpanelappearancetab.cpp b/indra/newview/llpanelappearancetab.cpp
new file mode 100644
index 0000000000..9910a3a2ac
--- /dev/null
+++ b/indra/newview/llpanelappearancetab.cpp
@@ -0,0 +1,51 @@
+/**
+ * @file llpanelappearancetab.h
+ * @brief Tabs interface for Side Bar "My Appearance" panel
+ *
+ * $LicenseInfo:firstyear=2010&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 "llpanelappearancetab.h"
+
+
+#include "llinventoryfunctions.h"
+#include "llinventorymodel.h"
+
+//virtual
+bool LLPanelAppearanceTab::canTakeOffSelected()
+{
+ uuid_vec_t selected_uuids;
+ getSelectedItemsUUIDs(selected_uuids);
+
+ LLFindWearablesEx is_worn(/*is_worn=*/ true, /*include_body_parts=*/ false);
+
+ for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it)
+ {
+ LLViewerInventoryItem* item = gInventory.getItem(*it);
+ if (!item) continue;
+
+ if (is_worn(NULL, item)) return true;
+ }
+ return false;
+}
diff --git a/indra/newview/llpanelappearancetab.h b/indra/newview/llpanelappearancetab.h
index fa929aac0a..81366c5db4 100644
--- a/indra/newview/llpanelappearancetab.h
+++ b/indra/newview/llpanelappearancetab.h
@@ -41,9 +41,17 @@ public:
virtual void showGearMenu(LLView* spawning_view) = 0;
+ virtual void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const {}
+
static const std::string& getFilterSubString() { return sFilterSubString; }
protected:
+
+ /**
+ * Returns true if there are any items that can be taken off among currently selected, otherwise false.
+ */
+ bool canTakeOffSelected();
+
static std::string sFilterSubString;
};
diff --git a/indra/newview/llpanelgroup.cpp b/indra/newview/llpanelgroup.cpp
index e42057e93a..62ed7acb15 100644
--- a/indra/newview/llpanelgroup.cpp
+++ b/indra/newview/llpanelgroup.cpp
@@ -112,6 +112,7 @@ void LLPanelGroup::onOpen(const LLSD& key)
if(!key.has("action"))
{
setGroupID(group_id);
+ getChild<LLAccordionCtrl>("groups_accordion")->expandDefaultTab();
return;
}
@@ -176,11 +177,6 @@ BOOL LLPanelGroup::postBuild()
LLPanelGroupTab* panel_notices = findChild<LLPanelGroupTab>("group_notices_tab_panel");
LLPanelGroupTab* panel_land = findChild<LLPanelGroupTab>("group_land_tab_panel");
- if (LLAccordionCtrl* accordion_ctrl = getChild<LLAccordionCtrl>("groups_accordion"))
- {
- setVisibleCallback(boost::bind(&LLPanelGroup::onVisibilityChange, this, _2, accordion_ctrl));
- }
-
if(panel_general) mTabs.push_back(panel_general);
if(panel_roles) mTabs.push_back(panel_roles);
if(panel_notices) mTabs.push_back(panel_notices);
@@ -304,14 +300,6 @@ void LLPanelGroup::onBtnCancel()
onBackBtnClick();
}
-void LLPanelGroup::onVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl)
-{
- if (in_visible_chain.asBoolean() && accordion_ctrl != NULL)
- {
- accordion_ctrl->expandDefaultTab();
- }
-}
-
void LLPanelGroup::changed(LLGroupChange gc)
{
for(std::vector<LLPanelGroupTab* >::iterator it = mTabs.begin();it!=mTabs.end();++it)
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 86875d2da3..b494c7d403 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -36,7 +36,6 @@ class LLOfferInfo;
const S32 UPDATE_MEMBERS_PER_FRAME = 500;
// Forward declares
-class LLAccordionCtrl;
class LLPanelGroupTab;
class LLTabContainer;
class LLAgent;
@@ -97,7 +96,6 @@ protected:
void onBackBtnClick();
void onBtnJoin();
void onBtnCancel();
- void onVisibilityChange(const LLSD &in_visible_chain, LLAccordionCtrl* accordion_ctrl);
static void onBtnApply(void*);
static void onBtnRefresh(void*);
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index ff15e3f08e..24bf67a000 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -965,12 +965,32 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
|| "expand" == command_name
)
{
- return canSelectedBeModified(command_name);
+ if (!root_folder_view) return false;
+
+ std::set<LLUUID> selected_uuids = root_folder_view->getSelectionList();
+
+ // Allow to execute the command only if it can be applied to all selected items.
+ for (std::set<LLUUID>::const_iterator iter = selected_uuids.begin(); iter != selected_uuids.end(); ++iter)
+ {
+ LLFolderViewItem* item = root_folder_view->getItemByID(*iter);
+
+ // If no item is found it might be a folder id.
+ if (!item)
+ {
+ item = root_folder_view->getFolderByID(*iter);
+ }
+ if (!item) return false;
+
+ if (!canItemBeModified(command_name, item)) return false;
+ }
+
+ return true;
}
else if ( "teleport" == command_name
|| "more_info" == command_name
|| "show_on_map" == command_name
|| "copy_slurl" == command_name
+ || "rename" == command_name
)
{
// disable some commands for multi-selection. EXT-1757
@@ -994,13 +1014,16 @@ bool LLLandmarksPanel::isActionEnabled(const LLSD& userdata) const
// Disable "Show on Map" if landmark loading is in progress.
return !gLandmarkList.isAssetInLoadedCallbackMap(asset_uuid);
}
+ else if ("rename" == command_name)
+ {
+ LLFolderViewItem* selected_item = getCurSelectedItem();
+ if (!selected_item) return false;
+
+ return canItemBeModified(command_name, selected_item);
+ }
return true;
}
- else if ("rename" == command_name)
- {
- return root_folder_view && root_folder_view->getSelectedCount() == 1 && canSelectedBeModified(command_name);
- }
else if("category" == command_name)
{
// we can add folder only in Landmarks Accordion
@@ -1065,12 +1088,11 @@ Rules:
4. We can not paste folders from Clipboard (processed by LLFolderView::canPaste())
5. Check LLFolderView/Inventory Bridges rules
*/
-bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) const
+bool LLLandmarksPanel::canItemBeModified(const std::string& command_name, LLFolderViewItem* item) const
{
// validate own rules first
- LLFolderViewItem* selected = getCurSelectedItem();
- if (!selected) return false;
+ if (!item) return false;
// nothing can be modified in Library
if (mLibraryInventoryPanel == mCurrentSelectedList) return false;
@@ -1078,7 +1100,7 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
bool can_be_modified = false;
// landmarks can be modified in any other accordion...
- if (isLandmarkSelected())
+ if (item->getListener()->getInventoryType() == LLInventoryType::IT_LANDMARK)
{
can_be_modified = true;
@@ -1107,16 +1129,16 @@ bool LLLandmarksPanel::canSelectedBeModified(const std::string& command_name) co
}
else if ("collapse" == command_name)
{
- return selected->isOpen();
+ return item->isOpen();
}
else if ("expand" == command_name)
{
- return !selected->isOpen();
+ return !item->isOpen();
}
if (can_be_modified)
{
- LLFolderViewEventListener* listenerp = selected->getListener();
+ LLFolderViewEventListener* listenerp = item->getListener();
if ("cut" == command_name)
{
diff --git a/indra/newview/llpanellandmarks.h b/indra/newview/llpanellandmarks.h
index 2b398decce..0d4402d8cb 100644
--- a/indra/newview/llpanellandmarks.h
+++ b/indra/newview/llpanellandmarks.h
@@ -127,12 +127,12 @@ private:
void onCustomAction(const LLSD& command_name);
/**
- * Determines if selected item can be modified via context/gear menu.
+ * Determines if an item can be modified via context/gear menu.
*
* It validates Places Landmarks rules first. And then LLFolderView permissions.
* For now it checks cut/rename/delete/paste actions.
*/
- bool canSelectedBeModified(const std::string& command_name) const;
+ bool canItemBeModified(const std::string& command_name, LLFolderViewItem* item) const;
void onPickPanelExit( LLPanelPickEdit* pick_panel, LLView* owner, const LLSD& params);
/**
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index 06ba08b51c..d096b17145 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -522,8 +522,10 @@ BOOL LLPanelPeople::postBuild()
mAllFriendList = friends_tab->getChild<LLAvatarList>("avatars_all");
mOnlineFriendList->setNoItemsCommentText(getString("no_friends_online"));
mOnlineFriendList->setShowIcons("FriendsListShowIcons");
+ mOnlineFriendList->showPermissions("FriendsListShowPermissions");
mAllFriendList->setNoItemsCommentText(getString("no_friends"));
mAllFriendList->setShowIcons("FriendsListShowIcons");
+ mAllFriendList->showPermissions("FriendsListShowPermissions");
LLPanel* nearby_tab = getChild<LLPanel>(NEARBY_TAB_NAME);
nearby_tab->setVisibleCallback(boost::bind(&Updater::setActive, mNearbyListUpdater, _2));
@@ -1205,6 +1207,14 @@ void LLPanelPeople::onFriendsViewSortMenuItemClicked(const LLSD& userdata)
mAllFriendList->toggleIcons();
mOnlineFriendList->toggleIcons();
}
+ else if (chosen_item == "view_permissions")
+ {
+ bool show_permissions = !gSavedSettings.getBOOL("FriendsListShowPermissions");
+ gSavedSettings.setBOOL("FriendsListShowPermissions", show_permissions);
+
+ mAllFriendList->showPermissions(show_permissions);
+ mOnlineFriendList->showPermissions(show_permissions);
+ }
}
void LLPanelPeople::onGroupsViewSortMenuItemClicked(const LLSD& userdata)
diff --git a/indra/newview/llpanelplaceprofile.cpp b/indra/newview/llpanelplaceprofile.cpp
index ee30c928c2..801db1e741 100644
--- a/indra/newview/llpanelplaceprofile.cpp
+++ b/indra/newview/llpanelplaceprofile.cpp
@@ -230,6 +230,11 @@ void LLPanelPlaceProfile::setInfoType(EInfoType type)
break;
}
+ if (mAccordionCtrl != NULL)
+ {
+ mAccordionCtrl->expandDefaultTab();
+ }
+
LLPanelPlaceInfo::setInfoType(type);
}
@@ -274,11 +279,6 @@ void LLPanelPlaceProfile::handleVisibilityChange(BOOL new_visibility)
parcel_mgr->deselectUnused();
}
}
-
- if (mAccordionCtrl != NULL)
- {
- mAccordionCtrl->expandDefaultTab();
- }
}
void LLPanelPlaceProfile::displaySelectedParcelInfo(LLParcel* parcel,
diff --git a/indra/newview/llpanelwearing.cpp b/indra/newview/llpanelwearing.cpp
index a6bc34c62e..860470cd73 100644
--- a/indra/newview/llpanelwearing.cpp
+++ b/indra/newview/llpanelwearing.cpp
@@ -29,6 +29,7 @@
#include "llpanelwearing.h"
#include "llappearancemgr.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
#include "llinventoryobserver.h"
#include "llsidetray.h"
@@ -46,12 +47,16 @@ static void edit_outfit()
class LLWearingGearMenu
{
public:
- LLWearingGearMenu()
- : mMenu(NULL)
+ LLWearingGearMenu(LLPanelWearing* panel_wearing)
+ : mMenu(NULL), mPanelWearing(panel_wearing)
{
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
+ LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
registrar.add("Gear.Edit", boost::bind(&edit_outfit));
+ registrar.add("Gear.TakeOff", boost::bind(&LLWearingGearMenu::onTakeOff, this));
+
+ enable_registrar.add("Gear.OnEnable", boost::bind(&LLPanelWearing::isActionEnabled, mPanelWearing, _2));
mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
"menu_wearing_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
@@ -70,7 +75,20 @@ public:
}
private:
+
+ void onTakeOff()
+ {
+ uuid_vec_t selected_uuids;
+ mPanelWearing->getSelectedItemsUUIDs(selected_uuids);
+
+ for (uuid_vec_t::const_iterator it=selected_uuids.begin(); it != selected_uuids.end(); ++it)
+ {
+ LLAppearanceMgr::instance().removeItemFromAvatar(*it);
+ }
+ }
+
LLMenuGL* mMenu;
+ LLPanelWearing* mPanelWearing;
};
//////////////////////////////////////////////////////////////////////////
@@ -150,7 +168,7 @@ LLPanelWearing::LLPanelWearing()
{
mCategoriesObserver = new LLInventoryCategoriesObserver();
- mGearMenu = new LLWearingGearMenu();
+ mGearMenu = new LLWearingGearMenu(this);
mContextMenu = new LLWearingContextMenu();
}
@@ -226,6 +244,12 @@ bool LLPanelWearing::isActionEnabled(const LLSD& userdata)
// allow save only if outfit isn't locked and is dirty
return !outfit_locked && outfit_dirty;
}
+
+ if (command_name == "take_off")
+ {
+ return hasItemSelected() && canTakeOffSelected();
+ }
+
return false;
}
@@ -255,4 +279,14 @@ void LLPanelWearing::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y)
mContextMenu->show(ctrl, selected_uuids, x, y);
}
+bool LLPanelWearing::hasItemSelected()
+{
+ return mCOFItemsList->getSelectedItem() != NULL;
+}
+
+void LLPanelWearing::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
+{
+ mCOFItemsList->getSelectedUUIDs(selected_uuids);
+}
+
// EOF
diff --git a/indra/newview/llpanelwearing.h b/indra/newview/llpanelwearing.h
index 6ae8efef99..1fa97735b1 100644
--- a/indra/newview/llpanelwearing.h
+++ b/indra/newview/llpanelwearing.h
@@ -60,8 +60,12 @@ public:
/*virtual*/ void showGearMenu(LLView* spawning_view);
+ /*virtual*/ void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;
+
boost::signals2::connection setSelectionChangeCallback(commit_callback_t cb);
+ bool hasItemSelected();
+
private:
void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index 7206e4fcaf..a3c6a7b6f1 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -286,6 +286,8 @@ void LLSidepanelAppearance::showOutfitsInventoryPanel()
void LLSidepanelAppearance::showOutfitEditPanel()
{
+ if (mOutfitEdit && mOutfitEdit->getVisible()) return;
+
// Accordion's state must be reset in all cases except the one when user
// is returning back to the mOutfitEdit panel from the mEditWearable panel.
// The simplest way to control this is to check the visibility state of the mEditWearable
diff --git a/indra/newview/llsidepaneliteminfo.cpp b/indra/newview/llsidepaneliteminfo.cpp
index 731079fb5d..e41bbe43df 100644
--- a/indra/newview/llsidepaneliteminfo.cpp
+++ b/indra/newview/llsidepaneliteminfo.cpp
@@ -75,7 +75,40 @@ void LLItemPropertiesObserver::changed(U32 mask)
}
}
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLObjectInventoryObserver
+//
+// Helper class to watch for changes in an object inventory.
+// Used to update item properties in LLSidepanelItemInfo.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLObjectInventoryObserver : public LLVOInventoryListener
+{
+public:
+ LLObjectInventoryObserver(LLSidepanelItemInfo* floater, LLViewerObject* object)
+ : mFloater(floater)
+ {
+ registerVOInventoryListener(object, NULL);
+ }
+ virtual ~LLObjectInventoryObserver()
+ {
+ removeVOInventoryListener();
+ }
+ /*virtual*/ void inventoryChanged(LLViewerObject* object,
+ LLInventoryObject::object_list_t* inventory,
+ S32 serial_num,
+ void* user_data);
+private:
+ LLSidepanelItemInfo* mFloater;
+};
+/*virtual*/
+void LLObjectInventoryObserver::inventoryChanged(LLViewerObject* object,
+ LLInventoryObject::object_list_t* inventory,
+ S32 serial_num,
+ void* user_data)
+{
+ mFloater->dirty();
+}
///----------------------------------------------------------------------------
/// Class LLSidepanelItemInfo
@@ -86,6 +119,7 @@ static LLRegisterPanelClassWrapper<LLSidepanelItemInfo> t_item_info("sidepanel_i
// Default constructor
LLSidepanelItemInfo::LLSidepanelItemInfo()
: mItemID(LLUUID::null)
+ , mObjectInventoryObserver(NULL)
{
mPropertiesObserver = new LLItemPropertiesObserver(this);
@@ -97,6 +131,8 @@ LLSidepanelItemInfo::~LLSidepanelItemInfo()
{
delete mPropertiesObserver;
mPropertiesObserver = NULL;
+
+ stopObjectInventoryObserver();
}
// virtual
@@ -134,6 +170,10 @@ BOOL LLSidepanelItemInfo::postBuild()
void LLSidepanelItemInfo::setObjectID(const LLUUID& object_id)
{
mObjectID = object_id;
+
+ // Start monitoring changes in the object inventory to update
+ // selected inventory item properties in Item Profile panel. See STORM-148.
+ startObjectInventoryObserver();
}
void LLSidepanelItemInfo::setItemID(const LLUUID& item_id)
@@ -147,6 +187,8 @@ void LLSidepanelItemInfo::reset()
mObjectID = LLUUID::null;
mItemID = LLUUID::null;
+
+ stopObjectInventoryObserver();
}
void LLSidepanelItemInfo::refresh()
@@ -600,6 +642,33 @@ void LLSidepanelItemInfo::refreshFromItem(LLViewerInventoryItem* item)
}
}
+void LLSidepanelItemInfo::startObjectInventoryObserver()
+{
+ if (!mObjectInventoryObserver)
+ {
+ stopObjectInventoryObserver();
+
+ // Previous object observer should be removed before starting to observe a new object.
+ llassert(mObjectInventoryObserver == NULL);
+ }
+
+ if (mObjectID.isNull())
+ {
+ llwarns << "Empty object id passed to inventory observer" << llendl;
+ return;
+ }
+
+ LLViewerObject* object = gObjectList.findObject(mObjectID);
+
+ mObjectInventoryObserver = new LLObjectInventoryObserver(this, object);
+}
+
+void LLSidepanelItemInfo::stopObjectInventoryObserver()
+{
+ delete mObjectInventoryObserver;
+ mObjectInventoryObserver = NULL;
+}
+
void LLSidepanelItemInfo::onClickCreator()
{
LLViewerInventoryItem* item = findItem();
diff --git a/indra/newview/llsidepaneliteminfo.h b/indra/newview/llsidepaneliteminfo.h
index 82ebbfa7ec..10e93dd7de 100644
--- a/indra/newview/llsidepaneliteminfo.h
+++ b/indra/newview/llsidepaneliteminfo.h
@@ -37,6 +37,7 @@
class LLButton;
class LLViewerInventoryItem;
class LLItemPropertiesObserver;
+class LLObjectInventoryObserver;
class LLViewerObject;
class LLPermissions;
@@ -63,9 +64,13 @@ protected:
void refreshFromItem(LLViewerInventoryItem* item);
private:
+ void startObjectInventoryObserver();
+ void stopObjectInventoryObserver();
+
LLUUID mItemID; // inventory UUID for the inventory item.
LLUUID mObjectID; // in-world task UUID, or null if in agent inventory.
LLItemPropertiesObserver* mPropertiesObserver; // for syncing changes to item
+ LLObjectInventoryObserver* mObjectInventoryObserver; // for syncing changes to items inside an object
//
// UI Elements
diff --git a/indra/newview/llsidetray.cpp b/indra/newview/llsidetray.cpp
index 7af3ad9896..9ee504cc4c 100644
--- a/indra/newview/llsidetray.cpp
+++ b/indra/newview/llsidetray.cpp
@@ -244,9 +244,7 @@ void LLSideTrayTab::toggleTabDocked()
LLFloater* floater_tab = LLFloaterReg::getInstance("side_bar_tab", tab_name);
if (!floater_tab) return;
- LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
-
- bool docking = !LLFloater::isShown(floater_tab);
+ bool docking = LLFloater::isShown(floater_tab);
// Hide the "Tear Off" button when a tab gets undocked
// and show "Dock" button instead.
@@ -261,6 +259,10 @@ void LLSideTrayTab::toggleTabDocked()
{
undock(floater_tab);
}
+
+ // Open/close the floater *after* we reparent the tab panel,
+ // so that it doesn't receive redundant visibility change notifications.
+ LLFloaterReg::toggleInstance("side_bar_tab", tab_name);
}
void LLSideTrayTab::dock()
@@ -282,7 +284,7 @@ void LLSideTrayTab::dock()
if (side_tray->getCollapsed())
{
- side_tray->expandSideBar();
+ side_tray->expandSideBar(false);
}
}
@@ -291,6 +293,10 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
LLSideTray* side_tray = getSideTray();
if (!side_tray) return;
+ // Remember whether the tab have been active before detaching
+ // because removeTab() will change active tab.
+ bool was_active = side_tray->getActiveTab() == this;
+
// Remove the tab from Side Tray's tabs list.
// We have to do it despite removing the tab from Side Tray's child view tree
// by addChild(). Otherwise the tab could be accessed by the pointer in LLSideTray::mTabs.
@@ -300,9 +306,15 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
return;
}
- setVisible(true); // *HACK: restore visibility after being hidden by LLSideTray::selectTabByName().
+ // If we're undocking while side tray is collapsed we need to explicitly show the panel.
+ if (!getVisible())
+ {
+ setVisible(true);
+ }
+
floater_tab->addChild(this);
floater_tab->setTitle(mTabTitle);
+ floater_tab->setName(getName());
// Reshape the floater if needed.
LLRect floater_rect;
@@ -334,7 +346,7 @@ void LLSideTrayTab::undock(LLFloater* floater_tab)
side_tray->collapseSideBar();
}
- if (side_tray->getActiveTab() != this)
+ if (!was_active)
{
// When a tab other then current active tab is detached from Side Tray
// onOpen() should be called as tab visibility is changed.
@@ -556,8 +568,9 @@ void LLSideTray::toggleTabButton(LLSideTrayTab* tab)
{
LLButton* btn = it->second;
bool new_state = !btn->getToggleState();
- btn->setToggleState(new_state);
- btn->setImageOverlay( new_state ? tab->mImageSelected : tab->mImage );
+ btn->setToggleState(new_state);
+ // Only highlight the tab if side tray is expanded (STORM-157).
+ btn->setImageOverlay( new_state && !getCollapsed() ? tab->mImageSelected : tab->mImage );
}
}
@@ -618,8 +631,9 @@ bool LLSideTray::selectTabByIndex(size_t index)
return selectTabByName(sidebar_tab->getName());
}
-bool LLSideTray::selectTabByName (const std::string& name)
+bool LLSideTray::selectTabByName(const std::string& name, bool keep_prev_visible)
{
+ LLSideTrayTab* tab_to_keep_visible = NULL;
LLSideTrayTab* new_tab = getTab(name);
if (!new_tab) return false;
@@ -630,6 +644,8 @@ bool LLSideTray::selectTabByName (const std::string& name)
//deselect old tab
if (mActiveTab)
{
+ // Keep previously active tab visible if requested.
+ if (keep_prev_visible) tab_to_keep_visible = mActiveTab;
toggleTabButton(mActiveTab);
}
@@ -650,9 +666,17 @@ bool LLSideTray::selectTabByName (const std::string& name)
for ( child_it = mTabs.begin(); child_it != mTabs.end(); ++child_it)
{
LLSideTrayTab* sidebar_tab = *child_it;
+
+ bool vis = sidebar_tab == mActiveTab;
+
+ // Force keeping the tab visible if requested.
+ vis |= sidebar_tab == tab_to_keep_visible;
+
// When the last tab gets detached, for a short moment the "Toggle Sidebar" pseudo-tab
// is shown. So, to avoid the flicker we make sure it never gets visible.
- sidebar_tab->setVisible(sidebar_tab == mActiveTab && (*child_it)->getName() != "sidebar_openclose");
+ vis &= (*child_it)->getName() != "sidebar_openclose";
+
+ sidebar_tab->setVisible(vis);
}
return true;
}
@@ -739,9 +763,16 @@ bool LLSideTray::removeTab(LLSideTrayTab* tab)
// Deselect the tab.
if (mActiveTab == tab)
{
- child_vector_iter_t next_tab_it =
- (tab_it < (mTabs.end() - 1)) ? tab_it + 1 : mTabs.begin();
- selectTabByName((*next_tab_it)->getName());
+ // Select the next tab (or first one, if we're removing the last tab),
+ // skipping the fake open/close tab (STORM-155).
+ child_vector_iter_t next_tab_it = tab_it;
+ do
+ {
+ next_tab_it = (next_tab_it < (mTabs.end() - 1)) ? next_tab_it + 1 : mTabs.begin();
+ }
+ while ((*next_tab_it)->getName() == "sidebar_openclose");
+
+ selectTabByName((*next_tab_it)->getName(), true); // Don't hide the tab being removed.
}
// Remove the tab.
@@ -976,9 +1007,9 @@ void LLSideTray::detachTabs()
std::string floater_ctrl_name = LLFloater::getControlName("side_bar_tab", LLSD(tab->getName()));
std::string vis_ctrl_name = LLFloaterReg::getVisibilityControlName(floater_ctrl_name);
- if (!LLUI::sSettingGroups["floater"]->controlExists(vis_ctrl_name)) continue;
+ if (!LLFloater::getControlGroup()->controlExists(vis_ctrl_name)) continue;
- bool is_visible = LLUI::sSettingGroups["floater"]->getBOOL(vis_ctrl_name);
+ bool is_visible = LLFloater::getControlGroup()->getBOOL(vis_ctrl_name);
if (!is_visible) continue;
llassert(isTabAttached(tab->getName()));
@@ -1016,7 +1047,7 @@ void LLSideTray::collapseSideBar()
setFocus( FALSE );
}
-void LLSideTray::expandSideBar()
+void LLSideTray::expandSideBar(bool open_active)
{
mCollapsed = false;
LLSideTrayTab* openclose_tab = getTab("sidebar_openclose");
@@ -1024,8 +1055,11 @@ void LLSideTray::expandSideBar()
{
mCollapseButton->setImageOverlay( openclose_tab->mImageSelected );
}
- LLSD key;//empty
- mActiveTab->onOpen(key);
+
+ if (open_active)
+ {
+ mActiveTab->onOpen(LLSD());
+ }
reflectCollapseChange();
diff --git a/indra/newview/llsidetray.h b/indra/newview/llsidetray.h
index 248def8e3d..4e79007c13 100644
--- a/indra/newview/llsidetray.h
+++ b/indra/newview/llsidetray.h
@@ -76,9 +76,12 @@ public:
// interface functions
/**
- * Select tab with specific name and set it active
- */
- bool selectTabByName (const std::string& name);
+ * Select tab with specific name and set it active
+ *
+ * @param name Tab to switch to.
+ * @param keep_prev_visible Whether to keep the previously selected tab visible.
+ */
+ bool selectTabByName (const std::string& name, bool keep_prev_visible = false);
/**
* Select tab with specific index and set it active
@@ -119,8 +122,10 @@ public:
/*
* expand SideBar
+ *
+ * @param open_active Whether to call onOpen() for the active tab.
*/
- void expandSideBar ();
+ void expandSideBar(bool open_active = true);
/**
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index ca6efa9d2f..1a1c94674b 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -51,7 +51,7 @@ const LLFontGL* LLToastNotifyPanel::sFontSmall = NULL;
LLToastNotifyPanel::button_click_signal_t LLToastNotifyPanel::sButtonClickSignal;
-LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification, const LLRect& rect) :
+LLToastNotifyPanel::LLToastNotifyPanel(LLNotificationPtr& notification, const LLRect& rect, bool show_images) :
LLToastPanel(notification),
mTextBox(NULL),
mInfoPanel(NULL),
@@ -120,6 +120,7 @@ mCloseNotificationOnDestroy(true)
mTextBox->setMaxTextLength(MAX_LENGTH);
mTextBox->setVisible(TRUE);
+ mTextBox->setPlainText(!show_images);
mTextBox->setValue(notification->getMessage());
// add buttons for a script notification
@@ -523,8 +524,9 @@ void LLToastNotifyPanel::disableRespondedOptions(LLNotificationPtr& notification
//////////////////////////////////////////////////////////////////////////
-LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */)
- : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect)
+LLIMToastNotifyPanel::LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect /* = LLRect::null */,
+ bool show_images /* = true */)
+ : mSessionID(session_id), LLToastNotifyPanel(pNotification, rect, show_images)
{
mTextBox->setFollowsAll();
}
diff --git a/indra/newview/lltoastnotifypanel.h b/indra/newview/lltoastnotifypanel.h
index 9e1eac90b3..57711b3d80 100644
--- a/indra/newview/lltoastnotifypanel.h
+++ b/indra/newview/lltoastnotifypanel.h
@@ -60,7 +60,7 @@ public:
* @deprecated if you intend to instantiate LLToastNotifyPanel - it's point to
* implement right class for desired toast panel. @see LLGenericTipPanel as example.
*/
- LLToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null);
+ LLToastNotifyPanel(LLNotificationPtr& pNotification, const LLRect& rect = LLRect::null, bool show_images = true);
virtual ~LLToastNotifyPanel();
LLPanel * getControlPanel() { return mControlPanel; }
@@ -137,7 +137,7 @@ class LLIMToastNotifyPanel : public LLToastNotifyPanel
{
public:
- LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null);
+ LLIMToastNotifyPanel(LLNotificationPtr& pNotification, const LLUUID& session_id, const LLRect& rect = LLRect::null, bool show_images = true);
~LLIMToastNotifyPanel();
diff --git a/indra/newview/lltoolpie.cpp b/indra/newview/lltoolpie.cpp
index d8be70e546..864de018e0 100644
--- a/indra/newview/lltoolpie.cpp
+++ b/indra/newview/lltoolpie.cpp
@@ -619,6 +619,25 @@ BOOL LLToolPie::handleDoubleClick(S32 x, S32 y, MASK mask)
return TRUE;
}
}
+ else if (gSavedSettings.getBOOL("DoubleClickTeleport"))
+ {
+ LLViewerObject* objp = mPick.getObject();
+ LLViewerObject* parentp = objp ? objp->getRootEdit() : NULL;
+
+ bool is_in_world = mPick.mObjectID.notNull() && objp && !objp->isHUDAttachment();
+ bool is_land = mPick.mPickType == LLPickInfo::PICK_LAND;
+ bool pos_non_zero = !mPick.mPosGlobal.isExactlyZero();
+ bool has_touch_handler = (objp && objp->flagHandleTouch()) || (parentp && parentp->flagHandleTouch());
+ bool has_click_action = final_click_action(objp);
+
+ if (pos_non_zero && (is_land || (is_in_world && !has_touch_handler && !has_click_action)))
+ {
+ LLVector3d pos = mPick.mPosGlobal;
+ pos.mdV[VZ] += gAgentAvatarp->getPelvisToFoot();
+ gAgent.teleportViaLocationLookAt(pos);
+ return TRUE;
+ }
+ }
return FALSE;
}
diff --git a/indra/newview/lltranslate.cpp b/indra/newview/lltranslate.cpp
new file mode 100644
index 0000000000..050e34ade9
--- /dev/null
+++ b/indra/newview/lltranslate.cpp
@@ -0,0 +1,123 @@
+/**
+* @file lltranslate.cpp
+* @brief Functions for translating text via Google Translate.
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2009-2010, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#include "llviewerprecompiledheaders.h"
+
+#include "lltranslate.h"
+
+#include "llbufferstream.h"
+#include "llui.h"
+#include "llversionviewer.h"
+#include "llviewercontrol.h"
+
+#include "jsoncpp/reader.h"
+
+// These two are concatenated with the language specifiers to form a complete Google Translate URL
+const char* LLTranslate::m_GoogleURL = "http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&q=";
+const char* LLTranslate::m_GoogleLangSpec = "&langpair=";
+float LLTranslate::m_GoogleTimeout = 5;
+
+LLSD LLTranslate::m_Header;
+// These constants are for the GET header.
+const char* LLTranslate::m_AcceptHeader = "Accept";
+const char* LLTranslate::m_AcceptType = "text/plain";
+const char* LLTranslate::m_AgentHeader = "User-Agent";
+
+// These constants are in the JSON returned from Google
+const char* LLTranslate::m_GoogleData = "responseData";
+const char* LLTranslate::m_GoogleTranslation = "translatedText";
+const char* LLTranslate::m_GoogleLanguage = "detectedSourceLanguage";
+
+//static
+void LLTranslate::translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg)
+{
+ std::string url;
+ getTranslateUrl(url, from_lang, to_lang, mesg);
+
+ std::string user_agent = llformat("%s %d.%d.%d (%d)",
+ LL_CHANNEL,
+ LL_VERSION_MAJOR,
+ LL_VERSION_MINOR,
+ LL_VERSION_PATCH,
+ LL_VERSION_BUILD );
+
+ if (!m_Header.size())
+ {
+ m_Header.insert(m_AcceptHeader, LLSD(m_AcceptType));
+ m_Header.insert(m_AgentHeader, LLSD(user_agent));
+ }
+
+ LLHTTPClient::get(url, result, m_Header, m_GoogleTimeout);
+}
+
+//static
+void LLTranslate::getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &mesg)
+{
+ std::string escaped_mesg = curl_escape(mesg.c_str(), mesg.size());
+
+ translate_url = m_GoogleURL
+ + escaped_mesg + m_GoogleLangSpec
+ + from_lang // 'from' language; empty string for auto
+ + "%7C" // |
+ + to_lang; // 'to' language
+}
+
+//static
+bool LLTranslate::parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language)
+{
+ Json::Value root;
+ Json::Reader reader;
+
+ bool success = reader.parse(body, root);
+ if (!success)
+ {
+ LL_WARNS("Translate") << "Non valid response from Google Translate API: '" << reader.getFormatedErrorMessages() << "'" << LL_ENDL;
+ return false;
+ }
+
+ translation = root[m_GoogleData].get(m_GoogleTranslation, "").asString();
+ detected_language = root[m_GoogleData].get(m_GoogleLanguage, "").asString();
+ return true;
+}
+
+//static
+std::string LLTranslate::getTranslateLanguage()
+{
+ std::string language = gSavedSettings.getString("TranslateLanguage");
+ if (language.empty() || language == "default")
+ {
+ language = LLUI::getLanguage();
+ }
+ language = language.substr(0,2);
+ return language;
+}
+
diff --git a/indra/newview/lltranslate.h b/indra/newview/lltranslate.h
new file mode 100644
index 0000000000..0786dc0ca3
--- /dev/null
+++ b/indra/newview/lltranslate.h
@@ -0,0 +1,124 @@
+/**
+* @file lltranslate.h
+* @brief Human language translation class and JSON response receiver.
+*
+* $LicenseInfo:firstyear=2009&license=viewergpl$
+*
+* Copyright (c) 2009-2010, Linden Research, Inc.
+*
+* Second Life Viewer Source Code
+* The source code in this file ("Source Code") is provided by Linden Lab
+* to you under the terms of the GNU General Public License, version 2.0
+* ("GPL"), unless you have obtained a separate licensing agreement
+* ("Other License"), formally executed by you and Linden Lab. Terms of
+* the GPL can be found in doc/GPL-license.txt in this distribution, or
+* online at http://secondlifegrid.net/programs/open_source/licensing/gplv2
+*
+* There are special exceptions to the terms and conditions of the GPL as
+* it is applied to this Source Code. View the full text of the exception
+* in the file doc/FLOSS-exception.txt in this software distribution, or
+* online at
+* http://secondlifegrid.net/programs/open_source/licensing/flossexception
+*
+* By copying, modifying or distributing this software, you acknowledge
+* that you have read and understood your obligations described above,
+* and agree to abide by those obligations.
+*
+* ALL LINDEN LAB SOURCE CODE IS PROVIDED "AS IS." LINDEN LAB MAKES NO
+* WARRANTIES, EXPRESS, IMPLIED OR OTHERWISE, REGARDING ITS ACCURACY,
+* COMPLETENESS OR PERFORMANCE.
+* $/LicenseInfo$
+*/
+
+#ifndef LL_LLTRANSLATE_H
+#define LL_LLTRANSLATE_H
+
+#include "llhttpclient.h"
+#include "llbufferstream.h"
+
+class LLTranslate
+{
+ LOG_CLASS(LLTranslate);
+public :
+ class TranslationReceiver: public LLHTTPClient::Responder
+ {
+ protected:
+ TranslationReceiver(const std::string &from_lang, const std::string &to_lang)
+ : m_fromLang(from_lang),
+ m_toLang(to_lang)
+ {
+ }
+
+ virtual void handleResponse(const std::string &translation, const std::string &recognized_lang) {};
+ virtual void handleFailure() {};
+
+ public:
+ ~TranslationReceiver()
+ {
+ }
+
+ virtual void completedRaw( U32 status,
+ const std::string& reason,
+ const LLChannelDescriptors& channels,
+ const LLIOPipe::buffer_ptr_t& buffer)
+ {
+ if (200 <= status && status < 300)
+ {
+ LLBufferStream istr(channels, buffer.get());
+ std::stringstream strstrm;
+ strstrm << istr.rdbuf();
+
+ const std::string result = strstrm.str();
+ std::string translation;
+ std::string detected_language;
+
+ if (!parseGoogleTranslate(result, translation, detected_language))
+ {
+ handleFailure();
+ return;
+ }
+
+ // Fix up the response
+ LLStringUtil::replaceString(translation, "&lt;", "<");
+ LLStringUtil::replaceString(translation, "&gt;",">");
+ LLStringUtil::replaceString(translation, "&quot;","\"");
+ LLStringUtil::replaceString(translation, "&#39;","'");
+ LLStringUtil::replaceString(translation, "&amp;","&");
+ LLStringUtil::replaceString(translation, "&apos;","'");
+
+ handleResponse(translation, detected_language);
+ }
+ else
+ {
+ LL_WARNS("Translate") << "HTTP request for Google Translate failed with status " << status << ", reason: " << reason << LL_ENDL;
+ handleFailure();
+ }
+ }
+
+ protected:
+ const std::string m_toLang;
+ const std::string m_fromLang;
+ };
+
+ static void translateMessage(LLHTTPClient::ResponderPtr &result, const std::string &from_lang, const std::string &to_lang, const std::string &mesg);
+ static float m_GoogleTimeout;
+ static std::string getTranslateLanguage();
+
+private:
+ static void getTranslateUrl(std::string &translate_url, const std::string &from_lang, const std::string &to_lang, const std::string &text);
+ static bool parseGoogleTranslate(const std::string& body, std::string &translation, std::string &detected_language);
+
+ static LLSD m_Header;
+ static const char* m_GoogleURL;
+ static const char* m_GoogleLangSpec;
+ static const char* m_AcceptHeader;
+ static const char* m_AcceptType;
+ static const char* m_AgentHeader;
+ static const char* m_UserAgent;
+
+ static const char* m_GoogleData;
+ static const char* m_GoogleTranslation;
+ static const char* m_GoogleLanguage;
+};
+
+#endif
diff --git a/indra/newview/llviewerdisplay.cpp b/indra/newview/llviewerdisplay.cpp
index d0ad918c58..916cbe2267 100644
--- a/indra/newview/llviewerdisplay.cpp
+++ b/indra/newview/llviewerdisplay.cpp
@@ -85,6 +85,7 @@ LLPointer<LLViewerTexture> gDisconnectedImagep = NULL;
// used to toggle renderer back on after teleport
const F32 TELEPORT_RENDER_DELAY = 20.f; // Max time a teleport is allowed to take before we raise the curtain
const F32 TELEPORT_ARRIVAL_DELAY = 2.f; // Time to preload the world before raising the curtain after we've actually already arrived.
+const F32 TELEPORT_LOCAL_DELAY = 1.0f; // Delay to prevent teleports after starting an in-sim teleport.
BOOL gTeleportDisplay = FALSE;
LLFrameTimer gTeleportDisplayTimer;
LLFrameTimer gTeleportArrivalTimer;
@@ -406,6 +407,18 @@ void display(BOOL rebuild, F32 zoom_factor, int subfield, BOOL for_snapshot)
}
break;
+ case LLAgent::TELEPORT_LOCAL:
+ // Short delay when teleporting in the same sim (progress screen active but not shown - did not
+ // fall-through from TELEPORT_START)
+ {
+ if( gTeleportDisplayTimer.getElapsedTimeF32() > TELEPORT_LOCAL_DELAY )
+ {
+ //LLFirstUse::useTeleport();
+ gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
+ }
+ }
+ break;
+
case LLAgent::TELEPORT_NONE:
// No teleport in progress
gViewerWindow->setShowProgress(FALSE);
diff --git a/indra/newview/llviewerfloaterreg.cpp b/indra/newview/llviewerfloaterreg.cpp
index 8728298575..b6f2d34663 100644
--- a/indra/newview/llviewerfloaterreg.cpp
+++ b/indra/newview/llviewerfloaterreg.cpp
@@ -86,6 +86,7 @@
#include "llfloaterscriptlimits.h"
#include "llfloatersellland.h"
#include "llfloatersettingsdebug.h"
+#include "llfloatersidetraytab.h"
#include "llfloatersnapshot.h"
#include "llfloatertelehub.h"
#include "llfloatertestinspectors.h"
@@ -234,7 +235,7 @@ void LLViewerFloaterReg::registerFloaters()
LLFloaterReg::add("script_limits", "floater_script_limits.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterScriptLimits>);
LLFloaterReg::add("sell_land", "floater_sell_land.xml", &LLFloaterSellLand::buildFloater);
LLFloaterReg::add("settings_debug", "floater_settings_debug.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterSettingsDebug>);
- LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml",&LLFloaterReg::build<LLFloater>);
+ LLFloaterReg::add("side_bar_tab", "floater_side_bar_tab.xml", &LLFloaterReg::build<LLFloaterSideTrayTab>);
LLFloaterReg::add("stats", "floater_stats.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloater>);
LLFloaterReg::add("start_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterRunQueue>);
LLFloaterReg::add("stop_queue", "floater_script_queue.xml", (LLFloaterBuildFunc)&LLFloaterReg::build<LLFloaterNotRunQueue>);
diff --git a/indra/newview/llviewermenu.cpp b/indra/newview/llviewermenu.cpp
index daeace0ec5..f62223a38d 100644
--- a/indra/newview/llviewermenu.cpp
+++ b/indra/newview/llviewermenu.cpp
@@ -6573,6 +6573,16 @@ class LLToggleControl : public view_listener_t
std::string control_name = userdata.asString();
BOOL checked = gSavedSettings.getBOOL( control_name );
gSavedSettings.setBOOL( control_name, !checked );
+
+ // Doubleclick actions - there can be only one
+ if ((control_name == "DoubleClickAutoPilot") && !checked)
+ {
+ gSavedSettings.setBOOL( "DoubleClickTeleport", FALSE );
+ }
+ else if ((control_name == "DoubleClickTeleport") && !checked)
+ {
+ gSavedSettings.setBOOL( "DoubleClickAutoPilot", FALSE );
+ }
return true;
}
};
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index 781e324e25..c35173a7d4 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -77,10 +77,12 @@
#include "llimview.h"
#include "llspeakers.h"
#include "lltrans.h"
+#include "lltranslate.h"
#include "llviewerfoldertype.h"
#include "lluri.h"
#include "llviewergenericmessage.h"
#include "llviewermenu.h"
+#include "llviewerjoystick.h"
#include "llviewerobjectlist.h"
#include "llviewerparcelmgr.h"
#include "llviewerstats.h"
@@ -2909,6 +2911,50 @@ void process_decline_callingcard(LLMessageSystem* msg, void**)
LLNotificationsUtil::add("CallingCardDeclined");
}
+class ChatTranslationReceiver : public LLTranslate::TranslationReceiver
+{
+public :
+ ChatTranslationReceiver(const std::string &from_lang, const std::string &to_lang, const std::string &mesg,
+ const LLChat &chat, const LLSD &toast_args)
+ : LLTranslate::TranslationReceiver(from_lang, to_lang),
+ m_chat(chat),
+ m_toastArgs(toast_args),
+ m_origMesg(mesg)
+ {
+ }
+
+ static boost::intrusive_ptr<ChatTranslationReceiver> build(const std::string &from_lang, const std::string &to_lang, const std::string &mesg, const LLChat &chat, const LLSD &toast_args)
+ {
+ return boost::intrusive_ptr<ChatTranslationReceiver>(new ChatTranslationReceiver(from_lang, to_lang, mesg, chat, toast_args));
+ }
+
+protected:
+ void handleResponse(const std::string &translation, const std::string &detected_language)
+ {
+ // filter out non-interesting responeses
+ if ( !translation.empty()
+ && (m_toLang != detected_language)
+ && (LLStringUtil::compareInsensitive(translation, m_origMesg) != 0) )
+ {
+ m_chat.mText += " (" + translation + ")";
+ }
+
+ LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs);
+ }
+
+ void handleFailure()
+ {
+ LLTranslate::TranslationReceiver::handleFailure();
+ m_chat.mText += " (?)";
+
+ LLNotificationsUI::LLNotificationManager::instance().onChat(m_chat, m_toastArgs);
+ }
+
+private:
+ LLChat m_chat;
+ std::string m_origMesg;
+ LLSD m_toastArgs;
+};
void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
{
@@ -3113,7 +3159,22 @@ void process_chat_from_simulator(LLMessageSystem *msg, void **user_data)
args["type"] = LLNotificationsUI::NT_NEARBYCHAT;
chat.mOwnerID = owner_id;
- LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
+ if (gSavedSettings.getBOOL("TranslateChat") && chat.mSourceType != CHAT_SOURCE_SYSTEM)
+ {
+ if (chat.mChatStyle == CHAT_STYLE_IRC)
+ {
+ mesg = mesg.substr(4, std::string::npos);
+ }
+ const std::string from_lang = ""; // leave empty to trigger autodetect
+ const std::string to_lang = LLTranslate::getTranslateLanguage();
+
+ LLHTTPClient::ResponderPtr result = ChatTranslationReceiver::build(from_lang, to_lang, mesg, chat, args);
+ LLTranslate::translateMessage(result, from_lang, to_lang, mesg);
+ }
+ else
+ {
+ LLNotificationsUI::LLNotificationManager::instance().onChat(chat, args);
+ }
}
}
@@ -3129,6 +3190,8 @@ void process_teleport_start(LLMessageSystem *msg, void**)
U32 teleport_flags = 0x0;
msg->getU32("Info", "TeleportFlags", teleport_flags);
+ LL_DEBUGS("Messaging") << "Got TeleportStart with TeleportFlags=" << teleport_flags << ". gTeleportDisplay: " << gTeleportDisplay << ", gAgent.mTeleportState: " << gAgent.getTeleportState() << LL_ENDL;
+
if (teleport_flags & TELEPORT_FLAGS_DISABLE_CANCEL)
{
gViewerWindow->setProgressCancelButtonVisible(FALSE);
@@ -3147,6 +3210,7 @@ void process_teleport_start(LLMessageSystem *msg, void**)
gAgent.setTeleportState( LLAgent::TELEPORT_START );
make_ui_sound("UISndTeleportOut");
+ LL_INFOS("Messaging") << "Teleport initiated by remote TeleportStart message with TeleportFlags: " << teleport_flags << LL_ENDL;
// Don't call LLFirstUse::useTeleport here because this could be
// due to being killed, which would send you home, not to a Telehub
}
@@ -3488,6 +3552,12 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
if( is_teleport )
{
+ if (gAgent.getTeleportKeepsLookAt())
+ {
+ // *NOTE: the LookAt data we get from the sim here doesn't
+ // seem to be useful, so get it from the camera instead
+ look_at = LLViewerCamera::getInstance()->getAtAxis();
+ }
// Force the camera back onto the agent, don't animate.
gAgentCamera.setFocusOnAvatar(TRUE, FALSE);
gAgentCamera.slamLookAt(look_at);
@@ -3534,7 +3604,7 @@ void process_agent_movement_complete(LLMessageSystem* msg, void**)
{
LLTracker::stopTracking(NULL);
}
- else if ( is_teleport )
+ else if ( is_teleport && !gAgent.getTeleportKeepsLookAt() )
{
//look at the beacon
LLVector3 global_agent_pos = agent_pos;
@@ -5806,7 +5876,18 @@ void process_teleport_local(LLMessageSystem *msg,void**)
if( gAgent.getTeleportState() != LLAgent::TELEPORT_NONE )
{
- gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
+ if( gAgent.getTeleportState() == LLAgent::TELEPORT_LOCAL )
+ {
+ // To prevent TeleportStart messages re-activating the progress screen right
+ // after tp, keep the teleport state and let progress screen clear it after a short delay
+ // (progress screen is active but not visible) *TODO: remove when SVC-5290 is fixed
+ gTeleportDisplayTimer.reset();
+ gTeleportDisplay = TRUE;
+ }
+ else
+ {
+ gAgent.setTeleportState( LLAgent::TELEPORT_NONE );
+ }
}
// Sim tells us whether the new position is off the ground
@@ -5822,8 +5903,10 @@ void process_teleport_local(LLMessageSystem *msg,void**)
gAgent.setPositionAgent(pos);
gAgentCamera.slamLookAt(look_at);
- // likewise make sure the camera is behind the avatar
- gAgentCamera.resetView(TRUE, TRUE);
+ if ( !(gAgent.getTeleportKeepsLookAt() && LLViewerJoystick::getInstance()->getOverrideCamera()) )
+ {
+ gAgentCamera.resetView(TRUE, TRUE);
+ }
// send camera update to new region
gAgentCamera.updateCamera();
diff --git a/indra/newview/llvoavatar.cpp b/indra/newview/llvoavatar.cpp
index cab6fbdc93..46d8f65d23 100644
--- a/indra/newview/llvoavatar.cpp
+++ b/indra/newview/llvoavatar.cpp
@@ -176,7 +176,7 @@ const F32 TIME_BEFORE_MESH_CLEANUP = 5.f; // seconds
const S32 AVATAR_RELEASE_THRESHOLD = 10; // number of avatar instances before releasing memory
const F32 FOOT_GROUND_COLLISION_TOLERANCE = 0.25f;
const F32 AVATAR_LOD_TWEAK_RANGE = 0.7f;
-const S32 MAX_BUBBLE_CHAT_LENGTH = 1023;
+const S32 MAX_BUBBLE_CHAT_LENGTH = DB_CHAT_MSG_STR_LEN;
const S32 MAX_BUBBLE_CHAT_UTTERANCES = 12;
const F32 CHAT_FADE_TIME = 8.0;
const F32 BUBBLE_CHAT_TIME = CHAT_FADE_TIME * 3.f;
diff --git a/indra/newview/llvocache.cpp b/indra/newview/llvocache.cpp
index d40e3c153c..442b3c3e33 100644
--- a/indra/newview/llvocache.cpp
+++ b/indra/newview/llvocache.cpp
@@ -661,4 +661,5 @@ void LLVOCache::writeToCache(U64 handle, const LLUUID& id, const LLVOCacheEntry:
delete apr_file ;
return ;
-} \ No newline at end of file
+}
+
diff --git a/indra/newview/llvoicevivox.cpp b/indra/newview/llvoicevivox.cpp
index 2e003dd2b8..e674fec053 100644
--- a/indra/newview/llvoicevivox.cpp
+++ b/indra/newview/llvoicevivox.cpp
@@ -386,7 +386,7 @@ LLVivoxVoiceClient::~LLVivoxVoiceClient()
{
}
-//----------------------------------------------
+//---------------------------------------------------
void LLVivoxVoiceClient::init(LLPumpIO *pump)
{
@@ -400,7 +400,8 @@ void LLVivoxVoiceClient::terminate()
{
logout();
connectorShutdown();
- closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
+ closeSocket(); // Need to do this now -- bad things happen if the destructor does it later.
+ cleanUp();
}
else
{
@@ -408,6 +409,18 @@ void LLVivoxVoiceClient::terminate()
}
}
+//---------------------------------------------------
+
+void LLVivoxVoiceClient::cleanUp()
+{
+ deleteAllSessions();
+ deleteAllBuddies();
+ deleteAllVoiceFonts();
+ deleteVoiceFontTemplates();
+}
+
+//---------------------------------------------------
+
const LLVoiceVersionInfo& LLVivoxVoiceClient::getVersion()
{
return mVoiceVersion;
@@ -776,14 +789,10 @@ void LLVivoxVoiceClient::stateMachine()
{
//MARK: stateDisableCleanup
case stateDisableCleanup:
- // Clean up and reset everything.
+ // Clean up and reset everything.
closeSocket();
- deleteAllSessions();
- deleteAllBuddies();
- deleteAllVoiceFonts();
- deleteVoiceFontTemplates();
+ cleanUp();
- mConnectorHandle.clear();
mAccountHandle.clear();
mAccountPassword.clear();
mVoiceAccountServerURI.clear();
@@ -1675,12 +1684,9 @@ void LLVivoxVoiceClient::stateMachine()
//MARK: stateLoggedOut
case stateLoggedOut: // logout response received
- // Once we're logged out, all these things are invalid.
+ // Once we're logged out, these things are invalid.
mAccountHandle.clear();
- deleteAllSessions();
- deleteAllBuddies();
- deleteAllVoiceFonts();
- deleteVoiceFontTemplates();
+ cleanUp();
if(mVoiceEnabled && !mRelogRequested)
{
@@ -1778,6 +1784,8 @@ void LLVivoxVoiceClient::closeSocket(void)
{
mSocket.reset();
mConnected = false;
+ mConnectorHandle.clear();
+ mAccountHandle.clear();
}
void LLVivoxVoiceClient::loginSendMessage()
@@ -2370,8 +2378,7 @@ void LLVivoxVoiceClient::giveUp()
{
// All has failed. Clean up and stop trying.
closeSocket();
- deleteAllSessions();
- deleteAllBuddies();
+ cleanUp();
setState(stateJail);
}
diff --git a/indra/newview/llvoicevivox.h b/indra/newview/llvoicevivox.h
index d10a562616..08f2f75a39 100644
--- a/indra/newview/llvoicevivox.h
+++ b/indra/newview/llvoicevivox.h
@@ -668,7 +668,10 @@ protected:
private:
LLVoiceVersionInfo mVoiceVersion;
-
+
+ /// Clean up objects created during a voice session.
+ void cleanUp();
+
state mState;
bool mSessionTerminateRequested;
bool mRelogRequested;
diff --git a/indra/newview/llvosky.h b/indra/newview/llvosky.h
index 0ac6b9117b..6b3e7873a1 100644
--- a/indra/newview/llvosky.h
+++ b/indra/newview/llvosky.h
@@ -139,10 +139,10 @@ protected:
~LLSkyTex();
- static S32 getResolution() { return sResolution; }
+ static S32 getResolution() { return sResolution; }
static S32 getCurrent() { return sCurrent; }
- static S32 stepCurrent() { return (sCurrent = (sCurrent + 1) % 2); }
- static S32 getNext() { return ((sCurrent+1) % 2); }
+ static S32 stepCurrent() { sCurrent++; sCurrent &= 1; return sCurrent; }
+ static S32 getNext() { return ((sCurrent+1) & 1); }
static S32 getWhich(const BOOL curr) { return curr ? sCurrent : getNext(); }
void initEmpty(const S32 tex);
diff --git a/indra/newview/skins/default/textures/icons/Generic_Group_Large.png b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png
index de8a39fc8a..75833eccf3 100644
--- a/indra/newview/skins/default/textures/icons/Generic_Group_Large.png
+++ b/indra/newview/skins/default/textures/icons/Generic_Group_Large.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Generic_Person_Large.png b/indra/newview/skins/default/textures/icons/Generic_Person_Large.png
index 65b0ce8b67..532288b430 100644
--- a/indra/newview/skins/default/textures/icons/Generic_Person_Large.png
+++ b/indra/newview/skins/default/textures/icons/Generic_Person_Large.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 2e282d813e..273531f9b2 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -359,11 +359,16 @@ with the same filename but different name
<texture name="Pause_Off" file_name="icons/Pause_Off.png" preload="false" />
<texture name="Pause_Over" file_name="icons/Pause_Over.png" preload="false" />
<texture name="Pause_Press" file_name="icons/Pause_Press.png" preload="false" />
+
+ <texture name="Permission_Visible_Online" file_name="ff_visible_online_button.tga" preload="false" />
+ <texture name="Permission_Visible_Map" file_name="ff_visible_map_button.tga" preload="false" />
+ <texture name="Permission_Edit_Objects_Mine" file_name="ff_edit_mine_button.tga" preload="false" />
+ <texture name="Permission_Edit_Objects_Theirs" file_name="ff_edit_theirs_button.tga" preload="false" />
+
<texture name="Play_Off" file_name="icons/Play_Off.png" preload="false" />
<texture name="Play_Over" file_name="icons/Play_Over.png" preload="false" />
<texture name="Play_Press" file_name="icons/Play_Press.png" preload="false" />
-
<texture name="ProgressBar" file_name="widgets/ProgressBar.png" preload="true" scale.left="4" scale.top="10" scale.right="48" scale.bottom="2" />
<texture name="ProgressTrack" file_name="widgets/ProgressTrack.png" preload="true" scale.left="4" scale.top="13" scale.right="148" scale.bottom="2" />
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
index 20a376f152..bea106bf28 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_chat.xml
@@ -56,4 +56,27 @@
<radio_item label="Separate vinduer" name="radio" value="0"/>
<radio_item label="Faner" name="radio2" value="1"/>
</radio_group>
+ <check_box label="Oversæt Chat" name="translate_chat_checkbox" />
+ <text name="translate_language_text" width="110">
+ Chat Sprog:
+ </text>
+ <combo_box name="translate_language_combobox" width="146">
+ <combo_box.item label="System standard" name="System Default Language"/>
+ <combo_box.item label="English (Engelsk)" name="English"/>
+ <combo_box.item label="Dansk" name="Danish"/>
+ <combo_box.item label="Deutsch (Tysk)" name="German"/>
+ <combo_box.item label="Español (Spansk)" name="Spanish"/>
+ <combo_box.item label="Français (Fransk)" name="French"/>
+ <combo_box.item label="Italiano (Italiensk)" name="Italian" />
+ <combo_box.item label="Magyar (Ungarsk)" name="Hungarian" />
+ <combo_box.item label="Nederlands (Hollandsk)" name="Dutch" />
+ <combo_box.item label="Polski (Polsk)" name="Polish" />
+ <combo_box.item label="Português (Portugisisk)" name="Portugese" />
+ <combo_box.item label="Русский (Russisk)" name="Russian" />
+ <combo_box.item label="Türkçe (Tyrkisk)" name="Turkish" />
+ <combo_box.item label="Українська (Ukrainsk)" name="Ukrainian" />
+ <combo_box.item label="中文 (简体) (Kinesisk)" name="Chinese" />
+ <combo_box.item label="日本語 (Japansk)" name="Japanese" />
+ <combo_box.item label="한국어 (Koreansk)" name="Korean" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/da/panel_preferences_general.xml b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
index e70cb48262..6a85cf4aae 100644
--- a/indra/newview/skins/default/xui/da/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/da/panel_preferences_general.xml
@@ -11,7 +11,7 @@
<combo_box.item label="Español (Spansk) - Beta" name="Spanish"/>
<combo_box.item label="Français (Fransk) - Beta" name="French"/>
<combo_box.item label="Polski (Polsk) - Beta" name="Polish"/>
- <combo_box.item label="Portugués (Portugisisk) - Beta" name="Portugese"/>
+ <combo_box.item label="Português (Portugisisk) - Beta" name="Portugese"/>
<combo_box.item label="日本語 (Japansk) - Beta" name="(Japanese)"/>
</combo_box>
<text name="language_textbox2">
diff --git a/indra/newview/skins/default/xui/da/strings.xml b/indra/newview/skins/default/xui/da/strings.xml
index 3152661fd4..712f6f8b50 100644
--- a/indra/newview/skins/default/xui/da/strings.xml
+++ b/indra/newview/skins/default/xui/da/strings.xml
@@ -1117,6 +1117,9 @@
<string name="InvFolder Favorite">
Favoritter
</string>
+ <string name="InvFolder favorite">
+ Favoritter
+ </string>
<string name="InvFolder Current Outfit">
Nuværende sæt
</string>
diff --git a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
index 5c91b34a21..064eb3895b 100644
--- a/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/de/panel_preferences_chat.xml
@@ -56,4 +56,27 @@
<radio_item label="Getrennte Fenster" name="radio" value="0"/>
<radio_item label="Registerkarten" name="radio2" value="1"/>
</radio_group>
+ <check_box label="Übersetzen Chat" name="translate_chat_checkbox" />
+ <text name="translate_language_text">
+ Chat-Sprache:
+ </text>
+ <combo_box name="translate_language_combobox" width="200">
+ <combo_box.item name="System Default Language" label="Betriebssystem-Einstellung" />
+ <combo_box.item name="English" label="English (Englisch)" />
+ <combo_box.item name="Danish" label="Danks (Dänisch)" />
+ <combo_box.item name="German" label="Deutsch" />
+ <combo_box.item name="Spanish" label="Español (Spanisch)" />
+ <combo_box.item name="French" label="Français (Französisch)" />
+ <combo_box.item name="Italian" label="Italiano (Italienisch)" />
+ <combo_box.item name="Hungarian" label="Magyar (Ungarisch)" />
+ <combo_box.item name="Dutch" label="Nederlands (Niederländisch)" />
+ <combo_box.item name="Polish" label="Polski (Polnisch)" />
+ <combo_box.item name="Portugese" label="Português (Portugiesisch)" />
+ <combo_box.item name="Russian" label="Русский (Russian)" />
+ <combo_box.item name="Turkish" label="Türkçe (Türkisch)" />
+ <combo_box.item name="Ukrainian" label="Українська (Ukrainisch)" />
+ <combo_box.item name="Chinese" label="中文 (简体) (Chinesisch)" />
+ <combo_box.item name="Japanese" label="日本語 (Japanisch)" />
+ <combo_box.item name="Korean" label="한국어 (Koreanisch)" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/de/strings.xml b/indra/newview/skins/default/xui/de/strings.xml
index bf7d2ef3b3..1adc4e3db1 100644
--- a/indra/newview/skins/default/xui/de/strings.xml
+++ b/indra/newview/skins/default/xui/de/strings.xml
@@ -1147,6 +1147,9 @@
<string name="InvFolder Favorite">
Favoriten
</string>
+ <string name="InvFolder favorite">
+ Favoriten
+ </string>
<string name="InvFolder Current Outfit">
Aktuelles Outfit
</string>
diff --git a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
index 42a9ff551e..65e2462ef8 100644
--- a/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/en/floater_day_cycle_options.xml
@@ -359,9 +359,9 @@
increment="1"
initial_value="0"
label="Hour"
- label_width="30"
+ label_width="35"
layout="topleft"
- left_delta="25"
+ left_delta="20"
max_val="100"
name="WLCurKeyHour"
top_pad="4"
@@ -374,13 +374,13 @@
increment="5"
initial_value="0"
label="Min"
- label_width="20"
+ label_width="45"
layout="topleft"
left_pad="5"
max_val="55"
name="WLCurKeyMin"
top_delta="0"
- width="60" />
+ width="85" />
<text
type="string"
length="1"
@@ -456,9 +456,9 @@
increment="1"
initial_value="0"
label="Hour"
- label_width="30"
+ label_width="33"
layout="topleft"
- left_delta="0"
+ left_delta="-3"
max_val="100"
name="WLLengthOfDayHour"
top_pad="4"
@@ -471,13 +471,13 @@
increment="1"
initial_value="0"
label="Min"
- label_width="20"
+ label_width="25"
layout="topleft"
- left_pad="5"
+ left_pad="2"
max_val="59"
name="WLLengthOfDayMin"
top_delta="0"
- width="60" />
+ width="65" />
<spinner
control_name="WLLengthOfDaySec"
decimal_digits="0"
@@ -486,13 +486,13 @@
increment="1"
initial_value="24"
label="Sec"
- label_width="20"
+ label_width="25"
layout="topleft"
- left_pad="5"
+ left_pad="2"
max_val="59"
name="WLLengthOfDaySec"
top_delta="0"
- width="60"/>
+ width="65"/>
<text
type="string"
halign="right"
diff --git a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
index 3b26c2ab59..4c5113aa55 100644
--- a/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
+++ b/indra/newview/skins/default/xui/en/floater_nearby_chat.xml
@@ -14,7 +14,7 @@
can_dock="true"
bevel_style="in"
height="300"
- min_width="150"
+ min_width="235"
layout="topleft"
name="nearby_chat"
help_topic="nearby_chat"
@@ -24,15 +24,25 @@
save_visibility="true"
single_instance="true"
width="320">
+ <check_box
+ bottom_delta="36"
+ control_name="TranslateChat"
+ enabled="true"
+ height="16"
+ label="Translate chat (powered by Google)"
+ layout="topleft"
+ left="5"
+ name="translate_chat_checkbox"
+ width="230" />
<chat_history
parse_urls="true"
bg_readonly_color="ChatHistoryBgColor"
bg_writeable_color="ChatHistoryBgColor"
follows="all"
left="5"
- top="20"
+ top_delta="17"
layout="topleft"
- height="275"
+ height="260"
name="chat_history"
parse_highlights="true"
text_color="ChatHistoryTextColor"
diff --git a/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml b/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml
index bf0913fde7..9f14e9ae0a 100644
--- a/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml
+++ b/indra/newview/skins/default/xui/en/floater_side_bar_tab.xml
@@ -2,7 +2,8 @@
<floater
can_close="false"
can_resize="true"
- min_width="150"
+ min_width="333"
+ min_height="440"
save_rect="true"
save_visibility="true"
>
diff --git a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
index 92752a0fee..22796f7b68 100644
--- a/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
+++ b/indra/newview/skins/default/xui/en/menu_people_friends_view_sort.xml
@@ -31,6 +31,14 @@
function="CheckControl"
parameter="FriendsListShowIcons" />
</menu_item_check>
+ <menu_item_check name="view_permissions" label="View Permissions Granted">
+ <menu_item_check.on_click
+ function="People.Friends.ViewSort.Action"
+ parameter="view_permissions" />
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="FriendsListShowPermissions" />
+ </menu_item_check>
<menu_item_separator layout="topleft" />
<menu_item_call name="show_blocked_list" label="Show Blocked Residents &amp; Objects">
<menu_item_call.on_click function="SideTray.ShowPanel" parameter="panel_block_list_sidetray" />
diff --git a/indra/newview/skins/default/xui/en/menu_viewer.xml b/indra/newview/skins/default/xui/en/menu_viewer.xml
index c79a484ef6..19707c1bc9 100644
--- a/indra/newview/skins/default/xui/en/menu_viewer.xml
+++ b/indra/newview/skins/default/xui/en/menu_viewer.xml
@@ -1669,8 +1669,8 @@
</menu_item_call>
<menu_item_separator
visible="false"/>
- <!-- Made invisible to avoid a dissonance: menu item toggle menu where it is located. EXT-8069.
- Can't be removed to keep sortcut workable.
+ <!-- Made invisible to avoid a dissonance: menu item toggles the menu where it is located. EXT-8069.
+ Can't be removed, to keep shortcut workable.
-->
<menu_item_check
label="Show Advanced Menu"
@@ -2629,8 +2629,8 @@
function="Advanced.PrintTextureMemoryStats" />
</menu_item_call>
<menu_item_check
- label="Double-ClickAuto-Pilot"
- name="Double-ClickAuto-Pilot">
+ label="Double-Click Auto-Pilot"
+ name="Double-Click Auto-Pilot">
<menu_item_check.on_check
function="CheckControl"
parameter="DoubleClickAutoPilot" />
@@ -2638,6 +2638,16 @@
function="ToggleControl"
parameter="DoubleClickAutoPilot" />
</menu_item_check>
+ <menu_item_check
+ label="Double-Click Teleport"
+ name="DoubleClick Teleport">
+ <menu_item_check.on_check
+ function="CheckControl"
+ parameter="DoubleClickTeleport" />
+ <menu_item_check.on_click
+ function="ToggleControl"
+ parameter="DoubleClickTeleport" />
+ </menu_item_check>
<menu_item_separator />
diff --git a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
index 747352cb29..84ab16c709 100644
--- a/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
+++ b/indra/newview/skins/default/xui/en/menu_wearing_gear.xml
@@ -10,4 +10,14 @@
<on_click
function="Gear.Edit" />
</menu_item_call>
+ <menu_item_call
+ label="Take Off"
+ layout="topleft"
+ name="takeoff">
+ <on_click
+ function="Gear.TakeOff" />
+ <on_enable
+ function="Gear.OnEnable"
+ parameter="take_off" />
+ </menu_item_call>
</menu>
diff --git a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
index f58715be56..b385654010 100644
--- a/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
+++ b/indra/newview/skins/default/xui/en/panel_avatar_list_item.xml
@@ -65,11 +65,55 @@
height="15"
layout="topleft"
left_pad="5"
- right="-72"
+ right="-164"
name="last_interaction"
text_color="LtGray_50"
value="0s"
width="35" />
+ <icon
+ height="20"
+ follows="right"
+ image_name="Permission_Visible_Online"
+ layout="topleft"
+ left_pad="3"
+ right="-141"
+ name="permission_online_icon"
+ tool_tip="This friend can see when you&apos;re online"
+ top="2"
+ width="20" />
+ <icon
+ height="20"
+ follows="right"
+ image_name="Permission_Visible_Map"
+ layout="topleft"
+ left_pad="3"
+ tool_tip="This friend can locate you on the map"
+ right="-118"
+ name="permission_map_icon"
+ top_delta="0"
+ width="20" />
+ <icon
+ height="20"
+ follows="right"
+ image_name="Permission_Edit_Objects_Mine"
+ layout="topleft"
+ left_pad="3"
+ right="-95"
+ name="permission_edit_mine_icon"
+ tool_tip="This friend can edit, delete or take your objects"
+ top_delta="0"
+ width="20" />
+ <icon
+ height="20"
+ follows="right"
+ image_name="Permission_Edit_Objects_Theirs"
+ layout="topleft"
+ left_pad="3"
+ right="-72"
+ name="permission_edit_theirs_icon"
+ tool_tip="You can edit this friend&apos;s objects"
+ top_delta="0"
+ width="20" />
<button
follows="right"
height="16"
@@ -80,7 +124,7 @@
right="-53"
name="info_btn"
tab_stop="false"
- top_delta="-2"
+ top_delta="2"
width="16" />
<button
follows="right"
diff --git a/indra/newview/skins/default/xui/en/panel_edit_profile.xml b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
index 8715a3a7a8..903dcd4c24 100644
--- a/indra/newview/skins/default/xui/en/panel_edit_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_edit_profile.xml
@@ -320,7 +320,7 @@
left="10"
name="partner_edit_link"
value="[[URL] Edit]"
- width="50" />
+ width="70" />
</panel>
</panel>
</scroll_container>
diff --git a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
index eb02d4104b..2a3add161a 100644
--- a/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_info_sidetray.xml
@@ -84,7 +84,7 @@ background_visible="true"
follows="all"
left="8"
top_pad="0"
- height="536"
+ height="506"
width="292"
border_size="0">
<layout_panel
@@ -176,15 +176,27 @@ background_visible="true"
</accordion_tab>
</accordion>
</layout_panel>
- <layout_panel
+ </layout_stack>
+
+ <layout_stack
+ name="layout"
+ orientation="horizontal"
+ follows="bottom|left|right"
+ left="8"
+ top_pad="0"
+ height="30"
+ width="292"
+ border_size="0">
+
+ <layout_panel
height="30"
layout="topleft"
auto_resize="false"
left="0"
top_pad="0"
- name="button_row"
- follows="bottom|left|right"
- width="313">
+ name="button_row"
+ follows="bottom|left|right"
+ width="313">
<layout_stack
follows="bottom|left|right"
@@ -307,5 +319,7 @@ background_visible="true"
visible="false"
width="65" />-->
</layout_panel>
- </layout_stack>
+
+ </layout_stack>
+
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_landmark_info.xml b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
index c5d6aced7a..f8ae238148 100644
--- a/indra/newview/skins/default/xui/en/panel_landmark_info.xml
+++ b/indra/newview/skins/default/xui/en/panel_landmark_info.xml
@@ -57,7 +57,7 @@
translate="false"
value="Parcel_R_Dark" />
<button
- follows="top|right"
+ follows="top|left"
height="24"
image_hover_unselected="BackButton_Over"
image_pressed="BackButton_Press"
diff --git a/indra/newview/skins/default/xui/en/panel_me.xml b/indra/newview/skins/default/xui/en/panel_me.xml
index 63c522ac69..84b5d11ba7 100644
--- a/indra/newview/skins/default/xui/en/panel_me.xml
+++ b/indra/newview/skins/default/xui/en/panel_me.xml
@@ -26,7 +26,7 @@
</text> -->
<tab_container
follows="all"
- height="575"
+ height="555"
halign="center"
layout="topleft"
left="5"
diff --git a/indra/newview/skins/default/xui/en/panel_my_profile.xml b/indra/newview/skins/default/xui/en/panel_my_profile.xml
index 684d38146a..37a1ed3048 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -41,7 +41,7 @@
layout="topleft"
left="0"
top="0"
- height="522"
+ height="510"
width="315"
border_size="0">
<layout_panel
@@ -324,82 +324,25 @@
</panel>
</scroll_container>
</layout_panel>
- <!-- <layout_panel
- follows="bottom|left"
+ </layout_stack>
+ <panel
+ follows="bottom|left|right"
+ height="23"
layout="topleft"
left="0"
- name="profile_buttons_panel"
- height="28"
- width="313">
- <button
- follows="bottom|left"
- height="23"
- label="Add Friend"
- layout="topleft"
- left="0"
- mouse_opaque="false"
- name="add_friend"
- tool_tip="Offer friendship to the Resident"
- top="5"
- width="80" />
- <button
- follows="bottom|left"
- height="23"
- label="IM"
- layout="topleft"
- name="im"
- top="5"
- left_pad="3"
- width="45" />
- <button
- follows="bottom|left"
- height="23"
- label="Call"
- layout="topleft"
- name="call"
- left_pad="3"
- top="5"
- width="45" />
- <button
- enabled="false"
- follows="bottom|left"
- height="23"
- label="Map"
- layout="topleft"
- name="show_on_map_btn"
- top="5"
- left_pad="3"
- width="45" />
- <button
- follows="bottom|left"
- height="23"
- label="Teleport"
- layout="topleft"
- name="teleport"
- left_pad="3"
- top="5"
- width="85" />
- </panel>-->
- <layout_panel
- follows="bottom|left"
- layout="topleft"
- left="0"
- top_pad="0"
+ top_pad="1"
name="profile_me_buttons_panel"
visible="false"
- user_resize="false"
- auto_resize="false"
- height="28"
width="315">
<button
follows="bottom"
height="23"
left="6"
- top="1"
+ top="1"
label="Edit Profile"
name="edit_profile_btn"
tool_tip="Edit your personal information"
width="152" />
- </layout_panel>
-</layout_stack>
+ </panel>
+
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_notes.xml b/indra/newview/skins/default/xui/en/panel_notes.xml
index 530e191952..124b1cfc6b 100644
--- a/indra/newview/skins/default/xui/en/panel_notes.xml
+++ b/indra/newview/skins/default/xui/en/panel_notes.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="all"
- height="533"
+ height="515"
label="Notes &amp; Privacy"
layout="topleft"
left="0"
diff --git a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
index 1cbdecab9d..883cbb30c6 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -295,7 +295,7 @@ It is calculated as border_size + 2*UIResizeBarOverlap
auto_resize="true"
default_tab_group="3"
height="450"
- min_height="73"
+ min_height="80"
name="add_wearables_panel"
width="313"
tab_group="2"
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 059283ce09..ab8930c967 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -192,6 +192,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="0"
multi_select="true"
name="avatars_online"
+ show_permissions_granted="true"
top="0"
width="307" />
</accordion_tab>
@@ -208,6 +209,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
left="0"
multi_select="true"
name="avatars_all"
+ show_permissions_granted="true"
top="0"
width="307" />
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/en/panel_picks.xml b/indra/newview/skins/default/xui/en/panel_picks.xml
index 647be28a62..4f7c4fa9b2 100644
--- a/indra/newview/skins/default/xui/en/panel_picks.xml
+++ b/indra/newview/skins/default/xui/en/panel_picks.xml
@@ -30,7 +30,7 @@ bg_opaque_color="DkGray2"
<accordion
fit_parent="true"
follows="all"
- height="470"
+ height="485"
layout="topleft"
left="0"
name="accordion"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
index ba967d3e2c..31e160ec33 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_chat.xml
@@ -104,7 +104,7 @@
layout="topleft"
left="190"
name="agent"
- top_pad="-17"
+ top_pad="-15"
width="44" >
<color_swatch.init_callback
function="Pref.getUIColor"
@@ -135,7 +135,7 @@
layout="topleft"
left="360"
name="im"
- top_pad="-17"
+ top_pad="-15"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
@@ -166,7 +166,7 @@
layout="topleft"
left="40"
name="system"
- top_pad="40"
+ top_pad="22"
width="44" >
<color_swatch.init_callback
function="Pref.getUIColor"
@@ -196,7 +196,7 @@
layout="topleft"
left="190"
name="script_error"
- top_pad="-17"
+ top_pad="-15"
width="44">
<color_swatch.init_callback
function="Pref.getUIColor"
@@ -226,7 +226,7 @@
layout="topleft"
left="360"
name="objects"
- top_pad="-17"
+ top_pad="-15"
width="44" >
<color_swatch.init_callback
function="Pref.getUIColor"
@@ -256,7 +256,7 @@
layout="topleft"
left="40"
name="owner"
- top_pad="40"
+ top_pad="22"
width="44" >
<color_swatch.init_callback
function="Pref.getUIColor"
@@ -286,7 +286,7 @@
layout="topleft"
left="190"
name="links"
- top_pad="-17"
+ top_pad="-15"
width="44" >
<color_swatch.init_callback
function="Pref.getUIColor"
@@ -316,7 +316,7 @@
layout="topleft"
left="30"
name="play_typing_animation"
- top_pad="40"
+ top_pad="32"
width="400" />
<check_box
enabled="false"
@@ -343,7 +343,7 @@
left="30"
height="20"
width="170"
- top_pad="20">
+ top_pad="14">
Show IMs in:
</text>
<text
@@ -386,4 +386,106 @@
top_pad="5"
width="150" />
</radio_group>
+ <check_box
+ control_name="TranslateChat"
+ enabled="true"
+ height="16"
+ label="Use machine translation while chatting (powered by Google)"
+ layout="topleft"
+ left="30"
+ name="translate_chat_checkbox"
+ bottom_delta="40"
+ width="400" />
+ <text
+ bottom_delta="30"
+ name="translate_language_text"
+ follows="left|top"
+ layout="topleft"
+ left_delta="20"
+ height="20"
+ width="110">
+ Translate chat into:
+ </text>
+ <combo_box
+ allow_text_entry="true"
+ bottom_delta="3"
+ control_name="TranslateLanguage"
+ enabled="true"
+ follows="left|top"
+ height="23"
+ left_delta="110"
+ max_chars="135"
+ mouse_opaque="true"
+ name="translate_language_combobox"
+ width="146">
+ <combo_box.item
+ label="System Default"
+ name="System Default Language"
+ value="default" />
+ <combo_box.item
+ label="English"
+ name="English"
+ value="en" />
+ <!-- After "System Default" and "English", please keep the rest of these combo_box.items in alphabetical order by the first character in the string. -->
+ <combo_box.item
+ label="Dansk (Danish)"
+ name="Danish"
+ value="da" />
+ <combo_box.item
+ label="Deutsch (German)"
+ name="German"
+ value="de" />
+ <combo_box.item
+ label="Español (Spanish)"
+ name="Spanish"
+ value="es" />
+ <combo_box.item
+ label="Français (French)"
+ name="French"
+ value="fr" />
+ <combo_box.item
+ label="Italiano (Italian)"
+ name="Italian"
+ value="it" />
+ <combo_box.item
+ label="Magyar (Hungarian)"
+ name="Hungarian"
+ value="hu" />
+ <combo_box.item
+ label="Nederlands (Dutch)"
+ name="Dutch"
+ value="nl" />
+ <combo_box.item
+ label="Polski (Polish)"
+ name="Polish"
+ value="pl" />
+ <combo_box.item
+ label="Português (Portuguese)"
+ name="Portugese"
+ value="pt" />
+ <combo_box.item
+ label="Русский (Russian)"
+ name="Russian"
+ value="ru" />
+ <combo_box.item
+ label="Türkçe (Turkish)"
+ name="Turkish"
+ value="tr" />
+ <combo_box.item
+ label="Українська (Ukrainian)"
+ name="Ukrainian"
+ value="uk" />
+ <combo_box.item
+ label="中文 (简体) (Chinese)"
+ name="Chinese"
+ value="zh" />
+ <combo_box.item
+ label="日本語 (Japanese)"
+ name="Japanese"
+ value="ja" />
+ <combo_box.item
+ label="한국어 (Korean)"
+ name="Korean"
+ value="ko" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_general.xml b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
index a69e8d29b0..17eebffa02 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_general.xml
@@ -77,7 +77,7 @@
value="pl" />
<combo_box.item
enabled="true"
- label="Portugués (Portuguese) - Beta"
+ label="Português (Portuguese) - Beta"
name="Portugese"
value="pt" />
<combo_box.item
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index 88d7e68894..e2cd27c419 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -1,7 +1,7 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<panel
follows="all"
- height="540"
+ height="430"
label="Profile"
layout="topleft"
left="0"
@@ -41,7 +41,7 @@
layout="topleft"
left="0"
top="0"
- height="524"
+ height="400"
width="317"
border_size="0">
<layout_panel
@@ -50,7 +50,7 @@
layout="topleft"
top="0"
left="0"
- height="524"
+ height="400"
width="317">
<scroll_container
color="DkGray2"
@@ -304,11 +304,25 @@
</panel>
</scroll_container>
</layout_panel>
- <layout_panel
+
+</layout_stack>
+
+ <layout_stack
+ name="layout_verb_buttons"
+ orientation="horizontal"
+ follows="bottom|left|right"
+ layout="topleft"
+ left="2"
+ top_pad="1"
+ height="30"
+ width="315"
+ border_size="0">
+ <layout_panel
follows="bottom|left"
height="30"
layout="topleft"
name="profile_buttons_panel"
+ top="0"
auto_resize="false"
width="317">
@@ -448,6 +462,6 @@
tool_tip="Edit your personal information"
width="130" />
</layout_panel>
+ </layout_stack>
-</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile_view.xml b/indra/newview/skins/default/xui/en/panel_profile_view.xml
index 41c7b95c9f..3b4d6ae58d 100644
--- a/indra/newview/skins/default/xui/en/panel_profile_view.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile_view.xml
@@ -56,7 +56,7 @@
width="150" />
<tab_container
follows="all"
- height="538"
+ height="515"
halign="center"
layout="topleft"
left="5"
diff --git a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
index 4f923f411c..182bc29e27 100644
--- a/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
+++ b/indra/newview/skins/default/xui/en/sidepanel_item_info.xml
@@ -79,333 +79,342 @@
use_ellipses="true"
value="(Inventory)"
width="275" />
- <panel
- follows="all"
- height="493"
- help_topic=""
- label=""
- layout="topleft"
- left="9"
- name="item_profile"
- top="45"
- width="313"
- background_visible="true"
- bg_alpha_color="DkGray2">
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="5"
- name="LabelItemNameTitle"
- top="10"
- width="78">
- Name:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="20"
- layout="topleft"
- left_delta="78"
- max_length="63"
- name="LabelItemName"
- top_delta="0"
- width="225" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="10"
- layout="topleft"
- left="5"
- name="LabelItemDescTitle"
- top_pad="10"
- width="78">
- Description:
- </text>
- <line_editor
- border_style="line"
- border_thickness="1"
- follows="left|top|right"
- height="23"
- layout="topleft"
- left_delta="78"
- max_length="127"
- name="LabelItemDesc"
- top_delta="-5"
- width="225" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="LabelCreatorTitle"
- top_pad="10"
- width="78">
- Creator:
- </text>
- <avatar_icon
- follows="top|left"
- height="20"
- default_icon_name="Generic_Person"
- layout="topleft"
- left_pad="0"
- top_delta="-6"
- mouse_opaque="true"
- width="20" />
- <text
- type="string"
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
+ <scroll_container
+ color="DkGray2"
+ follows="all"
layout="topleft"
- left_pad="5"
- name="LabelCreatorName"
- top_delta="6"
- width="140">
- </text>
- <button
- follows="top|right"
- height="16"
- image_selected="Inspector_I"
- image_unselected="Inspector_I"
- layout="topleft"
- right="-5"
- name="BtnCreator"
- top_delta="-6"
- width="16" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="LabelOwnerTitle"
- top_pad="10"
- width="78">
- Owner:
- </text>
- <avatar_icon
- follows="top|left"
- height="20"
- default_icon_name="Generic_Person"
- layout="topleft"
- left_pad="0"
- top_delta="-6"
- mouse_opaque="true"
- width="20" />
- <text
- type="string"
- follows="left|right|top"
- font="SansSerifSmall"
- height="15"
- layout="topleft"
- left_pad="5"
- name="LabelOwnerName"
- top_delta="6"
- width="140">
- </text>
- <button
- follows="top|right"
- height="16"
- image_selected="Inspector_I"
- image_unselected="Inspector_I"
- layout="topleft"
- right="-5"
- name="BtnOwner"
- top_delta="-3"
- width="16" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="23"
- layout="topleft"
- left="5"
- name="LabelAcquiredTitle"
-top_pad="10"
- width="78">
- Acquired:
- </text>
- <text
- type="string"
- length="1"
- follows="left|top|right"
- height="23"
- layout="topleft"
- left_delta="78"
- name="LabelAcquiredDate"
- top_delta="0"
- width="222">
- </text>
- <panel
- border="false"
- follows="left|top|right"
+ left="9"
+ name="item_profile_scroll"
+ opaque="true"
+ height="493"
+ width="313"
+ top="45">
+ <panel
+ follows="left|top|right"
+ height="390"
+ help_topic=""
+ label=""
+ layout="topleft"
+ left="0"
+ name="item_profile"
+ top="0"
+ width="295">
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="LabelItemNameTitle"
+ top="10"
+ width="78">
+ Name:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="20"
+ layout="topleft"
+ left_delta="78"
+ max_length="63"
+ name="LabelItemName"
+ top_delta="0"
+ width="210" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="10"
+ layout="topleft"
+ left="5"
+ name="LabelItemDescTitle"
+ top_pad="10"
+ width="78">
+ Description:
+ </text>
+ <line_editor
+ border_style="line"
+ border_thickness="1"
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left_delta="78"
+ max_length="127"
+ name="LabelItemDesc"
+ top_delta="-5"
+ width="210" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelCreatorTitle"
+ top_pad="10"
+ width="78">
+ Creator:
+ </text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
layout="topleft"
- mouse_opaque="false"
- name="perms_inv"
- left="0"
- top_pad="25"
- height="155"
- width="313">
- <text
- type="string"
- length="1"
- left="10"
- top_pad="13"
- text_color="EmphasisColor"
- height="15"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="LabelCreatorName"
+ top_delta="6"
+ width="140">
+ </text>
+ <button
+ follows="top|right"
+ height="16"
+ image_selected="Inspector_I"
+ image_unselected="Inspector_I"
+ layout="topleft"
+ right="-5"
+ name="BtnCreator"
+ top_delta="-6"
+ width="16" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelOwnerTitle"
+ top_pad="10"
+ width="78">
+ Owner:
+ </text>
+ <avatar_icon
+ follows="top|left"
+ height="20"
+ default_icon_name="Generic_Person"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-6"
+ mouse_opaque="true"
+ width="20" />
+ <text
+ type="string"
+ follows="left|right|top"
+ font="SansSerifSmall"
+ height="15"
+ layout="topleft"
+ left_pad="5"
+ name="LabelOwnerName"
+ top_delta="6"
+ width="140">
+ </text>
+ <button
+ follows="top|right"
+ height="16"
+ image_selected="Inspector_I"
+ image_unselected="Inspector_I"
+ layout="topleft"
+ right="-5"
+ name="BtnOwner"
+ top_delta="-3"
+ width="16" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="23"
+ layout="topleft"
+ left="5"
+ name="LabelAcquiredTitle"
+ top_pad="10"
+ width="78">
+ Acquired:
+ </text>
+ <text
+ type="string"
+ length="1"
+ follows="left|top|right"
+ height="23"
+ layout="topleft"
+ left_delta="78"
+ name="LabelAcquiredDate"
+ top_delta="0"
+ width="210">
+ </text>
+ <panel
+ border="false"
follows="left|top|right"
layout="topleft"
- name="perm_modify"
- width="200">
- You can:
+ mouse_opaque="false"
+ name="perms_inv"
+ left="0"
+ top_pad="25"
+ height="155"
+ width="313">
+ <text
+ type="string"
+ length="1"
+ left="10"
+ top_pad="13"
+ text_color="EmphasisColor"
+ height="15"
+ follows="left|top|right"
+ layout="topleft"
+ name="perm_modify"
+ width="200">
+ You can:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ name="CheckOwnerModify"
+ top_pad="0"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckOwnerCopy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="CheckOwnerTransfer"
+ width="106" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="AnyoneLabel"
+ top_pad="8"
+ width="100">
+ Anyone:
</text>
- <check_box
- height="18"
- label="Modify"
- layout="topleft"
- left="20"
- name="CheckOwnerModify"
- top_pad="0"
- width="90" />
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckOwnerCopy"
- width="90" />
- <check_box
- height="18"
- label="Transfer"
- layout="topleft"
- left_pad="0"
- name="CheckOwnerTransfer"
- width="106" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="AnyoneLabel"
- top_pad="8"
- width="100">
- Anyone:
- </text>
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckEveryoneCopy"
- top_delta="-2"
- width="150" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="GroupLabel"
- top_pad="8"
- width="100">
- Group:
- </text>
- <check_box
- height="18"
- label="Share"
- layout="topleft"
- left_pad="0"
- top_delta="-2"
- name="CheckShareWithGroup"
- tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
- width="150" />
- <text
- type="string"
- length="1"
- follows="left|top"
- height="16"
- layout="topleft"
- left="10"
- name="NextOwnerLabel"
- top_pad="8"
- width="200"
- word_wrap="true">
- Next owner:
- </text>
- <check_box
- height="18"
- label="Modify"
- layout="topleft"
- left="20"
- top_pad="0"
- name="CheckNextOwnerModify"
- width="90" />
- <check_box
- height="18"
- label="Copy"
- layout="topleft"
- left_pad="0"
- name="CheckNextOwnerCopy"
- width="90" />
- <check_box
- height="18"
- label="Transfer"
- layout="topleft"
- left_pad="0"
- name="CheckNextOwnerTransfer"
- tool_tip="Next owner can give away or resell this object"
- width="106" />
- </panel>
- <check_box
- height="18"
- label="For Sale"
- layout="topleft"
- left="20"
- name="CheckPurchase"
- top_pad="20"
- width="100" />
- <combo_box
- height="23"
- left_pad="0"
- layout="topleft"
- follows="left|top"
- name="combobox sale copy"
- width="170">
- <combo_box.item
- label="Copy"
- name="Copy"
- value="Copy" />
- <combo_box.item
- label="Original"
- name="Original"
- value="Original" />
- </combo_box>
- <spinner
- follows="left|top"
- decimal_digits="0"
- increment="1"
- control_name="Edit Cost"
- name="Edit Cost"
- label="Price: L$"
- label_width="75"
- left="120"
- width="170"
- min_val="0"
- height="23"
- max_val="999999999"
- top_pad="10"/>
- </panel>
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckEveryoneCopy"
+ top_delta="-2"
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="GroupLabel"
+ top_pad="8"
+ width="100">
+ Group:
+ </text>
+ <check_box
+ height="18"
+ label="Share"
+ layout="topleft"
+ left_pad="0"
+ top_delta="-2"
+ name="CheckShareWithGroup"
+ tool_tip="Allow all members of the set group to share your modify permissions for this object. You must Deed to enable role restrictions."
+ width="150" />
+ <text
+ type="string"
+ length="1"
+ follows="left|top"
+ height="16"
+ layout="topleft"
+ left="10"
+ name="NextOwnerLabel"
+ top_pad="8"
+ width="200"
+ word_wrap="true">
+ Next owner:
+ </text>
+ <check_box
+ height="18"
+ label="Modify"
+ layout="topleft"
+ left="20"
+ top_pad="0"
+ name="CheckNextOwnerModify"
+ width="90" />
+ <check_box
+ height="18"
+ label="Copy"
+ layout="topleft"
+ left_pad="0"
+ name="CheckNextOwnerCopy"
+ width="90" />
+ <check_box
+ height="18"
+ label="Transfer"
+ layout="topleft"
+ left_pad="0"
+ name="CheckNextOwnerTransfer"
+ tool_tip="Next owner can give away or resell this object"
+ width="106" />
+ </panel>
+ <check_box
+ height="18"
+ label="For Sale"
+ layout="topleft"
+ left="20"
+ name="CheckPurchase"
+ top_pad="20"
+ width="100" />
+ <combo_box
+ height="23"
+ left_pad="0"
+ layout="topleft"
+ follows="left|top"
+ name="combobox sale copy"
+ width="170">
+ <combo_box.item
+ label="Copy"
+ name="Copy"
+ value="Copy" />
+ <combo_box.item
+ label="Original"
+ name="Original"
+ value="Original" />
+ </combo_box>
+ <spinner
+ follows="left|top"
+ decimal_digits="0"
+ increment="1"
+ control_name="Edit Cost"
+ name="Edit Cost"
+ label="Price: L$"
+ label_width="75"
+ left="120"
+ width="170"
+ min_val="0"
+ height="23"
+ max_val="999999999"
+ top_pad="10"/>
+ </panel>
+ </scroll_container>
<panel
height="30"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 72639f08ee..3fa5c7afec 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -2225,7 +2225,7 @@ Clears (deletes) the media and all params from the given face.
<!-- panel picks -->
<string name="NoPicksClassifiedsText">You haven't created any Picks or Classifieds. Click the Plus button below to create a Pick or Classified.</string>
- <string name="NoAvatarPicksClassifiedsText">User has no picks or classfields</string>
+ <string name="NoAvatarPicksClassifiedsText">User has no picks or classifieds</string>
<string name="PicksClassifiedsLoadingText">Loading...</string>
<!-- Multi Preview Floater -->
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
index fc8c908788..22f967afe6 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_chat.xml
@@ -56,4 +56,27 @@
<radio_item label="Varias ventanas" name="radio" value="0"/>
<radio_item label="Pestañas" name="radio2" value="1"/>
</radio_group>
+ <check_box label="Traducir Chat" name="translate_chat_checkbox" />
+ <text name="translate_language_text">
+ Idioma de chat:
+ </text>
+ <combo_box name="translate_language_combobox">
+ <combo_box.item name="System Default Language" label="Predeterminado del sistema" />
+ <combo_box.item name="English" label="English (Inglés)" />
+ <combo_box.item name="Danish" label="Dansk (Danés)" />
+ <combo_box.item name="German" label="Deutsch (Alemán)" />
+ <combo_box.item name="Spanish" label="Español" />
+ <combo_box.item name="French" label="Français (Francés)" />
+ <combo_box.item name="Italian" label="Italiano" />
+ <combo_box.item name="Hungarian" label="Magyar (Húngaro)" />
+ <combo_box.item name="Dutch" label="Nederlands (Neerlandés)" />
+ <combo_box.item name="Polish" label="Polski (Polaco)" />
+ <combo_box.item name="Portugese" label="Português (Portugués)" />
+ <combo_box.item name="Russian" label="Русский (Ruso)" />
+ <combo_box.item name="Turkish" label="Türkçe (Turco)" />
+ <combo_box.item name="Ukrainian" label="Українська (Ucraniano)" />
+ <combo_box.item name="Chinese" label="中文 (简体) (Chino)" />
+ <combo_box.item name="Japanese" label="日本語 (Japonés)" />
+ <combo_box.item name="Korean" label="한국어 (Coreano)" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/es/panel_preferences_general.xml b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
index ca157314aa..20109cf2c5 100644
--- a/indra/newview/skins/default/xui/es/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/es/panel_preferences_general.xml
@@ -13,7 +13,7 @@
<combo_box.item label="Italiano - Beta" name="Italian"/>
<combo_box.item label="Nederlands (Neerlandés) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polaco) - Beta" name="Polish"/>
- <combo_box.item label="Portugués (Portugués) - Beta" name="Portugese"/>
+ <combo_box.item label="Português (Portugués) - Beta" name="Portugese"/>
<combo_box.item label="日本語 (Japonés) - Beta" name="(Japanese)"/>
</combo_box>
<text name="language_textbox2">
diff --git a/indra/newview/skins/default/xui/es/strings.xml b/indra/newview/skins/default/xui/es/strings.xml
index 9f5f1f99e7..971b725d39 100644
--- a/indra/newview/skins/default/xui/es/strings.xml
+++ b/indra/newview/skins/default/xui/es/strings.xml
@@ -1120,6 +1120,9 @@
<string name="InvFolder Favorite">
Favoritos
</string>
+ <string name="InvFolder favorite">
+ Favoritos
+ </string>
<string name="InvFolder Current Outfit">
Vestuario actual
</string>
diff --git a/indra/newview/skins/default/xui/fr/floater_about_land.xml b/indra/newview/skins/default/xui/fr/floater_about_land.xml
index 5263de4532..0b7a813e73 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -343,9 +343,9 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
Options du terrain :
</text>
<check_box label="Sécurisé (pas de dégâts)" name="check safe" tool_tip="Si cette option est cochée, le terrain est sécurisé et il n&apos;y pas de risques de dommages causés par des combats. Si elle est décochée, des dommages causés par les combats peuvent avoir lieu."/>
- <check_box bottom="-140" label="Pas de bousculades" left="14" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
- <check_box bottom="-160" label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
- <combo_box bottom="-160" left="286" name="land category with adult" width="146">
+ <check_box label="Pas de bousculades" name="PushRestrictCheck" tool_tip="Empêche l&apos;utilisation de scripts causant des bousculades. Cette option est utile pour empêcher les comportements abusifs sur votre terrain."/>
+ <check_box label="Afficher le lieu dans la recherche (30 L$/semaine)" name="ShowDirectoryCheck" tool_tip="Afficher la parcelle dans les résultats de recherche"/>
+ <combo_box name="land category with adult">
<combo_box.item label="Toutes catégories" name="item0"/>
<combo_box.item label="Appartenant aux Lindens" name="item1"/>
<combo_box.item label="Adult" name="item2"/>
@@ -360,7 +360,7 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="Autre" name="item12"/>
</combo_box>
- <combo_box bottom="-160" left="286" name="land category" width="146">
+ <combo_box name="land category">
<combo_box.item label="Toutes catégories" name="item0"/>
<combo_box.item label="Appartenant aux Lindens" name="item1"/>
<combo_box.item label="Art et Culture" name="item3"/>
@@ -374,20 +374,20 @@ Seules les parcelles de grande taille peuvent apparaître dans la recherche.
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="Autre" name="item12"/>
</combo_box>
- <check_box bottom="-180" label="Contenu Modéré" name="MatureCheck" tool_tip=""/>
- <text bottom="-200" name="Snapshot:">
+ <check_box label="Contenu Modéré" name="MatureCheck" tool_tip=""/>
+ <text name="Snapshot:">
Photo :
</text>
- <texture_picker bottom="-319" label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
+ <texture_picker label="" name="snapshot_ctrl" tool_tip="Cliquez pour sélectionner une image"/>
<text name="landing_point">
Lieu d&apos;arrivée : [LANDING]
</text>
<button label="Définir" label_selected="Définir" name="Set" tool_tip="Définit le point d&apos;arrivée des visiteurs. Définit l&apos;emplacement de votre avatar sur ce terrain."/>
<button label="Annuler" label_selected="Annuler" name="Clear" tool_tip="Effacer le lieu d&apos;arrivée"/>
- <text bottom="-343" name="Teleport Routing: ">
+ <text name="Teleport Routing: ">
Règles de téléportation :
</text>
- <combo_box bottom="-343" left="140" name="landing type" tool_tip="Règles de téléportation - Choisissez les règles de téléportation sur votre terrain" width="140">
+ <combo_box name="landing type" tool_tip="Règles de téléportation - Choisissez les règles de téléportation sur votre terrain" width="140">
<combo_box.item label="Bloqué" name="Blocked"/>
<combo_box.item label="Lieu d&apos;arrivée fixe" name="LandingPoint"/>
<combo_box.item label="Lieu d&apos;arrivée libre" name="Anywhere"/>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
index 76f3319525..ed1107f5e6 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_chat.xml
@@ -56,4 +56,27 @@
<radio_item label="Plusieurs fenêtres" name="radio" value="0"/>
<radio_item label="Onglets" name="radio2" value="1"/>
</radio_group>
+ <check_box label="Traduire Chat" name="translate_chat_checkbox" />
+ <text name="translate_language_text">
+ Langue de chat :
+ </text>
+ <combo_box name="translate_language_combobox">
+ <combo_box.item name="System Default Language" label="Choix par défaut" />
+ <combo_box.item name="English" label="English (Anglais)" />
+ <combo_box.item name="Danish" label="Dansk (Danois)" />
+ <combo_box.item name="German" label="Deutsch (Allemand)" />
+ <combo_box.item name="Spanish" label="Español (Espagnol)" />
+ <combo_box.item name="French" label="Français" />
+ <combo_box.item name="Italian" label="Italiano (Italien)" />
+ <combo_box.item name="Hungarian" label="Magyar (Hongrois)" />
+ <combo_box.item name="Dutch" label="Nederlands (Néerlandais)" />
+ <combo_box.item name="Polish" label="Polski (Polonais)" />
+ <combo_box.item name="Portugese" label="Português (Portugais)" />
+ <combo_box.item name="Russian" label="Русский (Russe)" />
+ <combo_box.item name="Turkish" label="Türkçe (Turc)" />
+ <combo_box.item name="Ukrainian" label="Українська (Ukrainien)" />
+ <combo_box.item name="Chinese" label="中文 (简体) (Chinois)" />
+ <combo_box.item name="Japanese" label="日本語 (Japonais)" />
+ <combo_box.item name="Korean" label="한국어 (Coréen)" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
index 3245132972..20d5f754ce 100644
--- a/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/fr/panel_preferences_general.xml
@@ -13,7 +13,7 @@
<combo_box.item label="Italiano (Italien) - Bêta" name="Italian"/>
<combo_box.item label="Nederlands (Néerlandais) - Bêta" name="Dutch"/>
<combo_box.item label="Polski (Polonais) - Bêta" name="Polish"/>
- <combo_box.item label="Portugués (Portugais) - Bêta" name="Portugese"/>
+ <combo_box.item label="Português (Portugais) - Bêta" name="Portugese"/>
<combo_box.item label="日本語 (Japonais) - Bêta" name="(Japanese)"/>
</combo_box>
<text name="language_textbox2">
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index f221e42e9a..159281f97f 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -1147,6 +1147,9 @@
<string name="InvFolder Favorite">
Favoris
</string>
+ <string name="InvFolder favorite">
+ Favoris
+ </string>
<string name="InvFolder Current Outfit">
Tenue actuelle
</string>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
index fb8ddf607d..d28ed41698 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_chat.xml
@@ -56,4 +56,27 @@
<radio_item label="Finestre separate" name="radio" value="0"/>
<radio_item label="Schede" name="radio2" value="1"/>
</radio_group>
+ <check_box label="Traduci Chat" name="translate_chat_checkbox" />
+ <text name="translate_language_text" width="110">
+ Chat Lingua:
+ </text>
+ <combo_box name="translate_language_combobox" width="146">
+ <combo_box.item name="System Default Language" label="Default di sistema" />
+ <combo_box.item name="English" label="English" />
+ <combo_box.item name="Danish" label="Dansk (Danese)" />
+ <combo_box.item name="German" label="Deutsch (Tedesco)" />
+ <combo_box.item name="Spanish" label="Español (Spagnolo)" />
+ <combo_box.item name="French" label="Français (Francese)" />
+ <combo_box.item name="Italian" label="Italiano" />
+ <combo_box.item name="Hungarian" label="Magyar (Ungherese)" />
+ <combo_box.item name="Dutch" label="Nederlands (Olandese)" />
+ <combo_box.item name="Polish" label="Polski (Polacco)" />
+ <combo_box.item name="Portugese" label="Português (Portoghese)" />
+ <combo_box.item name="Russian" label="Русский (Russo)" />
+ <combo_box.item name="Turkish" label="Türkçe (Turco)" />
+ <combo_box.item name="Ukrainian" label="Українська (Ukraino)" />
+ <combo_box.item name="Chinese" label="中文 (简体) (Cinese)" />
+ <combo_box.item name="Japanese" label="日本語 (Giapponese)" />
+ <combo_box.item name="Korean" label="한국어 (Coreano)" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/it/panel_preferences_general.xml b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
index e8c826609c..60c4ed5211 100644
--- a/indra/newview/skins/default/xui/it/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/it/panel_preferences_general.xml
@@ -13,7 +13,7 @@
<combo_box.item label="Italiano - Beta" name="Italian"/>
<combo_box.item label="Nederlands (Olandese) - Beta" name="Dutch"/>
<combo_box.item label="Polski (Polacco) - Beta" name="Polish"/>
- <combo_box.item label="Portugués (Portoghese) - Beta" name="Portugese"/>
+ <combo_box.item label="Português (Portoghese) - Beta" name="Portugese"/>
<combo_box.item label="日本語 (Giapponese) - Beta" name="(Japanese)"/>
</combo_box>
<text name="language_textbox2">
diff --git a/indra/newview/skins/default/xui/it/strings.xml b/indra/newview/skins/default/xui/it/strings.xml
index fb479b4653..fa465ee9c2 100644
--- a/indra/newview/skins/default/xui/it/strings.xml
+++ b/indra/newview/skins/default/xui/it/strings.xml
@@ -1126,6 +1126,9 @@
<string name="InvFolder Favorite">
Preferiti
</string>
+ <string name="InvFolder favorite">
+ Preferiti
+ </string>
<string name="InvFolder Current Outfit">
Abbigliamento attuale
</string>
diff --git a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
index 86f880de09..4082f71a76 100644
--- a/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/ja/panel_preferences_chat.xml
@@ -56,4 +56,27 @@
<radio_item label="別々のウィンドウ" name="radio" value="0"/>
<radio_item label="タブ" name="radio2" value="1"/>
</radio_group>
+ <check_box label="翻訳チャット" name="translate_chat_checkbox" />
+ <text name="translate_language_text">
+ チャット言語:
+ </text>
+ <combo_box name="translate_language_combobox">
+ <combo_box.item name="System Default Language" label="システム・デフォルト" />
+ <combo_box.item name="English" label="English (英語)" />
+ <combo_box.item name="Danish" label="Dansk (デンマーク語)" />
+ <combo_box.item name="German" label="Deutsch (ドイツ語)" />
+ <combo_box.item name="Spanish" label="Español (スペイン語)" />
+ <combo_box.item name="French" label="Français (フランス語)" />
+ <combo_box.item name="Italian" label="Italiano (イタリア語)" />
+ <combo_box.item name="Hungarian" label="Magyar (ハンガリー語)" />
+ <combo_box.item name="Dutch" label="Nederlands (オランダ語)" />
+ <combo_box.item name="Polish" label="Polski (ポーランド語)" />
+ <combo_box.item name="Portugese" label="Português (ポルトガル語)" />
+ <combo_box.item name="Russian" label="Русский (ロシア語)" />
+ <combo_box.item name="Turkish" label="Türkçe (トルコ語)" />
+ <combo_box.item name="Ukrainian" label="Українська (ウクライナ語)" />
+ <combo_box.item name="Chinese" label="中文 (简体) (中国語)" />
+ <combo_box.item name="Japanese" label="日本語" />
+ <combo_box.item name="Korean" label="한국어 (韓国語)" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/ja/strings.xml b/indra/newview/skins/default/xui/ja/strings.xml
index b68b68a4f8..dd59065a9d 100644
--- a/indra/newview/skins/default/xui/ja/strings.xml
+++ b/indra/newview/skins/default/xui/ja/strings.xml
@@ -1147,6 +1147,9 @@
<string name="InvFolder Favorite">
お気に入り
</string>
+ <string name="InvFolder favorite">
+ お気に入り
+ </string>
<string name="InvFolder Current Outfit">
着用中のアウトフィット
</string>
diff --git a/indra/newview/skins/default/xui/nl/panel_preferences_general.xml b/indra/newview/skins/default/xui/nl/panel_preferences_general.xml
index 9d9010a349..7be570b27f 100644
--- a/indra/newview/skins/default/xui/nl/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/nl/panel_preferences_general.xml
@@ -78,7 +78,7 @@
<combo_box.item name="Hungarian" label="Magyar (Hongaars) - Bèta"/>
<combo_box.item name="Dutch" label="Nederlands - Bèta"/>
<combo_box.item name="Polish" label="Polski (Pools) - Bèta"/>
- <combo_box.item name="Portugese" label="Portugués (Portugees) - Bèta"/>
+ <combo_box.item name="Portugese" label="Português (Portugees) - Bèta"/>
<combo_box.item name="Russian" label="Русский (Russisch) - Bèta"/>
<combo_box.item name="Turkish" label="Türkçe (Turks) - Bèta"/>
<combo_box.item name="Ukrainian" label="Українська (Oekraïens) - Bèta"/>
diff --git a/indra/newview/skins/default/xui/nl/strings.xml b/indra/newview/skins/default/xui/nl/strings.xml
index 25071b5460..1ee26c3f24 100644
--- a/indra/newview/skins/default/xui/nl/strings.xml
+++ b/indra/newview/skins/default/xui/nl/strings.xml
@@ -912,6 +912,9 @@
<string name="InvFolder Favorite">
Favoriten
</string>
+ <string name="InvFolder favorite">
+ Favoriten
+ </string>
<string name="InvFolder Current Outfit">
Huidige Uitrusting
</string>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
index 5805df402c..e980d71ce4 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_chat.xml
@@ -56,4 +56,27 @@
<radio_item label="Osobne okna" name="radio" value="0"/>
<radio_item label="Etykiety" name="radio2" value="1"/>
</radio_group>
+ <check_box label="Przetłumacz Czat" name="translate_chat_checkbox" />
+ <text name="translate_language_text">
+ Czat Język:
+ </text>
+ <combo_box name="translate_language_combobox">
+ <combo_box.item name="System Default Language" label="Domyślny" />
+ <combo_box.item name="English" label="English (Angielski)" />
+ <combo_box.item name="Danish" label="Dansk (Duński)" />
+ <combo_box.item name="German" label="Deutsch (Niemiecki)" />
+ <combo_box.item name="Spanish" label="Español (Hiszpański)" />
+ <combo_box.item name="French" label="Français (Francuski)" />
+ <combo_box.item name="Italian" label="Italiano (Włoski)" />
+ <combo_box.item name="Hungarian" label="Magyar (Węgierski)" />
+ <combo_box.item name="Dutch" label="Nederlands (Niderlandzki)" />
+ <combo_box.item name="Polish" label="Polski" />
+ <combo_box.item name="Portugese" label="Português (Portugalski)" />
+ <combo_box.item name="Russian" label="Русский (Rosyjski)" />
+ <combo_box.item name="Turkish" label="Türkçe (Turecki)" />
+ <combo_box.item name="Ukrainian" label="Українська (Ukraiński)" />
+ <combo_box.item name="Chinese" label="中文 (简体) (Chiński)" />
+ <combo_box.item name="Japanese" label="日本語 (Japoński)" />
+ <combo_box.item name="Korean" label="한국어 (Koreański)" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
index 69686bcdbc..65ea349aec 100644
--- a/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
+++ b/indra/newview/skins/default/xui/pl/panel_preferences_general.xml
@@ -13,7 +13,7 @@
<combo_box.item label="Italiano (Włoski) - Beta" name="Italian"/>
<combo_box.item label="Nederlands (Niderlandzki) - Beta" name="Dutch"/>
<combo_box.item label="Polski - Beta" name="Polish"/>
- <combo_box.item label="Portugués (Portugalski) - Beta" name="Portugese"/>
+ <combo_box.item label="Português (Portugalski) - Beta" name="Portugese"/>
<combo_box.item label="日本語 (Japoński) - Beta" name="(Japanese)"/>
</combo_box>
<text name="language_textbox2">
diff --git a/indra/newview/skins/default/xui/pl/strings.xml b/indra/newview/skins/default/xui/pl/strings.xml
index e2689720bf..f90e357373 100644
--- a/indra/newview/skins/default/xui/pl/strings.xml
+++ b/indra/newview/skins/default/xui/pl/strings.xml
@@ -1114,6 +1114,12 @@
<string name="InvFolder Gestures">
Gesturki
</string>
+ <string name="InvFolder Favorite">
+ Ulubione
+ </string>
+ <string name="InvFolder favorite">
+ Ulubione
+ </string>
<string name="InvFolder Current Outfit">
Obecny strój
</string>
diff --git a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
index 306487939e..9560a3b418 100644
--- a/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
+++ b/indra/newview/skins/default/xui/pt/floater_day_cycle_options.xml
@@ -52,8 +52,8 @@
Duração do Ciclo:
</text>
<spinner label="Hora" name="WLLengthOfDayHour"/>
- <spinner label="Minuto" name="WLLengthOfDayMin"/>
- <spinner label="Segundo" name="WLLengthOfDaySec"/>
+ <spinner label="Min." name="WLLengthOfDayMin"/>
+ <spinner label="Seg." name="WLLengthOfDaySec"/>
<text name="DayCycleText3">
Visualizar
</text>
diff --git a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
index 02b0ef35fe..1ec674e2e2 100644
--- a/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
+++ b/indra/newview/skins/default/xui/pt/panel_preferences_chat.xml
@@ -56,4 +56,27 @@
<radio_item label="Janelas separadas" name="radio" value="0"/>
<radio_item label="Guias" name="radio2" value="1"/>
</radio_group>
+ <check_box label="Traduzir Chat" name="translate_chat_checkbox" />
+ <text name="translate_language_text">
+ Chat Língua:
+ </text>
+ <combo_box name="translate_language_combobox">
+ <combo_box.item name="System Default Language" label="Padrão do Sistema" />
+ <combo_box.item name="English" label="English (Inglês)" />
+ <combo_box.item name="Danish" label="Dansk (Dinamarquês)" />
+ <combo_box.item name="German" label="Deutsch (Alemão)" />
+ <combo_box.item name="Spanish" label="Español (Espanhol)" />
+ <combo_box.item name="French" label="Français (Francês)" />
+ <combo_box.item name="Italian" label="Italiano" />
+ <combo_box.item name="Hungarian" label="Magyar (Húngaro)" />
+ <combo_box.item name="Dutch" label="Nederlands (Holandês)" />
+ <combo_box.item name="Polish" label="Polski (Polonês)" />
+ <combo_box.item name="Portugese" label="Português" />
+ <combo_box.item name="Russian" label="Русский (Russo)" />
+ <combo_box.item name="Turkish" label="Türkçe (Turco)" />
+ <combo_box.item name="Ukrainian" label="Українська (Ucraniano)" />
+ <combo_box.item name="Chinese" label="中文 (简体) (Chinês)" />
+ <combo_box.item name="Japanese" label="日本語 (Japonês)" />
+ <combo_box.item name="Korean" label="한국어 (Coreano)" />
+ </combo_box>
</panel>
diff --git a/indra/newview/skins/default/xui/pt/strings.xml b/indra/newview/skins/default/xui/pt/strings.xml
index 4bf2bda248..b6ecc9347b 100644
--- a/indra/newview/skins/default/xui/pt/strings.xml
+++ b/indra/newview/skins/default/xui/pt/strings.xml
@@ -1120,6 +1120,9 @@
<string name="InvFolder Favorite">
Favoritos
</string>
+ <string name="InvFolder favorite">
+ Favoritos
+ </string>
<string name="InvFolder Current Outfit">
Look atual
</string>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 08ba8c13b1..949fa3cc1c 100644
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -310,6 +310,7 @@ class WindowsManifest(ViewerManifest):
self.path(src="licenses-win32.txt", dst="licenses.txt")
self.path("featuretable.txt")
+ self.path("featuretable_xp.txt")
# For use in crash reporting (generates minidumps)
self.path("dbghelp.dll")