summaryrefslogtreecommitdiff
path: root/indra/newview
diff options
context:
space:
mode:
authorTofu Linden <tofu.linden@lindenlab.com>2010-04-28 12:41:34 +0100
committerTofu Linden <tofu.linden@lindenlab.com>2010-04-28 12:41:34 +0100
commit3e55def4e29e56b3c71f16af73059f2caf019e2e (patch)
treea0fdd2e429de4b5c6646207b2b186e1946146acd /indra/newview
parent4a501bb437f86175f6e8e2d015969595f55fa705 (diff)
parent96df3f3eb1351973d140ba73b507de44b1052c89 (diff)
merge from viewer-trunk
Diffstat (limited to 'indra/newview')
-rw-r--r--indra/newview/CMakeLists.txt25
-rw-r--r--indra/newview/app_settings/settings.xml11
-rw-r--r--indra/newview/llagent.cpp5
-rw-r--r--indra/newview/llagentwearables.cpp54
-rw-r--r--indra/newview/llagentwearables.h5
-rw-r--r--indra/newview/llagentwearablesfetch.cpp2
-rw-r--r--indra/newview/llappearancemgr.cpp365
-rw-r--r--indra/newview/llappearancemgr.h13
-rw-r--r--indra/newview/llappviewermacosx.cpp50
-rw-r--r--indra/newview/llavatarlist.cpp26
-rw-r--r--indra/newview/llchannelmanager.cpp52
-rw-r--r--indra/newview/llchatitemscontainerctrl.cpp4
-rw-r--r--indra/newview/llchiclet.h3
-rw-r--r--indra/newview/llcofwearables.cpp654
-rw-r--r--indra/newview/llcofwearables.h111
-rw-r--r--indra/newview/llfilteredwearablelist.cpp98
-rw-r--r--indra/newview/llfilteredwearablelist.h52
-rw-r--r--indra/newview/llfloaterbuyland.cpp9
-rw-r--r--indra/newview/llfolderview.cpp4
-rw-r--r--indra/newview/llgrouplist.cpp13
-rw-r--r--indra/newview/llimview.cpp2
-rw-r--r--indra/newview/llinventorybridge.cpp2
-rw-r--r--indra/newview/llinventoryfilter.cpp5
-rw-r--r--indra/newview/llinventoryfilter.h66
-rw-r--r--indra/newview/llinventoryitemslist.cpp199
-rw-r--r--indra/newview/llinventoryitemslist.h106
-rw-r--r--indra/newview/llinventoryobserver.cpp50
-rw-r--r--indra/newview/llinventoryobserver.h37
-rw-r--r--indra/newview/lllocationinputctrl.cpp74
-rw-r--r--indra/newview/lllocationinputctrl.h36
-rw-r--r--indra/newview/llnamelistctrl.cpp2
-rw-r--r--indra/newview/llnavigationbar.cpp1
-rw-r--r--indra/newview/llnetmap.h36
-rw-r--r--indra/newview/llnotificationstorage.cpp47
-rw-r--r--indra/newview/llnotificationstorage.h42
-rw-r--r--indra/newview/llnotificationtiphandler.cpp55
-rw-r--r--indra/newview/lloutfitslist.cpp994
-rw-r--r--indra/newview/lloutfitslist.h193
-rw-r--r--indra/newview/llpanelgroup.h45
-rw-r--r--indra/newview/llpanelgrouplandmoney.cpp3
-rw-r--r--indra/newview/llpanelgroupnotices.cpp16
-rw-r--r--indra/newview/llpanellandmarks.cpp1
-rw-r--r--indra/newview/llpanellogin.cpp2
-rw-r--r--indra/newview/llpanelme.cpp36
-rw-r--r--indra/newview/llpanelme.h36
-rw-r--r--indra/newview/llpanelonlinestatus.cpp47
-rw-r--r--indra/newview/llpanelonlinestatus.h42
-rw-r--r--indra/newview/llpaneloutfitedit.cpp168
-rw-r--r--indra/newview/llpaneloutfitedit.h16
-rw-r--r--indra/newview/llpaneloutfitsinventory.cpp143
-rw-r--r--indra/newview/llpaneloutfitsinventory.h16
-rw-r--r--indra/newview/llpanelpeople.cpp46
-rw-r--r--indra/newview/llpanelpeople.h2
-rw-r--r--indra/newview/llpanelplaces.cpp6
-rw-r--r--indra/newview/llscriptfloater.cpp65
-rw-r--r--indra/newview/llscriptfloater.h41
-rw-r--r--indra/newview/llsidepanelappearance.cpp7
-rw-r--r--indra/newview/llteleporthistory.cpp58
-rw-r--r--indra/newview/llteleporthistorystorage.cpp42
-rw-r--r--indra/newview/lltexturefetch.cpp6
-rw-r--r--indra/newview/lltoast.cpp8
-rw-r--r--indra/newview/lltoast.h1
-rw-r--r--indra/newview/lltoastalertpanel.cpp14
-rw-r--r--indra/newview/lltoastnotifypanel.cpp2
-rw-r--r--indra/newview/lltoastpanel.cpp15
-rw-r--r--indra/newview/llvieweraudio.cpp4
-rw-r--r--indra/newview/llviewerinventory.cpp71
-rw-r--r--indra/newview/llviewerinventory.h1
-rw-r--r--indra/newview/llviewermessage.cpp129
-rw-r--r--indra/newview/llviewermessage.h25
-rw-r--r--indra/newview/llviewerregion.cpp20
-rw-r--r--indra/newview/llviewerregion.h48
-rw-r--r--indra/newview/llviewertexture.cpp4
-rw-r--r--indra/newview/llvoavatarself.cpp1
-rw-r--r--indra/newview/llwearableitemslist.cpp894
-rw-r--r--indra/newview/llwearableitemslist.h435
-rw-r--r--indra/newview/llwearablelist.cpp42
-rw-r--r--indra/newview/llworldmapview.cpp16
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_1.pngbin0 -> 470 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_10.pngbin0 -> 461 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_11.pngbin0 -> 475 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_12.pngbin0 -> 455 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_2.pngbin0 -> 453 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_3.pngbin0 -> 454 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_4.pngbin0 -> 454 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_5.pngbin0 -> 468 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_6.pngbin0 -> 462 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_7.pngbin0 -> 469 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_8.pngbin0 -> 454 bytes
-rw-r--r--indra/newview/skins/default/textures/icons/Progress_9.pngbin0 -> 469 bytes
-rw-r--r--indra/newview/skins/default/textures/textures.xml13
-rw-r--r--indra/newview/skins/default/xui/de/floater_about_land.xml5
-rw-r--r--indra/newview/skins/default/xui/en/floater_about_land.xml9
-rw-r--r--indra/newview/skins/default/xui/en/floater_customize.xml660
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_container.xml6
-rw-r--r--indra/newview/skins/default/xui/en/floater_im_session.xml1
-rw-r--r--indra/newview/skins/default/xui/en/floater_outgoing_call.xml2
-rw-r--r--indra/newview/skins/default/xui/en/floater_preferences.xml3
-rw-r--r--indra/newview/skins/default/xui/en/menu_object.xml8
-rw-r--r--indra/newview/skins/default/xui/en/mime_types.xml32
-rw-r--r--indra/newview/skins/default/xui/en/mime_types_linux.xml32
-rw-r--r--indra/newview/skins/default/xui/en/mime_types_mac.xml30
-rw-r--r--indra/newview/skins/default/xui/en/notifications.xml6
-rw-r--r--indra/newview/skins/default/xui/en/outfit_accordion_tab.xml5
-rw-r--r--indra/newview/skins/default/xui/en/panel_cof_wearables.xml47
-rw-r--r--indra/newview/skins/default/xui/en/panel_group_land_money.xml4
-rw-r--r--indra/newview/skins/default/xui/en/panel_im_control_panel.xml40
-rw-r--r--indra/newview/skins/default/xui/en/panel_my_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_nearby_media.xml6
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfit_edit.xml77
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_inventory.xml20
-rw-r--r--indra/newview/skins/default/xui/en/panel_outfits_list.xml53
-rw-r--r--indra/newview/skins/default/xui/en/panel_people.xml25
-rw-r--r--indra/newview/skins/default/xui/en/panel_preferences_setup.xml2
-rw-r--r--indra/newview/skins/default/xui/en/panel_profile.xml8
-rw-r--r--indra/newview/skins/default/xui/en/strings.xml13
-rw-r--r--indra/newview/skins/default/xui/en/widgets/location_input.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/es/floater_customize.xml24
-rw-r--r--indra/newview/skins/default/xui/fr/floater_about_land.xml7
-rw-r--r--indra/newview/skins/default/xui/fr/floater_color_picker.xml2
-rw-r--r--indra/newview/skins/default/xui/fr/floater_customize.xml86
-rw-r--r--indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml3
-rw-r--r--indra/newview/skins/default/xui/fr/panel_main_inventory.xml66
-rw-r--r--indra/newview/skins/default/xui/fr/strings.xml16
-rw-r--r--indra/newview/skins/default/xui/it/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/it/floater_customize.xml68
-rw-r--r--indra/newview/skins/default/xui/ja/floater_about_land.xml13
-rw-r--r--indra/newview/skins/default/xui/pt/floater_about_land.xml2
-rw-r--r--indra/newview/skins/default/xui/pt/floater_customize.xml4
-rwxr-xr-xindra/newview/viewer_manifest.py17
132 files changed, 2803 insertions, 4705 deletions
diff --git a/indra/newview/CMakeLists.txt b/indra/newview/CMakeLists.txt
index efb16d1e42..835a9aacd5 100644
--- a/indra/newview/CMakeLists.txt
+++ b/indra/newview/CMakeLists.txt
@@ -104,6 +104,7 @@ set(viewer_SOURCE_FILES
llclassifiedinfo.cpp
llclassifiedstatsresponder.cpp
llcloud.cpp
+ llcofwearables.cpp
llcolorswatch.cpp
llcommanddispatcherlistener.cpp
llcommandhandler.cpp
@@ -142,6 +143,7 @@ set(viewer_SOURCE_FILES
llfavoritesbar.cpp
llfeaturemanager.cpp
llfilepicker.cpp
+ llfilteredwearablelist.cpp
llfirstuse.cpp
llflexibleobject.cpp
llfloaterabout.cpp
@@ -252,6 +254,7 @@ set(viewer_SOURCE_FILES
llinventoryclipboard.cpp
llinventoryfilter.cpp
llinventoryfunctions.cpp
+ llinventoryitemslist.cpp
llinventorymodel.cpp
llinventorymodelbackgroundfetch.cpp
llinventoryobserver.cpp
@@ -294,7 +297,9 @@ set(viewer_SOURCE_FILES
llnotificationmanager.cpp
llnotificationofferhandler.cpp
llnotificationscripthandler.cpp
+ llnotificationstorage.cpp
llnotificationtiphandler.cpp
+ lloutfitslist.cpp
lloutputmonitorctrl.cpp
llpanelavatar.cpp
llpanelavatartag.cpp
@@ -327,6 +332,7 @@ set(viewer_SOURCE_FILES
llpanelnearbymedia.cpp
llpanelobject.cpp
llpanelobjectinventory.cpp
+ llpanelonlinestatus.cpp
llpaneloutfitedit.cpp
llpaneloutfitsinventory.cpp
llpanelpeople.cpp
@@ -528,6 +534,7 @@ set(viewer_SOURCE_FILES
llwaterparamset.cpp
llwearable.cpp
llwearabledictionary.cpp
+ llwearableitemslist.cpp
llwearablelist.cpp
llweb.cpp
llwind.cpp
@@ -608,6 +615,7 @@ set(viewer_HEADER_FILES
llclassifiedinfo.h
llclassifiedstatsresponder.h
llcloud.h
+ llcofwearables.h
llcolorswatch.h
llcommanddispatcherlistener.h
llcommandhandler.h
@@ -647,6 +655,7 @@ set(viewer_HEADER_FILES
llfavoritesbar.h
llfeaturemanager.h
llfilepicker.h
+ llfilteredwearablelist.h
llfirstuse.h
llflexibleobject.h
llfloaterabout.h
@@ -756,6 +765,7 @@ set(viewer_HEADER_FILES
llinventoryclipboard.h
llinventoryfilter.h
llinventoryfunctions.h
+ llinventoryitemslist.h
llinventorymodel.h
llinventorymodelbackgroundfetch.h
llinventoryobserver.h
@@ -795,6 +805,8 @@ set(viewer_HEADER_FILES
llnetmap.h
llnotificationhandler.h
llnotificationmanager.h
+ llnotificationstorage.h
+ lloutfitslist.h
lloutputmonitorctrl.h
llpanelavatar.h
llpanelavatartag.h
@@ -827,6 +839,7 @@ set(viewer_HEADER_FILES
llpanelnearbymedia.h
llpanelobject.h
llpanelobjectinventory.h
+ llpanelonlinestatus.h
llpaneloutfitedit.h
llpaneloutfitsinventory.h
llpanelpeople.h
@@ -1030,6 +1043,7 @@ set(viewer_HEADER_FILES
llwaterparamset.h
llwearable.h
llwearabledictionary.h
+ llwearableitemslist.h
llwearablelist.h
llweb.h
llwind.h
@@ -1390,7 +1404,7 @@ if (WINDOWS)
# If adding a file to viewer_manifest.py in the WindowsManifest.construct() method, be sure to add the dependency
# here.
- # *NOTE:Mani - This is a crappy hack to have important dependecies for the viewer_manifest copy action
+ # *NOTE:Mani - This is a crappy hack to have important dependencies for the viewer_manifest copy action
# be met. I'm looking forward to a source-code split-up project next year that will address this kind of thing.
# In the meantime, if you have any ideas on how to easily maintain one list, either here or in viewer_manifest.py
# and have the build deps get tracked *please* tell me about it.
@@ -1411,7 +1425,7 @@ if (WINDOWS)
endif(USE_GOOGLE_PERFTOOLS)
- set(COPY_INPUT_DEPENDECIES
+ set(COPY_INPUT_DEPENDENCIES
# The following commented dependencies are determined at variably at build time. Can't do this here.
#${SHARED_LIB_STAGING_DIR}/${CMAKE_CFG_INTDIR}/libtcmalloc_minimal.dll => None ... Skipping libtcmalloc_minimal.dll
${CMAKE_SOURCE_DIR}/../etc/message.xml
@@ -1445,8 +1459,6 @@ if (WINDOWS)
${CMAKE_CURRENT_SOURCE_DIR}/featuretable.txt
${CMAKE_CURRENT_SOURCE_DIR}/dbghelp.dll
${CMAKE_CURRENT_SOURCE_DIR}/fmod.dll
- ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_quicktime.dll
- ${CMAKE_BINARY_DIR}/media_plugins/quicktime/${CMAKE_CFG_INTDIR}/media_plugin_webkit.dll
${ARCH_PREBUILT_DIRS_RELEASE}/libeay32.dll
${ARCH_PREBUILT_DIRS_RELEASE}/qtcore4.dll
${ARCH_PREBUILT_DIRS_RELEASE}/qtgui4.dll
@@ -1486,6 +1498,7 @@ if (WINDOWS)
SLPlugin
media_plugin_quicktime
media_plugin_webkit
+ winmm_shim
windows-crash-logger
windows-updater
)
@@ -1507,7 +1520,7 @@ if (WINDOWS)
DEPENDS
${CMAKE_CURRENT_SOURCE_DIR}/viewer_manifest.py
stage_third_party_libs
- ${COPY_INPUT_DEPENDECIES}
+ ${COPY_INPUT_DEPENDENCIES}
COMMENT "Performing viewer_manifest copy"
)
@@ -1526,8 +1539,6 @@ if (WINDOWS)
add_dependencies(${VIEWER_BINARY_NAME}
SLPlugin
- media_plugin_quicktime
- media_plugin_webkit
windows-updater
windows-crash-logger
)
diff --git a/indra/newview/app_settings/settings.xml b/indra/newview/app_settings/settings.xml
index 5014ba3349..600c548212 100644
--- a/indra/newview/app_settings/settings.xml
+++ b/indra/newview/app_settings/settings.xml
@@ -11038,5 +11038,16 @@
<integer>2048</integer>
</map>
<!-- End of back compatibility settings -->
+ <key>teleport_offer_invitation_max_length</key>
+ <map>
+ <key>Comment</key>
+ <string>Maximum length of teleport offer invitation line editor. 254 - max_location_url_length(76) = 178</string>
+ <key>Persist</key>
+ <integer>1</integer>
+ <key>Type</key>
+ <string>S32</string>
+ <key>Value</key>
+ <integer>178</integer>
+ </map>
</map>
</llsd>
diff --git a/indra/newview/llagent.cpp b/indra/newview/llagent.cpp
index 8bcf680876..ddcaeb113d 100644
--- a/indra/newview/llagent.cpp
+++ b/indra/newview/llagent.cpp
@@ -1226,7 +1226,10 @@ void LLAgent::startAutoPilotGlobal(const LLVector3d &target_global, const std::s
if ( distance > 1.f && heightDelta > (sqrtf(mAutoPilotStopDistance) + 1.f))
{
setFlying(TRUE);
- mAutoPilotFlyOnStop = TRUE;
+ // Do not force flying for "Sit" behavior to prevent flying after pressing "Stand"
+ // from an object. See EXT-1655.
+ if ("Sit" != mAutoPilotBehaviorName)
+ mAutoPilotFlyOnStop = TRUE;
}
mAutoPilot = TRUE;
diff --git a/indra/newview/llagentwearables.cpp b/indra/newview/llagentwearables.cpp
index 7f248eee30..8a880e5ace 100644
--- a/indra/newview/llagentwearables.cpp
+++ b/indra/newview/llagentwearables.cpp
@@ -1338,7 +1338,8 @@ public:
LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
LLPanelOutfitsInventory *outfit_panel =
dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
- if (outfit_panel)
+ // TODO: add handling "My Outfits" tab.
+ if (outfit_panel && outfit_panel->isCOFPanelActive())
{
outfit_panel->getRootFolder()->clearSelection();
outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE);
@@ -1361,24 +1362,6 @@ private:
LLUUID mFolderID;
};
-LLUUID LLAgentWearables::makeNewOutfitLinks(const std::string& new_folder_name)
-{
- if (!isAgentAvatarValid()) return LLUUID::null;
-
- // First, make a folder in the My Outfits directory.
- const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
- LLUUID folder_id = gInventory.createNewCategory(
- parent_id,
- LLFolderType::FT_OUTFIT,
- new_folder_name);
-
- LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id);
- LLAppearanceMgr::instance().shallowCopyCategoryContents(LLAppearanceMgr::instance().getCOF(),folder_id, cb);
- LLAppearanceMgr::instance().createBaseOutfitLink(folder_id, cb);
-
- return folder_id;
-}
-
void LLAgentWearables::makeNewOutfitDone(S32 type, U32 index)
{
LLUUID first_item_id = getWearableItemID((EWearableType)type, index);
@@ -2048,6 +2031,39 @@ void LLAgentWearables::animateAllWearableParams(F32 delta, BOOL upload_bake)
}
}
+bool LLAgentWearables::moveWearable(const LLViewerInventoryItem* item, bool closer_to_body)
+{
+ if (!item) return false;
+ if (!item->isWearableType()) return false;
+
+ wearableentry_map_t::iterator wearable_iter = mWearableDatas.find(item->getWearableType());
+ if (wearable_iter == mWearableDatas.end()) return false;
+
+ wearableentry_vec_t& wearable_vec = wearable_iter->second;
+ if (wearable_vec.empty()) return false;
+
+ const LLUUID& asset_id = item->getAssetUUID();
+
+ //nowhere to move if the wearable is already on any boundary (closest to the body/furthest from the body)
+ if (closer_to_body && asset_id == wearable_vec.front()->getAssetID()) return false;
+ if (!closer_to_body && asset_id == wearable_vec.back()->getAssetID()) return false;
+
+ for (U32 i = 0; i < wearable_vec.size(); ++i)
+ {
+ LLWearable* wearable = wearable_vec[i];
+ if (!wearable) continue;
+ if (wearable->getAssetID() != asset_id) continue;
+
+ //swapping wearables
+ U32 swap_i = closer_to_body ? i-1 : i+1;
+ wearable_vec[i] = wearable_vec[swap_i];
+ wearable_vec[swap_i] = wearable;
+ return true;
+ }
+
+ return false;
+}
+
void LLAgentWearables::updateServer()
{
sendAgentWearablesUpdate();
diff --git a/indra/newview/llagentwearables.h b/indra/newview/llagentwearables.h
index b76367324c..d3b18f68f1 100644
--- a/indra/newview/llagentwearables.h
+++ b/indra/newview/llagentwearables.h
@@ -82,6 +82,8 @@ public:
void animateAllWearableParams(F32 delta, BOOL upload_bake);
+ bool moveWearable(const LLViewerInventoryItem* item, bool closer_to_body);
+
//--------------------------------------------------------------------
// Accessors
//--------------------------------------------------------------------
@@ -169,8 +171,7 @@ public:
const LLDynamicArray<S32>& wearables_to_include,
const LLDynamicArray<S32>& attachments_to_include,
BOOL rename_clothing);
-
- LLUUID makeNewOutfitLinks(const std::string& new_folder_name);
+
// Should only be called if we *know* we've never done so before, since users may
// not want the Library outfits to stay in their quick outfit selector and can delete them.
diff --git a/indra/newview/llagentwearablesfetch.cpp b/indra/newview/llagentwearablesfetch.cpp
index 08d8ccfd23..03d09a3798 100644
--- a/indra/newview/llagentwearablesfetch.cpp
+++ b/indra/newview/llagentwearablesfetch.cpp
@@ -119,6 +119,7 @@ public:
item->getLinkedUUID(),
LLAppearanceMgr::instance().getCOF(),
item->getName(),
+ item->getDescription(),
LLAssetType::AT_LINK,
link_waiter);
}
@@ -507,6 +508,7 @@ void LLLibraryOutfitsFetch::contentsDone()
item->getLinkedUUID(),
new_outfit_folder_id,
item->getName(),
+ item->getDescription(),
LLAssetType::AT_LINK,
NULL);
}
diff --git a/indra/newview/llappearancemgr.cpp b/indra/newview/llappearancemgr.cpp
index 4d18ff57fe..5586b3cd4d 100644
--- a/indra/newview/llappearancemgr.cpp
+++ b/indra/newview/llappearancemgr.cpp
@@ -32,6 +32,7 @@
#include "llviewerprecompiledheaders.h"
+#include "llaccordionctrltab.h"
#include "llagent.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
@@ -42,6 +43,7 @@
#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
#include "llnotificationsutil.h"
+#include "llpaneloutfitsinventory.h"
#include "llselectmgr.h"
#include "llsidepanelappearance.h"
#include "llsidetray.h"
@@ -51,6 +53,8 @@
#include "llviewerregion.h"
#include "llwearablelist.h"
+char ORDER_NUMBER_SEPARATOR('@');
+
LLUUID findDescendentCategoryIDByName(const LLUUID& parent_id, const std::string& name)
{
LLInventoryModel::cat_array_t cat_array;
@@ -118,6 +122,38 @@ private:
bool mAppend;
};
+
+//Inventory callback updating "dirty" state when destroyed
+class LLUpdateDirtyState: public LLInventoryCallback
+{
+public:
+ LLUpdateDirtyState() {}
+ virtual ~LLUpdateDirtyState(){ LLAppearanceMgr::getInstance()->updateIsDirty(); }
+ virtual void fire(const LLUUID&) {}
+};
+
+
+//Inventory collect functor collecting wearables of a specific wearable type
+class LLFindClothesOfType : public LLInventoryCollectFunctor
+{
+public:
+ LLFindClothesOfType(EWearableType type) : mWearableType(type) {}
+ virtual ~LLFindClothesOfType() {}
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+ {
+ if (!item) return false;
+ if (item->getType() != LLAssetType::AT_CLOTHING) return false;
+
+ LLViewerInventoryItem *vitem = dynamic_cast<LLViewerInventoryItem*>(item);
+ if (!vitem || vitem->getWearableType() != mWearableType) return false;
+
+ return true;
+ }
+
+ const EWearableType mWearableType;
+};
+
+
LLUpdateAppearanceOnDestroy::LLUpdateAppearanceOnDestroy():
mFireCount(0)
{
@@ -400,6 +436,7 @@ public:
item_id,
LLAppearanceMgr::instance().getCOF(),
itemp->getName(),
+ itemp->getDescription(),
LLAssetType::AT_LINK,
cb);
}
@@ -691,10 +728,13 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL
{
case LLAssetType::AT_LINK:
{
+ //LLInventoryItem::getDescription() is used for a new description
+ //to propagate ordering information saved in descriptions of links
link_inventory_item(gAgent.getID(),
item->getLinkedUUID(),
dst_id,
item->getName(),
+ item->LLInventoryItem::getDescription(),
LLAssetType::AT_LINK, cb);
break;
}
@@ -708,6 +748,7 @@ void LLAppearanceMgr::shallowCopyCategoryContents(const LLUUID& src_id, const LL
item->getLinkedUUID(),
dst_id,
item->getName(),
+ item->getDescription(),
LLAssetType::AT_LINK_FOLDER, cb);
}
break;
@@ -811,20 +852,7 @@ void LLAppearanceMgr::filterWearableItems(
{
// Divvy items into arrays by wearable type.
std::vector<LLInventoryModel::item_array_t> items_by_type(WT_COUNT);
- for (S32 i=0; i<items.count(); i++)
- {
- LLViewerInventoryItem *item = items.get(i);
- // Ignore non-wearables.
- if (!item->isWearableType())
- continue;
- EWearableType type = item->getWearableType();
- if(type < 0 || type >= WT_COUNT)
- {
- LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL;
- continue;
- }
- items_by_type[type].push_back(item);
- }
+ divvyWearablesByType(items, items_by_type);
// rebuild items list, retaining the last max_per_type of each array
items.clear();
@@ -853,6 +881,7 @@ void LLAppearanceMgr::linkAll(const LLUUID& category,
item->getLinkedUUID(),
category,
item->getName(),
+ item->LLInventoryItem::getDescription(),
LLAssetType::AT_LINK,
cb);
}
@@ -956,7 +985,7 @@ void LLAppearanceMgr::createBaseOutfitLink(const LLUUID& category, LLPointer<LLI
if (catp && catp->getPreferredType() == LLFolderType::FT_OUTFIT)
{
- link_inventory_item(gAgent.getID(), category, cof, catp->getName(),
+ link_inventory_item(gAgent.getID(), category, cof, catp->getName(), "",
LLAssetType::AT_LINK_FOLDER, link_waiter);
new_outfit_name = catp->getName();
}
@@ -1016,8 +1045,24 @@ static void remove_non_link_items(LLInventoryModel::item_array_t &items)
items = pruned_items;
}
+//a predicate for sorting inventory items by actual descriptions
+bool sort_by_description(const LLInventoryItem* item1, const LLInventoryItem* item2)
+{
+ if (!item1 || !item2)
+ {
+ llwarning("either item1 or item2 is NULL", 0);
+ return true;
+ }
+
+ return item1->LLInventoryItem::getDescription() < item2->LLInventoryItem::getDescription();
+}
+
void LLAppearanceMgr::updateAppearanceFromCOF()
{
+ //checking integrity of the COF in terms of ordering of wearables,
+ //checking and updating links' descriptions of wearables in the COF (before analyzed for "dirty" state)
+ updateClothingOrderingInfo();
+
// update dirty flag to see if the state of the COF matches
// the saved outfit stored as a folder link
llinfos << "starting" << llendl;
@@ -1046,6 +1091,9 @@ void LLAppearanceMgr::updateAppearanceFromCOF()
return;
}
+ //preparing the list of wearables in the correct order for LLAgentWearables
+ std::sort(wear_items.begin(), wear_items.end(), sort_by_description);
+
LLWearableHoldingPattern* holder = new LLWearableHoldingPattern;
holder->mObjItems = obj_items;
@@ -1079,8 +1127,8 @@ void LLAppearanceMgr::updateAppearanceFromCOF()
}
#endif
-
- holder->mFoundList.push_front(found);
+ //pushing back, not front, to preserve order of wearables for LLAgentWearables
+ holder->mFoundList.push_back(found);
}
else
{
@@ -1407,7 +1455,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update
// Are these links to different items of the same wearable
// type? If so, new item will replace old.
// MULTI-WEARABLES: revisit if more than one per type is allowed.
- else if (areMatchingWearables(vitem,inv_item))
+ else if (FALSE/*areMatchingWearables(vitem,inv_item)*/)
{
if (inv_item->getIsLinkType())
{
@@ -1430,6 +1478,7 @@ void LLAppearanceMgr::addCOFItemLink(const LLInventoryItem *item, bool do_update
vitem->getLinkedUUID(),
getCOF(),
vitem->getName(),
+ vitem->getDescription(),
LLAssetType::AT_LINK,
cb);
}
@@ -1446,6 +1495,7 @@ void LLAppearanceMgr::addEnsembleLink( LLInventoryCategory* cat, bool do_update
cat->getLinkedUUID(),
getCOF(),
cat->getName(),
+ cat->getDescription(),
LLAssetType::AT_LINK_FOLDER,
cb);
#endif
@@ -1475,6 +1525,17 @@ void LLAppearanceMgr::removeCOFItemLinks(const LLUUID& item_id, bool do_update)
}
}
+bool sort_by_linked_uuid(const LLViewerInventoryItem* item1, const LLViewerInventoryItem* item2)
+{
+ if (!item1 || !item2)
+ {
+ llwarning("item1, item2 cannot be null, something is very wrong", 0);
+ return true;
+ }
+
+ return item1->getLinkedUUID() < item2->getLinkedUUID();
+}
+
void LLAppearanceMgr::updateIsDirty()
{
LLUUID cof = getCOF();
@@ -1514,33 +1575,37 @@ void LLAppearanceMgr::updateIsDirty()
// Current outfit folder should have one more item than the outfit folder.
// this one item is the link back to the outfit folder itself.
mOutfitIsDirty = true;
+ return;
}
- else
- {
- typedef std::set<LLUUID> item_set_t;
- item_set_t cof_set;
- item_set_t outfit_set;
- // sort COF items by UUID
- for (S32 i = 0; i < cof_items.count(); ++i)
+ //getting rid of base outfit folder link to simplify comparison
+ for (LLInventoryModel::item_array_t::iterator it = cof_items.begin(); it != cof_items.end(); ++it)
+ {
+ if (*it == base_outfit_item)
{
- LLViewerInventoryItem *item = cof_items.get(i);
- // don't add the base outfit link to the list of objects we're comparing
- if(item != base_outfit_item)
- {
- cof_set.insert(item->getLinkedUUID());
- }
+ cof_items.erase(it);
+ break;
}
+ }
- // sort outfit folder by UUID
- for (S32 i = 0; i < outfit_items.count(); ++i)
+ //"dirty" - also means a difference in linked UUIDs and/or a difference in wearables order (links' descriptions)
+ std::sort(cof_items.begin(), cof_items.end(), sort_by_linked_uuid);
+ std::sort(outfit_items.begin(), outfit_items.end(), sort_by_linked_uuid);
+
+ for (U32 i = 0; i < cof_items.size(); ++i)
+ {
+ LLViewerInventoryItem *item1 = cof_items.get(i);
+ LLViewerInventoryItem *item2 = outfit_items.get(i);
+
+ if (item1->getLinkedUUID() != item2->getLinkedUUID() ||
+ item1->LLInventoryItem::getDescription() != item2->LLInventoryItem::getDescription())
{
- LLViewerInventoryItem *item = outfit_items.get(i);
- outfit_set.insert(item->getLinkedUUID());
+ mOutfitIsDirty = true;
+ return;
}
-
- mOutfitIsDirty = (outfit_set != cof_set);
}
+
+ mOutfitIsDirty = false;
}
}
@@ -1572,15 +1637,182 @@ bool LLAppearanceMgr::updateBaseOutfit()
const LLUUID base_outfit_id = getBaseOutfitUUID();
if (base_outfit_id.isNull()) return false;
+ updateClothingOrderingInfo();
+
// in a Base Outfit we do not remove items, only links
purgeCategory(base_outfit_id, false);
+
+ LLPointer<LLInventoryCallback> dirty_state_updater = new LLUpdateDirtyState();
+
//COF contains only links so we copy to the Base Outfit only links
- shallowCopyCategoryContents(getCOF(), base_outfit_id, NULL);
+ shallowCopyCategoryContents(getCOF(), base_outfit_id, dirty_state_updater);
return true;
}
+void LLAppearanceMgr::divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type)
+{
+ items_by_type.reserve(WT_COUNT);
+ if (items.empty()) return;
+
+ for (S32 i=0; i<items.count(); i++)
+ {
+ LLViewerInventoryItem *item = items.get(i);
+ // Ignore non-wearables.
+ if (!item->isWearableType())
+ continue;
+ EWearableType type = item->getWearableType();
+ if(type < 0 || type >= WT_COUNT)
+ {
+ LL_WARNS("Appearance") << "Invalid wearable type. Inventory type does not match wearable flag bitfield." << LL_ENDL;
+ continue;
+ }
+ items_by_type[type].push_back(item);
+ }
+}
+
+std::string build_order_string(EWearableType type, U32 i)
+{
+ std::ostringstream order_num;
+ order_num << ORDER_NUMBER_SEPARATOR << type * 100 + i;
+ return order_num.str();
+}
+
+struct WearablesOrderComparator
+{
+ WearablesOrderComparator(const EWearableType type)
+ {
+ mControlSize = build_order_string(type, 0).size();
+ };
+
+ bool operator()(const LLInventoryItem* item1, const LLInventoryItem* item2)
+ {
+ if (!item1 || !item2)
+ {
+ llwarning("either item1 or item2 is NULL", 0);
+ return true;
+ }
+
+ const std::string& desc1 = item1->LLInventoryItem::getDescription();
+ const std::string& desc2 = item2->LLInventoryItem::getDescription();
+
+ bool item1_valid = (desc1.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc1[0]);
+ bool item2_valid = (desc2.size() == mControlSize) && (ORDER_NUMBER_SEPARATOR == desc2[0]);
+
+ if (item1_valid && item2_valid)
+ return desc1 < desc2;
+
+ //we need to sink down invalid items: items with empty descriptions, items with "Broken link" descriptions,
+ //items with ordering information but not for the associated wearables type
+ if (!item1_valid && item2_valid)
+ return false;
+
+ return true;
+ }
+
+ U32 mControlSize;
+};
+
+void LLAppearanceMgr::updateClothingOrderingInfo()
+{
+ LLInventoryModel::item_array_t wear_items;
+ getDescendentsOfAssetType(getCOF(), wear_items, LLAssetType::AT_CLOTHING, false);
+
+ wearables_by_type_t items_by_type(WT_COUNT);
+ divvyWearablesByType(wear_items, items_by_type);
+
+ bool inventory_changed = false;
+ for (U32 type = WT_SHIRT; type < WT_COUNT; type++)
+ {
+
+ U32 size = items_by_type[type].size();
+ if (!size) continue;
+
+ //sinking down invalid items which need reordering
+ std::sort(items_by_type[type].begin(), items_by_type[type].end(), WearablesOrderComparator((EWearableType) type));
+
+ //requesting updates only for those links which don't have "valid" descriptions
+ for (U32 i = 0; i < size; i++)
+ {
+ LLViewerInventoryItem* item = items_by_type[type][i];
+ if (!item) continue;
+
+ std::string new_order_str = build_order_string((EWearableType)type, i);
+ if (new_order_str == item->LLInventoryItem::getDescription()) continue;
+
+ item->setDescription(new_order_str);
+ item->setComplete(TRUE);
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+ inventory_changed = true;
+ }
+ }
+
+ //*TODO do we really need to notify observers?
+ if (inventory_changed) gInventory.notifyObservers();
+}
+
+
+
+
+class LLShowCreatedOutfit: public LLInventoryCallback
+{
+public:
+ LLShowCreatedOutfit(LLUUID& folder_id): mFolderID(folder_id)
+ {}
+
+ virtual ~LLShowCreatedOutfit()
+ {
+ LLSD key;
+ LLSideTray::getInstance()->showPanel("panel_outfits_inventory", key);
+ LLPanelOutfitsInventory *outfit_panel =
+ dynamic_cast<LLPanelOutfitsInventory*>(LLSideTray::getInstance()->getPanel("panel_outfits_inventory"));
+ if (outfit_panel)
+ {
+ outfit_panel->getRootFolder()->clearSelection();
+ outfit_panel->getRootFolder()->setSelectionByID(mFolderID, TRUE);
+ }
+
+ LLAccordionCtrlTab* tab_outfits = outfit_panel ? outfit_panel->findChild<LLAccordionCtrlTab>("tab_outfits") : 0;
+ if (tab_outfits && !tab_outfits->getDisplayChildren())
+ {
+ tab_outfits->changeOpenClose(tab_outfits->getDisplayChildren());
+ }
+
+ LLAppearanceMgr::getInstance()->updateIsDirty();
+ LLAppearanceMgr::getInstance()->updatePanelOutfitName("");
+ }
+
+ virtual void fire(const LLUUID&)
+ {}
+
+private:
+ LLUUID mFolderID;
+};
+
+LLUUID LLAppearanceMgr::makeNewOutfitLinks(const std::string& new_folder_name)
+{
+ if (!isAgentAvatarValid()) return LLUUID::null;
+
+ // First, make a folder in the My Outfits directory.
+ const LLUUID parent_id = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLUUID folder_id = gInventory.createNewCategory(
+ parent_id,
+ LLFolderType::FT_OUTFIT,
+ new_folder_name);
+
+ updateClothingOrderingInfo();
+
+ LLPointer<LLInventoryCallback> cb = new LLShowCreatedOutfit(folder_id);
+ shallowCopyCategoryContents(getCOF(),folder_id, cb);
+ createBaseOutfitLink(folder_id, cb);
+
+ dumpCat(folder_id,"COF, new outfit");
+
+ return folder_id;
+}
+
void LLAppearanceMgr::wearBaseOutfit()
{
const LLUUID& base_outfit_id = getBaseOutfitUUID();
@@ -1622,6 +1854,63 @@ void LLAppearanceMgr::removeItemFromAvatar(const LLUUID& id_to_remove)
}
}
+
+bool LLAppearanceMgr::moveWearable(LLViewerInventoryItem* item, bool closer_to_body)
+{
+ if (!item || !item->isWearableType()) return false;
+ if (item->getType() != LLAssetType::AT_CLOTHING) return false;
+ if (!gInventory.isObjectDescendentOf(item->getUUID(), getCOF())) return false;
+
+ LLInventoryModel::cat_array_t cats;
+ LLInventoryModel::item_array_t items;
+ LLFindClothesOfType filter_wearables_of_type(item->getWearableType());
+ gInventory.collectDescendentsIf(getCOF(), cats, items, true, filter_wearables_of_type);
+ if (items.empty()) return false;
+
+ //*TODO all items are not guarantied to have valid descriptions (check?)
+ std::sort(items.begin(), items.end(), WearablesOrderComparator(item->getWearableType()));
+
+ if (closer_to_body && items.front() == item) return false;
+ if (!closer_to_body && items.back() == item) return false;
+
+ LLInventoryModel::item_array_t::iterator it = std::find(items.begin(), items.end(), item);
+ if (items.end() == it) return false;
+
+
+ //swapping descriptions
+ closer_to_body ? --it : ++it;
+ LLViewerInventoryItem* swap_item = *it;
+ if (!swap_item) return false;
+ std::string tmp = swap_item->LLInventoryItem::getDescription();
+ swap_item->setDescription(item->LLInventoryItem::getDescription());
+ item->setDescription(tmp);
+
+
+ //items need to be updated on a dataserver
+ item->setComplete(TRUE);
+ item->updateServer(FALSE);
+ gInventory.updateItem(item);
+
+ swap_item->setComplete(TRUE);
+ swap_item->updateServer(FALSE);
+ gInventory.updateItem(swap_item);
+
+ //to cause appearance of the agent to be updated
+ bool result = false;
+ if (result = gAgentWearables.moveWearable(item, closer_to_body))
+ {
+ gAgentAvatarp->wearableUpdated(item->getWearableType(), TRUE);
+ }
+
+ setOutfitDirty(true);
+
+ //*TODO do we need to notify observers here in such a way?
+ gInventory.notifyObservers();
+
+ return result;
+}
+
+
//#define DUMP_CAT_VERBOSE
void LLAppearanceMgr::dumpCat(const LLUUID& cat_id, const std::string& msg)
diff --git a/indra/newview/llappearancemgr.h b/indra/newview/llappearancemgr.h
index 7e35919892..a308a3efa9 100644
--- a/indra/newview/llappearancemgr.h
+++ b/indra/newview/llappearancemgr.h
@@ -138,12 +138,25 @@ public:
//Remove clothing or detach an object from the agent (a bodypart cannot be removed)
void removeItemFromAvatar(const LLUUID& item_id);
+
+ LLUUID makeNewOutfitLinks(const std::string& new_folder_name);
+
+ bool moveWearable(LLViewerInventoryItem* item, bool closer_to_body);
+
protected:
LLAppearanceMgr();
~LLAppearanceMgr();
private:
+ typedef std::vector<LLInventoryModel::item_array_t> wearables_by_type_t;
+
+ //Divvy items into arrays by wearable type
+ static void divvyWearablesByType(const LLInventoryModel::item_array_t& items, wearables_by_type_t& items_by_type);
+
+ //Check ordering information on wearables stored in links' descriptions and update if it is invalid
+ void updateClothingOrderingInfo();
+
void filterWearableItems(LLInventoryModel::item_array_t& items, S32 max_per_type);
void getDescendentsOfAssetType(const LLUUID& category,
diff --git a/indra/newview/llappviewermacosx.cpp b/indra/newview/llappviewermacosx.cpp
index 80d9b14345..44ef39fb7d 100644
--- a/indra/newview/llappviewermacosx.cpp
+++ b/indra/newview/llappviewermacosx.cpp
@@ -291,6 +291,7 @@ static OSStatus CarbonEventHandler(EventHandlerCallRef inHandlerCallRef,
if(os_result >= 0 && matching_psn)
{
sCrashReporterIsRunning = false;
+ QuitApplicationEventLoop();
}
}
return noErr;
@@ -326,7 +327,7 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
// *NOTE:Mani A better way - make a copy of the data that the crash reporter will send
// and let SL go about its business. This way makes the mac work like windows and linux
// and is the smallest patch for the issue.
- sCrashReporterIsRunning = true;
+ sCrashReporterIsRunning = false;
ProcessSerialNumber o_psn;
static EventHandlerRef sCarbonEventsRef = NULL;
@@ -356,15 +357,13 @@ void LLAppViewerMacOSX::handleCrashReporting(bool reportFreeze)
if(os_result >= 0)
{
- EventRecord evt;
- while(sCrashReporterIsRunning)
- {
- while(WaitNextEvent(osMask, &evt, 0, NULL))
- {
- // null op!?!
- }
- }
- }
+ sCrashReporterIsRunning = true;
+ }
+
+ while(sCrashReporterIsRunning)
+ {
+ RunApplicationEventLoop();
+ }
// Re-install the apps quit handler.
AEInstallEventHandler(kCoreEventClass,
@@ -453,16 +452,17 @@ std::string LLAppViewerMacOSX::generateSerialNumber()
static AudioDeviceID get_default_audio_output_device(void)
{
AudioDeviceID device = 0;
- UInt32 size;
- OSStatus err;
-
- size = sizeof(device);
- err = AudioHardwareGetProperty(kAudioHardwarePropertyDefaultOutputDevice, &size, &device);
+ UInt32 size = sizeof(device);
+ AudioObjectPropertyAddress device_address = { kAudioHardwarePropertyDefaultOutputDevice,
+ kAudioObjectPropertyScopeGlobal,
+ kAudioObjectPropertyElementMaster };
+
+ OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, &device_address, 0, NULL, &size, &device);
if(err != noErr)
{
LL_DEBUGS("SystemMute") << "Couldn't get default audio output device (0x" << std::hex << err << ")" << LL_ENDL;
}
-
+
return device;
}
@@ -470,11 +470,15 @@ static AudioDeviceID get_default_audio_output_device(void)
void LLAppViewerMacOSX::setMasterSystemAudioMute(bool new_mute)
{
AudioDeviceID device = get_default_audio_output_device();
-
+
if(device != 0)
{
UInt32 mute = new_mute;
- OSStatus err = AudioDeviceSetProperty(device, NULL, 0, false, kAudioDevicePropertyMute, sizeof(mute), &mute);
+ AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute,
+ kAudioDevicePropertyScopeOutput,
+ kAudioObjectPropertyElementMaster };
+
+ OSStatus err = AudioObjectSetPropertyData(device, &device_address, 0, NULL, sizeof(mute), &mute);
if(err != noErr)
{
LL_INFOS("SystemMute") << "Couldn't set audio mute property (0x" << std::hex << err << ")" << LL_ENDL;
@@ -487,13 +491,17 @@ bool LLAppViewerMacOSX::getMasterSystemAudioMute()
{
// Assume the system isn't muted
UInt32 mute = 0;
-
+
AudioDeviceID device = get_default_audio_output_device();
-
+
if(device != 0)
{
UInt32 size = sizeof(mute);
- OSStatus err = AudioDeviceGetProperty(device, 0, false, kAudioDevicePropertyMute, &size, &mute);
+ AudioObjectPropertyAddress device_address = { kAudioDevicePropertyMute,
+ kAudioDevicePropertyScopeOutput,
+ kAudioObjectPropertyElementMaster };
+
+ OSStatus err = AudioObjectGetPropertyData(device, &device_address, 0, NULL, &size, &mute);
if(err != noErr)
{
LL_DEBUGS("SystemMute") << "Couldn't get audio mute property (0x" << std::hex << err << ")" << LL_ENDL;
diff --git a/indra/newview/llavatarlist.cpp b/indra/newview/llavatarlist.cpp
index 8ba47b5198..dfb213716c 100644
--- a/indra/newview/llavatarlist.cpp
+++ b/indra/newview/llavatarlist.cpp
@@ -34,6 +34,7 @@
// common
#include "lltrans.h"
+#include "llcommonutils.h"
#include "llavatarlist.h"
#include "llagentdata.h" // for comparator
@@ -176,13 +177,15 @@ void LLAvatarList::clear()
void LLAvatarList::setNameFilter(const std::string& filter)
{
- if (mNameFilter != filter)
+ std::string filter_upper = filter;
+ LLStringUtil::toUpper(filter_upper);
+ if (mNameFilter != filter_upper)
{
- mNameFilter = filter;
+ mNameFilter = filter_upper;
// update message for empty state here instead of refresh() to avoid blinking when switch
// between tabs.
- updateNoItemsMessage(!mNameFilter.empty());
+ updateNoItemsMessage(filter);
setDirty();
}
}
@@ -404,7 +407,6 @@ void LLAvatarList::computeDifference(
uuid_vec_t& vremoved)
{
uuid_vec_t vcur;
- uuid_vec_t vnew = vnew_unsorted;
// Convert LLSDs to LLUUIDs.
{
@@ -415,21 +417,7 @@ void LLAvatarList::computeDifference(
vcur.push_back(vcur_values[i].asUUID());
}
- std::sort(vcur.begin(), vcur.end());
- std::sort(vnew.begin(), vnew.end());
-
- uuid_vec_t::iterator it;
- size_t maxsize = llmax(vcur.size(), vnew.size());
- vadded.resize(maxsize);
- vremoved.resize(maxsize);
-
- // what to remove
- it = set_difference(vcur.begin(), vcur.end(), vnew.begin(), vnew.end(), vremoved.begin());
- vremoved.erase(it, vremoved.end());
-
- // what to add
- it = set_difference(vnew.begin(), vnew.end(), vcur.begin(), vcur.end(), vadded.begin());
- vadded.erase(it, vadded.end());
+ LLCommonUtils::computeDifference(vnew_unsorted, vcur, vadded, vremoved);
}
// Refresh shown time of our last interaction with all listed avatars.
diff --git a/indra/newview/llchannelmanager.cpp b/indra/newview/llchannelmanager.cpp
index 4ab3d8dc98..4f9434030f 100644
--- a/indra/newview/llchannelmanager.cpp
+++ b/indra/newview/llchannelmanager.cpp
@@ -2,25 +2,31 @@
* @file llchannelmanager.cpp
* @brief This class rules screen notification channels.
*
- * $LicenseInfo:firstyear=2000&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2000&license=viewergpl$
+ *
+ * Copyright (c) 2000-2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
@@ -237,19 +243,3 @@ void LLChannelManager::killToastsFromChannel(const LLUUID& channel_id, const LLS
}
}
-// static
-LLNotificationsUI::LLScreenChannel* LLChannelManager::getNotificationScreenChannel()
-{
- LLNotificationsUI::LLScreenChannel* channel = static_cast<LLNotificationsUI::LLScreenChannel*>
- (LLNotificationsUI::LLChannelManager::getInstance()->
- findChannelByID(LLUUID(gSavedSettings.getString("NotificationChannelUUID"))));
-
- if (channel == NULL)
- {
- llwarns << "Can't find screen channel by NotificationChannelUUID" << llendl;
- llassert(!"Can't find screen channel by NotificationChannelUUID");
- }
-
- return channel;
-}
-
diff --git a/indra/newview/llchatitemscontainerctrl.cpp b/indra/newview/llchatitemscontainerctrl.cpp
index aef36b677c..6ee14e8ba9 100644
--- a/indra/newview/llchatitemscontainerctrl.cpp
+++ b/indra/newview/llchatitemscontainerctrl.cpp
@@ -44,6 +44,8 @@
#include "llviewercontrol.h"
#include "llagentdata.h"
+#include "llslurl.h"
+
static const S32 msg_left_offset = 10;
static const S32 msg_right_offset = 10;
static const S32 msg_height_pad = 5;
@@ -190,6 +192,8 @@ void LLNearbyChatToastPanel::init(LLSD& notification)
style_params_name.font.name(font_name);
style_params_name.font.size(font_style_size);
+ style_params_name.link_href = LLSLURL::buildCommand("agent",mFromID,"about");
+
msg_text->appendText(str_sender, FALSE, style_params_name);
}
diff --git a/indra/newview/llchiclet.h b/indra/newview/llchiclet.h
index 489c66be71..9d421b4f0b 100644
--- a/indra/newview/llchiclet.h
+++ b/indra/newview/llchiclet.h
@@ -921,6 +921,9 @@ protected:
class LLNotificationChiclet : public LLSysWellChiclet
{
friend class LLUICtrlFactory;
+public:
+ struct Params : public LLInitParam::Block<Params, LLSysWellChiclet::Params>{};
+
protected:
LLNotificationChiclet(const Params& p);
diff --git a/indra/newview/llcofwearables.cpp b/indra/newview/llcofwearables.cpp
index 04623c03be..f0442ee3f6 100644
--- a/indra/newview/llcofwearables.cpp
+++ b/indra/newview/llcofwearables.cpp
@@ -2,25 +2,31 @@
* @file llcofwearables.cpp
* @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts)
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
@@ -28,270 +34,24 @@
#include "llcofwearables.h"
-#include "llaccordionctrl.h"
-#include "llaccordionctrltab.h"
-#include "llagentdata.h"
-#include "llagentwearables.h"
#include "llappearancemgr.h"
#include "llinventory.h"
+#include "llinventoryitemslist.h"
#include "llinventoryfunctions.h"
-#include "lllistcontextmenu.h"
-#include "llmenugl.h"
-#include "llviewermenu.h"
-#include "llwearableitemslist.h"
-#include "llpaneloutfitedit.h"
-#include "llsidetray.h"
-#include "lltrans.h"
static LLRegisterPanelClassWrapper<LLCOFWearables> t_cof_wearables("cof_wearables");
const LLSD REARRANGE = LLSD().with("rearrange", LLSD());
-static const LLWearableItemNameComparator WEARABLE_NAME_COMPARATOR;
-
-//////////////////////////////////////////////////////////////////////////
-
-class CofContextMenu : public LLListContextMenu
-{
-protected:
- CofContextMenu(LLCOFWearables* cof_wearables)
- : mCOFWearables(cof_wearables)
- {
- llassert(mCOFWearables);
- }
-
- void updateCreateWearableLabel(LLMenuGL* menu, const LLUUID& item_id)
- {
- LLMenuItemGL* menu_item = menu->getChild<LLMenuItemGL>("create_new");
- LLWearableType::EType w_type = getWearableType(item_id);
-
- // Hide the "Create new <WEARABLE_TYPE>" if it's irrelevant.
- if (w_type == LLWearableType::WT_NONE)
- {
- menu_item->setVisible(FALSE);
- return;
- }
-
- // Set proper label for the "Create new <WEARABLE_TYPE>" menu item.
- std::string new_label = LLTrans::getString("create_new_" + LLWearableType::getTypeName(w_type));
- menu_item->setLabel(new_label);
- }
-
- void createNew(const LLUUID& item_id)
- {
- LLAgentWearables::createWearable(getWearableType(item_id), true);
- }
-
- // Get wearable type of the given item.
- //
- // There is a special case: so-called "dummy items"
- // (i.e. the ones that are there just to indicate that you're not wearing
- // any wearables of the corresponding type. They are currently grayed out
- // and suffixed with "not worn").
- // Those items don't have an UUID, but they do have an associated wearable type.
- // If the user has invoked context menu for such item,
- // we ignore the passed item_id and retrieve wearable type from the item.
- LLWearableType::EType getWearableType(const LLUUID& item_id)
- {
- if (!isDummyItem(item_id))
- {
- LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id);
- if (item && item->isWearableType())
- {
- return item->getWearableType();
- }
- }
- else if (mCOFWearables) // dummy item selected
- {
- LLPanelDummyClothingListItem* item;
-
- item = dynamic_cast<LLPanelDummyClothingListItem*>(mCOFWearables->getSelectedItem());
- if (item)
- {
- return item->getWearableType();
- }
- }
-
- return LLWearableType::WT_NONE;
- }
-
- static bool isDummyItem(const LLUUID& item_id)
- {
- return item_id.isNull();
- }
-
- LLCOFWearables* mCOFWearables;
-};
-
-//////////////////////////////////////////////////////////////////////////
-
-class CofAttachmentContextMenu : public CofContextMenu
-{
-public:
- CofAttachmentContextMenu(LLCOFWearables* cof_wearables)
- : CofContextMenu(cof_wearables)
- {
- }
-
-protected:
-
- /*virtual*/ LLContextMenu* createMenu()
- {
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
-
- functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
- registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, mUUIDs));
-
- return createFromFile("menu_cof_attachment.xml");
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-
-class CofClothingContextMenu : public CofContextMenu
-{
-public:
- CofClothingContextMenu(LLCOFWearables* cof_wearables)
- : CofContextMenu(cof_wearables)
- {
- }
-
-protected:
- static void replaceWearable(const LLUUID& item_id)
- {
- // *TODO: Most probable that accessing to LLPanelOutfitEdit instance should be:
- // LLSideTray::getInstance()->getSidepanelAppearance()->getPanelOutfitEdit()
- // without casting. Getter methods provides possibility to check and construct
- // absent instance. Explicit relations between components avoids situations
- // when we tries to construct instance with unsatisfied implicit input conditions.
- LLPanelOutfitEdit * panel_outfit_edit =
- dynamic_cast<LLPanelOutfitEdit*> (LLSideTray::getInstance()->getPanel(
- "panel_outfit_edit"));
- if (panel_outfit_edit != NULL)
- {
- panel_outfit_edit->onReplaceMenuItemClicked(item_id);
- }
- }
-
- /*virtual*/ LLContextMenu* createMenu()
- {
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
- LLUUID selected_id = mUUIDs.back();
- functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
-
- registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, mUUIDs));
- registrar.add("Clothing.Replace", boost::bind(replaceWearable, selected_id));
- registrar.add("Clothing.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
- registrar.add("Clothing.Create", boost::bind(&CofClothingContextMenu::createNew, this, selected_id));
-
- enable_registrar.add("Clothing.OnEnable", boost::bind(&CofClothingContextMenu::onEnable, this, _2));
-
- LLContextMenu* menu = createFromFile("menu_cof_clothing.xml");
- llassert(menu);
- if (menu)
- {
- updateCreateWearableLabel(menu, selected_id);
- }
- return menu;
- }
-
- bool onEnable(const LLSD& data)
- {
- std::string param = data.asString();
- LLUUID selected_id = mUUIDs.back();
-
- if ("take_off" == param)
- {
- return get_is_item_worn(selected_id);
- }
- else if ("edit" == param)
- {
- return mUUIDs.size() == 1 && gAgentWearables.isWearableModifiable(selected_id);
- }
- else if ("replace" == param)
- {
- return get_is_item_worn(selected_id) && mUUIDs.size() == 1;
- }
-
- return true;
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-
-class CofBodyPartContextMenu : public CofContextMenu
-{
-public:
- CofBodyPartContextMenu(LLCOFWearables* cof_wearables)
- : CofContextMenu(cof_wearables)
- {
- }
-
-protected:
- /*virtual*/ LLContextMenu* createMenu()
- {
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
- LLUUID selected_id = mUUIDs.back();
-
- // *HACK* need to pass pointer to LLPanelOutfitEdit instead of LLSideTray::getInstance()->getPanel().
- // LLSideTray::getInstance()->getPanel() is rather slow variant
- LLPanelOutfitEdit* panel_oe = dynamic_cast<LLPanelOutfitEdit*>(LLSideTray::getInstance()->getPanel("panel_outfit_edit"));
- registrar.add("BodyPart.Replace", boost::bind(&LLPanelOutfitEdit::onReplaceMenuItemClicked, panel_oe, selected_id));
- registrar.add("BodyPart.Edit", boost::bind(LLAgentWearables::editWearable, selected_id));
- registrar.add("BodyPart.Create", boost::bind(&CofBodyPartContextMenu::createNew, this, selected_id));
-
- enable_registrar.add("BodyPart.OnEnable", boost::bind(&CofBodyPartContextMenu::onEnable, this, _2));
-
- LLContextMenu* menu = createFromFile("menu_cof_body_part.xml");
- llassert(menu);
- if (menu)
- {
- updateCreateWearableLabel(menu, selected_id);
- }
- return menu;
- }
-
- bool onEnable(const LLSD& data)
- {
- std::string param = data.asString();
- LLUUID selected_id = mUUIDs.back();
-
- if ("edit" == param)
- {
- return mUUIDs.size() == 1 && gAgentWearables.isWearableModifiable(selected_id);
- }
-
- return true;
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
LLCOFWearables::LLCOFWearables() : LLPanel(),
mAttachments(NULL),
mClothing(NULL),
mBodyParts(NULL),
- mLastSelectedList(NULL),
- mClothingTab(NULL),
- mAttachmentsTab(NULL),
- mBodyPartsTab(NULL),
- mLastSelectedTab(NULL),
- mAccordionCtrl(NULL),
- mCOFVersion(-1)
+ mLastSelectedList(NULL)
{
- mClothingMenu = new CofClothingContextMenu(this);
- mAttachmentMenu = new CofAttachmentContextMenu(this);
- mBodyPartMenu = new CofBodyPartContextMenu(this);
};
-LLCOFWearables::~LLCOFWearables()
-{
- delete mClothingMenu;
- delete mAttachmentMenu;
- delete mBodyPartMenu;
-}
// virtual
BOOL LLCOFWearables::postBuild()
@@ -300,9 +60,6 @@ BOOL LLCOFWearables::postBuild()
mClothing = getChild<LLFlatListView>("list_clothing");
mBodyParts = getChild<LLFlatListView>("list_body_parts");
- mClothing->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mClothingMenu));
- mAttachments->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mAttachmentMenu));
- mBodyParts->setRightMouseDownCallback(boost::bind(&LLCOFWearables::onListRightClick, this, _1, _2, _3, mBodyPartMenu));
//selection across different list/tabs is not supported
mAttachments->setCommitCallback(boost::bind(&LLCOFWearables::onSelectionChange, this, mAttachments));
@@ -313,26 +70,6 @@ BOOL LLCOFWearables::postBuild()
mClothing->setCommitOnSelectionChange(true);
mBodyParts->setCommitOnSelectionChange(true);
- //clothing is sorted according to its position relatively to the body
- mAttachments->setComparator(&WEARABLE_NAME_COMPARATOR);
- mBodyParts->setComparator(&WEARABLE_NAME_COMPARATOR);
-
-
- mClothingTab = getChild<LLAccordionCtrlTab>("tab_clothing");
- mClothingTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
-
- mAttachmentsTab = getChild<LLAccordionCtrlTab>("tab_attachments");
- mAttachmentsTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
-
- mBodyPartsTab = getChild<LLAccordionCtrlTab>("tab_body_parts");
- mBodyPartsTab->setDropDownStateChangedCallback(boost::bind(&LLCOFWearables::onAccordionTabStateChanged, this, _1, _2));
-
- mTab2AssetType[mClothingTab] = LLAssetType::AT_CLOTHING;
- mTab2AssetType[mAttachmentsTab] = LLAssetType::AT_OBJECT;
- mTab2AssetType[mBodyPartsTab] = LLAssetType::AT_BODYPART;
-
- mAccordionCtrl = getChild<LLAccordionCtrl>("cof_wearables_accordion");
-
return LLPanel::postBuild();
}
@@ -352,264 +89,53 @@ void LLCOFWearables::onSelectionChange(LLFlatListView* selected_list)
onCommit();
}
-void LLCOFWearables::onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expanded)
-{
- bool had_selected_items = mClothing->numSelected() || mAttachments->numSelected() || mBodyParts->numSelected();
- mClothing->resetSelection(true);
- mAttachments->resetSelection(true);
- mBodyParts->resetSelection(true);
-
- bool tab_selection_changed = false;
- LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
- if (tab && tab != mLastSelectedTab)
- {
- mLastSelectedTab = tab;
- tab_selection_changed = true;
- }
-
- if (had_selected_items || tab_selection_changed)
- {
- //sending commit signal to indicate selection changes
- onCommit();
- }
-}
-
void LLCOFWearables::refresh()
{
- const LLUUID cof_id = LLAppearanceMgr::instance().getCOF();
- if (cof_id.isNull())
- {
- llwarns << "COF ID cannot be NULL" << llendl;
- return;
- }
-
- LLViewerInventoryCategory* catp = gInventory.getCategory(cof_id);
- if (!catp)
- {
- llwarns << "COF category cannot be NULL" << llendl;
- return;
- }
-
- // BAP - this check has to be removed because an item name change does not
- // change cat version - ie, checking version is not a complete way
- // of finding out whether anything has changed in this category.
- //if (mCOFVersion == catp->getVersion()) return;
-
- mCOFVersion = catp->getVersion();
-
- 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]);
-
clear();
LLInventoryModel::cat_array_t cats;
- LLInventoryModel::item_array_t cof_items;
-
- gInventory.collectDescendents(cof_id, cats, cof_items, LLInventoryModel::EXCLUDE_TRASH);
-
- populateAttachmentsAndBodypartsLists(cof_items);
-
-
- LLAppearanceMgr::wearables_by_type_t clothing_by_type(LLWearableType::WT_COUNT);
- LLAppearanceMgr::getInstance()->divvyWearablesByType(cof_items, clothing_by_type);
+ LLInventoryModel::item_array_t items;
- populateClothingList(clothing_by_type);
+ gInventory.collectDescendents(LLAppearanceMgr::getInstance()->getCOF(), cats, items, LLInventoryModel::EXCLUDE_TRASH);
+ if (items.empty()) return;
- // Restore previous selection
- for (selection_map_t::iterator
- iter = preserve_selection.begin(),
- iter_end = preserve_selection.end();
- iter != iter_end; ++iter)
+ for (U32 i = 0; i < items.size(); ++i)
{
- LLFlatListView* list = iter->first;
- if (!list) continue;
+ LLViewerInventoryItem* item = items.get(i);
+ if (!item) continue;
- //restoring selection should not fire commit callbacks
- list->setCommitOnSelectionChange(false);
+ LLPanelInventoryListItem* item_panel = LLPanelInventoryListItem::createItemPanel(item);
+ if (!item_panel) continue;
- const values_vector_t& values = iter->second;
- for (values_vector_t::const_iterator
- value_it = values.begin(),
- value_it_end = values.end();
- value_it != value_it_end; ++value_it)
+ switch (item->getType())
{
- // value_it may be null because of dummy items
- // Dummy items have no ID
- if(value_it->asUUID().notNull())
- {
- list->selectItemByValue(*value_it);
- }
- }
-
- list->setCommitOnSelectionChange(true);
- }
-}
+ case LLAssetType::AT_OBJECT:
+ mAttachments->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
+ break;
+ case LLAssetType::AT_BODYPART:
+ mBodyParts->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
+ break;
-void LLCOFWearables::populateAttachmentsAndBodypartsLists(const LLInventoryModel::item_array_t& cof_items)
-{
- for (U32 i = 0; i < cof_items.size(); ++i)
- {
- LLViewerInventoryItem* item = cof_items.get(i);
- if (!item) continue;
-
- const LLAssetType::EType item_type = item->getType();
- if (item_type == LLAssetType::AT_CLOTHING) continue;
- LLPanelInventoryListItemBase* item_panel = NULL;
- if (item_type == LLAssetType::AT_OBJECT)
- {
- item_panel = buildAttachemntListItem(item);
- mAttachments->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
- }
- else if (item_type == LLAssetType::AT_BODYPART)
- {
- item_panel = buildBodypartListItem(item);
- if (!item_panel) continue;
+ case LLAssetType::AT_CLOTHING:
+ mClothing->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
+ break;
- mBodyParts->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
+ default: break;
}
}
- if (mAttachments->size())
- {
- mAttachments->sort();
- mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false)
- }
-
- if (mBodyParts->size())
- {
- mBodyParts->sort();
- mBodyParts->notify(REARRANGE);
- }
-}
-
-//create a clothing list item, update verbs and show/hide line separator
-LLPanelClothingListItem* LLCOFWearables::buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last)
-{
- llassert(item);
- if (!item) return NULL;
- LLPanelClothingListItem* item_panel = LLPanelClothingListItem::create(item);
- if (!item_panel) return NULL;
-
- //updating verbs
- //we don't need to use permissions of a link but of an actual/linked item
- if (item->getLinkedItem()) item = item->getLinkedItem();
- llassert(item);
- if (!item) return NULL;
-
- bool allow_modify = item->getPermissions().allowModifyBy(gAgentID);
+ mAttachments->sort(); //*TODO by Name
+ mAttachments->notify(REARRANGE); //notifying the parent about the list's size change (cause items were added with rearrange=false)
- item_panel->setShowLockButton(!allow_modify);
- item_panel->setShowEditButton(allow_modify);
-
- item_panel->setShowMoveUpButton(!first);
- item_panel->setShowMoveDownButton(!last);
-
- //setting callbacks
- //*TODO move that item panel's inner structure disclosing stuff into the panels
- item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable);
- item_panel->childSetAction("btn_move_up", mCOFCallbacks.mMoveWearableFurther);
- item_panel->childSetAction("btn_move_down", mCOFCallbacks.mMoveWearableCloser);
- item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);
-
- //turning on gray separator line for the last item in the items group of the same wearable type
- item_panel->setSeparatorVisible(last);
-
- return item_panel;
-}
-
-LLPanelBodyPartsListItem* LLCOFWearables::buildBodypartListItem(LLViewerInventoryItem* item)
-{
- llassert(item);
- if (!item) return NULL;
- LLPanelBodyPartsListItem* item_panel = LLPanelBodyPartsListItem::create(item);
- if (!item_panel) return NULL;
-
- //updating verbs
- //we don't need to use permissions of a link but of an actual/linked item
- if (item->getLinkedItem()) item = item->getLinkedItem();
- llassert(item);
- if (!item) return NULL;
- bool allow_modify = item->getPermissions().allowModifyBy(gAgentID);
- item_panel->setShowLockButton(!allow_modify);
- item_panel->setShowEditButton(allow_modify);
-
- //setting callbacks
- //*TODO move that item panel's inner structure disclosing stuff into the panels
- item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable);
- item_panel->childSetAction("btn_edit", mCOFCallbacks.mEditWearable);
-
- return item_panel;
-}
-
-LLPanelDeletableWearableListItem* LLCOFWearables::buildAttachemntListItem(LLViewerInventoryItem* item)
-{
- llassert(item);
- if (!item) return NULL;
-
- LLPanelAttachmentListItem* item_panel = LLPanelAttachmentListItem::create(item);
- if (!item_panel) return NULL;
-
- //setting callbacks
- //*TODO move that item panel's inner structure disclosing stuff into the panels
- item_panel->childSetAction("btn_delete", mCOFCallbacks.mDeleteWearable);
-
- return item_panel;
-}
-
-void LLCOFWearables::populateClothingList(LLAppearanceMgr::wearables_by_type_t& clothing_by_type)
-{
- llassert(clothing_by_type.size() == LLWearableType::WT_COUNT);
-
- for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; ++type)
- {
- U32 size = clothing_by_type[type].size();
- if (!size) continue;
-
- LLAppearanceMgr::sortItemsByActualDescription(clothing_by_type[type]);
-
- //clothing items are displayed in reverse order, from furthest ones to closest ones (relatively to the body)
- for (U32 i = size; i != 0; --i)
- {
- LLViewerInventoryItem* item = clothing_by_type[type][i-1];
-
- LLPanelClothingListItem* item_panel = buildClothingListItem(item, i == size, i == 1);
- if (!item_panel) continue;
-
- mClothing->addItem(item_panel, item->getUUID(), ADD_BOTTOM, false);
- }
- }
-
- addClothingTypesDummies(clothing_by_type);
-
+ mClothing->sort(); //*TODO by actual inventory item description
mClothing->notify(REARRANGE);
-}
-
-//adding dummy items for missing wearable types
-void LLCOFWearables::addClothingTypesDummies(const LLAppearanceMgr::wearables_by_type_t& clothing_by_type)
-{
- llassert(clothing_by_type.size() == LLWearableType::WT_COUNT);
- for (U32 type = LLWearableType::WT_SHIRT; type < LLWearableType::WT_COUNT; type++)
- {
- U32 size = clothing_by_type[type].size();
- if (size) continue;
-
- LLWearableType::EType w_type = static_cast<LLWearableType::EType>(type);
- LLPanelInventoryListItemBase* item_panel = LLPanelDummyClothingListItem::create(w_type);
- if(!item_panel) continue;
- item_panel->childSetAction("btn_add", mCOFCallbacks.mAddWearable);
- mClothing->addItem(item_panel, LLUUID::null, ADD_BOTTOM, false);
- }
+ mBodyParts->sort(); //*TODO by name
+ mBodyParts->notify(REARRANGE);
}
+
LLUUID LLCOFWearables::getSelectedUUID()
{
if (!mLastSelectedList) return LLUUID::null;
@@ -617,29 +143,6 @@ LLUUID LLCOFWearables::getSelectedUUID()
return mLastSelectedList->getSelectedUUID();
}
-bool LLCOFWearables::getSelectedUUIDs(uuid_vec_t& selected_ids)
-{
- if (!mLastSelectedList) return false;
-
- mLastSelectedList->getSelectedUUIDs(selected_ids);
- return selected_ids.size() != 0;
-}
-
-LLPanel* LLCOFWearables::getSelectedItem()
-{
- if (!mLastSelectedList) return NULL;
-
- return mLastSelectedList->getSelectedItem();
-}
-
-void LLCOFWearables::getSelectedItems(std::vector<LLPanel*>& selected_items) const
-{
- if (mLastSelectedList)
- {
- mLastSelectedList->getSelectedItems(selected_items);
- }
-}
-
void LLCOFWearables::clear()
{
mAttachments->clear();
@@ -647,65 +150,4 @@ void LLCOFWearables::clear()
mBodyParts->clear();
}
-LLAssetType::EType LLCOFWearables::getExpandedAccordionAssetType()
-{
- typedef std::map<std::string, LLAssetType::EType> type_map_t;
-
- static type_map_t type_map;
-
- if (mAccordionCtrl != NULL)
- {
- const LLAccordionCtrlTab* expanded_tab = mAccordionCtrl->getExpandedTab();
-
- return get_if_there(mTab2AssetType, expanded_tab, LLAssetType::AT_NONE);
- }
-
- return LLAssetType::AT_NONE;
-}
-
-LLAssetType::EType LLCOFWearables::getSelectedAccordionAssetType()
-{
- if (mAccordionCtrl != NULL)
- {
- const LLAccordionCtrlTab* selected_tab = mAccordionCtrl->getSelectedTab();
-
- return get_if_there(mTab2AssetType, selected_tab, LLAssetType::AT_NONE);
- }
-
- return LLAssetType::AT_NONE;
-}
-
-void LLCOFWearables::expandDefaultAccordionTab()
-{
- if (mAccordionCtrl != NULL)
- {
- mAccordionCtrl->expandDefaultTab();
- }
-}
-
-void LLCOFWearables::onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu)
-{
- if(menu)
- {
- uuid_vec_t selected_uuids;
- if(getSelectedUUIDs(selected_uuids))
- {
- bool show_menu = false;
- for(uuid_vec_t::iterator it = selected_uuids.begin();it!=selected_uuids.end();++it)
- {
- if ((*it).notNull())
- {
- show_menu = true;
- break;
- }
- }
-
- if(show_menu)
- {
- menu->show(ctrl, selected_uuids, x, y);
- }
- }
- }
-}
-
//EOF
diff --git a/indra/newview/llcofwearables.h b/indra/newview/llcofwearables.h
index e426b10810..58d67ed32f 100644
--- a/indra/newview/llcofwearables.h
+++ b/indra/newview/llcofwearables.h
@@ -2,104 +2,57 @@
* @file llcofwearables.h
* @brief LLCOFWearables displayes wearables from the current outfit split into three lists (attachments, clothing and body parts)
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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_LLCOFWEARABLES_H
#define LL_LLCOFWEARABLES_H
-// llui
-#include "llflatlistview.h"
#include "llpanel.h"
-#include "llappearancemgr.h"
-#include "llinventorymodel.h"
-
-class LLAccordionCtrl;
-class LLAccordionCtrlTab;
-class LLListContextMenu;
-class LLPanelClothingListItem;
-class LLPanelBodyPartsListItem;
-class LLPanelDeletableWearableListItem;
+class LLFlatListView;
class LLCOFWearables : public LLPanel
{
public:
-
- /**
- * Represents a collection of callbacks assigned to inventory panel item's buttons
- */
- class LLCOFCallbacks
- {
- public:
- LLCOFCallbacks() {};
- virtual ~LLCOFCallbacks() {};
-
- typedef boost::function<void (void*)> cof_callback_t;
-
- cof_callback_t mAddWearable;
- cof_callback_t mMoveWearableCloser;
- cof_callback_t mMoveWearableFurther;
- cof_callback_t mEditWearable;
- cof_callback_t mDeleteWearable;
- };
-
-
-
LLCOFWearables();
- virtual ~LLCOFWearables();
+ virtual ~LLCOFWearables() {};
/*virtual*/ BOOL postBuild();
LLUUID getSelectedUUID();
- bool getSelectedUUIDs(uuid_vec_t& selected_ids);
- LLPanel* getSelectedItem();
- void getSelectedItems(std::vector<LLPanel*>& selected_items) const;
-
- /* Repopulate the COF wearables list if the COF category has been changed since the last refresh */
void refresh();
void clear();
- LLAssetType::EType getExpandedAccordionAssetType();
- LLAssetType::EType getSelectedAccordionAssetType();
- void expandDefaultAccordionTab();
-
- LLCOFCallbacks& getCOFCallbacks() { return mCOFCallbacks; }
-
protected:
- void populateAttachmentsAndBodypartsLists(const LLInventoryModel::item_array_t& cof_items);
- void populateClothingList(LLAppearanceMgr::wearables_by_type_t& clothing_by_type);
-
- void addClothingTypesDummies(const LLAppearanceMgr::wearables_by_type_t& clothing_by_type);
void onSelectionChange(LLFlatListView* selected_list);
- void onAccordionTabStateChanged(LLUICtrl* ctrl, const LLSD& expanded);
-
- LLPanelClothingListItem* buildClothingListItem(LLViewerInventoryItem* item, bool first, bool last);
- LLPanelBodyPartsListItem* buildBodypartListItem(LLViewerInventoryItem* item);
- LLPanelDeletableWearableListItem* buildAttachemntListItem(LLViewerInventoryItem* item);
-
- void onListRightClick(LLUICtrl* ctrl, S32 x, S32 y, LLListContextMenu* menu);
LLFlatListView* mAttachments;
LLFlatListView* mClothing;
@@ -107,24 +60,6 @@ protected:
LLFlatListView* mLastSelectedList;
- LLAccordionCtrlTab* mClothingTab;
- LLAccordionCtrlTab* mAttachmentsTab;
- LLAccordionCtrlTab* mBodyPartsTab;
-
- LLAccordionCtrlTab* mLastSelectedTab;
-
- std::map<const LLAccordionCtrlTab*, LLAssetType::EType> mTab2AssetType;
-
- LLCOFCallbacks mCOFCallbacks;
-
- LLListContextMenu* mClothingMenu;
- LLListContextMenu* mAttachmentMenu;
- LLListContextMenu* mBodyPartMenu;
-
- LLAccordionCtrl* mAccordionCtrl;
-
- /* COF category version since last refresh */
- S32 mCOFVersion;
};
diff --git a/indra/newview/llfilteredwearablelist.cpp b/indra/newview/llfilteredwearablelist.cpp
index cd5e779c4d..01d3c3f22e 100644
--- a/indra/newview/llfilteredwearablelist.cpp
+++ b/indra/newview/llfilteredwearablelist.cpp
@@ -2,25 +2,30 @@
* @file llfilteredwearablelist.cpp
* @brief Functionality for showing filtered wearable flat list
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
* 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
+ * 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$
*/
@@ -32,10 +37,34 @@
#include "llinventoryitemslist.h"
#include "llinventorymodel.h"
+class LLFindItemsByMask : public LLInventoryCollectFunctor
+{
+public:
+ LLFindItemsByMask(U64 mask)
+ : mFilterMask(mask)
+ {}
+
+ virtual bool operator()(LLInventoryCategory* cat, LLInventoryItem* item)
+ {
+ if(item)
+ {
+ if( mFilterMask & (1LL << item->getInventoryType()) )
+ {
+ return TRUE;
+ }
+ }
+ return FALSE;
+ }
-LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, LLInventoryCollectFunctor* collector)
+private:
+ U64 mFilterMask;
+};
+
+//////////////////////////////////////////////////////////////////////////
+
+LLFilteredWearableListManager::LLFilteredWearableListManager(LLInventoryItemsList* list, U64 filter_mask)
: mWearableList(list)
-, mCollector(collector)
+, mFilterMask(filter_mask)
{
llassert(mWearableList);
gInventory.addObserver(this);
@@ -49,15 +78,6 @@ LLFilteredWearableListManager::~LLFilteredWearableListManager()
void LLFilteredWearableListManager::changed(U32 mask)
{
- if (LLInventoryObserver::CALLING_CARD == mask
- || LLInventoryObserver::GESTURE == mask
- || LLInventoryObserver::SORT == mask
- )
- {
- // skip non-related changes
- return;
- }
-
if(!gInventory.isInventoryUsable())
{
return;
@@ -66,9 +86,9 @@ void LLFilteredWearableListManager::changed(U32 mask)
populateList();
}
-void LLFilteredWearableListManager::setFilterCollector(LLInventoryCollectFunctor* collector)
+void LLFilteredWearableListManager::setFilterMask(U64 mask)
{
- mCollector = collector;
+ mFilterMask = mask;
populateList();
}
@@ -76,16 +96,14 @@ void LLFilteredWearableListManager::populateList()
{
LLInventoryModel::cat_array_t cat_array;
LLInventoryModel::item_array_t item_array;
+ LLFindItemsByMask collector(mFilterMask);
- if(mCollector)
- {
- gInventory.collectDescendentsIf(
- gInventory.getRootFolderID(),
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH,
- *mCollector);
- }
+ gInventory.collectDescendentsIf(
+ gInventory.getRootFolderID(),
+ cat_array,
+ item_array,
+ LLInventoryModel::EXCLUDE_TRASH,
+ collector);
// Probably will also need to get items from Library (waiting for reply in EXT-6724).
diff --git a/indra/newview/llfilteredwearablelist.h b/indra/newview/llfilteredwearablelist.h
index c21458ca98..3f42833bb4 100644
--- a/indra/newview/llfilteredwearablelist.h
+++ b/indra/newview/llfilteredwearablelist.h
@@ -2,43 +2,47 @@
* @file llfilteredwearablelist.h
* @brief Functionality for showing filtered wearable flat list
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
* 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
+ * 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_LLFILTEREDWEARABLELIST_H
#define LL_LLFILTEREDWEARABLELIST_H
-#include "llinventoryfunctions.h"
#include "llinventoryobserver.h"
class LLInventoryItemsList;
-// Class that fills LLInventoryItemsList with filtered data (original items only (non-links)).
+// Class that fills LLInventoryItemsList with filtered data.
class LLFilteredWearableListManager : public LLInventoryObserver
{
LOG_CLASS(LLFilteredWearableListManager);
public:
- LLFilteredWearableListManager(LLInventoryItemsList* list, LLInventoryCollectFunctor* collector);
+ LLFilteredWearableListManager(LLInventoryItemsList* list, U64 filter_mask);
~LLFilteredWearableListManager();
/** LLInventoryObserver implementation
@@ -47,9 +51,9 @@ public:
/*virtual*/ void changed(U32 mask);
/**
- * Sets new collector and applies it immediately
+ * Sets new filter and applies it immediately
*/
- void setFilterCollector(LLInventoryCollectFunctor* collector);
+ void setFilterMask(U64 mask);
/**
* Populates wearable list with filtered data.
@@ -58,7 +62,7 @@ public:
private:
LLInventoryItemsList* mWearableList;
- LLInventoryCollectFunctor* mCollector;
+ U64 mFilterMask;
};
#endif //LL_LLFILTEREDWEARABLELIST_H
diff --git a/indra/newview/llfloaterbuyland.cpp b/indra/newview/llfloaterbuyland.cpp
index d37bc01885..76a61db5fd 100644
--- a/indra/newview/llfloaterbuyland.cpp
+++ b/indra/newview/llfloaterbuyland.cpp
@@ -54,6 +54,7 @@
#include "llstatusbar.h"
#include "lltextbox.h"
#include "lltexturectrl.h"
+#include "lltrans.h"
#include "llviewchildren.h"
#include "llviewercontrol.h"
#include "lluictrlfactory.h"
@@ -1172,13 +1173,13 @@ void LLFloaterBuyLandUI::refreshUI()
if (!mParcelValid)
{
- message += getString("no_parcel_selected");
+ message += LLTrans::getString("sentences_separator") + getString("no_parcel_selected");
}
else if (mParcelBillableArea == mParcelActualArea)
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d ", mParcelActualArea);
- message += getString("parcel_meters", string_args);
+ message += LLTrans::getString("sentences_separator") + getString("parcel_meters", string_args);
}
else
{
@@ -1187,13 +1188,13 @@ void LLFloaterBuyLandUI::refreshUI()
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea);
- message += getString("premium_land", string_args);
+ message += LLTrans::getString("sentences_separator") + getString("premium_land", string_args);
}
else
{
LLStringUtil::format_map_t string_args;
string_args["[AMOUNT]"] = llformat("%d ", mParcelBillableArea);
- message += getString("discounted_land", string_args);
+ message += LLTrans::getString("sentences_separator") + getString("discounted_land", string_args);
}
}
diff --git a/indra/newview/llfolderview.cpp b/indra/newview/llfolderview.cpp
index c492bfcef1..eba4cdfa31 100644
--- a/indra/newview/llfolderview.cpp
+++ b/indra/newview/llfolderview.cpp
@@ -946,7 +946,9 @@ void LLFolderView::draw()
}
else
{
- mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage());
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(getFilter()->getFilterSubStringOrig());
+ mStatusText = LLTrans::getString(getFilter()->getEmptyLookupMessage(), args);
//font->renderUTF8(mStatusText, 0, 2, 1, sSearchStatusColor, LLFontGL::LEFT, LLFontGL::TOP, LLFontGL::NORMAL, LLFontGL::NO_SHADOW, S32_MAX, S32_MAX, NULL, FALSE );
}
mStatusTextBox->setValue(mStatusText);
diff --git a/indra/newview/llgrouplist.cpp b/indra/newview/llgrouplist.cpp
index f21b6e1085..252c34cf9c 100644
--- a/indra/newview/llgrouplist.cpp
+++ b/indra/newview/llgrouplist.cpp
@@ -131,9 +131,15 @@ BOOL LLGroupList::handleRightMouseDown(S32 x, S32 y, MASK mask)
void LLGroupList::setNameFilter(const std::string& filter)
{
- if (mNameFilter != filter)
+ std::string filter_upper = filter;
+ LLStringUtil::toUpper(filter_upper);
+ if (mNameFilter != filter_upper)
{
- mNameFilter = filter;
+ mNameFilter = filter_upper;
+
+ // set no items message depend on filter state
+ updateNoItemsMessage(filter);
+
setDirty();
}
}
@@ -151,9 +157,6 @@ void LLGroupList::refresh()
LLUUID id;
bool have_filter = !mNameFilter.empty();
- // set no items message depend on filter state & total count of groups
- updateNoItemsMessage(have_filter);
-
clear();
for(S32 i = 0; i < count; ++i)
diff --git a/indra/newview/llimview.cpp b/indra/newview/llimview.cpp
index 909878207c..f03026715d 100644
--- a/indra/newview/llimview.cpp
+++ b/indra/newview/llimview.cpp
@@ -1767,6 +1767,8 @@ void LLOutgoingCallDialog::show(const LLSD& key)
getChild<LLTextBox>("leaving")->setVisible(true);
}
break;
+ // STATE_READY is here to show appropriate text for ad-hoc and group calls when floater is shown(EXT-6893)
+ case LLVoiceChannel::STATE_READY :
case LLVoiceChannel::STATE_RINGING :
if(show_oldchannel)
{
diff --git a/indra/newview/llinventorybridge.cpp b/indra/newview/llinventorybridge.cpp
index b85bf0d518..b4a1bf2758 100644
--- a/indra/newview/llinventorybridge.cpp
+++ b/indra/newview/llinventorybridge.cpp
@@ -2520,6 +2520,7 @@ void LLFolderBridge::pasteLinkFromClipboard()
item->getLinkedUUID(),
parent_id,
item->getName(),
+ item->getDescription(),
LLAssetType::AT_LINK,
LLPointer<LLInventoryCallback>(NULL));
}
@@ -3166,6 +3167,7 @@ BOOL LLFolderBridge::dragItemIntoFolder(LLInventoryItem* inv_item,
inv_item->getLinkedUUID(),
mUUID,
inv_item->getName(),
+ inv_item->getDescription(),
LLAssetType::AT_LINK,
cb);
}
diff --git a/indra/newview/llinventoryfilter.cpp b/indra/newview/llinventoryfilter.cpp
index 1a488175ac..901a570487 100644
--- a/indra/newview/llinventoryfilter.cpp
+++ b/indra/newview/llinventoryfilter.cpp
@@ -329,9 +329,10 @@ void LLInventoryFilter::setFilterSubString(const std::string& string)
// appending new characters
const BOOL more_restrictive = mFilterSubString.size() < string.size() && !string.substr(0, mFilterSubString.size()).compare(mFilterSubString);
- mFilterSubString = string;
+ mFilterSubStringOrig = string;
+ LLStringUtil::trimHead(mFilterSubStringOrig);
+ mFilterSubString = mFilterSubStringOrig;
LLStringUtil::toUpper(mFilterSubString);
- LLStringUtil::trimHead(mFilterSubString);
if (less_restrictive)
{
setModified(FILTER_LESS_RESTRICTIVE);
diff --git a/indra/newview/llinventoryfilter.h b/indra/newview/llinventoryfilter.h
index f488b2ed1b..2376ba5d22 100644
--- a/indra/newview/llinventoryfilter.h
+++ b/indra/newview/llinventoryfilter.h
@@ -3,25 +3,31 @@
* @brief Support for filtering your inventory to only display a subset of the
* available items.
*
-* $LicenseInfo:firstyear=2005&license=viewerlgpl$
-* Second Life Viewer Source Code
-* Copyright (C) 2010, Linden Research, Inc.
+* $LicenseInfo:firstyear=2005&license=viewergpl$
+*
+* Copyright (c) 2005-2009, 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.
+* 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
*
-* 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.
+* 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
*
-* 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
+* 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.
*
-* Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+* 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 LLINVENTORYFILTER_H
@@ -50,20 +56,13 @@ public:
FILTER_MORE_RESTRICTIVE // if you didn't pass the previous filter, you definitely won't pass this one
};
- enum EFilterType {
- FILTERTYPE_NONE = 0,
- FILTERTYPE_OBJECT = 0x1 << 0, // normal default search-by-object-type
- FILTERTYPE_CATEGORY = 0x1 << 1, // search by folder type
- FILTERTYPE_UUID = 0x1 << 2, // find the object with UUID and any links to it
- FILTERTYPE_DATE = 0x1 << 3, // search by date range
- FILTERTYPE_WEARABLE = 0x1 << 4 // search by wearable type
- };
-
- enum EFilterLink
+ enum EFilterType
{
- FILTERLINK_INCLUDE_LINKS, // show links too
- FILTERLINK_EXCLUDE_LINKS, // don't show links
- FILTERLINK_ONLY_LINKS // only show links
+ FILTERTYPE_NONE = 0,
+ FILTERTYPE_OBJECT = 1, // normal default search-by-object-type
+ FILTERTYPE_CATEGORY = 2, // search by folder type
+ FILTERTYPE_UUID = 4, // find the object with UUID and any links to it
+ FILTERTYPE_DATE = 8 // search by date range
};
// REFACTOR: Change this to an enum.
@@ -82,7 +81,6 @@ public:
BOOL isFilterObjectTypesWith(LLInventoryType::EType t) const;
void setFilterCategoryTypes(U64 types);
void setFilterUUID(const LLUUID &object_id);
- void setFilterWearableTypes(U64 types);
void setFilterSubString(const std::string& string);
const std::string& getFilterSubString(BOOL trim = FALSE) const;
@@ -100,17 +98,11 @@ public:
void setHoursAgo(U32 hours);
U32 getHoursAgo() const;
- void setFilterLinks(U64 filter_link);
- U64 getFilterLinks() const;
-
// +-------------------------------------------------------------------+
// + Execution And Results
// +-------------------------------------------------------------------+
BOOL check(const LLFolderViewItem* item);
- BOOL checkAgainstFilterType(const LLFolderViewItem* item) const;
- BOOL checkAgainstPermissions(const LLFolderViewItem* item) const;
- BOOL checkAgainstFilterLinks(const LLFolderViewItem* item) const;
-
+ BOOL checkAgainstFilterType(const LLFolderViewItem* item);
std::string::size_type getStringMatchOffset() const;
// +-------------------------------------------------------------------+
@@ -172,7 +164,6 @@ private:
U32 mFilterTypes;
U64 mFilterObjectTypes; // For _OBJECT
- U64 mFilterWearableTypes;
U64 mFilterCategoryTypes; // For _CATEGORY
LLUUID mFilterUUID; // for UUID
@@ -181,7 +172,6 @@ private:
U32 mHoursAgo;
EFolderShow mShowFolderState;
PermissionMask mPermissions;
- U64 mFilterLinks;
};
U32 mOrder;
diff --git a/indra/newview/llinventoryitemslist.cpp b/indra/newview/llinventoryitemslist.cpp
index 2b81ba8a12..dca130c672 100644
--- a/indra/newview/llinventoryitemslist.cpp
+++ b/indra/newview/llinventoryitemslist.cpp
@@ -3,26 +3,33 @@
* @brief A list of inventory items represented by LLFlatListView.
*
* Class LLInventoryItemsList implements a flat list of inventory items.
+ * Class LLPanelInventoryListItem displays inventory item as an element
+ * of LLInventoryItemsList.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
*
- * $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
+ * 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$
*/
@@ -33,36 +40,108 @@
// llcommon
#include "llcommonutils.h"
-#include "lltrans.h"
+#include "lliconctrl.h"
-#include "llcallbacklist.h"
-#include "llinventorylistitem.h"
+#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
-#include "llviewerinventory.h"
+#include "lltextutil.h"
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+
+// static
+LLPanelInventoryListItem* LLPanelInventoryListItem::createItemPanel(const LLViewerInventoryItem* item)
+{
+ if (item)
+ {
+ return new LLPanelInventoryListItem(item);
+ }
+ else
+ {
+ return NULL;
+ }
+}
+
+LLPanelInventoryListItem::~LLPanelInventoryListItem()
+{}
+
+//virtual
+BOOL LLPanelInventoryListItem::postBuild()
+{
+ mIcon = getChild<LLIconCtrl>("item_icon");
+ mTitle = getChild<LLTextBox>("item_name");
+
+ updateItem();
+
+ return TRUE;
+}
+
+//virtual
+void LLPanelInventoryListItem::setValue(const LLSD& value)
+{
+ if (!value.isMap()) return;
+ if (!value.has("selected")) return;
+ childSetVisible("selected_icon", value["selected"]);
+}
+
+void LLPanelInventoryListItem::updateItem()
+{
+ if (mItemIcon.notNull())
+ mIcon->setImage(mItemIcon);
+
+ LLTextUtil::textboxSetHighlightedVal(
+ mTitle,
+ LLStyle::Params(),
+ mItemName,
+ mHighlightedText);
+}
+
+void LLPanelInventoryListItem::onMouseEnter(S32 x, S32 y, MASK mask)
+{
+ childSetVisible("hovered_icon", true);
+
+ LLPanel::onMouseEnter(x, y, mask);
+}
+
+void LLPanelInventoryListItem::onMouseLeave(S32 x, S32 y, MASK mask)
+{
+ childSetVisible("hovered_icon", false);
+
+ LLPanel::onMouseLeave(x, y, mask);
+}
+
+LLPanelInventoryListItem::LLPanelInventoryListItem(const LLViewerInventoryItem* item)
+: LLPanel()
+ ,mIcon(NULL)
+ ,mTitle(NULL)
+{
+ mItemName = item->getName();
+ mItemIcon = get_item_icon(item->getType(), item->getInventoryType(), item->getFlags(), FALSE);
+
+ LLUICtrlFactory::getInstance()->buildPanel(this, "panel_inventory_item.xml");
+}
+
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
+////////////////////////////////////////////////////////////////////////////////
LLInventoryItemsList::Params::Params()
{}
LLInventoryItemsList::LLInventoryItemsList(const LLInventoryItemsList::Params& p)
-: LLFlatListViewEx(p)
+: LLFlatListView(p)
, mNeedsRefresh(false)
-, mForceRefresh(false)
{
// TODO: mCommitOnSelectionChange is set to "false" in LLFlatListView
// but reset to true in all derived classes. This settings might need to
// be added to LLFlatListView::Params() and/or set to "true" by default.
setCommitOnSelectionChange(true);
-
- setNoFilteredItemsMsg(LLTrans::getString("InventoryNoMatchingItems"));
-
- gIdleCallbacks.addFunction(idle, this);
}
// virtual
LLInventoryItemsList::~LLInventoryItemsList()
-{
- gIdleCallbacks.deleteFunction(idle, this);
-}
+{}
void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item_array)
{
@@ -75,39 +154,18 @@ void LLInventoryItemsList::refreshList(const LLInventoryModel::item_array_t item
mNeedsRefresh = true;
}
-boost::signals2::connection LLInventoryItemsList::setRefreshCompleteCallback(const commit_signal_t::slot_type& cb)
-{
- return mRefreshCompleteSignal.connect(cb);
-}
-
-void LLInventoryItemsList::doIdle()
+void LLInventoryItemsList::draw()
{
- if (!mNeedsRefresh) return;
-
- if (isInVisibleChain() || mForceRefresh)
+ LLFlatListView::draw();
+ if(mNeedsRefresh)
{
refresh();
-
- mRefreshCompleteSignal(this, LLSD());
- }
-}
-
-//static
-void LLInventoryItemsList::idle(void* user_data)
-{
- LLInventoryItemsList* self = static_cast<LLInventoryItemsList*>(user_data);
- if ( self )
- { // Do the real idle
- self->doIdle();
}
}
-LLFastTimer::DeclareTimer FTM_INVENTORY_ITEMS_REFRESH("Inventory List Refresh");
-
void LLInventoryItemsList::refresh()
{
- LLFastTimer _(FTM_INVENTORY_ITEMS_REFRESH);
- static const unsigned ADD_LIMIT = 20;
+ static const unsigned ADD_LIMIT = 50;
uuid_vec_t added_items;
uuid_vec_t removed_items;
@@ -115,7 +173,7 @@ void LLInventoryItemsList::refresh()
computeDifference(getIDs(), added_items, removed_items);
bool add_limit_exceeded = false;
- unsigned int nadded = 0;
+ unsigned nadded = 0;
uuid_vec_t::const_iterator it = added_items.begin();
for( ; added_items.end() != it; ++it)
@@ -126,28 +184,18 @@ void LLInventoryItemsList::refresh()
break;
}
LLViewerInventoryItem* item = gInventory.getItem(*it);
- // Do not rearrange items on each adding, let's do that on filter call
- llassert(item);
- if (item)
- {
- addNewItem(item, false);
- ++nadded;
- }
+ addNewItem(item);
+ ++nadded;
}
it = removed_items.begin();
for( ; removed_items.end() != it; ++it)
{
- // don't filter items right away
- removeItemByUUID(*it, false);
+ removeItemByUUID(*it);
}
- // Filter, rearrange and notify parent about shape changes
- filterItems();
-
bool needs_refresh = add_limit_exceeded;
setNeedsRefresh(needs_refresh);
- setForceRefresh(needs_refresh);
}
void LLInventoryItemsList::computeDifference(
@@ -167,23 +215,22 @@ void LLInventoryItemsList::computeDifference(
LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved);
}
-void LLInventoryItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/)
+void LLInventoryItemsList::addNewItem(LLViewerInventoryItem* item)
{
if (!item)
{
llwarns << "No inventory item. Couldn't create flat list item." << llendl;
- llassert(item != NULL);
+ llassert(!"No inventory item. Couldn't create flat list item.");
}
- LLPanelInventoryListItemBase *list_item = LLPanelInventoryListItemBase::create(item);
+ LLPanelInventoryListItem *list_item = LLPanelInventoryListItem::createItemPanel(item);
if (!list_item)
return;
- bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange);
- if (!is_item_added)
+ if (!addItem(list_item, item->getUUID()))
{
llwarns << "Couldn't add flat list item." << llendl;
- llassert(is_item_added);
+ llassert(!"Couldn't add flat list item.");
}
}
diff --git a/indra/newview/llinventoryitemslist.h b/indra/newview/llinventoryitemslist.h
index ca90427659..b496f4b9e9 100644
--- a/indra/newview/llinventoryitemslist.h
+++ b/indra/newview/llinventoryitemslist.h
@@ -3,26 +3,33 @@
* @brief A list of inventory items represented by LLFlatListView.
*
* Class LLInventoryItemsList implements a flat list of inventory items.
+ * Class LLPanelInventoryListItem displays inventory item as an element
+ * of LLInventoryItemsList.
+ *
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
*
- * $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
+ * 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$
*/
@@ -31,16 +38,46 @@
#include "lldarray.h"
+#include "llpanel.h"
+
// newview
#include "llflatlistview.h"
+class LLIconCtrl;
+class LLTextBox;
class LLViewerInventoryItem;
-class LLInventoryItemsList : public LLFlatListViewEx
+class LLPanelInventoryListItem : public LLPanel
{
- LOG_CLASS(LLInventoryItemsList);
public:
- struct Params : public LLInitParam::Block<Params, LLFlatListViewEx::Params>
+ static LLPanelInventoryListItem* createItemPanel(const LLViewerInventoryItem* item);
+
+ virtual ~LLPanelInventoryListItem();
+
+ /*virtual*/ BOOL postBuild();
+ /*virtual*/ void setValue(const LLSD& value);
+
+ void updateItem();
+
+ void onMouseEnter(S32 x, S32 y, MASK mask);
+ void onMouseLeave(S32 x, S32 y, MASK mask);
+
+protected:
+ LLPanelInventoryListItem(const LLViewerInventoryItem* item);
+
+private:
+ LLIconCtrl* mIcon;
+ LLTextBox* mTitle;
+
+ LLUIImagePtr mItemIcon;
+ std::string mItemName;
+ std::string mHighlightedText;
+};
+
+class LLInventoryItemsList : public LLFlatListView
+{
+public:
+ struct Params : public LLInitParam::Block<Params, LLFlatListView::Params>
{
Params();
};
@@ -49,29 +86,14 @@ public:
void refreshList(const LLDynamicArray<LLPointer<LLViewerInventoryItem> > item_array);
- boost::signals2::connection setRefreshCompleteCallback(const commit_signal_t::slot_type& cb);
-
/**
- * Let list know items need to be refreshed in next doIdle()
+ * Let list know items need to be refreshed in next draw()
*/
void setNeedsRefresh(bool needs_refresh){ mNeedsRefresh = needs_refresh; }
bool getNeedsRefresh(){ return mNeedsRefresh; }
- /**
- * Sets the flag indicating that the list needs to be refreshed even if it is
- * not currently visible.
- */
- void setForceRefresh(bool force_refresh){ mForceRefresh = force_refresh; }
-
- /**
- * Idle routine used to refresh the list regardless of the current list
- * visibility, unlike draw() which is called only for the visible list.
- * This is needed for example to filter items of the list hidden by closed
- * accordion tab.
- */
- void doIdle(); // Real idle routine
- static void idle(void* user_data); // static glue to doIdle()
+ /*virtual*/ void draw();
protected:
friend class LLUICtrlFactory;
@@ -81,7 +103,7 @@ protected:
/**
* Refreshes list items, adds new items and removes deleted items.
- * Called from doIdle() until all new items are added,
+ * Called from draw() until all new items are added, ,
* maximum 50 items can be added during single call.
*/
void refresh();
@@ -95,16 +117,12 @@ protected:
/**
* Add an item to the list
*/
- virtual void addNewItem(LLViewerInventoryItem* item, bool rearrange = true);
+ void addNewItem(LLViewerInventoryItem* item);
private:
uuid_vec_t mIDs; // IDs of items that were added in refreshList().
// Will be used in refresh() to determine added and removed ids
bool mNeedsRefresh;
-
- bool mForceRefresh;
-
- commit_signal_t mRefreshCompleteSignal;
};
#endif //LL_LLINVENTORYITEMSLIST_H
diff --git a/indra/newview/llinventoryobserver.cpp b/indra/newview/llinventoryobserver.cpp
index 29d99d328a..214b5d317a 100644
--- a/indra/newview/llinventoryobserver.cpp
+++ b/indra/newview/llinventoryobserver.cpp
@@ -650,3 +650,53 @@ void LLInventoryTransactionObserver::changed(U32 mask)
}
}
}
+
+void LLInventoryCategoriesObserver::changed(U32 mask)
+{
+ if (!mCategoryMap.size())
+ return;
+
+ for (category_map_t::iterator iter = mCategoryMap.begin();
+ iter != mCategoryMap.end();
+ ++iter)
+ {
+ LLViewerInventoryCategory* category = gInventory.getCategory((*iter).first);
+ if (!category)
+ continue;
+
+ S32 version = category->getVersion();
+ if (version != (*iter).second.mVersion)
+ {
+ // Update category version in map.
+ (*iter).second.mVersion = version;
+ (*iter).second.mCallback();
+ }
+ }
+}
+
+void LLInventoryCategoriesObserver::addCategory(const LLUUID& cat_id, callback_t cb)
+{
+ S32 version;
+ LLViewerInventoryCategory* category = gInventory.getCategory(cat_id);
+ if (category)
+ {
+ // Inventory category version is used to find out if some changes
+ // to a category have been made.
+ version = category->getVersion();
+ }
+ else
+ {
+ // If category could not be retrieved it might mean that
+ // inventory is unusable at the moment so the category is
+ // stored with VERSION_UNKNOWN and it may be updated later.
+ version = LLViewerInventoryCategory::VERSION_UNKNOWN;
+ }
+
+ version = category->getVersion();
+ mCategoryMap.insert(category_map_value_t(cat_id, LLCategoryData(cb, version)));
+}
+
+void LLInventoryCategoriesObserver::removeCategory(const LLUUID& cat_id)
+{
+ mCategoryMap.erase(cat_id);
+}
diff --git a/indra/newview/llinventoryobserver.h b/indra/newview/llinventoryobserver.h
index 8d60df7e8d..e63b67d2ad 100644
--- a/indra/newview/llinventoryobserver.h
+++ b/indra/newview/llinventoryobserver.h
@@ -261,5 +261,40 @@ protected:
uuid_vec_t mIncomplete;
};
-#endif // LL_LLINVENTORYOBSERVERS_H
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+// Class LLInventoryCategoriesObserver
+//
+// This class is used for monitoring a list of inventory categories
+// and firing a callback when there are changes in any of them.
+// Categories are identified by their UUIDs.
+//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+class LLInventoryCategoriesObserver : public LLInventoryObserver
+{
+public:
+ typedef boost::function<void()> callback_t;
+
+ LLInventoryCategoriesObserver() {};
+ virtual void changed(U32 mask);
+
+ void addCategory(const LLUUID& cat_id, callback_t cb);
+ void removeCategory(const LLUUID& cat_id);
+protected:
+ struct LLCategoryData
+ {
+ LLCategoryData(callback_t cb, S32 version)
+ : mCallback(cb)
+ , mVersion(version)
+ {}
+
+ callback_t mCallback;
+ S32 mVersion;
+ };
+
+ typedef std::map<LLUUID, LLCategoryData> category_map_t;
+ typedef category_map_t::value_type category_map_value_t;
+
+ category_map_t mCategoryMap;
+};
+
+#endif // LL_LLINVENTORYOBSERVERS_H
diff --git a/indra/newview/lllocationinputctrl.cpp b/indra/newview/lllocationinputctrl.cpp
index 4e0be81f62..7abb4f4f16 100644
--- a/indra/newview/lllocationinputctrl.cpp
+++ b/indra/newview/lllocationinputctrl.cpp
@@ -38,6 +38,7 @@
// common includes
#include "llbutton.h"
#include "llfocusmgr.h"
+#include "llhelp.h"
#include "llmenugl.h"
#include "llparcel.h"
#include "llstring.h"
@@ -177,6 +178,7 @@ static LLDefaultChildRegistry::Register<LLLocationInputCtrl> r("location_input")
LLLocationInputCtrl::Params::Params()
: icon_maturity_general("icon_maturity_general"),
icon_maturity_adult("icon_maturity_adult"),
+ icon_maturity_moderate("icon_maturity_moderate"),
add_landmark_image_enabled("add_landmark_image_enabled"),
add_landmark_image_disabled("add_landmark_image_disabled"),
add_landmark_image_hover("add_landmark_image_hover"),
@@ -186,14 +188,15 @@ LLLocationInputCtrl::Params::Params()
add_landmark_button("add_landmark_button"),
for_sale_button("for_sale_button"),
info_button("info_button"),
- maturity_icon("maturity_icon"),
+ maturity_button("maturity_button"),
voice_icon("voice_icon"),
fly_icon("fly_icon"),
push_icon("push_icon"),
build_icon("build_icon"),
scripts_icon("scripts_icon"),
damage_icon("damage_icon"),
- damage_text("damage_text")
+ damage_text("damage_text"),
+ maturity_help_topic("maturity_help_topic")
{
}
@@ -208,7 +211,9 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
mLandmarkImageOn(NULL),
mLandmarkImageOff(NULL),
mIconMaturityGeneral(NULL),
- mIconMaturityAdult(NULL)
+ mIconMaturityAdult(NULL),
+ mIconMaturityModerate(NULL),
+ mMaturityHelpTopic(p.maturity_help_topic)
{
// Lets replace default LLLineEditor with LLLocationLineEditor
// to make needed escaping while copying and cutting url
@@ -276,10 +281,15 @@ LLLocationInputCtrl::LLLocationInputCtrl(const LLLocationInputCtrl::Params& p)
{
mIconMaturityAdult = p.icon_maturity_adult;
}
+ if(p.icon_maturity_moderate())
+ {
+ mIconMaturityModerate = p.icon_maturity_moderate;
+ }
- LLIconCtrl::Params maturity_icon = p.maturity_icon;
- mMaturityIcon = LLUICtrlFactory::create<LLIconCtrl>(maturity_icon);
- addChild(mMaturityIcon);
+ LLButton::Params maturity_button = p.maturity_button;
+ mMaturityButton = LLUICtrlFactory::create<LLButton>(maturity_button);
+ addChild(mMaturityButton);
+ mMaturityButton->setClickedCallback(boost::bind(&LLLocationInputCtrl::onMaturityButtonClicked, this));
LLButton::Params for_sale_button = p.for_sale_button;
for_sale_button.tool_tip = LLTrans::getString("LocationCtrlForSaleTooltip");
@@ -576,7 +586,7 @@ void LLLocationInputCtrl::reshape(S32 width, S32 height, BOOL called_from_parent
if (isHumanReadableLocationVisible)
{
- refreshMaturityIcon();
+ refreshMaturityButton();
}
}
@@ -613,6 +623,11 @@ void LLLocationInputCtrl::onAgentParcelChange()
refresh();
}
+void LLLocationInputCtrl::onMaturityButtonClicked()
+{
+ LLUI::sHelpImpl->showTopic(mMaturityHelpTopic);
+}
+
void LLLocationInputCtrl::onLandmarkLoaded(LLLandmark* lm)
{
(void) lm;
@@ -736,7 +751,7 @@ void LLLocationInputCtrl::refreshLocation()
setText(location_name);
isHumanReadableLocationVisible = true;
- refreshMaturityIcon();
+ refreshMaturityButton();
}
// returns new right edge
@@ -852,37 +867,54 @@ void LLLocationInputCtrl::refreshHealth()
}
}
-void LLLocationInputCtrl::refreshMaturityIcon()
+void LLLocationInputCtrl::refreshMaturityButton()
{
// Updating maturity rating icon.
LLViewerRegion* region = gAgent.getRegion();
if (!region)
return;
+ bool button_visible = true;
+ LLPointer<LLUIImage> rating_image = NULL;
+ std::string rating_tooltip;
+
U8 sim_access = region->getSimAccess();
switch(sim_access)
{
case SIM_ACCESS_PG:
- mMaturityIcon->setValue(mIconMaturityGeneral->getName());
- mMaturityIcon->setVisible(TRUE);
+ rating_image = mIconMaturityGeneral;
+ rating_tooltip = LLTrans::getString("LocationCtrlGeneralIconTooltip");
break;
case SIM_ACCESS_ADULT:
- mMaturityIcon->setValue(mIconMaturityAdult->getName());
- mMaturityIcon->setVisible(TRUE);
+ rating_image = mIconMaturityAdult;
+ rating_tooltip = LLTrans::getString("LocationCtrlAdultIconTooltip");
+ break;
+
+ case SIM_ACCESS_MATURE:
+ rating_image = mIconMaturityModerate;
+ rating_tooltip = LLTrans::getString("LocationCtrlModerateIconTooltip");
break;
default:
- mMaturityIcon->setVisible(FALSE);
+ button_visible = false;
+ break;
}
- if (mMaturityIcon->getVisible())
+ mMaturityButton->setVisible(button_visible);
+ mMaturityButton->setToolTip(rating_tooltip);
+ if(rating_image)
+ {
+ mMaturityButton->setImageUnselected(rating_image);
+ mMaturityButton->setImagePressed(rating_image);
+ }
+ if (mMaturityButton->getVisible())
{
- positionMaturityIcon();
+ positionMaturityButton();
}
}
-void LLLocationInputCtrl::positionMaturityIcon()
+void LLLocationInputCtrl::positionMaturityButton()
{
const LLFontGL* font = mTextEntry->getFont();
if (!font)
@@ -894,11 +926,11 @@ void LLLocationInputCtrl::positionMaturityIcon()
// Calculate the right edge of rendered text + a whitespace.
left_pad = left_pad + font->getWidth(mTextEntry->getText()) + font->getWidth(" ");
- LLRect rect = mMaturityIcon->getRect();
- mMaturityIcon->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
+ LLRect rect = mMaturityButton->getRect();
+ mMaturityButton->setRect(rect.setOriginAndSize(left_pad, rect.mBottom, rect.getWidth(), rect.getHeight()));
// Hide icon if it text area is not width enough to display it, show otherwise.
- mMaturityIcon->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);
+ mMaturityButton->setVisible(rect.mRight < mTextEntry->getRect().getWidth() - right_pad);
}
void LLLocationInputCtrl::rebuildLocationHistory(const std::string& filter)
@@ -1014,7 +1046,7 @@ void LLLocationInputCtrl::changeLocationPresentation()
mTextEntry->setText(LLAgentUI::buildSLURL(false));
mTextEntry->selectAll();
- mMaturityIcon->setVisible(FALSE);
+ mMaturityButton->setVisible(FALSE);
isHumanReadableLocationVisible = false;
}
diff --git a/indra/newview/lllocationinputctrl.h b/indra/newview/lllocationinputctrl.h
index 6368bf5cf2..fc7adf60b0 100644
--- a/indra/newview/lllocationinputctrl.h
+++ b/indra/newview/lllocationinputctrl.h
@@ -2,25 +2,31 @@
* @file lllocationinputctrl.h
* @brief Combobox-like location input control
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
diff --git a/indra/newview/llnamelistctrl.cpp b/indra/newview/llnamelistctrl.cpp
index 9611c286eb..d605d4430e 100644
--- a/indra/newview/llnamelistctrl.cpp
+++ b/indra/newview/llnamelistctrl.cpp
@@ -81,7 +81,7 @@ void LLNameListCtrl::addNameItem(const LLUUID& agent_id, EAddPosition pos,
item.enabled = enabled;
item.target = INDIVIDUAL;
- addNameItemRow(item, pos);
+ addNameItemRow(item, pos, suffix);
}
// virtual, public
diff --git a/indra/newview/llnavigationbar.cpp b/indra/newview/llnavigationbar.cpp
index e11df06d86..0341f2c693 100644
--- a/indra/newview/llnavigationbar.cpp
+++ b/indra/newview/llnavigationbar.cpp
@@ -375,7 +375,6 @@ void LLNavigationBar::draw()
if(mPurgeTPHistoryItems)
{
LLTeleportHistory::getInstance()->purgeItems();
- onTeleportHistoryChanged();
mPurgeTPHistoryItems = false;
}
diff --git a/indra/newview/llnetmap.h b/indra/newview/llnetmap.h
index 6808642505..eb53d295b2 100644
--- a/indra/newview/llnetmap.h
+++ b/indra/newview/llnetmap.h
@@ -2,25 +2,31 @@
* @file llnetmap.h
* @brief A little map of the world with network information
*
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
diff --git a/indra/newview/llnotificationstorage.cpp b/indra/newview/llnotificationstorage.cpp
index fb1adc7ddf..316ff4324c 100644
--- a/indra/newview/llnotificationstorage.cpp
+++ b/indra/newview/llnotificationstorage.cpp
@@ -2,25 +2,31 @@
* @file llnotificationstorage.cpp
* @brief LLPersistentNotificationStorage class implementation
*
-* $LicenseInfo:firstyear=2010&license=viewerlgpl$
+* $LicenseInfo:firstyear=2010&license=viewergpl$
+*
+* Copyright (c) 2010, Linden Research, Inc.
+*
* 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
+* 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$
*/
@@ -106,8 +112,8 @@ void LLPersistentNotificationStorage::saveNotifications()
LLNotificationPtr notification = *it;
// After a notification was placed in Persist channel, it can become
- // responded, expired or canceled - in this case we are should not save it
- if(notification->isRespondedTo() || notification->isCancelled()
+ // responded, expired - in this case we are should not save it
+ if(notification->isRespondedTo()
|| notification->isExpired())
{
continue;
@@ -202,6 +208,7 @@ LLNotificationResponderInterface* LLResponderRegistry::createResponder(const std
build_map_t::const_iterator it = sBuildMap.find(notification_name);
if(sBuildMap.end() == it)
{
+ llwarns << "Responder for notification \'" << notification_name << "\' is not registered" << llendl;
return NULL;
}
responder_constructor_t ctr = it->second;
diff --git a/indra/newview/llnotificationstorage.h b/indra/newview/llnotificationstorage.h
index 8635c797c0..5050781a85 100644
--- a/indra/newview/llnotificationstorage.h
+++ b/indra/newview/llnotificationstorage.h
@@ -2,25 +2,31 @@
* @file llnotificationstorage.h
* @brief LLNotificationStorage class declaration
*
-* $LicenseInfo:firstyear=2010&license=viewerlgpl$
+* $LicenseInfo:firstyear=2010&license=viewergpl$
+*
+* Copyright (c) 2010, Linden Research, Inc.
+*
* 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
+* 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$
*/
diff --git a/indra/newview/llnotificationtiphandler.cpp b/indra/newview/llnotificationtiphandler.cpp
index e528f871af..df6f04b6ea 100644
--- a/indra/newview/llnotificationtiphandler.cpp
+++ b/indra/newview/llnotificationtiphandler.cpp
@@ -45,38 +45,6 @@
using namespace LLNotificationsUI;
-class LLOnlineStatusToast : public LLPanelTipToast
-{
-public:
-
- struct Params
- {
- LLNotificationPtr notification;
- LLUUID avatar_id;
- std::string message;
-
- Params() {}
- };
-
- LLOnlineStatusToast(Params& p) : LLPanelTipToast(p.notification)
- {
- LLUICtrlFactory::getInstance()->buildPanel(this, "panel_online_status_toast.xml");
-
- childSetValue("avatar_icon", p.avatar_id);
- childSetValue("message", p.message);
-
- if (p.notification->getPayload().has("respond_on_mousedown")
- && p.notification->getPayload()["respond_on_mousedown"] )
- {
- setMouseDownCallback(boost::bind(&LLNotification::respond, p.notification,
- p.notification->getResponseTemplate()));
- }
-
- // set line max count to 3 in case of a very long name
- snapToMessageHeight(getChild<LLTextBox>("message"), 3);
- }
-};
-
//--------------------------------------------------------------------------
LLTipHandler::LLTipHandler(e_notification_type type, const LLSD& id)
{
@@ -157,28 +125,7 @@ bool LLTipHandler::processNotification(const LLSD& notify)
return true;
}
- LLToastPanel* notify_box = NULL;
- // TODO: this should be implemented in LLToastPanel::buidPanelFromNotification
- if("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName())
- {
- LLOnlineStatusToast::Params p;
- p.notification = notification;
- p.message = notification->getMessage();
- p.avatar_id = notification->getPayload()["FROM_ID"];
- notify_box = new LLOnlineStatusToast(p);
- }
- else
- {
- notify_box = LLToastPanel::buidPanelFromNotification(notification);
- }
-
- // TODO: this if statement should be removed after modification of
- // LLToastPanel::buidPanelFromNotification() to allow create generic tip panel
- // for all tip notifications except FriendOnline and FriendOffline
- if (notify_box == NULL)
- {
- notify_box = new LLToastNotifyPanel(notification);
- }
+ LLToastPanel* notify_box = LLToastPanel::buidPanelFromNotification(notification);
LLToast::Params p;
p.notif_id = notification->getID();
diff --git a/indra/newview/lloutfitslist.cpp b/indra/newview/lloutfitslist.cpp
index 3eda077b87..1215272685 100644
--- a/indra/newview/lloutfitslist.cpp
+++ b/indra/newview/lloutfitslist.cpp
@@ -2,25 +2,30 @@
* @file lloutfitslist.cpp
* @brief List of agent's outfits for My Appearance side panel.
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
* 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
+ * 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$
*/
@@ -31,373 +36,76 @@
// llcommon
#include "llcommonutils.h"
+// llcommon
+#include "llcommonutils.h"
+
#include "llaccordionctrl.h"
#include "llaccordionctrltab.h"
-#include "llagentwearables.h"
-#include "llappearancemgr.h"
#include "llinventoryfunctions.h"
#include "llinventorymodel.h"
-#include "lllistcontextmenu.h"
-#include "llnotificationsutil.h"
-#include "lloutfitobserver.h"
-#include "llsidetray.h"
-#include "lltransutil.h"
-#include "llviewermenu.h"
-#include "llvoavatar.h"
-#include "llvoavatarself.h"
#include "llwearableitemslist.h"
-static bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y);
-
-static const LLOutfitTabNameComparator OUTFIT_TAB_NAME_COMPARATOR;
-
-/*virtual*/
-bool LLOutfitTabNameComparator::compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const
-{
- std::string name1 = tab1->getTitle();
- std::string name2 = tab2->getTitle();
-
- LLStringUtil::toUpper(name1);
- LLStringUtil::toUpper(name2);
-
- return name1 < name2;
-}
-
-//////////////////////////////////////////////////////////////////////////
-
-class LLOutfitListGearMenu
-{
-public:
- LLOutfitListGearMenu(LLOutfitsList* olist)
- : mOutfitList(olist),
- mMenu(NULL)
- {
- llassert_always(mOutfitList);
-
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
-
- registrar.add("Gear.Wear", boost::bind(&LLOutfitListGearMenu::onWear, this));
- registrar.add("Gear.TakeOff", boost::bind(&LLOutfitListGearMenu::onTakeOff, this));
- registrar.add("Gear.Rename", boost::bind(&LLOutfitListGearMenu::onRename, this));
- registrar.add("Gear.Delete", boost::bind(&LLOutfitListGearMenu::onDelete, this));
- registrar.add("Gear.Create", boost::bind(&LLOutfitListGearMenu::onCreate, this, _2));
-
- registrar.add("Gear.WearAdd", boost::bind(&LLOutfitListGearMenu::onAdd, this));
-
- enable_registrar.add("Gear.OnEnable", boost::bind(&LLOutfitsList::isActionEnabled, mOutfitList, _2));
- enable_registrar.add("Gear.OnVisible", boost::bind(&LLOutfitListGearMenu::onVisible, this, _2));
-
- mMenu = LLUICtrlFactory::getInstance()->createFromFile<LLMenuGL>(
- "menu_outfit_gear.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
- llassert(mMenu);
- }
-
- void show(LLView* spawning_view)
- {
- if (!mMenu) return;
-
- updateItemsVisibility();
- mMenu->buildDrawLabels();
- mMenu->updateParent(LLMenuGL::sMenuContainer);
- S32 menu_x = 0;
- S32 menu_y = spawning_view->getRect().getHeight() + mMenu->getRect().getHeight();
- LLMenuGL::showPopup(spawning_view, mMenu, menu_x, menu_y);
- }
-
- void updateItemsVisibility()
- {
- if (!mMenu) return;
-
- bool have_selection = getSelectedOutfitID().notNull();
- mMenu->setItemVisible("sepatator1", have_selection);
- mMenu->setItemVisible("sepatator2", have_selection);
- mMenu->arrangeAndClear(); // update menu height
- }
-
-private:
- const LLUUID& getSelectedOutfitID()
- {
- return mOutfitList->getSelectedOutfitUUID();
- }
-
- LLViewerInventoryCategory* getSelectedOutfit()
- {
- const LLUUID& selected_outfit_id = getSelectedOutfitID();
- if (selected_outfit_id.isNull())
- {
- return NULL;
- }
-
- LLViewerInventoryCategory* cat = gInventory.getCategory(selected_outfit_id);
- return cat;
- }
-
- void onWear()
- {
- LLViewerInventoryCategory* selected_outfit = getSelectedOutfit();
- if (selected_outfit)
- {
- LLAppearanceMgr::instance().wearInventoryCategory(
- selected_outfit, /*copy=*/ FALSE, /*append=*/ FALSE);
- }
- }
-
- void onAdd()
- {
- const LLUUID& selected_id = getSelectedOutfitID();
-
- if (selected_id.notNull())
- {
- LLAppearanceMgr::getInstance()->addCategoryToCurrentOutfit(selected_id);
- }
- }
-
- 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.
- {
- const LLUUID& selected_outfit_id = getSelectedOutfitID();
- if (selected_outfit_id.notNull())
- {
- LLAppearanceMgr::instance().takeOffOutfit(selected_outfit_id);
- }
- }
- }
-
- void onRename()
- {
- const LLUUID& selected_outfit_id = getSelectedOutfitID();
- if (selected_outfit_id.notNull())
- {
- LLAppearanceMgr::instance().renameOutfit(selected_outfit_id);
- }
- }
-
- void onDelete()
- {
- const LLUUID& selected_outfit_id = getSelectedOutfitID();
- if (selected_outfit_id.notNull())
- {
- remove_category(&gInventory, selected_outfit_id);
- }
- }
-
- void onCreate(const LLSD& data)
- {
- LLWearableType::EType type = LLWearableType::typeNameToType(data.asString());
- if (type == LLWearableType::WT_NONE)
- {
- llwarns << "Invalid wearable type" << llendl;
- return;
- }
-
- LLAgentWearables::createWearable(type, true);
- }
-
- bool onVisible(LLSD::String param)
- {
- const LLUUID& selected_outfit_id = getSelectedOutfitID();
- if (selected_outfit_id.isNull()) // no selection or invalid outfit selected
- {
- return false;
- }
-
- // *TODO This condition leads to menu item behavior inconsistent with
- // "Wear" button behavior and should be modified or removed.
- bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == selected_outfit_id;
-
- if ("wear" == param)
- {
- return !is_worn;
- }
-
- return true;
- }
-
- LLOutfitsList* mOutfitList;
- LLMenuGL* mMenu;
-};
-
-//////////////////////////////////////////////////////////////////////////
-
-class LLOutfitContextMenu : public LLListContextMenu
-{
-protected:
- /* virtual */ LLContextMenu* createMenu()
- {
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- LLUICtrl::EnableCallbackRegistry::ScopedRegistrar enable_registrar;
- LLUUID selected_id = mUUIDs.front();
-
- registrar.add("Outfit.WearReplace",
- boost::bind(&LLAppearanceMgr::replaceCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
- registrar.add("Outfit.WearAdd",
- boost::bind(&LLAppearanceMgr::addCategoryToCurrentOutfit, &LLAppearanceMgr::instance(), selected_id));
- registrar.add("Outfit.TakeOff",
- boost::bind(&LLAppearanceMgr::takeOffOutfit, &LLAppearanceMgr::instance(), selected_id));
- registrar.add("Outfit.Edit", boost::bind(editOutfit));
- registrar.add("Outfit.Rename", boost::bind(renameOutfit, selected_id));
- registrar.add("Outfit.Delete", boost::bind(deleteOutfit, selected_id));
-
- enable_registrar.add("Outfit.OnEnable", boost::bind(&LLOutfitContextMenu::onEnable, this, _2));
- enable_registrar.add("Outfit.OnVisible", boost::bind(&LLOutfitContextMenu::onVisible, this, _2));
-
- return createFromFile("menu_outfit_tab.xml");
- }
-
- bool onEnable(LLSD::String param)
- {
- LLUUID outfit_cat_id = mUUIDs.back();
-
- if ("rename" == param)
- {
- return get_is_category_renameable(&gInventory, outfit_cat_id);
- }
- else if ("wear_replace" == param)
- {
- return LLAppearanceMgr::instance().getCanReplaceCOF(outfit_cat_id);
- }
- else if ("wear_add" == param)
- {
- return LLAppearanceMgr::getCanAddToCOF(outfit_cat_id);
- }
- else if ("take_off" == param)
- {
- return LLAppearanceMgr::getCanRemoveFromCOF(outfit_cat_id);
- }
-
- return true;
- }
-
- bool onVisible(LLSD::String param)
- {
- LLUUID outfit_cat_id = mUUIDs.back();
- bool is_worn = LLAppearanceMgr::instance().getBaseOutfitUUID() == outfit_cat_id;
-
- if ("edit" == param)
- {
- return is_worn;
- }
- else if ("wear_replace" == param)
- {
- return !is_worn;
- }
- else if ("delete" == param)
- {
- return LLAppearanceMgr::instance().getCanRemoveOutfit(outfit_cat_id);
- }
-
- return true;
- }
-
- static void editOutfit()
- {
- LLSideTray::getInstance()->showPanel("sidepanel_appearance", LLSD().with("type", "edit_outfit"));
- }
-
- static void renameOutfit(const LLUUID& outfit_cat_id)
- {
- LLAppearanceMgr::instance().renameOutfit(outfit_cat_id);
- }
-
- static void deleteOutfit(const LLUUID& outfit_cat_id)
- {
- remove_category(&gInventory, outfit_cat_id);
- }
-};
-
-//////////////////////////////////////////////////////////////////////////
-
static LLRegisterPanelClassWrapper<LLOutfitsList> t_outfits_list("outfits_list");
LLOutfitsList::LLOutfitsList()
- : LLPanelAppearanceTab()
+ : LLPanel()
, mAccordion(NULL)
, mListCommands(NULL)
- , mIsInitialized(false)
- , mItemSelected(false)
{
mCategoriesObserver = new LLInventoryCategoriesObserver();
+ gInventory.addObserver(mCategoriesObserver);
- mGearMenu = new LLOutfitListGearMenu(this);
- mOutfitMenu = new LLOutfitContextMenu();
+ gInventory.addObserver(this);
}
LLOutfitsList::~LLOutfitsList()
{
- delete mGearMenu;
- delete mOutfitMenu;
-
if (gInventory.containsObserver(mCategoriesObserver))
{
gInventory.removeObserver(mCategoriesObserver);
delete mCategoriesObserver;
}
+
+ if (gInventory.containsObserver(this))
+ {
+ gInventory.removeObserver(this);
+ }
}
BOOL LLOutfitsList::postBuild()
{
mAccordion = getChild<LLAccordionCtrl>("outfits_accordion");
- mAccordion->setComparator(&OUTFIT_TAB_NAME_COMPARATOR);
return TRUE;
}
//virtual
-void LLOutfitsList::onOpen(const LLSD& /*info*/)
+void LLOutfitsList::changed(U32 mask)
{
- if (!mIsInitialized)
- {
- // *TODO: I'm not sure is this check necessary but it never match while developing.
- if (!gInventory.isInventoryUsable())
- return;
-
- const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
-
- // *TODO: I'm not sure is this check necessary but it never match while developing.
- LLViewerInventoryCategory* category = gInventory.getCategory(outfits);
- if (!category)
- return;
+ if (!gInventory.isInventoryUsable())
+ return;
- gInventory.addObserver(mCategoriesObserver);
+ const LLUUID outfits = gInventory.findCategoryUUIDForType(LLFolderType::FT_MY_OUTFITS);
+ LLViewerInventoryCategory* category = gInventory.getCategory(outfits);
+ if (!category)
+ return;
- // Start observing changes in "My Outfits" category.
- mCategoriesObserver->addCategory(outfits,
+ // Start observing changes in "My Outfits" category.
+ mCategoriesObserver->addCategory(outfits,
boost::bind(&LLOutfitsList::refreshList, this, outfits));
- const LLUUID cof = gInventory.findCategoryUUIDForType(LLFolderType::FT_CURRENT_OUTFIT);
-
- // Start observing changes in Current Outfit category.
- mCategoriesObserver->addCategory(cof, boost::bind(&LLOutfitsList::onCOFChanged, this));
-
- LLOutfitObserver::instance().addBOFChangedCallback(boost::bind(&LLOutfitsList::highlightBaseOutfit, this));
- LLOutfitObserver::instance().addBOFReplacedCallback(boost::bind(&LLOutfitsList::highlightBaseOutfit, this));
-
- // Fetch "My Outfits" contents and refresh the list to display
- // initially fetched items. If not all items are fetched now
- // the observer will refresh the list as soon as the new items
- // arrive.
- category->fetch();
- refreshList(outfits);
- highlightBaseOutfit();
+ // Fetch "My Outfits" contents and refresh the list to display
+ // initially fetched items. If not all items are fetched now
+ // the observer will refresh the list as soon as the new items
+ // arrive.
+ category->fetch();
+ refreshList(outfits);
- mIsInitialized = true;
- }
+ // This observer is used to start the initial outfits fetch
+ // when inventory becomes usable. It is no longer needed because
+ // "My Outfits" category is now observed by
+ // LLInventoryCategoriesObserver.
+ gInventory.removeObserver(this);
}
void LLOutfitsList::refreshList(const LLUUID& category_id)
@@ -427,57 +135,30 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
{
const LLUUID cat_id = (*iter);
LLViewerInventoryCategory *cat = gInventory.getCategory(cat_id);
- if (!cat) continue;
+ if (!cat)
+ continue;
std::string name = cat->getName();
static LLXMLNodePtr accordionXmlNode = getAccordionTabXMLNode();
- LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL);
- tab->setName(name);
- tab->setTitle(name);
+ accordionXmlNode->setAttributeString("name", name);
+ accordionXmlNode->setAttributeString("title", name);
+ LLAccordionCtrlTab* tab = LLUICtrlFactory::defaultBuilder<LLAccordionCtrlTab>(accordionXmlNode, NULL, NULL);
// *TODO: LLUICtrlFactory::defaultBuilder does not use "display_children" from xml. Should be investigated.
tab->setDisplayChildren(false);
mAccordion->addCollapsibleCtrl(tab);
- // Start observing the new outfit category.
- LLWearableItemsList* list = tab->getChild<LLWearableItemsList>("wearable_items_list");
- if (!mCategoriesObserver->addCategory(cat_id, boost::bind(&LLWearableItemsList::updateList, list, cat_id)))
- {
- // Remove accordion tab if category could not be added to observer.
- mAccordion->removeCollapsibleCtrl(tab);
-
- // kill removed tab
- if (tab != NULL)
- {
- tab->die();
- }
- continue;
- }
-
// Map the new tab with outfit category UUID.
mOutfitsMap.insert(LLOutfitsList::outfits_map_value_t(cat_id, tab));
- tab->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onAccordionTabRightClick, this,
- _1, _2, _3, cat_id));
-
- // Setting tab focus callback to monitor currently selected outfit.
- tab->setFocusReceivedCallback(boost::bind(&LLOutfitsList::changeOutfitSelection, this, list, cat_id));
-
- // Setting callback to reset items selection inside outfit on accordion collapsing and expanding (EXT-7875)
- tab->setDropDownStateChangedCallback(boost::bind(&LLOutfitsList::resetItemSelection, this, list, cat_id));
-
- // force showing list items that don't match current filter(EXT-7158)
- list->setForceShowingUnmatchedItems(true);
-
- // Setting list commit callback to monitor currently selected wearable item.
- list->setCommitCallback(boost::bind(&LLOutfitsList::onSelectionChange, this, _1));
-
- // Setting list refresh callback to apply filter on list change.
- list->setRefreshCompleteCallback(boost::bind(&LLOutfitsList::onFilteredWearableItemsListRefresh, this, _1));
+ // Start observing the new outfit category.
+ LLWearableItemsList* list = tab->getChild<LLWearableItemsList>("wearable_items_list");
+ mCategoriesObserver->addCategory(cat_id, boost::bind(&LLWearableItemsList::updateList, list, cat_id));
- list->setRightMouseDownCallback(boost::bind(&LLOutfitsList::onWearableItemsListRightClick, this, _1, _2, _3));
+ // Setting drop down callback to monitor currently selected outfit.
+ tab->setDropDownStateChangedCallback(boost::bind(&LLOutfitsList::onTabExpandedCollapsed, this, list));
// Fetch the new outfit contents.
cat->fetch();
@@ -485,50 +166,23 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
// Refresh the list of outfit items after fetch().
// Further list updates will be triggered by the category observer.
list->updateList(cat_id);
-
- // If filter is currently applied we store the initial tab state and
- // open it to show matched items if any.
- if (!sFilterSubString.empty())
- {
- tab->notifyChildren(LLSD().with("action","store_state"));
- tab->setDisplayChildren(true);
-
- // Setting mForceRefresh flag will make the list refresh its contents
- // even if it is not currently visible. This is required to apply the
- // filter to the newly added list.
- list->setForceRefresh(true);
-
- list->setFilterSubString(sFilterSubString);
- }
}
// Handle removed tabs.
- for (uuid_vec_t::const_iterator iter=vremoved.begin(); iter != vremoved.end(); ++iter)
+ for (uuid_vec_t::const_iterator iter=vremoved.begin(); iter != vremoved.end(); iter++)
{
outfits_map_t::iterator outfits_iter = mOutfitsMap.find((*iter));
if (outfits_iter != mOutfitsMap.end())
{
- const LLUUID& outfit_id = outfits_iter->first;
- LLAccordionCtrlTab* tab = outfits_iter->second;
-
// An outfit is removed from the list. Do the following:
- // 1. Remove outfit category from observer to stop monitoring its changes.
- mCategoriesObserver->removeCategory(outfit_id);
+ // 1. Remove outfit accordion tab from accordion.
+ mAccordion->removeCollapsibleCtrl(outfits_iter->second);
- // 2. Remove the outfit from selection.
- deselectOutfit(outfit_id);
+ // 2. Remove outfit category from observer to stop monitoring its changes.
+ mCategoriesObserver->removeCategory(outfits_iter->first);
// 3. Remove category UUID to accordion tab mapping.
mOutfitsMap.erase(outfits_iter);
-
- // 4. Remove outfit tab from accordion.
- mAccordion->removeCollapsibleCtrl(tab);
-
- // kill removed tab
- if (tab != NULL)
- {
- tab->die();
- }
}
}
@@ -542,185 +196,50 @@ void LLOutfitsList::refreshList(const LLUUID& category_id)
updateOutfitTab(*items_iter);
}
- mAccordion->sort();
-}
-
-void LLOutfitsList::highlightBaseOutfit()
-{
- // id of base outfit
- LLUUID base_id = LLAppearanceMgr::getInstance()->getBaseOutfitUUID();
- if (base_id != mHighlightedOutfitUUID)
- {
- if (mOutfitsMap[mHighlightedOutfitUUID])
- {
- mOutfitsMap[mHighlightedOutfitUUID]->setTitleFontStyle("NORMAL");
- mOutfitsMap[mHighlightedOutfitUUID]->setTitleColor(LLUIColorTable::instance().getColor("AccordionHeaderTextColor"));
- }
-
- mHighlightedOutfitUUID = base_id;
- }
- if (mOutfitsMap[base_id])
- {
- mOutfitsMap[base_id]->setTitleFontStyle("BOLD");
- mOutfitsMap[base_id]->setTitleColor(LLUIColorTable::instance().getColor("SelectedOutfitTextColor"));
- }
-}
-
-void LLOutfitsList::onSelectionChange(LLUICtrl* ctrl)
-{
- LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(ctrl);
- if (!list) return;
-
- LLViewerInventoryItem *item = gInventory.getItem(list->getSelectedUUID());
- if (!item) return;
-
- changeOutfitSelection(list, item->getParentUUID());
-}
-
-void LLOutfitsList::performAction(std::string action)
-{
- if (mSelectedOutfitUUID.isNull()) return;
-
- LLViewerInventoryCategory* cat = gInventory.getCategory(mSelectedOutfitUUID);
- if (!cat) return;
-
- if ("replaceoutfit" == action)
- {
- LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, FALSE );
- }
- else if ("addtooutfit" == action)
- {
- LLAppearanceMgr::instance().wearInventoryCategory( cat, FALSE, TRUE );
- }
- else if ("rename_outfit" == action)
- {
- LLAppearanceMgr::instance().renameOutfit(mSelectedOutfitUUID);
- }
-}
-
-void LLOutfitsList::removeSelected()
-{
- if (mSelectedOutfitUUID.notNull())
- {
- remove_category(&gInventory, mSelectedOutfitUUID);
- }
+ mAccordion->arrange();
}
-void LLOutfitsList::setSelectedOutfitByUUID(const LLUUID& outfit_uuid)
+void LLOutfitsList::updateOutfitTab(const LLUUID& category_id)
{
- for (outfits_map_t::iterator iter = mOutfitsMap.begin();
- iter != mOutfitsMap.end();
- ++iter)
+ outfits_map_t::iterator outfits_iter = mOutfitsMap.find(category_id);
+ if (outfits_iter != mOutfitsMap.end())
{
- if (outfit_uuid == iter->first)
- {
- LLAccordionCtrlTab* tab = iter->second;
- if (!tab) continue;
-
- LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
- if (!list) continue;
-
- tab->setFocus(TRUE);
- changeOutfitSelection(list, outfit_uuid);
-
- tab->setDisplayChildren(true);
- }
- }
-}
-
-// virtual
-void LLOutfitsList::setFilterSubString(const std::string& string)
-{
- applyFilter(string);
-
- sFilterSubString = string;
-}
+ LLViewerInventoryCategory *cat = gInventory.getCategory(category_id);
+ if (!cat)
+ return;
-// virtual
-bool LLOutfitsList::isActionEnabled(const LLSD& userdata)
-{
- if (mSelectedOutfitUUID.isNull()) return false;
+ std::string name = cat->getName();
- const std::string command_name = userdata.asString();
- if (command_name == "delete")
- {
- return !mItemSelected && LLAppearanceMgr::instance().getCanRemoveOutfit(mSelectedOutfitUUID);
- }
- if (command_name == "rename")
- {
- return get_is_category_renameable(&gInventory, mSelectedOutfitUUID);
- }
- if (command_name == "save_outfit")
- {
- bool outfit_locked = LLAppearanceMgr::getInstance()->isOutfitLocked();
- bool outfit_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty();
- // allow save only if outfit isn't locked and is dirty
- return !outfit_locked && outfit_dirty;
- }
- if (command_name == "wear")
- {
- if (gAgentWearables.isCOFChangeInProgress())
+ // Update tab name with the new category name.
+ LLAccordionCtrlTab* tab = outfits_iter->second;
+ if (tab)
{
- return false;
+ tab->setName(name);
}
- if (hasItemSelected())
+ // Update tab title with the new category name using textbox
+ // in accordion tab header.
+ LLTextBox* tab_title = tab->findChild<LLTextBox>("dd_textbox");
+ if (tab_title)
{
- return canWearSelected();
+ tab_title->setText(name);
}
-
- // outfit selected
- return LLAppearanceMgr::instance().getCanReplaceCOF(mSelectedOutfitUUID);
}
- if (command_name == "take_off")
- {
- // Enable "Take Off" if any of selected items can be taken off
- // or the selected outfit contains items that can be taken off.
- return ( hasItemSelected() && canTakeOffSelected() )
- || ( !hasItemSelected() && LLAppearanceMgr::getCanRemoveFromCOF(mSelectedOutfitUUID) );
- }
-
- if (command_name == "wear_add")
- {
- // *TODO: do we ever get here?
- return LLAppearanceMgr::getCanAddToCOF(mSelectedOutfitUUID);
- }
-
- return false;
}
-// virtual
-void LLOutfitsList::showGearMenu(LLView* spawning_view)
+void LLOutfitsList::onTabExpandedCollapsed(LLWearableItemsList* list)
{
- if (!mGearMenu) return;
- mGearMenu->show(spawning_view);
-}
-
-void LLOutfitsList::getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const
-{
- // Collect selected items from all selected lists.
- for (wearables_lists_map_t::const_iterator iter = mSelectedListsMap.begin();
- iter != mSelectedListsMap.end();
- ++iter)
- {
- uuid_vec_t uuids;
- (*iter).second->getSelectedUUIDs(uuids);
+ if (!list)
+ return;
- S32 prev_size = selected_uuids.size();
- selected_uuids.resize(prev_size + uuids.size());
- std::copy(uuids.begin(), uuids.end(), selected_uuids.begin() + prev_size);
- }
+ // TODO: Add outfit selection handling.
}
-boost::signals2::connection LLOutfitsList::setSelectionChangeCallback(selection_change_callback_t cb)
+void LLOutfitsList::setFilterSubString(const std::string& string)
{
- return mSelectionChangeSignal.connect(cb);
+ mFilterSubString = string;
}
-bool LLOutfitsList::hasItemSelected()
-{
- return mItemSelected;
-}
//////////////////////////////////////////////////////////////////////////
// Private methods
@@ -764,333 +283,4 @@ void LLOutfitsList::computeDifference(
LLCommonUtils::computeDifference(vnew, vcur, vadded, vremoved);
}
-void LLOutfitsList::updateOutfitTab(const LLUUID& category_id)
-{
- outfits_map_t::iterator outfits_iter = mOutfitsMap.find(category_id);
- if (outfits_iter != mOutfitsMap.end())
- {
- LLViewerInventoryCategory *cat = gInventory.getCategory(category_id);
- if (!cat) return;
-
- std::string name = cat->getName();
-
- // Update tab name with the new category name.
- LLAccordionCtrlTab* tab = outfits_iter->second;
- if (tab)
- {
- tab->setName(name);
- tab->setTitle(name);
- }
- }
-}
-
-void LLOutfitsList::resetItemSelection(LLWearableItemsList* list, const LLUUID& category_id)
-{
- list->resetSelection();
- mItemSelected = false;
- setSelectedOutfitUUID(category_id);
-}
-
-void LLOutfitsList::changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id)
-{
- MASK mask = gKeyboard->currentMask(TRUE);
-
- // Reset selection in all previously selected tabs except for the current
- // if new selection is started.
- if (list && !(mask & MASK_CONTROL))
- {
- for (wearables_lists_map_t::iterator iter = mSelectedListsMap.begin();
- iter != mSelectedListsMap.end();
- ++iter)
- {
- LLWearableItemsList* selected_list = (*iter).second;
- if (selected_list != list)
- {
- selected_list->resetSelection();
- }
- }
-
- // Clear current selection.
- mSelectedListsMap.clear();
- }
-
- mItemSelected = list && (list->getSelectedItem() != NULL);
-
- mSelectedListsMap.insert(wearables_lists_map_value_t(category_id, list));
- setSelectedOutfitUUID(category_id);
-}
-
-void LLOutfitsList::setSelectedOutfitUUID(const LLUUID& category_id)
-{
- mSelectionChangeSignal(mSelectedOutfitUUID = category_id);
-}
-
-void LLOutfitsList::deselectOutfit(const LLUUID& category_id)
-{
- // Remove selected lists map entry.
- mSelectedListsMap.erase(category_id);
-
- // Reset selection if the outfit is selected.
- if (category_id == mSelectedOutfitUUID)
- {
- setSelectedOutfitUUID(LLUUID::null);
- }
-}
-
-void LLOutfitsList::restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id)
-{
- // Try restoring outfit selection after filtering.
- if (mAccordion->getSelectedTab() == tab)
- {
- setSelectedOutfitUUID(category_id);
- }
-}
-
-void LLOutfitsList::onFilteredWearableItemsListRefresh(LLUICtrl* ctrl)
-{
- if (!ctrl || sFilterSubString.empty())
- return;
-
- for (outfits_map_t::iterator
- iter = mOutfitsMap.begin(),
- iter_end = mOutfitsMap.end();
- iter != iter_end; ++iter)
- {
- LLAccordionCtrlTab* tab = iter->second;
- if (!tab) continue;
-
- LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
- if (list != ctrl) continue;
-
- applyFilterToTab(iter->first, tab, sFilterSubString);
- }
-}
-
-void LLOutfitsList::applyFilter(const std::string& new_filter_substring)
-{
- mAccordion->setFilterSubString(new_filter_substring);
-
- for (outfits_map_t::iterator
- iter = mOutfitsMap.begin(),
- iter_end = mOutfitsMap.end();
- iter != iter_end; ++iter)
- {
- LLAccordionCtrlTab* tab = iter->second;
- if (!tab) continue;
-
- bool more_restrictive = sFilterSubString.size() < new_filter_substring.size() && !new_filter_substring.substr(0, sFilterSubString.size()).compare(sFilterSubString);
-
- // Restore tab visibility in case of less restrictive filter
- // to compare it with updated string if it was previously hidden.
- if (!more_restrictive)
- {
- tab->setVisible(TRUE);
- }
-
- LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
- if (list)
- {
- list->setFilterSubString(new_filter_substring);
- }
-
- if(sFilterSubString.empty() && !new_filter_substring.empty())
- {
- //store accordion tab state when filter is not empty
- tab->notifyChildren(LLSD().with("action","store_state"));
- }
-
- if (!new_filter_substring.empty())
- {
- applyFilterToTab(iter->first, tab, new_filter_substring);
- }
- else
- {
- // restore tab title when filter is empty
- tab->setTitle(tab->getTitle());
-
- //restore accordion state after all those accodrion tab manipulations
- tab->notifyChildren(LLSD().with("action","restore_state"));
-
- // Try restoring the tab selection.
- restoreOutfitSelection(tab, iter->first);
- }
- }
-
- mAccordion->arrange();
-}
-
-void LLOutfitsList::applyFilterToTab(
- const LLUUID& category_id,
- LLAccordionCtrlTab* tab,
- const std::string& filter_substring)
-{
- if (!tab) return;
- LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
- if (!list) return;
-
- std::string title = tab->getTitle();
- LLStringUtil::toUpper(title);
-
- std::string cur_filter = filter_substring;
- LLStringUtil::toUpper(cur_filter);
-
- tab->setTitle(tab->getTitle(), cur_filter);
-
- if (std::string::npos == title.find(cur_filter))
- {
- // hide tab if its title doesn't pass filter
- // and it has no visible items
- tab->setVisible(list->hasMatchedItems());
-
- // remove title highlighting because it might
- // have been previously highlighted by less restrictive filter
- tab->setTitle(tab->getTitle());
-
- // Remove the tab from selection.
- deselectOutfit(category_id);
- }
- else
- {
- // Try restoring the tab selection.
- restoreOutfitSelection(tab, category_id);
- }
-
- if (tab->getVisible())
- {
- // Open tab if it has passed the filter.
- tab->setDisplayChildren(true);
- }
- else
- {
- // Set force refresh flag to refresh not visible list
- // when some changes occur in it.
- list->setForceRefresh(true);
- }
-}
-
-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;
- getSelectedItemsUUIDs(selected_items);
-
- for (uuid_vec_t::const_iterator it = selected_items.begin(); it != selected_items.end(); ++it)
- {
- const LLUUID& id = *it;
-
- // Check whether the item is worn.
- if (!get_can_item_be_worn(id))
- {
- return false;
- }
- }
-
- // All selected items can be worn.
- return true;
-}
-
-void LLOutfitsList::onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id)
-{
- LLAccordionCtrlTab* tab = dynamic_cast<LLAccordionCtrlTab*>(ctrl);
- if(mOutfitMenu && is_tab_header_clicked(tab, y) && cat_id.notNull())
- {
- // Focus tab header to trigger tab selection change.
- LLUICtrl* header = tab->findChild<LLUICtrl>("dd_header");
- if (header)
- {
- header->setFocus(TRUE);
- }
-
- uuid_vec_t selected_uuids;
- selected_uuids.push_back(cat_id);
- mOutfitMenu->show(ctrl, selected_uuids, x, y);
- }
-}
-
-void LLOutfitsList::wearSelectedItems()
-{
- uuid_vec_t selected_uuids;
- getSelectedItemsUUIDs(selected_uuids);
-
- if(selected_uuids.empty())
- {
- return;
- }
-
- wear_multiple(selected_uuids, false);
-}
-
-void LLOutfitsList::onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y)
-{
- LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(ctrl);
- if (!list) return;
-
- uuid_vec_t selected_uuids;
-
- getSelectedItemsUUIDs(selected_uuids);
-
- LLWearableItemsList::ContextMenu::instance().show(list, selected_uuids, x, y);
-}
-
-void LLOutfitsList::onCOFChanged()
-{
- LLInventoryModel::changed_items_t changed_linked_items;
-
- const LLInventoryModel::changed_items_t& changed_items = gInventory.getChangedIDs();
- for (LLInventoryModel::changed_items_t::const_iterator iter = changed_items.begin();
- iter != changed_items.end();
- ++iter)
- {
- LLViewerInventoryItem* item = gInventory.getItem(*iter);
- if (item)
- {
- // From gInventory we get the UUIDs of new links added to COF
- // or removed from COF. These links UUIDs are not the same UUIDs
- // that we have in each wearable items list. So we collect base items
- // UUIDs to find all items or links that point to same base items in wearable
- // items lists and update their worn state there.
- changed_linked_items.insert(item->getLinkedUUID());
- }
- }
-
- for (outfits_map_t::iterator iter = mOutfitsMap.begin();
- iter != mOutfitsMap.end();
- ++iter)
- {
- LLAccordionCtrlTab* tab = iter->second;
- if (!tab) continue;
-
- LLWearableItemsList* list = dynamic_cast<LLWearableItemsList*>(tab->getAccordionView());
- if (!list) continue;
-
- // Every list updates the labels of changed items or
- // the links that point to these items.
- list->updateChangedItems(changed_linked_items);
- }
-}
-
-bool is_tab_header_clicked(LLAccordionCtrlTab* tab, S32 y)
-{
- if(!tab || !tab->getHeaderVisible()) return false;
-
- S32 header_bottom = tab->getLocalRect().getHeight() - tab->getHeaderHeight();
- return y >= header_bottom;
-}
-
// EOF
diff --git a/indra/newview/lloutfitslist.h b/indra/newview/lloutfitslist.h
index 25aeab2cb7..2d103ea356 100644
--- a/indra/newview/lloutfitslist.h
+++ b/indra/newview/lloutfitslist.h
@@ -2,60 +2,45 @@
* @file lloutfitslist.h
* @brief List of agent's outfits for My Appearance side panel.
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
* 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
+ * 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_LLOUTFITSLIST_H
#define LL_LLOUTFITSLIST_H
-#include "llaccordionctrl.h"
#include "llpanel.h"
// newview
#include "llinventorymodel.h"
-#include "llpanelappearancetab.h"
+#include "llinventoryobserver.h"
+class LLAccordionCtrl;
class LLAccordionCtrlTab;
-class LLInventoryCategoriesObserver;
-class LLOutfitListGearMenu;
class LLWearableItemsList;
-class LLListContextMenu;
-
-
-/**
- * @class LLOutfitTabNameComparator
- *
- * Comparator of outfit tabs.
- */
-class LLOutfitTabNameComparator : public LLAccordionCtrl::LLTabComparator
-{
- LOG_CLASS(LLOutfitTabNameComparator);
-
-public:
- LLOutfitTabNameComparator() {};
- virtual ~LLOutfitTabNameComparator() {};
-
- /*virtual*/ bool compare(const LLAccordionCtrlTab* tab1, const LLAccordionCtrlTab* tab2) const;
-};
/**
* @class LLOutfitsList
@@ -63,52 +48,29 @@ public:
* A list of agents's outfits from "My Outfits" inventory category
* which displays each outfit in an accordion tab with a flat list
* of items inside it.
- *
- * Starts fetching necessary inventory content on first opening.
+ * Uses LLInventoryCategoriesObserver to monitor changes to "My Outfits"
+ * inventory category and refresh the outfits listed in it.
+ * This class is derived from LLInventoryObserver to know when inventory
+ * becomes usable and it is safe to request data from inventory model.
*/
-class LLOutfitsList : public LLPanelAppearanceTab
+class LLOutfitsList : public LLPanel, public LLInventoryObserver
{
public:
- typedef boost::function<void (const LLUUID&)> selection_change_callback_t;
- typedef boost::signals2::signal<void (const LLUUID&)> selection_change_signal_t;
-
LLOutfitsList();
virtual ~LLOutfitsList();
/*virtual*/ BOOL postBuild();
- /*virtual*/ void onOpen(const LLSD& info);
+ /*virtual*/ void changed(U32 mask);
void refreshList(const LLUUID& category_id);
- // highlits currently worn outfit tab text and unhighlights previously worn
- void highlightBaseOutfit();
-
- void performAction(std::string action);
-
- void removeSelected();
-
- void setSelectedOutfitByUUID(const LLUUID& outfit_uuid);
-
- /*virtual*/ void setFilterSubString(const std::string& string);
-
- /*virtual*/ bool isActionEnabled(const LLSD& userdata);
-
- /*virtual*/ void showGearMenu(LLView* spawning_view);
-
- const LLUUID& getSelectedOutfitUUID() const { return mSelectedOutfitUUID; }
-
- void getSelectedItemsUUIDs(uuid_vec_t& selected_uuids) const;
-
- boost::signals2::connection setSelectionChangeCallback(selection_change_callback_t cb);
+ // Update tab displaying outfit identified by category_id.
+ void updateOutfitTab(const LLUUID& category_id);
- // Collects selected items from all selected lists and wears them(if possible- adds, else replaces)
- void wearSelectedItems();
+ void onTabExpandedCollapsed(LLWearableItemsList* list);
- /**
- * Returns true if there is a selection inside currently selected outfit
- */
- bool hasItemSelected();
+ void setFilterSubString(const std::string& string);
private:
/**
@@ -123,100 +85,17 @@ private:
*/
void computeDifference(const LLInventoryModel::cat_array_t& vcats, uuid_vec_t& vadded, uuid_vec_t& vremoved);
- /**
- * Updates tab displaying outfit identified by category_id.
- */
- void updateOutfitTab(const LLUUID& category_id);
-
- /**
- * Resets previous selection and stores newly selected list and outfit id.
- */
- void changeOutfitSelection(LLWearableItemsList* list, const LLUUID& category_id);
-
- /**
- *Resets items selection inside outfit
- */
- void resetItemSelection(LLWearableItemsList* list, const LLUUID& category_id);
-
- /**
- * Saves newly selected outfit ID.
- */
- void setSelectedOutfitUUID(const LLUUID& category_id);
-
- /**
- * Removes the outfit from selection.
- */
- void deselectOutfit(const LLUUID& category_id);
-
- /**
- * Try restoring selection for a temporary hidden tab.
- *
- * A tab may be hidden if it doesn't match current filter.
- */
- void restoreOutfitSelection(LLAccordionCtrlTab* tab, const LLUUID& category_id);
-
- /**
- * Called upon list refresh event to update tab visibility depending on
- * the results of applying filter to the title and list items of the tab.
- */
- void onFilteredWearableItemsListRefresh(LLUICtrl* ctrl);
-
- /**
- * Highlights filtered items and hides tabs which haven't passed filter.
- */
- void applyFilter(const std::string& new_filter_substring);
-
- /**
- * Applies filter to the given tab
- *
- * @see applyFilter()
- */
- 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();
-
- void onAccordionTabRightClick(LLUICtrl* ctrl, S32 x, S32 y, const LLUUID& cat_id);
- void onWearableItemsListRightClick(LLUICtrl* ctrl, S32 x, S32 y);
- void onCOFChanged();
-
- void onSelectionChange(LLUICtrl* ctrl);
-
- static void onOutfitRename(const LLSD& notification, const LLSD& response);
LLInventoryCategoriesObserver* mCategoriesObserver;
LLAccordionCtrl* mAccordion;
LLPanel* mListCommands;
- typedef std::map<LLUUID, LLWearableItemsList*> wearables_lists_map_t;
- typedef wearables_lists_map_t::value_type wearables_lists_map_value_t;
- wearables_lists_map_t mSelectedListsMap;
-
- LLUUID mSelectedOutfitUUID;
- // id of currently highlited outfit
- LLUUID mHighlightedOutfitUUID;
- selection_change_signal_t mSelectionChangeSignal;
+ std::string mFilterSubString;
typedef std::map<LLUUID, LLAccordionCtrlTab*> outfits_map_t;
typedef outfits_map_t::value_type outfits_map_value_t;
outfits_map_t mOutfitsMap;
-
- LLOutfitListGearMenu* mGearMenu;
- LLListContextMenu* mOutfitMenu;
-
- bool mIsInitialized;
- /**
- * True if there is a selection inside currently selected outfit
- */
- bool mItemSelected;
};
#endif //LL_LLOUTFITSLIST_H
diff --git a/indra/newview/llpanelgroup.h b/indra/newview/llpanelgroup.h
index 86875d2da3..359f252383 100644
--- a/indra/newview/llpanelgroup.h
+++ b/indra/newview/llpanelgroup.h
@@ -1,25 +1,31 @@
/**
* @file llpanelgroup.h
*
- * $LicenseInfo:firstyear=2006&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2006&license=viewergpl$
+ *
+ * Copyright (c) 2006-2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
@@ -36,7 +42,6 @@ class LLOfferInfo;
const S32 UPDATE_MEMBERS_PER_FRAME = 500;
// Forward declares
-class LLAccordionCtrl;
class LLPanelGroupTab;
class LLTabContainer;
class LLAgent;
@@ -90,6 +95,9 @@ public:
LLOfferInfo* inventory_offer);
+ bool notifyChildren (const LLSD& info);
+ bool handleNotifyCallback(const LLSD&, const LLSD&);
+
protected:
virtual void update(LLGroupChange gc);
@@ -97,7 +105,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*);
@@ -110,6 +117,9 @@ protected:
protected:
bool apply(LLPanelGroupTab* tab);
+ bool canClose();
+
+ bool mShowingNotifyDialog;
LLTimer mRefreshTimer;
@@ -122,6 +132,7 @@ protected:
LLButton* mButtonJoin;
LLUICtrl* mJoinText;
+
};
class LLPanelGroupTab : public LLPanel
diff --git a/indra/newview/llpanelgrouplandmoney.cpp b/indra/newview/llpanelgrouplandmoney.cpp
index 9ac3a07041..65fe7165c2 100644
--- a/indra/newview/llpanelgrouplandmoney.cpp
+++ b/indra/newview/llpanelgrouplandmoney.cpp
@@ -236,6 +236,7 @@ public:
std::string mCantViewParcelsText;
std::string mCantViewAccountsText;
+ std::string mEmptyParcelsText;
};
//*******************************************
@@ -452,6 +453,7 @@ void LLPanelGroupLandMoney::impl::processGroupLand(LLMessageSystem* msg)
// This power was removed to make group roles simpler
//if ( !gAgent.hasPowerInGroup(mGroupID, GP_LAND_VIEW_OWNED) ) return;
if (!gAgent.isInGroup(mPanel.mGroupID)) return;
+ mGroupParcelsp->setCommentText(mEmptyParcelsText);
std::string name;
std::string desc;
@@ -696,6 +698,7 @@ BOOL LLPanelGroupLandMoney::postBuild()
mImplementationp->mCantViewParcelsText = getString("cant_view_group_land_text");
mImplementationp->mCantViewAccountsText = getString("cant_view_group_accounting_text");
+ mImplementationp->mEmptyParcelsText = getString("epmty_view_group_land_text");
if ( mImplementationp->mMapButtonp )
{
diff --git a/indra/newview/llpanelgroupnotices.cpp b/indra/newview/llpanelgroupnotices.cpp
index 8da19d1574..230e484fad 100644
--- a/indra/newview/llpanelgroupnotices.cpp
+++ b/indra/newview/llpanelgroupnotices.cpp
@@ -517,6 +517,11 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
mNoticesList->setEnabled(TRUE);
+ //save sort state and set unsorted state to prevent unnecessary
+ //sorting while adding notices
+ bool save_sort = mNoticesList->isSorted();
+ mNoticesList->setNeedsSort(false);
+
for (;i<count;++i)
{
msg->getUUID("Data","NoticeID",id,i);
@@ -527,6 +532,13 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
mNoticesList->setEnabled(FALSE);
return;
}
+
+ //with some network delays we can receive notice list more then once...
+ //so add only unique notices
+ S32 pos = mNoticesList->getItemIndex(id);
+
+ if(pos!=-1)//if items with this ID already in the list - skip it
+ continue;
msg->getString("Data","Subject",subj,i);
msg->getString("Data","FromName",name,i);
@@ -562,6 +574,7 @@ void LLPanelGroupNotices::processNotices(LLMessageSystem* msg)
mNoticesList->addElement(row, ADD_BOTTOM);
}
+ mNoticesList->setNeedsSort(save_sort);
mNoticesList->updateSort();
}
@@ -656,6 +669,9 @@ void LLPanelGroupNotices::setGroupID(const LLUUID& id)
if(mViewMessage)
mViewMessage->clear();
+
+ if(mViewInventoryName)
+ mViewInventoryName->clear();
activate();
}
diff --git a/indra/newview/llpanellandmarks.cpp b/indra/newview/llpanellandmarks.cpp
index 67d40a39b1..0a978d1b26 100644
--- a/indra/newview/llpanellandmarks.cpp
+++ b/indra/newview/llpanellandmarks.cpp
@@ -583,6 +583,7 @@ void LLLandmarksPanel::initLandmarksPanel(LLPlacesInventoryPanel* inventory_list
if (!inventory_list->getFilter())
return;
+ inventory_list->getFilter()->setEmptyLookupMessage("PlacesNoMatchingItems");
inventory_list->setFilterTypes(0x1 << LLInventoryType::IT_LANDMARK);
inventory_list->setSelectCallback(boost::bind(&LLLandmarksPanel::onSelectionChange, this, inventory_list, _1, _2));
diff --git a/indra/newview/llpanellogin.cpp b/indra/newview/llpanellogin.cpp
index ee4dcc44fe..529a368dc3 100644
--- a/indra/newview/llpanellogin.cpp
+++ b/indra/newview/llpanellogin.cpp
@@ -1007,7 +1007,7 @@ void LLPanelLogin::onPassKey(LLLineEditor* caller, void* user_data)
{
if (gKeyboard->getKeyDown(KEY_CAPSLOCK) && sCapslockDidNotification == FALSE)
{
- LLNotificationsUtil::add("CapsKeyOn");
+// *TODO: use another way to notify user about enabled caps lock, see EXT-6858
sCapslockDidNotification = TRUE;
}
}
diff --git a/indra/newview/llpanelme.cpp b/indra/newview/llpanelme.cpp
index 50f0a14995..3f620869e0 100644
--- a/indra/newview/llpanelme.cpp
+++ b/indra/newview/llpanelme.cpp
@@ -2,25 +2,31 @@
* @file llpanelme.cpp
* @brief Side tray "Me" (My Profile) panel
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
diff --git a/indra/newview/llpanelme.h b/indra/newview/llpanelme.h
index 984ba1e9a2..f2b38de3d6 100644
--- a/indra/newview/llpanelme.h
+++ b/indra/newview/llpanelme.h
@@ -2,25 +2,31 @@
* @file llpanelme.h
* @brief Side tray "Me" (My Profile) panel
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
diff --git a/indra/newview/llpanelonlinestatus.cpp b/indra/newview/llpanelonlinestatus.cpp
index 08204e7e4d..6ba015b11c 100644
--- a/indra/newview/llpanelonlinestatus.cpp
+++ b/indra/newview/llpanelonlinestatus.cpp
@@ -2,25 +2,31 @@
* @file llpanelonlinestatus.cpp
* @brief Represents a class of online status tip toast panels.
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
* 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
+ * 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$
*/
@@ -28,7 +34,6 @@
#include "llnotifications.h"
#include "llpanelonlinestatus.h"
-#include "llviewercontrol.h" // for gSavedSettings
LLPanelOnlineStatus::LLPanelOnlineStatus(
const LLNotificationPtr& notification) :
@@ -49,7 +54,7 @@ LLPanelOnlineStatus::LLPanelOnlineStatus(
notification, notification->getResponseTemplate()));
}
- S32 max_line_count = gSavedSettings.getS32("TipToastMessageLineCount");
- snapToMessageHeight(getChild<LLTextBox> ("message"), max_line_count);
+ // set line max count to 3 in case of a very long name
+ snapToMessageHeight(getChild<LLTextBox> ("message"), 3);
}
diff --git a/indra/newview/llpanelonlinestatus.h b/indra/newview/llpanelonlinestatus.h
index 7dc648f135..b47050c3a2 100644
--- a/indra/newview/llpanelonlinestatus.h
+++ b/indra/newview/llpanelonlinestatus.h
@@ -2,25 +2,31 @@
* @file llpanelonlinestatus.h
* @brief Represents a class of online status tip toast panels.
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
* 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
+ * 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$
*/
diff --git a/indra/newview/llpaneloutfitedit.cpp b/indra/newview/llpaneloutfitedit.cpp
index ce17e1d624..dbccd243da 100644
--- a/indra/newview/llpaneloutfitedit.cpp
+++ b/indra/newview/llpaneloutfitedit.cpp
@@ -38,7 +38,10 @@
#include "llagent.h"
#include "llagentwearables.h"
#include "llappearancemgr.h"
+#include "llcofwearables.h"
+#include "llfilteredwearablelist.h"
#include "llinventory.h"
+#include "llinventoryitemslist.h"
#include "llviewercontrol.h"
#include "llui.h"
#include "llfloater.h"
@@ -71,6 +74,9 @@ const U64 WEARABLE_MASK = (1LL << LLInventoryType::IT_WEARABLE);
const U64 ATTACHMENT_MASK = (1LL << LLInventoryType::IT_ATTACHMENT) | (1LL << LLInventoryType::IT_OBJECT);
const U64 ALL_ITEMS_MASK = WEARABLE_MASK | ATTACHMENT_MASK;
+static const std::string SAVE_BTN("save_btn");
+static const std::string REVERT_BTN("revert_btn");
+
class LLInventoryLookObserver : public LLInventoryObserver
{
public:
@@ -116,9 +122,15 @@ private:
LLPanelOutfitEdit::LLPanelOutfitEdit()
-: LLPanel(), mCurrentOutfitID(), mFetchLook(NULL), mSearchFilter(NULL),
-mLookContents(NULL), mInventoryItemsPanel(NULL), mAddToOutfitBtn(NULL),
-mRemoveFromOutfitBtn(NULL), mLookObserver(NULL)
+: LLPanel(),
+ mCurrentOutfitID(),
+ mFetchLook(NULL),
+ mSearchFilter(NULL),
+ mCOFWearables(NULL),
+ mInventoryItemsPanel(NULL),
+ mAddToOutfitBtn(NULL),
+ mRemoveFromOutfitBtn(NULL),
+ mLookObserver(NULL)
{
mSavedFolderState = new LLSaveFolderState();
mSavedFolderState->setApply(FALSE);
@@ -164,10 +176,10 @@ BOOL LLPanelOutfitEdit::postBuild()
childSetCommitCallback("add_btn", boost::bind(&LLPanelOutfitEdit::showAddWearablesPanel, this), NULL);
childSetCommitCallback("filter_button", boost::bind(&LLPanelOutfitEdit::showWearablesFilter, this), NULL);
+ childSetCommitCallback("list_view_btn", boost::bind(&LLPanelOutfitEdit::showFilteredWearablesPanel, this), NULL);
- mLookContents = getChild<LLScrollListCtrl>("look_items_list");
- mLookContents->sortByColumn("look_item_sort", TRUE);
- mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this));
+ mCOFWearables = getChild<LLCOFWearables>("cof_wearables_list");
+ mCOFWearables->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this));
mInventoryItemsPanel = getChild<LLInventoryPanel>("inventory_items");
mInventoryItemsPanel->setFilterTypes(ALL_ITEMS_MASK);
@@ -200,15 +212,6 @@ BOOL LLPanelOutfitEdit::postBuild()
childSetAction("add_to_outfit_btn", boost::bind(&LLPanelOutfitEdit::onAddToOutfitClicked, this));
childSetEnabled("add_to_outfit_btn", false);
- mUpBtn = getChild<LLButton>("up_btn");
- mUpBtn->setEnabled(TRUE);
- mUpBtn->setClickedCallback(boost::bind(&LLPanelOutfitEdit::onUpClicked, this));
-
- //*TODO rename mLookContents to mOutfitContents
- mLookContents = getChild<LLScrollListCtrl>("look_items_list");
- mLookContents->sortByColumn("look_item_sort", TRUE);
- mLookContents->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onOutfitItemSelectionChange, this));
-
mRemoveFromOutfitBtn = getChild<LLButton>("remove_from_outfit_btn");
mRemoveFromOutfitBtn->setEnabled(FALSE);
mRemoveFromOutfitBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onRemoveFromOutfitClicked, this));
@@ -218,10 +221,9 @@ BOOL LLPanelOutfitEdit::postBuild()
mEditWearableBtn->setVisible(FALSE);
mEditWearableBtn->setCommitCallback(boost::bind(&LLPanelOutfitEdit::onEditWearableClicked, this));
- childSetAction("revert_btn", boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
+ childSetAction(REVERT_BTN, boost::bind(&LLAppearanceMgr::wearBaseOutfit, LLAppearanceMgr::getInstance()));
- childSetAction("save_btn", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));
- childSetAction("save_as_btn", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true));
+ childSetAction(SAVE_BTN, boost::bind(&LLPanelOutfitEdit::saveOutfit, this, false));
childSetAction("save_flyout_btn", boost::bind(&LLPanelOutfitEdit::showSaveMenu, this));
LLUICtrl::CommitCallbackRegistry::ScopedRegistrar save_registar;
@@ -229,9 +231,27 @@ BOOL LLPanelOutfitEdit::postBuild()
save_registar.add("Outfit.SaveAsNew.Action", boost::bind(&LLPanelOutfitEdit::saveOutfit, this, true));
mSaveMenu = LLUICtrlFactory::getInstance()->createFromFile<LLToggleableMenu>("menu_save_outfit.xml", gMenuHolder, LLViewerMenuHolderGL::child_registry_t::instance());
+ mWearableListManager = new LLFilteredWearableListManager(
+ getChild<LLInventoryItemsList>("filtered_wearables_list"), ALL_ITEMS_MASK);
+
+ childSetAction("move_closer_btn", boost::bind(&LLPanelOutfitEdit::moveWearable, this, true));
+ childSetAction("move_further_btn", boost::bind(&LLPanelOutfitEdit::moveWearable, this, false));
+
return TRUE;
}
+void LLPanelOutfitEdit::moveWearable(bool closer_to_body)
+{
+ LLUUID item_id = mCOFWearables->getSelectedUUID();
+ if (item_id.isNull()) return;
+
+ LLViewerInventoryItem* wearable_to_move = gInventory.getItem(item_id);
+ LLAppearanceMgr::getInstance()->moveWearable(wearable_to_move, closer_to_body);
+
+ //*TODO why not to listen to inventory?
+ updateLookInfo();
+}
+
void LLPanelOutfitEdit::showAddWearablesPanel()
{
childSetVisible("add_wearables_panel", childGetValue("add_btn"));
@@ -242,6 +262,11 @@ void LLPanelOutfitEdit::showWearablesFilter()
childSetVisible("filter_combobox_panel", childGetValue("filter_button"));
}
+void LLPanelOutfitEdit::showFilteredWearablesPanel()
+{
+ childSetVisible("filtered_wearables_panel", !childIsVisible("filtered_wearables_panel"));
+}
+
void LLPanelOutfitEdit::saveOutfit(bool as_new)
{
if (!as_new && LLAppearanceMgr::getInstance()->updateBaseOutfit())
@@ -256,6 +281,8 @@ void LLPanelOutfitEdit::saveOutfit(bool as_new)
{
panel_outfits_inventory->onSave();
}
+
+ //*TODO how to get to know when base outfit is updated or new outfit is created?
}
void LLPanelOutfitEdit::showSaveMenu()
@@ -275,6 +302,7 @@ void LLPanelOutfitEdit::onTypeFilterChanged(LLUICtrl* ctrl)
{
U32 curr_filter_type = type_filter->getCurrentIndex();
mInventoryItemsPanel->setFilterTypes(mLookItemTypes[curr_filter_type].inventoryMask);
+ mWearableListManager->setFilterMask(mLookItemTypes[curr_filter_type].inventoryMask);
}
mSavedFolderState->setApply(TRUE);
@@ -346,7 +374,7 @@ void LLPanelOutfitEdit::onAddToOutfitClicked(void)
void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void)
{
- LLUUID id_to_remove = mLookContents->getSelectionInterface()->getCurrentID();
+ LLUUID id_to_remove = mCOFWearables->getSelectedUUID();
LLAppearanceMgr::getInstance()->removeItemFromAvatar(id_to_remove);
@@ -356,41 +384,9 @@ void LLPanelOutfitEdit::onRemoveFromOutfitClicked(void)
}
-void LLPanelOutfitEdit::onUpClicked(void)
-{
- LLUUID inv_id = mLookContents->getSelectionInterface()->getCurrentID();
- if (inv_id.isNull())
- {
- //nothing selected, do nothing
- return;
- }
-
- LLViewerInventoryItem *link_item = gInventory.getItem(inv_id);
- if (!link_item)
- {
- llwarns << "could not find inventory item based on currently worn link." << llendl;
- return;
- }
-
-
- LLUUID asset_id = link_item->getAssetUUID();
- if (asset_id.isNull())
- {
- llwarns << "inventory link has null Asset ID. could not get object reference" << llendl;
- }
-
- static const std::string empty = "";
- LLWearableList::instance().getAsset(asset_id,
- empty, // don't care about wearable name
- link_item->getActualType(),
- LLSidepanelAppearance::editWearable,
- (void*)getParentUICtrl());
-}
-
-
void LLPanelOutfitEdit::onEditWearableClicked(void)
{
- LLUUID id_to_edit = mLookContents->getSelectionInterface()->getCurrentID();
+ LLUUID id_to_edit = mCOFWearables->getSelectedUUID();
LLViewerInventoryItem * item_to_edit = gInventory.getItem(id_to_edit);
if (item_to_edit)
@@ -463,29 +459,11 @@ void LLPanelOutfitEdit::onInventorySelectionChange(const std::deque<LLFolderView
void LLPanelOutfitEdit::onOutfitItemSelectionChange(void)
{
- LLScrollListItem* item = mLookContents->getLastSelectedItem();
- if (!item)
- return;
-
- LLRect item_rect;
- mLookContents->localRectToOtherView(item->getRect(), &item_rect, this);
-
- // TODO button(and item list) should be removed (when new widget is ready)
- LLRect btn_rect = mEditWearableBtn->getRect();
- btn_rect.set(item_rect.mRight - btn_rect.getWidth(), item_rect.mTop, item_rect.mRight, item_rect.mBottom);
-
- mEditWearableBtn->setShape(btn_rect);
- sendChildToFront(mEditWearableBtn);
-
- mEditWearableBtn->setEnabled(TRUE);
- if (!mEditWearableBtn->getVisible())
- {
- mEditWearableBtn->setVisible(TRUE);
- }
+ LLUUID item_id = mCOFWearables->getSelectedUUID();
+ //*TODO show Edit Wearable Button
- const LLUUID& id_item_to_remove = item->getUUID();
- LLViewerInventoryItem* item_to_remove = gInventory.getItem(id_item_to_remove);
+ LLViewerInventoryItem* item_to_remove = gInventory.getItem(item_id);
if (!item_to_remove) return;
switch (item_to_remove->getType())
@@ -506,42 +484,15 @@ void LLPanelOutfitEdit::changed(U32 mask)
void LLPanelOutfitEdit::lookFetched(void)
{
- LLInventoryModel::cat_array_t cat_array;
- LLInventoryModel::item_array_t item_array;
-
- // collectDescendentsIf takes non-const reference:
- LLFindCOFValidItems is_cof_valid;
- gInventory.collectDescendentsIf(mCurrentOutfitID,
- cat_array,
- item_array,
- LLInventoryModel::EXCLUDE_TRASH,
- is_cof_valid);
- for (LLInventoryModel::item_array_t::const_iterator iter = item_array.begin();
- iter != item_array.end();
- iter++)
- {
- const LLViewerInventoryItem *item = (*iter);
-
- LLSD row;
- row["id"] = item->getUUID();
- LLSD& columns = row["columns"];
- columns[0]["column"] = "look_item";
- columns[0]["type"] = "text";
- columns[0]["value"] = item->getName();
- columns[1]["column"] = "look_item_sort";
- columns[1]["type"] = "text"; // TODO: multi-wearable sort "type" should go here.
- columns[1]["value"] = "BAR"; // TODO: Multi-wearable sort index should go here
-
- mLookContents->addElement(row);
- }
+ mCOFWearables->refresh();
+
+ updateVerbs();
}
void LLPanelOutfitEdit::updateLookInfo()
{
if (getVisible())
{
- mLookContents->clearRows();
-
mFetchLook->setFetchID(mCurrentOutfitID);
mFetchLook->startFetch();
if (mFetchLook->isFinished())
@@ -577,4 +528,15 @@ void LLPanelOutfitEdit::displayCurrentOutfit()
updateLookInfo();
}
+//private
+void LLPanelOutfitEdit::updateVerbs()
+{
+ bool outfit_is_dirty = LLAppearanceMgr::getInstance()->isOutfitDirty();
+
+ childSetEnabled(SAVE_BTN, outfit_is_dirty);
+ childSetEnabled(REVERT_BTN, outfit_is_dirty);
+
+ mSaveMenu->setItemEnabled("save_outfit", outfit_is_dirty);
+}
+// EOF
diff --git a/indra/newview/llpaneloutfitedit.h b/indra/newview/llpaneloutfitedit.h
index 69e8016534..21fa849289 100644
--- a/indra/newview/llpaneloutfitedit.h
+++ b/indra/newview/llpaneloutfitedit.h
@@ -45,6 +45,7 @@
#include "llinventorymodel.h"
class LLButton;
+class LLCOFWearables;
class LLTextBox;
class LLInventoryCategory;
class LLInventoryLookObserver;
@@ -55,6 +56,7 @@ class LLScrollListCtrl;
class LLToggleableMenu;
class LLLookFetchObserver;
class LLFilterEditor;
+class LLFilteredWearableListManager;
class LLPanelOutfitEdit : public LLPanel
{
@@ -86,8 +88,11 @@ public:
// Sends a request for data about the given parcel, which will
// only update the location if there is none already available.
+ void moveWearable(bool closer_to_body);
+
void showAddWearablesPanel();
void showWearablesFilter();
+ void showFilteredWearablesPanel();
void saveOutfit(bool as_new = false);
void showSaveMenu();
@@ -98,7 +103,6 @@ public:
void onOutfitItemSelectionChange(void);
void onRemoveFromOutfitClicked(void);
void onEditWearableClicked(void);
- void onUpClicked(void);
void displayCurrentOutfit();
@@ -108,24 +112,28 @@ public:
private:
+ void updateVerbs();
+
//*TODO got rid of mCurrentOutfitID
LLUUID mCurrentOutfitID;
LLTextBox* mCurrentOutfitName;
- LLScrollListCtrl* mLookContents;
LLInventoryPanel* mInventoryItemsPanel;
LLFilterEditor* mSearchFilter;
LLSaveFolderState* mSavedFolderState;
std::string mSearchString;
LLButton* mAddToOutfitBtn;
LLButton* mRemoveFromOutfitBtn;
- LLButton* mUpBtn;
LLButton* mEditWearableBtn;
LLToggleableMenu* mSaveMenu;
-
+
+ LLFilteredWearableListManager* mWearableListManager;
+
LLLookFetchObserver* mFetchLook;
LLInventoryLookObserver* mLookObserver;
std::vector<LLLookItemType> mLookItemTypes;
+
+ LLCOFWearables* mCOFWearables;
};
#endif // LL_LLPANELOUTFITEDIT_H
diff --git a/indra/newview/llpaneloutfitsinventory.cpp b/indra/newview/llpaneloutfitsinventory.cpp
index b78268da7b..789e85b46f 100644
--- a/indra/newview/llpaneloutfitsinventory.cpp
+++ b/indra/newview/llpaneloutfitsinventory.cpp
@@ -49,6 +49,7 @@
#include "lllineeditor.h"
#include "llmodaldialog.h"
#include "llnotificationsutil.h"
+#include "lloutfitslist.h"
#include "llsidepanelappearance.h"
#include "llsidetray.h"
#include "lltabcontainer.h"
@@ -71,7 +72,8 @@ bool LLPanelOutfitsInventory::sShowDebugEditor = false;
LLPanelOutfitsInventory::LLPanelOutfitsInventory() :
- mActivePanel(NULL),
+ mMyOutfitsPanel(NULL),
+ mCurrentOutfitPanel(NULL),
mParent(NULL)
{
mSavedFolderState = new LLSaveFolderState();
@@ -145,9 +147,17 @@ void LLPanelOutfitsInventory::setParent(LLSidepanelAppearance* parent)
void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
{
mFilterSubString = string;
+
+ // TODO: add handling "My Outfits" tab.
+ if (!isCOFPanelActive())
+ {
+ mMyOutfitsPanel->setFilterSubString(string);
+ return;
+ }
+
if (string == "")
{
- mActivePanel->setFilterSubString(LLStringUtil::null);
+ getActivePanel()->setFilterSubString(LLStringUtil::null);
// re-open folders that were initially open
mSavedFolderState->setApply(TRUE);
@@ -159,7 +169,7 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
LLInventoryModelBackgroundFetch::instance().start();
- if (mActivePanel->getFilterSubString().empty() && string.empty())
+ if (getActivePanel()->getFilterSubString().empty() && string.empty())
{
// current filter and new filter empty, do nothing
return;
@@ -173,7 +183,7 @@ void LLPanelOutfitsInventory::onSearchEdit(const std::string& string)
}
// set new filter string
- mActivePanel->setFilterSubString(string);
+ getActivePanel()->setFilterSubString(string);
}
void LLPanelOutfitsInventory::onWearButtonClick()
@@ -216,7 +226,7 @@ bool LLPanelOutfitsInventory::onSaveCommit(const LLSD& notification, const LLSD&
LLStringUtil::trim(outfit_name);
if( !outfit_name.empty() )
{
- LLUUID outfit_folder = gAgentWearables.makeNewOutfitLinks(outfit_name);
+ LLUUID outfit_folder = LLAppearanceMgr::getInstance()->makeNewOutfitLinks(outfit_name);
LLSidepanelAppearance* panel_appearance =
dynamic_cast<LLSidepanelAppearance *>(LLSideTray::getInstance()->getPanel("sidepanel_appearance"));
@@ -267,6 +277,11 @@ void LLPanelOutfitsInventory::onSave()
void LLPanelOutfitsInventory::onSelectionChange(const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
updateVerbs();
+
+ // TODO: add handling "My Outfits" tab.
+ if (!isCOFPanelActive())
+ return;
+
if (getRootFolder()->needsAutoRename() && items.size())
{
getRootFolder()->startRenamingSelectedItem();
@@ -284,6 +299,10 @@ void LLPanelOutfitsInventory::showEditOutfitPanel()
LLFolderViewEventListener *LLPanelOutfitsInventory::getCorrectListenerForAction()
{
+ // TODO: add handling "My Outfits" tab.
+ if (!isCOFPanelActive())
+ return NULL;
+
LLFolderViewItem* current_item = getRootFolder()->getCurSelectedItem();
if (!current_item)
return NULL;
@@ -311,7 +330,7 @@ bool LLPanelOutfitsInventory::getIsCorrectType(const LLFolderViewEventListener *
LLFolderView *LLPanelOutfitsInventory::getRootFolder()
{
- return mActivePanel->getRootFolder();
+ return getActivePanel()->getRootFolder();
}
//static
@@ -393,7 +412,11 @@ void LLPanelOutfitsInventory::onTrashButtonClick()
void LLPanelOutfitsInventory::onClipboardAction(const LLSD& userdata)
{
std::string command_name = userdata.asString();
- getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
+ {
+ getActivePanel()->getRootFolder()->doToSelected(getActivePanel()->getModel(),command_name);
+ }
updateListCommands();
updateVerbs();
}
@@ -447,21 +470,26 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
if (command_name == "delete" || command_name == "remove")
{
BOOL can_delete = FALSE;
- LLFolderView* root = getActivePanel()->getRootFolder();
- if (root)
+
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
{
- std::set<LLUUID> selection_set;
- root->getSelectionList(selection_set);
- can_delete = (selection_set.size() > 0);
- for (std::set<LLUUID>::iterator iter = selection_set.begin();
- iter != selection_set.end();
- ++iter)
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ if (root)
{
- const LLUUID &item_id = (*iter);
- LLFolderViewItem *item = root->getItemByID(item_id);
- can_delete &= item->getListener()->isItemRemovable();
+ std::set<LLUUID> selection_set;
+ root->getSelectionList(selection_set);
+ can_delete = (selection_set.size() > 0);
+ for (std::set<LLUUID>::iterator iter = selection_set.begin();
+ iter != selection_set.end();
+ ++iter)
+ {
+ const LLUUID &item_id = (*iter);
+ LLFolderViewItem *item = root->getItemByID(item_id);
+ can_delete &= item->getListener()->isItemRemovable();
+ }
+ return can_delete;
}
- return can_delete;
}
return FALSE;
}
@@ -517,12 +545,17 @@ BOOL LLPanelOutfitsInventory::isActionEnabled(const LLSD& userdata)
bool LLPanelOutfitsInventory::hasItemsSelected()
{
bool has_items_selected = false;
- LLFolderView* root = getActivePanel()->getRootFolder();
- if (root)
+
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
{
- std::set<LLUUID> selection_set;
- root->getSelectionList(selection_set);
- has_items_selected = (selection_set.size() > 0);
+ LLFolderView* root = getActivePanel()->getRootFolder();
+ if (root)
+ {
+ std::set<LLUUID> selection_set;
+ root->getSelectionList(selection_set);
+ has_items_selected = (selection_set.size() > 0);
+ }
}
return has_items_selected;
}
@@ -549,74 +582,58 @@ bool LLPanelOutfitsInventory::handleDragAndDropToTrash(BOOL drop, EDragAndDropTy
void LLPanelOutfitsInventory::initTabPanels()
{
- LLInventoryPanel *cof_panel = getChild<LLInventoryPanel>(COF_TAB_NAME);
- cof_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mTabPanels.push_back(cof_panel);
+ mCurrentOutfitPanel = getChild<LLInventoryPanel>(COF_TAB_NAME);
+ mCurrentOutfitPanel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
+ mCurrentOutfitPanel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, mCurrentOutfitPanel, _1, _2));
- LLInventoryPanel *myoutfits_panel = getChild<LLInventoryPanel>(OUTFITS_TAB_NAME);
- myoutfits_panel->setFilterTypes(1LL << LLFolderType::FT_OUTFIT, LLInventoryFilter::FILTERTYPE_CATEGORY);
- myoutfits_panel->setShowFolderState(LLInventoryFilter::SHOW_NON_EMPTY_FOLDERS);
- mTabPanels.push_back(myoutfits_panel);
-
- for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
- iter != mTabPanels.end();
- ++iter)
- {
- LLInventoryPanel *panel = (*iter);
- panel->setSelectCallback(boost::bind(&LLPanelOutfitsInventory::onTabSelectionChange, this, panel, _1, _2));
- }
+ mMyOutfitsPanel = getChild<LLOutfitsList>(OUTFITS_TAB_NAME);
mAppearanceTabs = getChild<LLTabContainer>("appearance_tabs");
mAppearanceTabs->setCommitCallback(boost::bind(&LLPanelOutfitsInventory::onTabChange, this));
- mActivePanel = (LLInventoryPanel*)mAppearanceTabs->getCurrentPanel();
}
void LLPanelOutfitsInventory::onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action)
{
if (user_action && items.size() > 0)
{
- for (tabpanels_vec_t::iterator iter = mTabPanels.begin();
- iter != mTabPanels.end();
- ++iter)
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
{
- LLInventoryPanel *panel = (*iter);
- if (panel == tab_panel)
- {
- mActivePanel = panel;
- }
- else
- {
- panel->getRootFolder()->clearSelection();
- }
+ onSelectionChange(items, user_action);
+ }
+ else
+ {
+ mCurrentOutfitPanel->getRootFolder()->clearSelection();
}
}
- onSelectionChange(items, user_action);
}
void LLPanelOutfitsInventory::onTabChange()
{
- mActivePanel = (LLInventoryPanel*)childGetVisibleTab("appearance_tabs");
- if (!mActivePanel)
+ // TODO: add handling "My Outfits" tab.
+ if (isCOFPanelActive())
{
- return;
+ mCurrentOutfitPanel->setFilterSubString(mFilterSubString);
+ }
+ else
+ {
+ mMyOutfitsPanel->setFilterSubString(mFilterSubString);
}
- mActivePanel->setFilterSubString(mFilterSubString);
+
updateVerbs();
}
BOOL LLPanelOutfitsInventory::isTabPanel(LLInventoryPanel *panel) const
{
- for(tabpanels_vec_t::const_iterator it = mTabPanels.begin();
- it != mTabPanels.end();
- ++it)
+ // TODO: add handling "My Outfits" tab.
+ if (mCurrentOutfitPanel == panel)
{
- if (*it == panel)
- return TRUE;
+ return TRUE;
}
return FALSE;
}
BOOL LLPanelOutfitsInventory::isCOFPanelActive() const
{
- return (getActivePanel()->getName() == COF_TAB_NAME);
+ return (childGetVisibleTab("appearance_tabs")->getName() == COF_TAB_NAME);
}
diff --git a/indra/newview/llpaneloutfitsinventory.h b/indra/newview/llpaneloutfitsinventory.h
index 5d0d27ee4f..4234cc45c5 100644
--- a/indra/newview/llpaneloutfitsinventory.h
+++ b/indra/newview/llpaneloutfitsinventory.h
@@ -40,6 +40,7 @@ class LLFolderView;
class LLFolderViewItem;
class LLFolderViewEventListener;
class LLInventoryPanel;
+class LLOutfitsList;
class LLSaveFolderState;
class LLButton;
class LLMenuGL;
@@ -88,20 +89,21 @@ private:
public:
//////////////////////////////////////////////////////////////////////////////////
// tab panels
- LLInventoryPanel* getActivePanel() { return mActivePanel; }
- const LLInventoryPanel* getActivePanel() const { return mActivePanel; }
+ // TODO: change getActivePanel() to return the active tab instead of returning
+ // a pointer to "Wearing" inventory panel.
+ LLInventoryPanel* getActivePanel() { return mCurrentOutfitPanel; }
+
BOOL isTabPanel(LLInventoryPanel *panel) const;
-
+ BOOL isCOFPanelActive() const;
+
protected:
void initTabPanels();
void onTabSelectionChange(LLInventoryPanel* tab_panel, const std::deque<LLFolderViewItem*> &items, BOOL user_action);
void onTabChange();
- BOOL isCOFPanelActive() const;
private:
- LLInventoryPanel* mActivePanel;
- typedef std::vector<LLInventoryPanel *> tabpanels_vec_t;
- tabpanels_vec_t mTabPanels;
+ LLOutfitsList* mMyOutfitsPanel;
+ LLInventoryPanel* mCurrentOutfitPanel;
// tab panels //
////////////////////////////////////////////////////////////////////////////////
diff --git a/indra/newview/llpanelpeople.cpp b/indra/newview/llpanelpeople.cpp
index daa2a04f65..f2c0f92f9b 100644
--- a/indra/newview/llpanelpeople.cpp
+++ b/indra/newview/llpanelpeople.cpp
@@ -443,6 +443,7 @@ public:
LLPanelPeople::LLPanelPeople()
: LLPanel(),
mFilterSubString(LLStringUtil::null),
+ mFilterSubStringOrig(LLStringUtil::null),
mFilterEditor(NULL),
mTabContainer(NULL),
mOnlineFriendList(NULL),
@@ -645,6 +646,25 @@ void LLPanelPeople::onChange(EStatusType status, const std::string &channelURI,
updateButtons();
}
+void LLPanelPeople::updateFriendListHelpText()
+{
+ // show special help text for just created account to help finding friends. EXT-4836
+ static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_help_text");
+
+ // Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...)
+ // So, lets check all lists to avoid overlapping the text with online list. See EXT-6448.
+ bool any_friend_exists = mAllFriendList->filterHasMatches() || mOnlineFriendList->filterHasMatches();
+ no_friends_text->setVisible(!any_friend_exists);
+ if (no_friends_text->getVisible())
+ {
+ //update help text for empty lists
+ std::string message_name = mFilterSubString.empty() ? "no_friends_msg" : "no_filtered_friends_msg";
+ LLStringUtil::format_map_t args;
+ args["[SEARCH_TERM]"] = LLURI::escape(mFilterSubStringOrig);
+ no_friends_text->setText(getString(message_name, args));
+ }
+}
+
void LLPanelPeople::updateFriendList()
{
if (!mOnlineFriendList || !mAllFriendList)
@@ -684,14 +704,6 @@ void LLPanelPeople::updateFriendList()
online_friendsp.push_back(buddy_id);
}
- // show special help text for just created account to help found friends. EXT-4836
- static LLTextBox* no_friends_text = getChild<LLTextBox>("no_friends_msg");
-
- // Seems sometimes all_friends can be empty because of issue with Inventory loading (clear cache, slow connection...)
- // So, lets check all lists to avoid overlapping the text with online list. See EXT-6448.
- bool any_friend_exists = (all_friendsp.size() > 0) || (online_friendsp.size() > 0);
- no_friends_text->setVisible(!any_friend_exists);
-
/*
* Avatarlists will be hidden by showFriendsAccordionsIfNeeded(), if they do not have items.
* But avatarlist can be updated only if it is visible @see LLAvatarList::draw();
@@ -972,10 +984,11 @@ bool LLPanelPeople::isRealGroup()
void LLPanelPeople::onFilterEdit(const std::string& search_string)
{
- std::string search_upper = search_string;
+ mFilterSubStringOrig = search_string;
+ LLStringUtil::trimHead(mFilterSubStringOrig);
// Searches are case-insensitive
+ std::string search_upper = mFilterSubStringOrig;
LLStringUtil::toUpper(search_upper);
- LLStringUtil::trimHead(search_upper);
if (mFilterSubString == search_upper)
return;
@@ -990,11 +1003,11 @@ void LLPanelPeople::onFilterEdit(const std::string& search_string)
// Apply new filter.
- mNearbyList->setNameFilter(mFilterSubString);
- mOnlineFriendList->setNameFilter(mFilterSubString);
- mAllFriendList->setNameFilter(mFilterSubString);
- mRecentList->setNameFilter(mFilterSubString);
- mGroupList->setNameFilter(mFilterSubString);
+ mNearbyList->setNameFilter(mFilterSubStringOrig);
+ mOnlineFriendList->setNameFilter(mFilterSubStringOrig);
+ mAllFriendList->setNameFilter(mFilterSubStringOrig);
+ mRecentList->setNameFilter(mFilterSubStringOrig);
+ mGroupList->setNameFilter(mFilterSubStringOrig);
setAccordionCollapsedByUser("tab_online", false);
setAccordionCollapsedByUser("tab_all", false);
@@ -1436,6 +1449,9 @@ void LLPanelPeople::showFriendsAccordionsIfNeeded()
// Rearrange accordions
LLAccordionCtrl* accordion = getChild<LLAccordionCtrl>("friends_accordion");
accordion->arrange();
+
+ // keep help text in a synchronization with accordions visibility.
+ updateFriendListHelpText();
}
}
diff --git a/indra/newview/llpanelpeople.h b/indra/newview/llpanelpeople.h
index 891381e2de..17c45a034b 100644
--- a/indra/newview/llpanelpeople.h
+++ b/indra/newview/llpanelpeople.h
@@ -73,6 +73,7 @@ private:
} ESortOrder;
// methods indirectly called by the updaters
+ void updateFriendListHelpText();
void updateFriendList();
void updateNearbyList();
void updateRecentList();
@@ -168,6 +169,7 @@ private:
Updater* mRecentListUpdater;
std::string mFilterSubString;
+ std::string mFilterSubStringOrig;
};
#endif //LL_LLPANELPEOPLE_H
diff --git a/indra/newview/llpanelplaces.cpp b/indra/newview/llpanelplaces.cpp
index 17784c31e3..51a11e97e4 100644
--- a/indra/newview/llpanelplaces.cpp
+++ b/indra/newview/llpanelplaces.cpp
@@ -528,8 +528,7 @@ void LLPanelPlaces::onFilterEdit(const std::string& search_string, bool force_fi
std::string string = search_string;
// Searches are case-insensitive
- LLStringUtil::toUpper(string);
- LLStringUtil::trimHead(string);
+ // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is.
mActivePanel->onSearchEdit(string);
}
@@ -1071,8 +1070,7 @@ void LLPanelPlaces::updateVerbs()
mSaveBtn->setVisible(isLandmarkEditModeOn);
mCancelBtn->setVisible(isLandmarkEditModeOn);
mCloseBtn->setVisible(is_create_landmark_visible && !isLandmarkEditModeOn);
- mPlaceInfoBtn->setVisible(mPlaceInfoType != LANDMARK_INFO_TYPE && mPlaceInfoType != TELEPORT_HISTORY_INFO_TYPE
- && !is_create_landmark_visible && !isLandmarkEditModeOn);
+ mPlaceInfoBtn->setVisible(!is_place_info_visible && !is_create_landmark_visible && !isLandmarkEditModeOn);
mShowOnMapBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
mPlaceInfoBtn->setEnabled(!is_create_landmark_visible && !isLandmarkEditModeOn && have_3d_pos);
diff --git a/indra/newview/llscriptfloater.cpp b/indra/newview/llscriptfloater.cpp
index 00afb00ddc..11b6c0a3ae 100644
--- a/indra/newview/llscriptfloater.cpp
+++ b/indra/newview/llscriptfloater.cpp
@@ -2,25 +2,31 @@
* @file llscriptfloater.cpp
* @brief LLScriptFloater class definition
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
@@ -170,15 +176,7 @@ void LLScriptFloater::onClose(bool app_quitting)
if(getNotificationId().notNull())
{
- // we shouldn't kill notification on exit since it may be used as persistent.
- if (app_quitting)
- {
- LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId());
- }
- else
- {
- LLScriptFloaterManager::getInstance()->removeNotification(getNotificationId());
- }
+ LLScriptFloaterManager::getInstance()->onRemoveNotification(getNotificationId());
}
}
@@ -354,7 +352,7 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
set_new_message |= !floater->hasFocus();
}
- removeNotification(it->first);
+ onRemoveNotification(it->first);
}
}
@@ -381,17 +379,6 @@ void LLScriptFloaterManager::onAddNotification(const LLUUID& notification_id)
toggleScriptFloater(notification_id, set_new_message);
}
-void LLScriptFloaterManager::removeNotification(const LLUUID& notification_id)
-{
- LLNotificationPtr notification = LLNotifications::instance().find(notification_id);
- if (notification != NULL && !notification->isCancelled())
- {
- LLNotificationsUtil::cancel(notification);
- }
-
- onRemoveNotification(notification_id);
-}
-
void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
{
if(notification_id.isNull())
@@ -405,8 +392,6 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
LLIMWellWindow::getInstance()->removeObjectRow(notification_id);
- mNotifications.erase(notification_id);
-
// close floater
LLScriptFloater* floater = LLFloaterReg::findTypedInstance<LLScriptFloater>("script_floater", notification_id);
if(floater)
@@ -415,6 +400,8 @@ void LLScriptFloaterManager::onRemoveNotification(const LLUUID& notification_id)
floater->setNotificationId(LLUUID::null);
floater->closeFloater();
}
+
+ mNotifications.erase(notification_id);
}
void LLScriptFloaterManager::toggleScriptFloater(const LLUUID& notification_id, bool set_new_message)
@@ -495,7 +482,7 @@ std::string LLScriptFloaterManager::getObjectName(const LLUUID& notification_id)
text = notification->getSubstitutions()["OBJECTNAME"].asString();
break;
case LLScriptFloaterManager::OBJ_GIVE_INVENTORY:
- text = notification->getSubstitutions()["OBJECTFROMNAME"].asString();
+ text = notification->getSubstitutions()["NAME"].asString();
break;
default:
text = LLTrans::getString("object");
diff --git a/indra/newview/llscriptfloater.h b/indra/newview/llscriptfloater.h
index da70bb4334..dc0cfc2400 100644
--- a/indra/newview/llscriptfloater.h
+++ b/indra/newview/llscriptfloater.h
@@ -2,25 +2,31 @@
* @file llscriptfloater.h
* @brief LLScriptFloater class definition
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
@@ -59,11 +65,6 @@ public:
void onAddNotification(const LLUUID& notification_id);
/**
- * Removes notification.
- */
- void removeNotification(const LLUUID& notification_id);
-
- /**
* Handles notification removal.
* Removes script notification toast, removes script chiclet, closes script floater
*/
diff --git a/indra/newview/llsidepanelappearance.cpp b/indra/newview/llsidepanelappearance.cpp
index abef47d4be..f38df19de0 100644
--- a/indra/newview/llsidepanelappearance.cpp
+++ b/indra/newview/llsidepanelappearance.cpp
@@ -197,8 +197,7 @@ void LLSidepanelAppearance::onFilterEdit(const std::string& search_string)
mFilterSubString = search_string;
// Searches are case-insensitive
- LLStringUtil::toUpper(mFilterSubString);
- LLStringUtil::trimHead(mFilterSubString);
+ // but we don't convert the typed string to upper-case so that it can be fed to the web search as-is.
mPanelOutfitsInventory->onSearchEdit(mFilterSubString);
}
@@ -329,8 +328,8 @@ void LLSidepanelAppearance::updateVerbs()
if (mPanelOutfitsInventory && !is_look_info_visible)
{
- const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
- mEditBtn->setEnabled(is_correct_type);
+// const bool is_correct_type = (mPanelOutfitsInventory->getCorrectListenerForAction() != NULL);
+// mEditBtn->setEnabled(is_correct_type);
}
else
{
diff --git a/indra/newview/llteleporthistory.cpp b/indra/newview/llteleporthistory.cpp
index 0d8b45db1f..15684337f4 100644
--- a/indra/newview/llteleporthistory.cpp
+++ b/indra/newview/llteleporthistory.cpp
@@ -2,25 +2,31 @@
* @file llteleporthistory.cpp
* @brief Teleport history
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
@@ -32,7 +38,6 @@
#include "llsdserialize.h"
#include "llagent.h"
-#include "llvoavatarself.h"
#include "llslurl.h"
#include "llviewercontrol.h" // for gSavedSettings
#include "llviewerparcelmgr.h"
@@ -103,16 +108,6 @@ void LLTeleportHistory::onTeleportFailed()
}
}
-void LLTeleportHistory::handleLoginComplete()
-{
- if( mGotInitialUpdate )
- {
- return;
- }
- updateCurrentLocation(gAgent.getPositionGlobal());
-}
-
-
void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
{
if (mRequestedItem != -1) // teleport within the history in progress?
@@ -122,17 +117,6 @@ void LLTeleportHistory::updateCurrentLocation(const LLVector3d& new_pos)
}
else
{
- //EXT-7034
- //skip initial update if agent avatar is no valid yet
- //this may happen when updateCurrentLocation called while login process
- //sometimes isAgentAvatarValid return false and in this case new_pos
- //(which actually is gAgent.getPositionGlobal() ) is invalid
- //if this position will be saved then teleport back will teleport user to wrong position
- if ( !mGotInitialUpdate && !isAgentAvatarValid() )
- {
- return ;
- }
-
// If we're getting the initial location update
// while we already have a (loaded) non-empty history,
// there's no need to purge forward items or add a new item.
diff --git a/indra/newview/llteleporthistorystorage.cpp b/indra/newview/llteleporthistorystorage.cpp
index 0ba455e7d5..430d62e15e 100644
--- a/indra/newview/llteleporthistorystorage.cpp
+++ b/indra/newview/llteleporthistorystorage.cpp
@@ -2,25 +2,31 @@
* @file llteleporthistorystorage.cpp
* @brief Teleport history
*
- * $LicenseInfo:firstyear=2009&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2009&license=viewergpl$
+ *
+ * Copyright (c) 2009, Linden Research, Inc.
+ *
* 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
+ * 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$
*/
diff --git a/indra/newview/lltexturefetch.cpp b/indra/newview/lltexturefetch.cpp
index 2ea6e5936d..e64696b120 100644
--- a/indra/newview/lltexturefetch.cpp
+++ b/indra/newview/lltexturefetch.cpp
@@ -850,6 +850,7 @@ bool LLTextureFetchWorker::doWork(S32 param)
mState = WAIT_HTTP_REQ;
mFetcher->addToHTTPQueue(mID);
+ mSentRequest = QUEUED;
// Will call callbackHttpGet when curl request completes
std::vector<std::string> headers;
headers.push_back("Accept: image/x-j2c");
@@ -936,6 +937,11 @@ bool LLTextureFetchWorker::doWork(S32 param)
{
mFileSize = mBufferSize;
}
+ else //the file size is unknown
+ {
+ mFileSize = S32_MAX ; //flag the file is not fully loaded.
+ }
+
U8* buffer = new U8[mBufferSize];
if (cur_size > 0)
{
diff --git a/indra/newview/lltoast.cpp b/indra/newview/lltoast.cpp
index 22b12ee132..568cd4cb19 100644
--- a/indra/newview/lltoast.cpp
+++ b/indra/newview/lltoast.cpp
@@ -67,6 +67,7 @@ LLToast::Params::Params()
LLToast::LLToast(const LLToast::Params& p)
: LLModalDialog(LLSD(), p.is_modal),
mPanel(p.panel),
+ mToastLifetime(p.lifetime_secs),
mToastFadingTime(p.fading_time_secs),
mNotificationID(p.notif_id),
mSessionID(p.session_id),
@@ -241,6 +242,13 @@ void LLToast::draw()
drawChild(mHideBtn);
}
}
+
+ // if timer started and remaining time <= fading time
+ if (mTimer->getStarted() && (mToastLifetime
+ - mTimer->getEventTimer().getElapsedTimeF32()) <= mToastFadingTime)
+ {
+ setBackgroundOpaque(FALSE);
+ }
}
//--------------------------------------------------------------------------
diff --git a/indra/newview/lltoast.h b/indra/newview/lltoast.h
index 4a213580da..4211f21ef1 100644
--- a/indra/newview/lltoast.h
+++ b/indra/newview/lltoast.h
@@ -209,6 +209,7 @@ private:
// timer counts a lifetime of a toast
std::auto_ptr<LLToastLifeTimer> mTimer;
+ F32 mToastLifetime; // in seconds
F32 mToastFadingTime; // in seconds
LLPanel* mPanel;
diff --git a/indra/newview/lltoastalertpanel.cpp b/indra/newview/lltoastalertpanel.cpp
index 986ccdf19b..2b529a4e50 100644
--- a/indra/newview/lltoastalertpanel.cpp
+++ b/indra/newview/lltoastalertpanel.cpp
@@ -50,6 +50,7 @@
#include "llnotifications.h"
#include "llfunctorregistry.h"
#include "llrootview.h"
+#include "llviewercontrol.h" // for gSavedSettings
const S32 MAX_ALLOWED_MSG_WIDTH = 400;
const F32 DEFAULT_BUTTON_DELAY = 0.5f;
@@ -279,7 +280,18 @@ LLToastAlertPanel::LLToastAlertPanel( LLNotificationPtr notification, bool modal
mLineEditor->reshape(leditor_rect.getWidth(), leditor_rect.getHeight());
mLineEditor->setRect(leditor_rect);
mLineEditor->setText(edit_text_contents);
- mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1);
+
+ // decrease limit of line editor of teleport offer dialog to avoid truncation of
+ // location URL in invitation message, see EXT-6891
+ if ("OfferTeleport" == mNotification->getName())
+ {
+ mLineEditor->setMaxTextLength(gSavedSettings.getS32(
+ "teleport_offer_invitation_max_length"));
+ }
+ else
+ {
+ mLineEditor->setMaxTextLength(STD_STRING_STR_LEN - 1);
+ }
LLToastPanel::addChild(mLineEditor);
diff --git a/indra/newview/lltoastnotifypanel.cpp b/indra/newview/lltoastnotifypanel.cpp
index c9d2d404c0..089163929e 100644
--- a/indra/newview/lltoastnotifypanel.cpp
+++ b/indra/newview/lltoastnotifypanel.cpp
@@ -493,7 +493,7 @@ void LLToastNotifyPanel::onClickButton(void* data)
{
sButtonClickSignal(self->mNotification->getID(), button_name);
- if(new_info)
+ if(new_info && !self->mNotification->isPersistent())
{
self->mNotification->setResponseFunctor(
boost::bind(&LLOfferInfo::inventory_offer_callback, new_info, _1, _2));
diff --git a/indra/newview/lltoastpanel.cpp b/indra/newview/lltoastpanel.cpp
index d142a0665b..71598b3169 100644
--- a/indra/newview/lltoastpanel.cpp
+++ b/indra/newview/lltoastpanel.cpp
@@ -33,6 +33,7 @@
#include "llviewerprecompiledheaders.h"
#include "llpanelgenerictip.h"
+#include "llpanelonlinestatus.h"
#include "llnotifications.h"
#include "lltoastpanel.h"
@@ -97,9 +98,19 @@ LLToastPanel* LLToastPanel::buidPanelFromNotification(
{
LLToastPanel* res = NULL;
- if (notification->getName() == "SystemMessageTip")
+ //process tip toast panels
+ if ("notifytip" == notification->getType())
{
- res = new LLPanelGenericTip(notification);
+ // if it is online/offline notification
+ if ("FriendOffline" == notification->getName() || "FriendOnline" == notification->getName())
+ {
+ res = new LLPanelOnlineStatus(notification);
+ }
+ // in all other case we use generic tip panel
+ else
+ {
+ res = new LLPanelGenericTip(notification);
+ }
}
/*
else if(...)
diff --git a/indra/newview/llvieweraudio.cpp b/indra/newview/llvieweraudio.cpp
index 2661c9f32b..9559311e3c 100644
--- a/indra/newview/llvieweraudio.cpp
+++ b/indra/newview/llvieweraudio.cpp
@@ -145,7 +145,7 @@ void audio_update_volume(bool force_update)
{
F32 music_volume = gSavedSettings.getF32("AudioLevelMusic");
BOOL music_muted = gSavedSettings.getBOOL("MuteMusic");
- music_volume = mute_volume * master_volume * (music_volume*music_volume);
+ music_volume = mute_volume * master_volume * music_volume;
gAudiop->setInternetStreamGain ( music_muted ? 0.f : music_volume );
}
@@ -153,7 +153,7 @@ void audio_update_volume(bool force_update)
// Streaming Media
F32 media_volume = gSavedSettings.getF32("AudioLevelMedia");
BOOL media_muted = gSavedSettings.getBOOL("MuteMedia");
- media_volume = mute_volume * master_volume * (media_volume*media_volume);
+ media_volume = mute_volume * master_volume * media_volume;
LLViewerMedia::setVolume( media_muted ? 0.0f : media_volume );
// Voice
diff --git a/indra/newview/llviewerinventory.cpp b/indra/newview/llviewerinventory.cpp
index 8a891b1462..b39ee8b2e0 100644
--- a/indra/newview/llviewerinventory.cpp
+++ b/indra/newview/llviewerinventory.cpp
@@ -67,6 +67,40 @@
#include "llviewermessage.h"
///----------------------------------------------------------------------------
+/// Helper class to store special inventory item names
+///----------------------------------------------------------------------------
+class LLLocalizedInventoryItemsDictionary : public LLSingleton<LLLocalizedInventoryItemsDictionary>
+{
+public:
+ std::map<std::string, std::string> mInventoryItemsDict;
+
+ LLLocalizedInventoryItemsDictionary()
+ {
+ mInventoryItemsDict["New Shape"] = LLTrans::getString("New Shape");
+ mInventoryItemsDict["New Skin"] = LLTrans::getString("New Skin");
+ mInventoryItemsDict["New Hair"] = LLTrans::getString("New Hair");
+ mInventoryItemsDict["New Eyes"] = LLTrans::getString("New Eyes");
+ mInventoryItemsDict["New Shirt"] = LLTrans::getString("New Shirt");
+ mInventoryItemsDict["New Pants"] = LLTrans::getString("New Pants");
+ mInventoryItemsDict["New Shoes"] = LLTrans::getString("New Shoes");
+ mInventoryItemsDict["New Socks"] = LLTrans::getString("New Socks");
+ mInventoryItemsDict["New Jacket"] = LLTrans::getString("New Jacket");
+ mInventoryItemsDict["New Gloves"] = LLTrans::getString("New Gloves");
+ mInventoryItemsDict["New Undershirt"] = LLTrans::getString("New Undershirt");
+ mInventoryItemsDict["New Underpants"] = LLTrans::getString("New Underpants");
+ mInventoryItemsDict["New Skirt"] = LLTrans::getString("New Skirt");
+ mInventoryItemsDict["New Alpha"] = LLTrans::getString("New Alpha");
+ mInventoryItemsDict["New Tattoo"] = LLTrans::getString("New Tattoo");
+ mInventoryItemsDict["Invalid Wearable"] = LLTrans::getString("Invalid Wearable");
+
+ mInventoryItemsDict["New Script"] = LLTrans::getString("New Script");
+ mInventoryItemsDict["New Folder"] = LLTrans::getString("New Folder");
+ mInventoryItemsDict["Contents"] = LLTrans::getString("Contents");
+ }
+};
+
+
+///----------------------------------------------------------------------------
/// Local function declarations, constants, enums, and typedefs
///----------------------------------------------------------------------------
@@ -316,6 +350,18 @@ BOOL LLViewerInventoryItem::unpackMessage(LLSD item)
BOOL LLViewerInventoryItem::unpackMessage(LLMessageSystem* msg, const char* block, S32 block_num)
{
BOOL rv = LLInventoryItem::unpackMessage(msg, block, block_num);
+
+ std::string localized_str;
+
+ std::map<std::string, std::string>::const_iterator dictionary_iter;
+
+ dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.find(mName);
+
+ if(dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end())
+ {
+ mName = dictionary_iter->second;
+ }
+
mIsComplete = TRUE;
return rv;
}
@@ -867,6 +913,25 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
U32 next_owner_perm,
LLPointer<LLInventoryCallback> cb)
{
+ //check if name is equal to one of special inventory items names
+ //EXT-5839
+ std::string server_name = name;
+
+ {
+ std::map<std::string, std::string>::const_iterator dictionary_iter;
+
+ for (dictionary_iter = LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.begin();
+ dictionary_iter != LLLocalizedInventoryItemsDictionary::getInstance()->mInventoryItemsDict.end();
+ dictionary_iter++)
+ {
+ const std::string& localized_name = dictionary_iter->second;
+ if(localized_name == name)
+ {
+ server_name = dictionary_iter->first;
+ }
+ }
+ }
+
LLMessageSystem* msg = gMessageSystem;
msg->newMessageFast(_PREHASH_CreateInventoryItem);
msg->nextBlock(_PREHASH_AgentData);
@@ -880,7 +945,7 @@ void create_inventory_item(const LLUUID& agent_id, const LLUUID& session_id,
msg->addS8Fast(_PREHASH_Type, (S8)asset_type);
msg->addS8Fast(_PREHASH_InvType, (S8)inv_type);
msg->addU8Fast(_PREHASH_WearableType, (U8)wtype);
- msg->addStringFast(_PREHASH_Name, name);
+ msg->addStringFast(_PREHASH_Name, server_name);
msg->addStringFast(_PREHASH_Description, desc);
gAgent.sendReliableMessage();
@@ -923,6 +988,7 @@ void link_inventory_item(
const LLUUID& item_id,
const LLUUID& parent_id,
const std::string& new_name,
+ const std::string& new_description,
const LLAssetType::EType asset_type,
LLPointer<LLInventoryCallback> cb)
{
@@ -948,7 +1014,6 @@ void link_inventory_item(
}
LLUUID transaction_id;
- std::string desc = "Broken link"; // This should only show if the object can't find its baseobj.
LLInventoryType::EType inv_type = LLInventoryType::IT_NONE;
if (dynamic_cast<const LLInventoryCategory *>(baseobj))
{
@@ -979,7 +1044,7 @@ void link_inventory_item(
msg->addS8Fast(_PREHASH_Type, (S8)asset_type);
msg->addS8Fast(_PREHASH_InvType, (S8)inv_type);
msg->addStringFast(_PREHASH_Name, new_name);
- msg->addStringFast(_PREHASH_Description, desc);
+ msg->addStringFast(_PREHASH_Description, new_description);
}
gAgent.sendReliableMessage();
}
diff --git a/indra/newview/llviewerinventory.h b/indra/newview/llviewerinventory.h
index 9d449399e8..f296ce35ff 100644
--- a/indra/newview/llviewerinventory.h
+++ b/indra/newview/llviewerinventory.h
@@ -339,6 +339,7 @@ void link_inventory_item(
const LLUUID& item_id,
const LLUUID& parent_id,
const std::string& new_name,
+ const std::string& new_description,
const LLAssetType::EType asset_type,
LLPointer<LLInventoryCallback> cb);
diff --git a/indra/newview/llviewermessage.cpp b/indra/newview/llviewermessage.cpp
index bc4e20d706..78be6bdfd0 100644
--- a/indra/newview/llviewermessage.cpp
+++ b/indra/newview/llviewermessage.cpp
@@ -1035,21 +1035,26 @@ bool check_offer_throttle(const std::string& from_name, bool check_only)
{
// Use the name of the last item giver, who is probably the person
// spamming you.
- std::ostringstream message;
- message << LLAppViewer::instance()->getSecondLifeTitle();
+
+ LLStringUtil::format_map_t arg;
+ std::string log_msg;
+ std::ostringstream time ;
+ time<<OFFER_THROTTLE_TIME;
+
+ arg["APP_NAME"] = LLAppViewer::instance()->getSecondLifeTitle();
+ arg["TIME"] = time.str();
+
if (!from_name.empty())
{
- message << ": Items coming in too fast from " << from_name;
+ arg["FROM_NAME"] = from_name;
+ log_msg = LLTrans::getString("ItemsComingInTooFastFrom", arg);
}
else
{
- message << ": Items coming in too fast";
+ log_msg = LLTrans::getString("ItemsComingInTooFast", arg);
}
- message << ", automatic preview disabled for "
- << OFFER_THROTTLE_TIME << " seconds.";
//this is kinda important, so actually put it on screen
- std::string log_msg = message.str();
LLSD args;
args["MESSAGE"] = log_msg;
LLNotificationsUtil::add("SystemMessage", args);
@@ -1247,6 +1252,16 @@ void inventory_offer_mute_callback(const LLUUID& blocked_id,
gSavedSettings.getString("NotificationChannelUUID")), OfferMatcher(blocked_id));
}
+LLOfferInfo::LLOfferInfo()
+ : LLNotificationResponderInterface()
+ , mFromGroup(FALSE)
+ , mFromObject(FALSE)
+ , mIM(IM_NOTHING_SPECIAL)
+ , mType(LLAssetType::AT_NONE)
+ , mPersist(false)
+{
+}
+
LLOfferInfo::LLOfferInfo(const LLSD& sd)
{
mIM = (EInstantMessage)sd["im_type"].asInteger();
@@ -1260,6 +1275,7 @@ LLOfferInfo::LLOfferInfo(const LLSD& sd)
mFromName = sd["from_name"].asString();
mDesc = sd["description"].asString();
mHost = LLHost(sd["sender"].asString());
+ mPersist = sd["persist"].asBoolean();
}
LLOfferInfo::LLOfferInfo(const LLOfferInfo& info)
@@ -1275,6 +1291,7 @@ LLOfferInfo::LLOfferInfo(const LLOfferInfo& info)
mFromName = info.mFromName;
mDesc = info.mDesc;
mHost = info.mHost;
+ mPersist = info.mPersist;
}
LLSD LLOfferInfo::asLLSD()
@@ -1291,9 +1308,15 @@ LLSD LLOfferInfo::asLLSD()
sd["from_name"] = mFromName;
sd["description"] = mDesc;
sd["sender"] = mHost.getIPandPort();
+ sd["persist"] = mPersist;
return sd;
}
+void LLOfferInfo::fromLLSD(const LLSD& params)
+{
+ *this = params;
+}
+
void LLOfferInfo::send_auto_receive_response(void)
{
LLMessageSystem* msg = gMessageSystem;
@@ -1333,6 +1356,21 @@ void LLOfferInfo::send_auto_receive_response(void)
}
}
+void LLOfferInfo::handleRespond(const LLSD& notification, const LLSD& response)
+{
+ initRespondFunctionMap();
+
+ const std::string name = notification["name"].asString();
+ if(mRespondFunctions.find(name) == mRespondFunctions.end())
+ {
+ llwarns << "Unexpected notification name : " << name << llendl;
+ llassert(!"Unexpected notification name");
+ return;
+ }
+
+ mRespondFunctions[name](notification, response);
+}
+
bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD& response)
{
LLChat chat;
@@ -1469,7 +1507,10 @@ bool LLOfferInfo::inventory_offer_callback(const LLSD& notification, const LLSD&
gInventory.addObserver(opener);
}
- delete this;
+ if(!mPersist)
+ {
+ delete this;
+ }
return false;
}
@@ -1635,7 +1676,10 @@ bool LLOfferInfo::inventory_task_offer_callback(const LLSD& notification, const
gInventory.addObserver(opener);
}
- delete this;
+ if(!mPersist)
+ {
+ delete this;
+ }
return false;
}
@@ -1651,6 +1695,16 @@ protected:
}
};
+void LLOfferInfo::initRespondFunctionMap()
+{
+ if(mRespondFunctions.empty())
+ {
+ mRespondFunctions["ObjectGiveItem"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2);
+ mRespondFunctions["ObjectGiveItemUnknownUser"] = boost::bind(&LLOfferInfo::inventory_task_offer_callback, this, _1, _2);
+ mRespondFunctions["UserGiveItem"] = boost::bind(&LLOfferInfo::inventory_offer_callback, this, _1, _2);
+ }
+}
+
void inventory_offer_handler(LLOfferInfo* info)
{
//Until throttling is implmented, busy mode should reject inventory instead of silently
@@ -1767,7 +1821,8 @@ void inventory_offer_handler(LLOfferInfo* info)
// Inventory Slurls don't currently work for non agent transfers, so only display the object name.
args["ITEM_SLURL"] = msg;
// Note: sets inventory_task_offer_callback as the callback
- p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_task_offer_callback, info, _1, _2));
+ p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info));
+ info->mPersist = true;
p.name = name_found ? "ObjectGiveItem" : "ObjectGiveItemUnknownUser";
// Pop up inv offer chiclet and let the user accept (keep), or reject (and silently delete) the inventory.
LLNotifications::instance().add(p);
@@ -1779,7 +1834,8 @@ void inventory_offer_handler(LLOfferInfo* info)
// *TODO fix memory leak
// inventory_offer_callback() is not invoked if user received notification and
// closes viewer(without responding the notification)
- p.substitutions(args).payload(payload).functor.function(boost::bind(&LLOfferInfo::inventory_offer_callback, info, _1, _2));
+ p.substitutions(args).payload(payload).functor.responder(LLNotificationResponderPtr(info));
+ info->mPersist = true;
p.name = "UserGiveItem";
// Prefetch the item into your local inventory.
@@ -1800,10 +1856,8 @@ void inventory_offer_handler(LLOfferInfo* info)
// Inform user that there is a script floater via toast system
{
payload["give_inventory_notification"] = TRUE;
- LLNotification::Params params(p.name);
- params.substitutions = p.substitutions;
- params.payload = payload;
- LLPostponedNotification::add<LLPostponedOfferNotification>( params, info->mFromID, false);
+ p.payload = payload;
+ LLPostponedNotification::add<LLPostponedOfferNotification>(p, info->mFromID, false);
}
}
}
@@ -1880,7 +1934,7 @@ protected:
}
};
-static void parse_lure_bucket(const std::string& bucket,
+static bool parse_lure_bucket(const std::string& bucket,
U64& region_handle,
LLVector3& pos,
LLVector3& look_at,
@@ -1892,15 +1946,25 @@ static void parse_lure_bucket(const std::string& bucket,
tokenizer tokens(bucket, sep);
tokenizer::iterator iter = tokens.begin();
- S32 gx = boost::lexical_cast<S32>((*(iter)).c_str());
- S32 gy = boost::lexical_cast<S32>((*(++iter)).c_str());
- S32 rx = boost::lexical_cast<S32>((*(++iter)).c_str());
- S32 ry = boost::lexical_cast<S32>((*(++iter)).c_str());
- S32 rz = boost::lexical_cast<S32>((*(++iter)).c_str());
- S32 lx = boost::lexical_cast<S32>((*(++iter)).c_str());
- S32 ly = boost::lexical_cast<S32>((*(++iter)).c_str());
- S32 lz = boost::lexical_cast<S32>((*(++iter)).c_str());
-
+ S32 gx,gy,rx,ry,rz,lx,ly,lz;
+ try
+ {
+ gx = boost::lexical_cast<S32>((*(iter)).c_str());
+ gy = boost::lexical_cast<S32>((*(++iter)).c_str());
+ rx = boost::lexical_cast<S32>((*(++iter)).c_str());
+ ry = boost::lexical_cast<S32>((*(++iter)).c_str());
+ rz = boost::lexical_cast<S32>((*(++iter)).c_str());
+ lx = boost::lexical_cast<S32>((*(++iter)).c_str());
+ ly = boost::lexical_cast<S32>((*(++iter)).c_str());
+ lz = boost::lexical_cast<S32>((*(++iter)).c_str());
+ }
+ catch( boost::bad_lexical_cast& )
+ {
+ LL_WARNS("parse_lure_bucket")
+ << "Couldn't parse lure bucket."
+ << LL_ENDL;
+ return false;
+ }
// Grab region access
region_access = SIM_ACCESS_MIN;
if (++iter != tokens.end())
@@ -1925,6 +1989,7 @@ static void parse_lure_bucket(const std::string& bucket,
look_at.setVec((F32)lx, (F32)ly, (F32)lz);
region_handle = to_region_handle(gx, gy);
+ return true;
}
void process_improved_im(LLMessageSystem *msg, void **user_data)
@@ -2484,7 +2549,7 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
// Note: lie to Nearby Chat, pretending that this is NOT an IM, because
// IMs from obejcts don't open IM sessions.
LLNearbyChat* nearby_chat = LLFloaterReg::getTypedInstance<LLNearbyChat>("nearby_chat", LLSD());
- if(nearby_chat)
+ if(SYSTEM_FROM != name && nearby_chat)
{
LLSD args;
args["owner_id"] = from_id;
@@ -2562,15 +2627,21 @@ void process_improved_im(LLMessageSystem *msg, void **user_data)
U64 region_handle;
U8 region_access;
std::string region_info = ll_safe_string((char*)binary_bucket, binary_bucket_size);
- parse_lure_bucket(region_info, region_handle, pos, look_at, region_access);
+ std::string region_access_str = LLStringUtil::null;
+ std::string region_access_icn = LLStringUtil::null;
- std::string region_access_str = LLViewerRegion::accessToString(region_access);
+ if (parse_lure_bucket(region_info, region_handle, pos, look_at, region_access))
+ {
+ region_access_str = LLViewerRegion::accessToString(region_access);
+ region_access_icn = LLViewerRegion::getAccessIcon(region_access);
+ }
LLSD args;
// *TODO: Translate -> [FIRST] [LAST] (maybe)
args["NAME_SLURL"] = LLSLURL::buildCommand("agent", from_id, "about");
args["MESSAGE"] = message;
- args["MATURITY"] = region_access_str;
+ args["MATURITY_STR"] = region_access_str;
+ args["MATURITY_ICON"] = region_access_icn;
LLSD payload;
payload["from_id"] = from_id;
payload["lure_id"] = session_id;
diff --git a/indra/newview/llviewermessage.h b/indra/newview/llviewermessage.h
index 7c021dc05f..72ad3c8926 100644
--- a/indra/newview/llviewermessage.h
+++ b/indra/newview/llviewermessage.h
@@ -40,6 +40,7 @@
#include "lluuid.h"
#include "message.h"
#include "stdenums.h"
+#include "llnotifications.h"
//
// Forward declarations
@@ -210,11 +211,10 @@ bool highlight_offered_item(const LLUUID& item_id);
void set_dad_inventory_item(LLInventoryItem* inv_item, const LLUUID& into_folder_uuid);
-struct LLOfferInfo
+class LLOfferInfo : public LLNotificationResponderInterface
{
- LLOfferInfo()
- : mFromGroup(FALSE), mFromObject(FALSE),
- mIM(IM_NOTHING_SPECIAL), mType(LLAssetType::AT_NONE) {};
+public:
+ LLOfferInfo();
LLOfferInfo(const LLSD& sd);
LLOfferInfo(const LLOfferInfo& info);
@@ -232,12 +232,27 @@ struct LLOfferInfo
std::string mFromName;
std::string mDesc;
LLHost mHost;
+ bool mPersist;
+
+ // LLNotificationResponderInterface implementation
+ /*virtual*/ LLSD asLLSD();
+ /*virtual*/ void fromLLSD(const LLSD& params);
+ /*virtual*/ void handleRespond(const LLSD& notification, const LLSD& response);
- LLSD asLLSD();
void send_auto_receive_response(void);
+
+ // TODO - replace all references with handleRespond()
bool inventory_offer_callback(const LLSD& notification, const LLSD& response);
bool inventory_task_offer_callback(const LLSD& notification, const LLSD& response);
+private:
+
+ void initRespondFunctionMap();
+
+ typedef boost::function<bool (const LLSD&, const LLSD&)> respond_function_t;
+ typedef std::map<std::string, respond_function_t> respond_function_map_t;
+
+ respond_function_map_t mRespondFunctions;
};
void process_feature_disabled_message(LLMessageSystem* msg, void**);
diff --git a/indra/newview/llviewerregion.cpp b/indra/newview/llviewerregion.cpp
index 07d4ac664f..c48668df9a 100644
--- a/indra/newview/llviewerregion.cpp
+++ b/indra/newview/llviewerregion.cpp
@@ -627,6 +627,26 @@ std::string LLViewerRegion::accessToString(U8 sim_access)
}
// static
+std::string LLViewerRegion::getAccessIcon(U8 sim_access)
+{
+ switch(sim_access)
+ {
+ case SIM_ACCESS_MATURE:
+ return "Parcel_M_Dark";
+
+ case SIM_ACCESS_ADULT:
+ return "Parcel_R_Light";
+
+ case SIM_ACCESS_PG:
+ return "Parcel_PG_Light";
+
+ case SIM_ACCESS_MIN:
+ default:
+ return "";
+ }
+}
+
+// static
std::string LLViewerRegion::accessToShortString(U8 sim_access)
{
switch(sim_access) /* Flawfinder: ignore */
diff --git a/indra/newview/llviewerregion.h b/indra/newview/llviewerregion.h
index 361ae87e1b..5c4d5a61fd 100644
--- a/indra/newview/llviewerregion.h
+++ b/indra/newview/llviewerregion.h
@@ -2,25 +2,31 @@
* @file llviewerregion.h
* @brief Description of the LLViewerRegion class.
*
- * $LicenseInfo:firstyear=2001&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2001&license=viewergpl$
+ *
+ * Copyright (c) 2001-2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
@@ -93,8 +99,9 @@ public:
~LLViewerRegion();
// Call this after you have the region name and handle.
- void loadObjectCache();
- void saveObjectCache();
+ void loadCache();
+
+ void saveCache();
void sendMessage(); // Send the current message to this region's simulator
void sendReliableMessage(); // Send the current message to this region's simulator
@@ -284,7 +291,6 @@ public:
friend std::ostream& operator<<(std::ostream &s, const LLViewerRegion &region);
/// implements LLCapabilityProvider
virtual std::string getDescription() const;
- std::string getHttpUrl() const { return mHttpUrl ;}
LLSpatialPartition* getSpatialPartition(U32 type);
public:
@@ -323,9 +329,6 @@ public:
LLDynamicArray<LLUUID> mMapAvatarIDs;
private:
- // determine the cache filename for the region from the region handle
- const std::string getObjectCacheFilename(U64 mHandle) const;
-
// The surfaces and other layers
LLSurface* mLandp;
@@ -380,7 +383,6 @@ private:
std::string mColoName;
std::string mProductSKU;
std::string mProductName;
- std::string mHttpUrl ;
// Maps local ids to cache entries.
@@ -400,7 +402,7 @@ private:
// Cache ID is unique per-region, across renames, moving locations,
// etc.
LLUUID mCacheID;
-
+
typedef std::map<std::string, std::string> CapabilityMap;
CapabilityMap mCapabilities;
diff --git a/indra/newview/llviewertexture.cpp b/indra/newview/llviewertexture.cpp
index a5adb11c53..c883087cf2 100644
--- a/indra/newview/llviewertexture.cpp
+++ b/indra/newview/llviewertexture.cpp
@@ -1564,10 +1564,6 @@ F32 LLViewerFetchedTexture::calcDecodePriority()
// larger mips are corrupted
priority = -3.0f;
}
- else if (cur_discard <= mDesiredDiscardLevel)
- {
- priority = -4.0f;
- }
else
{
// priority range = 100,000 - 500,000
diff --git a/indra/newview/llvoavatarself.cpp b/indra/newview/llvoavatarself.cpp
index 7473adda1f..63f060b58a 100644
--- a/indra/newview/llvoavatarself.cpp
+++ b/indra/newview/llvoavatarself.cpp
@@ -2238,7 +2238,6 @@ LLGLuint LLVOAvatarSelf::getScratchTexName( LLGLenum format, S32& components, U3
{
case GL_LUMINANCE: components = 1; internal_format = GL_LUMINANCE8; break;
case GL_ALPHA: components = 1; internal_format = GL_ALPHA8; break;
- case GL_COLOR_INDEX: components = 1; internal_format = GL_COLOR_INDEX8_EXT; break;
case GL_LUMINANCE_ALPHA: components = 2; internal_format = GL_LUMINANCE8_ALPHA8; break;
case GL_RGB: components = 3; internal_format = GL_RGB8; break;
case GL_RGBA: components = 4; internal_format = GL_RGBA8; break;
diff --git a/indra/newview/llwearableitemslist.cpp b/indra/newview/llwearableitemslist.cpp
index 29d2745d6e..3d110dcc78 100644
--- a/indra/newview/llwearableitemslist.cpp
+++ b/indra/newview/llwearableitemslist.cpp
@@ -2,25 +2,30 @@
* @file llwearableitemslist.cpp
* @brief A flat list of wearable items.
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
* 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
+ * 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$
*/
@@ -28,15 +33,8 @@
#include "llwearableitemslist.h"
-#include "lliconctrl.h"
-#include "llmenugl.h" // for LLContextMenu
-
-#include "llagentwearables.h"
-#include "llappearancemgr.h"
#include "llinventoryfunctions.h"
-#include "lltransutil.h"
-#include "llviewerattachmenu.h"
-#include "llvoavatarself.h"
+#include "llinventorymodel.h"
class LLFindOutfitItems : public LLInventoryCollectFunctor
{
@@ -62,573 +60,19 @@ bool LLFindOutfitItems::operator()(LLInventoryCategory* cat,
return FALSE;
}
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-void LLPanelWearableListItem::onMouseEnter(S32 x, S32 y, MASK mask)
-{
- LLPanelInventoryListItemBase::onMouseEnter(x, y, mask);
- setWidgetsVisible(true);
- reshapeWidgets();
-}
-
-void LLPanelWearableListItem::onMouseLeave(S32 x, S32 y, MASK mask)
-{
- LLPanelInventoryListItemBase::onMouseLeave(x, y, mask);
- setWidgetsVisible(false);
- reshapeWidgets();
-}
-
-LLPanelWearableListItem::LLPanelWearableListItem(LLViewerInventoryItem* item, const LLPanelWearableListItem::Params& params)
-: LLPanelInventoryListItemBase(item, params)
-{
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-// static
-LLPanelWearableOutfitItem* LLPanelWearableOutfitItem::create(LLViewerInventoryItem* item,
- bool worn_indication_enabled)
-{
- LLPanelWearableOutfitItem* list_item = NULL;
- if (item)
- {
- const LLPanelInventoryListItemBase::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelInventoryListItemBase>();
-
- list_item = new LLPanelWearableOutfitItem(item, worn_indication_enabled, params);
- list_item->initFromParams(params);
- list_item->postBuild();
- }
- return list_item;
-}
-
-LLPanelWearableOutfitItem::LLPanelWearableOutfitItem(LLViewerInventoryItem* item,
- bool worn_indication_enabled,
- const LLPanelWearableOutfitItem::Params& params)
-: LLPanelInventoryListItemBase(item, params)
-, mWornIndicationEnabled(worn_indication_enabled)
-{
-}
-
-// virtual
-void LLPanelWearableOutfitItem::updateItem(const std::string& name,
- EItemState item_state)
-{
- std::string search_label = name;
-
- if (mWornIndicationEnabled && get_is_item_worn(mInventoryItemUUID))
- {
- search_label += LLTrans::getString("worn");
- item_state = IS_WORN;
- }
-
- LLPanelInventoryListItemBase::updateItem(search_label, item_state);
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelClothingListItem(&typeid(LLPanelClothingListItem::Params), "clothing_list_item");
-
-
-LLPanelClothingListItem::Params::Params()
-: up_btn("up_btn"),
- down_btn("down_btn"),
- edit_btn("edit_btn"),
- lock_panel("lock_panel"),
- edit_panel("edit_panel"),
- lock_icon("lock_icon")
-{}
-
-// static
-LLPanelClothingListItem* LLPanelClothingListItem::create(LLViewerInventoryItem* item)
-{
- LLPanelClothingListItem* list_item = NULL;
- if(item)
- {
- const LLPanelClothingListItem::Params& params = LLUICtrlFactory::getDefaultParams<LLPanelClothingListItem>();
- list_item = new LLPanelClothingListItem(item, params);
- list_item->initFromParams(params);
- list_item->postBuild();
- }
- return list_item;
-}
-
-LLPanelClothingListItem::LLPanelClothingListItem(LLViewerInventoryItem* item, const LLPanelClothingListItem::Params& params)
- : LLPanelDeletableWearableListItem(item, params)
-{
- LLButton::Params button_params = params.up_btn;
- applyXUILayout(button_params, this);
- addChild(LLUICtrlFactory::create<LLButton>(button_params));
-
- button_params = params.down_btn;
- applyXUILayout(button_params, this);
- addChild(LLUICtrlFactory::create<LLButton>(button_params));
-
- LLPanel::Params panel_params = params.lock_panel;
- applyXUILayout(panel_params, this);
- LLPanel* lock_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
- addChild(lock_panelp);
-
- panel_params = params.edit_panel;
- applyXUILayout(panel_params, this);
- LLPanel* edit_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
- addChild(edit_panelp);
-
- if (lock_panelp)
-{
- LLIconCtrl::Params icon_params = params.lock_icon;
- applyXUILayout(icon_params, this);
- lock_panelp->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params));
-}
-
- if (edit_panelp)
-{
- button_params = params.edit_btn;
- applyXUILayout(button_params, this);
- edit_panelp->addChild(LLUICtrlFactory::create<LLButton>(button_params));
- }
-
- setSeparatorVisible(false);
-}
-
-LLPanelClothingListItem::~LLPanelClothingListItem()
-{
-}
-
-BOOL LLPanelClothingListItem::postBuild()
-{
- LLPanelDeletableWearableListItem::postBuild();
-
- addWidgetToRightSide("btn_move_up");
- addWidgetToRightSide("btn_move_down");
- addWidgetToRightSide("btn_lock");
- addWidgetToRightSide("btn_edit_panel");
-
- setWidgetsVisible(false);
- reshapeWidgets();
-
- return TRUE;
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelBodyPartsListItem(&typeid(LLPanelBodyPartsListItem::Params), "bodyparts_list_item");
-
-
-LLPanelBodyPartsListItem::Params::Params()
-: edit_btn("edit_btn"),
- edit_panel("edit_panel"),
- lock_panel("lock_panel"),
- lock_icon("lock_icon")
-{}
-
-// static
-LLPanelBodyPartsListItem* LLPanelBodyPartsListItem::create(LLViewerInventoryItem* item)
-{
- LLPanelBodyPartsListItem* list_item = NULL;
- if(item)
- {
- const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelBodyPartsListItem>();
- list_item = new LLPanelBodyPartsListItem(item, params);
- list_item->initFromParams(params);
- list_item->postBuild();
- }
- return list_item;
-}
-
-LLPanelBodyPartsListItem::LLPanelBodyPartsListItem(LLViewerInventoryItem* item, const LLPanelBodyPartsListItem::Params& params)
-: LLPanelWearableListItem(item, params)
-{
- LLPanel::Params panel_params = params.edit_panel;
- applyXUILayout(panel_params, this);
- LLPanel* edit_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
- addChild(edit_panelp);
-
- panel_params = params.lock_panel;
- applyXUILayout(panel_params, this);
- LLPanel* lock_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
- addChild(lock_panelp);
-
- if (edit_panelp)
- {
- LLButton::Params btn_params = params.edit_btn;
- applyXUILayout(btn_params, this);
- edit_panelp->addChild(LLUICtrlFactory::create<LLButton>(btn_params));
-}
-
- if (lock_panelp)
-{
- LLIconCtrl::Params icon_params = params.lock_icon;
- applyXUILayout(icon_params, this);
- lock_panelp->addChild(LLUICtrlFactory::create<LLIconCtrl>(icon_params));
- }
-
- setSeparatorVisible(true);
-}
-
-LLPanelBodyPartsListItem::~LLPanelBodyPartsListItem()
-{
-}
-
-BOOL LLPanelBodyPartsListItem::postBuild()
-{
- LLPanelInventoryListItemBase::postBuild();
-
- addWidgetToRightSide("btn_lock");
- addWidgetToRightSide("btn_edit_panel");
-
- return TRUE;
-}
-
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDeletableWearableListItem(&typeid(LLPanelDeletableWearableListItem::Params), "deletable_wearable_list_item");
-
-LLPanelDeletableWearableListItem::Params::Params()
-: delete_btn("delete_btn")
-{}
-
-// static
-LLPanelDeletableWearableListItem* LLPanelDeletableWearableListItem::create(LLViewerInventoryItem* item)
-{
- LLPanelDeletableWearableListItem* list_item = NULL;
- if(item)
- {
- const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDeletableWearableListItem>();
- list_item = new LLPanelDeletableWearableListItem(item, params);
- list_item->initFromParams(params);
- list_item->postBuild();
- }
- return list_item;
-}
-
-LLPanelDeletableWearableListItem::LLPanelDeletableWearableListItem(LLViewerInventoryItem* item, const LLPanelDeletableWearableListItem::Params& params)
-: LLPanelWearableListItem(item, params)
-{
- LLButton::Params button_params = params.delete_btn;
- applyXUILayout(button_params, this);
- addChild(LLUICtrlFactory::create<LLButton>(button_params));
-
- setSeparatorVisible(true);
-}
-
-BOOL LLPanelDeletableWearableListItem::postBuild()
-{
- LLPanelWearableListItem::postBuild();
-
- addWidgetToLeftSide("btn_delete");
-
- LLButton* delete_btn = getChild<LLButton>("btn_delete");
- // Reserve space for 'delete' button event if it is invisible.
- setLeftWidgetsWidth(delete_btn->getRect().mRight);
-
- setWidgetsVisible(false);
- reshapeWidgets();
-
- return TRUE;
-}
-
-
-// static
-LLPanelAttachmentListItem* LLPanelAttachmentListItem::create(LLViewerInventoryItem* item)
-{
- LLPanelAttachmentListItem* list_item = NULL;
- if(item)
- {
- const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDeletableWearableListItem>();
-
- list_item = new LLPanelAttachmentListItem(item, params);
- list_item->initFromParams(params);
- list_item->postBuild();
- }
- return list_item;
-}
-
-void LLPanelAttachmentListItem::updateItem(const std::string& name,
- EItemState item_state)
-{
- std::string title_joint = name;
-
- LLViewerInventoryItem* inv_item = getItem();
- if (inv_item && isAgentAvatarValid() && gAgentAvatarp->isWearingAttachment(inv_item->getLinkedUUID()))
- {
- std::string joint = LLTrans::getString(gAgentAvatarp->getAttachedPointName(inv_item->getLinkedUUID()));
- title_joint = title_joint + " (" + joint + ")";
- }
-
- LLPanelInventoryListItemBase::updateItem(title_joint, item_state);
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-static LLWidgetNameRegistry::StaticRegistrar sRegisterPanelDummyClothingListItem(&typeid(LLPanelDummyClothingListItem::Params), "dummy_clothing_list_item");
-
-LLPanelDummyClothingListItem::Params::Params()
-: add_panel("add_panel"),
- add_btn("add_btn")
-{}
-
-LLPanelDummyClothingListItem* LLPanelDummyClothingListItem::create(LLWearableType::EType w_type)
-{
- const Params& params = LLUICtrlFactory::getDefaultParams<LLPanelDummyClothingListItem>();
-
- LLPanelDummyClothingListItem* list_item = new LLPanelDummyClothingListItem(w_type, params);
- list_item->initFromParams(params);
- list_item->postBuild();
- return list_item;
-}
-
-BOOL LLPanelDummyClothingListItem::postBuild()
-{
- addWidgetToRightSide("btn_add_panel");
-
- setIconImage(LLInventoryIcon::getIcon(LLAssetType::AT_CLOTHING, LLInventoryType::IT_NONE, mWearableType, FALSE));
- updateItem(wearableTypeToString(mWearableType));
-
- // Make it look loke clothing item - reserve space for 'delete' button
- setLeftWidgetsWidth(getChildView("item_icon")->getRect().mLeft);
-
- setWidgetsVisible(false);
- reshapeWidgets();
-
- return TRUE;
-}
-
-LLWearableType::EType LLPanelDummyClothingListItem::getWearableType() const
-{
- return mWearableType;
-}
-
-LLPanelDummyClothingListItem::LLPanelDummyClothingListItem(LLWearableType::EType w_type, const LLPanelDummyClothingListItem::Params& params)
-: LLPanelWearableListItem(NULL, params),
- mWearableType(w_type)
-{
- LLPanel::Params panel_params(params.add_panel);
- applyXUILayout(panel_params, this);
- LLPanel* add_panelp = LLUICtrlFactory::create<LLPanel>(panel_params);
- addChild(add_panelp);
-
- if (add_panelp)
-{
- LLButton::Params button_params(params.add_btn);
- applyXUILayout(button_params, this);
- add_panelp->addChild(LLUICtrlFactory::create<LLButton>(button_params));
-}
-
- setSeparatorVisible(true);
-}
-
-typedef std::map<LLWearableType::EType, std::string> clothing_to_string_map_t;
-
-clothing_to_string_map_t init_clothing_string_map()
-{
- clothing_to_string_map_t w_map;
- w_map.insert(std::make_pair(LLWearableType::WT_SHIRT, "shirt_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_PANTS, "pants_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_SHOES, "shoes_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_SOCKS, "socks_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_JACKET, "jacket_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_GLOVES, "gloves_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_UNDERSHIRT, "undershirt_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_UNDERPANTS, "underpants_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_SKIRT, "skirt_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_ALPHA, "alpha_not_worn"));
- w_map.insert(std::make_pair(LLWearableType::WT_TATTOO, "tattoo_not_worn"));
- return w_map;
-}
-
-std::string LLPanelDummyClothingListItem::wearableTypeToString(LLWearableType::EType w_type)
-{
- static const clothing_to_string_map_t w_map = init_clothing_string_map();
- static const std::string invalid_str = LLTrans::getString("invalid_not_worn");
-
- std::string type_str = invalid_str;
- clothing_to_string_map_t::const_iterator it = w_map.find(w_type);
- if(w_map.end() != it)
- {
- type_str = LLTrans::getString(it->second);
- }
- return type_str;
-}
-
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-LLWearableItemTypeNameComparator::LLWearableTypeOrder::LLWearableTypeOrder(LLWearableItemTypeNameComparator::ETypeListOrder order_priority, bool sort_asset_by_name, bool sort_wearable_by_name):
- mOrderPriority(order_priority),
- mSortAssetTypeByName(sort_asset_by_name),
- mSortWearableTypeByName(sort_wearable_by_name)
-{
-}
-
-LLWearableItemTypeNameComparator::LLWearableItemTypeNameComparator()
-{
- // By default the sort order conforms the order by spec of MY OUTFITS items list:
- // 1. CLOTHING - sorted by name
- // 2. OBJECT - sorted by type
- // 3. BODYPART - sorted by name
- mWearableOrder[LLAssetType::AT_CLOTHING] = LLWearableTypeOrder(ORDER_RANK_1, false, false);
- mWearableOrder[LLAssetType::AT_OBJECT] = LLWearableTypeOrder(ORDER_RANK_2, true, true);
- mWearableOrder[LLAssetType::AT_BODYPART] = LLWearableTypeOrder(ORDER_RANK_3, false, true);
-}
-
-void LLWearableItemTypeNameComparator::setOrder(LLAssetType::EType items_of_type, LLWearableItemTypeNameComparator::ETypeListOrder order_priority, bool sort_asset_items_by_name, bool sort_wearable_items_by_name)
-{
- mWearableOrder[items_of_type] = LLWearableTypeOrder(order_priority, sort_asset_items_by_name, sort_wearable_items_by_name);
-}
-
-/*virtual*/
-bool LLWearableItemNameComparator::doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const
-{
- std::string name1 = wearable_item1->getItemName();
- std::string name2 = wearable_item2->getItemName();
-
- LLStringUtil::toUpper(name1);
- LLStringUtil::toUpper(name2);
-
- return name1 < name2;
-}
-
-/*virtual*/
-bool LLWearableItemTypeNameComparator::doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const
-{
- const LLAssetType::EType item_type1 = wearable_item1->getType();
- const LLAssetType::EType item_type2 = wearable_item2->getType();
-
- LLWearableItemTypeNameComparator::ETypeListOrder item_type_order1 = getTypeListOrder(item_type1);
- LLWearableItemTypeNameComparator::ETypeListOrder item_type_order2 = getTypeListOrder(item_type2);
-
- if (item_type_order1 != item_type_order2)
- {
- // If items are of different asset types we can compare them
- // by types order in the list.
- return item_type_order1 < item_type_order2;
- }
-
- if (sortAssetTypeByName(item_type1))
- {
- // If both items are of the same asset type except AT_CLOTHING and AT_BODYPART
- // we can compare them by name.
- return LLWearableItemNameComparator::doCompare(wearable_item1, wearable_item2);
- }
-
- const LLWearableType::EType item_wearable_type1 = wearable_item1->getWearableType();
- const LLWearableType::EType item_wearable_type2 = wearable_item2->getWearableType();
-
- if (item_wearable_type1 != item_wearable_type2)
- {
- // If items are of different LLWearableType::EType types they are compared
- // by LLWearableType::EType. types order determined in LLWearableType::EType.
- return item_wearable_type1 < item_wearable_type2;
- }
- else
- {
- // If both items are of the same clothing type they are compared
- // by description and place in reverse order (i.e. outer layer item
- // on top) OR by name
- if(sortWearableTypeByName(item_type1))
- {
- return LLWearableItemNameComparator::doCompare(wearable_item1, wearable_item2);
- }
- return wearable_item1->getDescription() > wearable_item2->getDescription();
- }
-}
-
-LLWearableItemTypeNameComparator::ETypeListOrder LLWearableItemTypeNameComparator::getTypeListOrder(LLAssetType::EType item_type) const
-{
- wearable_type_order_map_t::const_iterator const_it = mWearableOrder.find(item_type);
-
- if(const_it == mWearableOrder.end())
- {
- llwarns<<"Absent information about order rang of items of "<<LLAssetType::getDesc(item_type)<<" type"<<llendl;
- return ORDER_RANK_UNKNOWN;
- }
-
- return const_it->second.mOrderPriority;
-}
-
-bool LLWearableItemTypeNameComparator::sortAssetTypeByName(LLAssetType::EType item_type) const
-{
- wearable_type_order_map_t::const_iterator const_it = mWearableOrder.find(item_type);
-
- if(const_it == mWearableOrder.end())
- {
- llwarns<<"Absent information about sorting items of "<<LLAssetType::getDesc(item_type)<<" type"<<llendl;
- return true;
- }
-
- return const_it->second.mSortAssetTypeByName;
-}
-
-bool LLWearableItemTypeNameComparator::sortWearableTypeByName(LLAssetType::EType item_type) const
-{
- wearable_type_order_map_t::const_iterator const_it = mWearableOrder.find(item_type);
-
- if(const_it == mWearableOrder.end())
- {
- llwarns<<"Absent information about sorting items of "<<LLAssetType::getDesc(item_type)<<" type"<<llendl;
- return true;
- }
-
- return const_it->second.mSortWearableTypeByName;
-}
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-//////////////////////////////////////////////////////////////////////////
-
-static const LLWearableItemTypeNameComparator WEARABLE_TYPE_NAME_COMPARATOR;
-
static const LLDefaultChildRegistry::Register<LLWearableItemsList> r("wearable_items_list");
LLWearableItemsList::Params::Params()
-: standalone("standalone", true)
-, worn_indication_enabled("worn_indication_enabled", true)
{}
LLWearableItemsList::LLWearableItemsList(const LLWearableItemsList::Params& p)
: LLInventoryItemsList(p)
-{
- setComparator(&WEARABLE_TYPE_NAME_COMPARATOR);
- mIsStandalone = p.standalone;
- if (mIsStandalone)
- {
- // Use built-in context menu.
- setRightMouseDownCallback(boost::bind(&LLWearableItemsList::onRightClick, this, _2, _3));
- }
- mWornIndicationEnabled = p.worn_indication_enabled;
-}
+{}
// virtual
LLWearableItemsList::~LLWearableItemsList()
{}
-// virtual
-void LLWearableItemsList::addNewItem(LLViewerInventoryItem* item, bool rearrange /*= true*/)
-{
- if (!item)
- {
- llwarns << "No inventory item. Couldn't create flat list item." << llendl;
- llassert(item != NULL);
- }
-
- LLPanelWearableOutfitItem *list_item = LLPanelWearableOutfitItem::create(item, mWornIndicationEnabled);
- if (!list_item)
- return;
-
- bool is_item_added = addItem(list_item, item->getUUID(), ADD_BOTTOM, rearrange);
- if (!is_item_added)
- {
- llwarns << "Couldn't add flat list item." << llendl;
- llassert(is_item_added);
- }
-}
-
void LLWearableItemsList::updateList(const LLUUID& category_id)
{
LLInventoryModel::cat_array_t cat_array;
@@ -645,291 +89,3 @@ void LLWearableItemsList::updateList(const LLUUID& category_id)
refreshList(item_array);
}
-
-void LLWearableItemsList::updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids)
-{
- // nothing to update
- if (changed_items_uuids.empty()) return;
-
- typedef std::vector<LLPanel*> item_panel_list_t;
-
- item_panel_list_t items;
- getItems(items);
-
- for (item_panel_list_t::iterator items_iter = items.begin();
- items_iter != items.end();
- ++items_iter)
- {
- LLPanelInventoryListItemBase* item = dynamic_cast<LLPanelInventoryListItemBase*>(*items_iter);
- if (!item) continue;
-
- LLViewerInventoryItem* inv_item = item->getItem();
- if (!inv_item) continue;
-
- LLUUID linked_uuid = inv_item->getLinkedUUID();
-
- for (LLInventoryModel::changed_items_t::const_iterator iter = changed_items_uuids.begin();
- iter != changed_items_uuids.end();
- ++iter)
- {
- if (linked_uuid == *iter)
- {
- item->setNeedsRefresh(true);
- break;
- }
- }
- }
-}
-
-void LLWearableItemsList::onRightClick(S32 x, S32 y)
-{
- uuid_vec_t selected_uuids;
-
- getSelectedUUIDs(selected_uuids);
- if (selected_uuids.empty())
- {
- return;
- }
-
- ContextMenu::instance().show(this, selected_uuids, x, y);
-}
-
-//////////////////////////////////////////////////////////////////////////
-/// ContextMenu
-//////////////////////////////////////////////////////////////////////////
-
-LLWearableItemsList::ContextMenu::ContextMenu()
-: mParent(NULL)
-{
-}
-
-void LLWearableItemsList::ContextMenu::show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y)
-{
- mParent = dynamic_cast<LLWearableItemsList*>(spawning_view);
- LLListContextMenu::show(spawning_view, uuids, x, y);
- mParent = NULL; // to avoid dereferencing an invalid pointer
-}
-
-// virtual
-LLContextMenu* LLWearableItemsList::ContextMenu::createMenu()
-{
- LLUICtrl::CommitCallbackRegistry::ScopedRegistrar registrar;
- const uuid_vec_t& ids = mUUIDs; // selected items IDs
- LLUUID selected_id = ids.front(); // ID of the first selected item
-
- functor_t take_off = boost::bind(&LLAppearanceMgr::removeItemFromAvatar, LLAppearanceMgr::getInstance(), _1);
-
- // Register handlers common for all wearable types.
- registrar.add("Wearable.Wear", boost::bind(wear_multiple, ids, true));
- registrar.add("Wearable.Add", boost::bind(wear_multiple, ids, false));
- registrar.add("Wearable.Edit", boost::bind(handleMultiple, LLAgentWearables::editWearable, ids));
- registrar.add("Wearable.CreateNew", boost::bind(createNewWearable, selected_id));
- registrar.add("Wearable.ShowOriginal", boost::bind(show_item_original, selected_id));
- registrar.add("Wearable.TakeOffDetach", boost::bind(handleMultiple, take_off, ids));
-
- // Register handlers for clothing.
- registrar.add("Clothing.TakeOff", boost::bind(handleMultiple, take_off, ids));
-
- // Register handlers for body parts.
-
- // Register handlers for attachments.
- registrar.add("Attachment.Detach", boost::bind(handleMultiple, take_off, ids));
- registrar.add("Attachment.Profile", boost::bind(show_item_profile, selected_id));
- registrar.add("Object.Attach", boost::bind(LLViewerAttachMenu::attachObjects, ids, _2));
-
- // Create the menu.
- LLContextMenu* menu = createFromFile("menu_wearable_list_item.xml");
-
- // Determine which items should be visible/enabled.
- updateItemsVisibility(menu);
-
- // Update labels for the items requiring that.
- updateItemsLabels(menu);
- return menu;
-}
-
-void LLWearableItemsList::ContextMenu::updateItemsVisibility(LLContextMenu* menu)
-{
- if (!menu)
- {
- llwarns << "Invalid menu" << llendl;
- return;
- }
-
- const uuid_vec_t& ids = mUUIDs; // selected items IDs
- U32 mask = 0; // mask of selected items' types
- U32 n_items = ids.size(); // number of selected items
- U32 n_worn = 0; // number of worn items among the selected ones
- U32 n_already_worn = 0; // number of items worn of same type as selected items
- U32 n_links = 0; // number of links among the selected items
- U32 n_editable = 0; // number of editable items among the selected ones
-
- for (uuid_vec_t::const_iterator it = ids.begin(); it != ids.end(); ++it)
- {
- LLUUID id = *it;
- LLViewerInventoryItem* item = gInventory.getItem(id);
-
- if (!item)
- {
- llwarns << "Invalid item" << llendl;
- // *NOTE: the logic below may not work in this case
- continue;
- }
-
- updateMask(mask, item->getType());
-
- const LLWearableType::EType wearable_type = item->getWearableType();
- const bool is_link = item->getIsLinkType();
- const bool is_worn = get_is_item_worn(id);
- const bool is_editable = gAgentWearables.isWearableModifiable(id);
- const bool is_already_worn = gAgentWearables.selfHasWearable(wearable_type);
- if (is_worn)
- {
- ++n_worn;
- }
- if (is_editable)
- {
- ++n_editable;
- }
- if (is_link)
- {
- ++n_links;
- }
- if (is_already_worn)
- {
- ++n_already_worn;
- }
- } // for
-
- bool standalone = mParent ? mParent->isStandalone() : false;
-
- // *TODO: eliminate multiple traversals over the menu items
- setMenuItemVisible(menu, "wear_wear", n_already_worn == 0 && n_worn == 0);
- setMenuItemEnabled(menu, "wear_wear", n_already_worn == 0 && n_worn == 0);
- setMenuItemVisible(menu, "wear_add", mask == MASK_CLOTHING && n_worn == 0 && n_already_worn != 0);
- setMenuItemEnabled(menu, "wear_add", n_items == 1 && canAddWearable(ids.front()) && n_already_worn != 0);
- setMenuItemVisible(menu, "wear_replace", n_worn == 0 && n_already_worn != 0);
- //visible only when one item selected and this item is worn
- setMenuItemVisible(menu, "edit", !standalone && mask & (MASK_CLOTHING|MASK_BODYPART) && n_worn == n_items && n_worn == 1);
- setMenuItemEnabled(menu, "edit", n_editable == 1 && n_worn == 1 && n_items == 1);
- setMenuItemVisible(menu, "create_new", mask & (MASK_CLOTHING|MASK_BODYPART) && n_items == 1);
- setMenuItemVisible(menu, "show_original", !standalone);
- setMenuItemEnabled(menu, "show_original", n_items == 1 && n_links == n_items);
- setMenuItemVisible(menu, "take_off", mask == MASK_CLOTHING && n_worn == n_items);
- setMenuItemVisible(menu, "detach", mask == MASK_ATTACHMENT && n_worn == n_items);
- setMenuItemVisible(menu, "take_off_or_detach", mask == (MASK_ATTACHMENT|MASK_CLOTHING));
- setMenuItemEnabled(menu, "take_off_or_detach", n_worn == n_items);
- setMenuItemVisible(menu, "object_profile", !standalone);
- setMenuItemEnabled(menu, "object_profile", n_items == 1);
- setMenuItemVisible(menu, "--no options--", FALSE);
- setMenuItemEnabled(menu, "--no options--", FALSE);
-
- // Populate or hide the "Attach to..." / "Attach to HUD..." submenus.
- if (mask == MASK_ATTACHMENT && n_worn == 0)
- {
- LLViewerAttachMenu::populateMenus("wearable_attach_to", "wearable_attach_to_hud");
- }
- else
- {
- setMenuItemVisible(menu, "wearable_attach_to", false);
- setMenuItemVisible(menu, "wearable_attach_to_hud", false);
- }
-
- if (mask & MASK_UNKNOWN)
- {
- llwarns << "Non-wearable items passed." << llendl;
- }
-
- U32 num_visible_items = 0;
- for (U32 menu_item_index = 0; menu_item_index < menu->getItemCount(); ++menu_item_index)
- {
- const LLMenuItemGL* menu_item = menu->getItem(menu_item_index);
- if (menu_item && menu_item->getVisible())
- {
- num_visible_items++;
- }
- }
- if (num_visible_items == 0)
- {
- setMenuItemVisible(menu, "--no options--", TRUE);
- }
-}
-
-void LLWearableItemsList::ContextMenu::updateItemsLabels(LLContextMenu* menu)
-{
- llassert(menu);
- if (!menu) return;
-
- // Set proper label for the "Create new <WEARABLE_TYPE>" menu item.
- LLViewerInventoryItem* item = gInventory.getLinkedItem(mUUIDs.back());
- if (!item || !item->isWearableType()) return;
-
- LLWearableType::EType w_type = item->getWearableType();
- std::string new_label = LLTrans::getString("create_new_" + LLWearableType::getTypeName(w_type));
-
- LLMenuItemGL* menu_item = menu->getChild<LLMenuItemGL>("create_new");
- menu_item->setLabel(new_label);
-}
-
-// We need this method to convert non-zero BOOL values to exactly 1 (TRUE).
-// Otherwise code relying on a BOOL value being TRUE may fail
-// (I experienced a weird assert in LLView::drawChildren() because of that.
-// static
-void LLWearableItemsList::ContextMenu::setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val)
-{
- menu->setItemVisible(name, val);
-}
-
-// static
-void LLWearableItemsList::ContextMenu::setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val)
-{
- menu->setItemEnabled(name, val);
-}
-
-// static
-void LLWearableItemsList::ContextMenu::updateMask(U32& mask, LLAssetType::EType at)
-{
- if (at == LLAssetType::AT_CLOTHING)
- {
- mask |= MASK_CLOTHING;
- }
- else if (at == LLAssetType::AT_BODYPART)
- {
- mask |= MASK_BODYPART;
- }
- else if (at == LLAssetType::AT_OBJECT)
- {
- mask |= MASK_ATTACHMENT;
- }
- else
- {
- mask |= MASK_UNKNOWN;
- }
-}
-
-// static
-void LLWearableItemsList::ContextMenu::createNewWearable(const LLUUID& item_id)
-{
- LLViewerInventoryItem* item = gInventory.getLinkedItem(item_id);
- if (!item || !item->isWearableType()) return;
-
- LLAgentWearables::createWearable(item->getWearableType(), true);
-}
-
-// Can we wear another wearable of the given item's wearable type?
-// static
-bool LLWearableItemsList::ContextMenu::canAddWearable(const LLUUID& item_id)
-{
- // TODO: investigate wearables may not be loaded at this point EXT-8231
-
- LLViewerInventoryItem* item = gInventory.getItem(item_id);
- if (!item || item->getType() != LLAssetType::AT_CLOTHING)
- {
- return false;
- }
-
- U32 wearable_count = gAgentWearables.getWearableCount(item->getWearableType());
- return wearable_count < LLAgentWearables::MAX_CLOTHING_PER_TYPE;
-}
-
-// EOF
diff --git a/indra/newview/llwearableitemslist.h b/indra/newview/llwearableitemslist.h
index 854c37c2c1..e7ccba8e6c 100644
--- a/indra/newview/llwearableitemslist.h
+++ b/indra/newview/llwearableitemslist.h
@@ -2,377 +2,40 @@
* @file llwearableitemslist.h
* @brief A flat list of wearable items.
*
- * $LicenseInfo:firstyear=2010&license=viewerlgpl$
+ * $LicenseInfo:firstyear=2010&license=viewergpl$
+ *
+ * Copyright (c) 2010, Linden Research, Inc.
+ *
* 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
+ * 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_LLWEARABLEITEMSLIST_H
#define LL_LLWEARABLEITEMSLIST_H
-// libs
#include "llpanel.h"
-#include "llsingleton.h"
// newview
#include "llinventoryitemslist.h"
-#include "llinventorylistitem.h"
-#include "llinventorymodel.h"
-#include "lllistcontextmenu.h"
-#include "llwearabletype.h"
-
-/**
- * @class LLPanelWearableListItem
- *
- * Extends LLPanelInventoryListItemBase:
- * - makes side widgets show on mouse_enter and hide on
- * mouse_leave events.
- * - provides callback for button clicks
- */
-class LLPanelWearableListItem : public LLPanelInventoryListItemBase
-{
- LOG_CLASS(LLPanelWearableListItem);
-public:
-
- /**
- * Shows buttons when mouse is over
- */
- /*virtual*/ void onMouseEnter(S32 x, S32 y, MASK mask);
-
- /**
- * Hides buttons when mouse is out
- */
- /*virtual*/ void onMouseLeave(S32 x, S32 y, MASK mask);
-
-protected:
-
- LLPanelWearableListItem(LLViewerInventoryItem* item, const Params& params);
-};
-
-/**
- * @class LLPanelWearableOutfitItem
- *
- * Outfit item for "My Outfits" list.
- * Extends LLPanelInventoryListItemBase with handling
- * double click to wear the item.
- */
-class LLPanelWearableOutfitItem : public LLPanelInventoryListItemBase
-{
- LOG_CLASS(LLPanelWearableOutfitItem);
-public:
- static LLPanelWearableOutfitItem* create(LLViewerInventoryItem* item,
- bool worn_indication_enabled);
-
- /**
- * Updates item name and (worn) suffix.
- */
- /*virtual*/ void updateItem(const std::string& name,
- EItemState item_state = IS_DEFAULT);
-
-protected:
- LLPanelWearableOutfitItem(LLViewerInventoryItem* item,
- bool worn_indication_enabled, const Params& params);
-
-private:
- bool mWornIndicationEnabled;
-};
-
-class LLPanelDeletableWearableListItem : public LLPanelWearableListItem
-{
- LOG_CLASS(LLPanelDeletableWearableListItem);
-public:
- struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params>
- {
- Optional<LLButton::Params> delete_btn;
-
- Params();
- };
-
-
- static LLPanelDeletableWearableListItem* create(LLViewerInventoryItem* item);
-
- virtual ~LLPanelDeletableWearableListItem() {};
-
- /*virtual*/ BOOL postBuild();
-
- /**
- * Make button visible during mouse over event.
- */
- inline void setShowDeleteButton(bool show) { setShowWidget("btn_delete", show); }
-
-protected:
- LLPanelDeletableWearableListItem(LLViewerInventoryItem* item, const Params& params);
-};
-
-/** Outfit list item for an attachment */
-class LLPanelAttachmentListItem : public LLPanelDeletableWearableListItem
-{
- LOG_CLASS(LLPanelAttachmentListItem);
-public:
- static LLPanelAttachmentListItem* create(LLViewerInventoryItem* item);
- virtual ~LLPanelAttachmentListItem() {};
-
- /** Set item title. Joint name is added to the title in parenthesis */
- /*virtual*/ void updateItem(const std::string& name,
- EItemState item_state = IS_DEFAULT);
-
-protected:
- LLPanelAttachmentListItem(LLViewerInventoryItem* item, const Params& params) : LLPanelDeletableWearableListItem(item, params) {};
-};
-
-/**
- * @class LLPanelClothingListItem
- *
- * Provides buttons for editing, moving, deleting a wearable.
- */
-class LLPanelClothingListItem : public LLPanelDeletableWearableListItem
-{
- LOG_CLASS(LLPanelClothingListItem);
-public:
-
- struct Params : public LLInitParam::Block<Params, LLPanelDeletableWearableListItem::Params>
- {
- Optional<LLButton::Params> up_btn,
- down_btn,
- edit_btn;
- Optional<LLPanel::Params> lock_panel,
- edit_panel;
- Optional<LLIconCtrl::Params> lock_icon;
-
- Params();
- };
-
- static LLPanelClothingListItem* create(LLViewerInventoryItem* item);
-
- virtual ~LLPanelClothingListItem();
-
- /*virtual*/ BOOL postBuild();
-
- /**
- * Make button visible during mouse over event.
- */
- inline void setShowMoveUpButton(bool show) { setShowWidget("btn_move_up", show); }
-
- inline void setShowMoveDownButton(bool show) { setShowWidget("btn_move_down", show); }
- inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); }
- inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }
-
-protected:
-
- LLPanelClothingListItem(LLViewerInventoryItem* item, const Params& params);
-
-};
-
-class LLPanelBodyPartsListItem : public LLPanelWearableListItem
-{
- LOG_CLASS(LLPanelBodyPartsListItem);
-public:
- struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params>
- {
- Optional<LLButton::Params> edit_btn;
- Optional<LLPanel::Params> lock_panel,
- edit_panel;
- Optional<LLIconCtrl::Params> lock_icon;
-
- Params();
- };
-
- static LLPanelBodyPartsListItem* create(LLViewerInventoryItem* item);
-
- virtual ~LLPanelBodyPartsListItem();
-
- /*virtual*/ BOOL postBuild();
-
- /**
- * Make button visible during mouse over event.
- */
- inline void setShowLockButton(bool show) { setShowWidget("btn_lock", show); }
- inline void setShowEditButton(bool show) { setShowWidget("btn_edit_panel", show); }
-
-protected:
- LLPanelBodyPartsListItem(LLViewerInventoryItem* item, const Params& params);
-};
-
-
-/**
- * @class LLPanelDummyClothingListItem
- *
- * A dummy item panel - displays grayed clothing icon, grayed title '<clothing> not worn' and 'add' button
- */
-class LLPanelDummyClothingListItem : public LLPanelWearableListItem
-{
-public:
- struct Params : public LLInitParam::Block<Params, LLPanelWearableListItem::Params>
- {
- Optional<LLPanel::Params> add_panel;
- Optional<LLButton::Params> add_btn;
- Params();
- };
- static LLPanelDummyClothingListItem* create(LLWearableType::EType w_type);
-
- /*virtual*/ BOOL postBuild();
- LLWearableType::EType getWearableType() const;
-
-protected:
- LLPanelDummyClothingListItem(LLWearableType::EType w_type, const Params& params);
-
- static std::string wearableTypeToString(LLWearableType::EType w_type);
-
-private:
- LLWearableType::EType mWearableType;
-};
-
-/**
- * @class LLWearableListItemComparator
- *
- * Abstract comparator of wearable list items.
- */
-class LLWearableListItemComparator : public LLFlatListView::ItemComparator
-{
- LOG_CLASS(LLWearableListItemComparator);
-
-public:
- LLWearableListItemComparator() {};
- virtual ~LLWearableListItemComparator() {};
-
- virtual bool compare(const LLPanel* item1, const LLPanel* item2) const
- {
- const LLPanelInventoryListItemBase* wearable_item1 = dynamic_cast<const LLPanelInventoryListItemBase*>(item1);
- const LLPanelInventoryListItemBase* wearable_item2 = dynamic_cast<const LLPanelInventoryListItemBase*>(item2);
-
- if (!wearable_item1 || !wearable_item2)
- {
- llwarning("item1 and item2 cannot be null", 0);
- return true;
- }
-
- return doCompare(wearable_item1, wearable_item2);
- }
-
-protected:
-
- /**
- * Returns true if wearable_item1 < wearable_item2, false otherwise
- * Implement this method in your particular comparator.
- */
- virtual bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const = 0;
-};
-
-/**
- * @class LLWearableItemNameComparator
- *
- * Comparator for sorting wearable list items by name.
- */
-class LLWearableItemNameComparator : public LLWearableListItemComparator
-{
- LOG_CLASS(LLWearableItemNameComparator);
-
-public:
- LLWearableItemNameComparator() {};
- virtual ~LLWearableItemNameComparator() {};
-
-protected:
- /*virtual*/ bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const;
-};
-
-/**
- * @class LLWearableItemTypeNameComparator
- *
- * Comparator for sorting wearable list items by type and name.
- */
-class LLWearableItemTypeNameComparator : public LLWearableItemNameComparator
-{
- LOG_CLASS(LLWearableItemTypeNameComparator);
-
-public:
-
- LLWearableItemTypeNameComparator();
- virtual ~LLWearableItemTypeNameComparator() {};
-
- enum ETypeListOrder
- {
- ORDER_RANK_1 = 1,
- ORDER_RANK_2,
- ORDER_RANK_3,
- ORDER_RANK_UNKNOWN
- };
-
- void setOrder(LLAssetType::EType items_of_type, ETypeListOrder order_priority, bool sort_items_by_name, bool sort_wearable_items_by_name);
-
-protected:
- /**
- * All information about sort order is stored in mWearableOrder map
- *
- * mWearableOrder : KYES VALUES
- * [LLAssetType] [struct LLWearableTypeOrder]
- *
- *---------------------------------------------------------------------------------------------
- * I. Determines order (ORDER_RANK) in which items of LLAssetType should be displayed in list.
- * For example by spec in MY OUTFITS the order is:
- * 1. AT_CLOTHING (ORDER_RANK_1)
- * 2. AT_OBJECT (ORDER_RANK_2)
- * 3. AT_BODYPART (ORDER_RANK_3)
- *
- * II.Items of each type(LLAssetType) are sorted by name or type(LLWearableType)
- * For example by spec in MY OUTFITS the order within each items type(LLAssetType) is:
- * 1. AT_OBJECTS (abc order)
- * 2. AT_CLOTHINGS
- * - by type (types order determined in LLWearableType::EType)
- * - outer layer on top
- * 3. AT_BODYPARTS (abc order)
- *---------------------------------------------------------------------------------------------
- *
- * For each LLAssetType (KEYS in mWearableOrder) the information about:
- *
- * I. ORDER_RANK (the flag is LLWearableTypeOrder::mOrderPriority)
- *
- * II. whether items of this LLAssetType type should be ordered
- * by name or by LLWearableType::EType (the flag is LLWearableTypeOrder::mSortAssetTypeByName)
- *
- * III.whether items of LLWearableType type within this LLAssetType
- * should be ordered by name (the flag is LLWearableTypeOrder::mSortWearableTypeByName)
- *
- * holds in mWearableOrder map as VALUES (struct LLWearableTypeOrder).
- */
- /*virtual*/ bool doCompare(const LLPanelInventoryListItemBase* wearable_item1, const LLPanelInventoryListItemBase* wearable_item2) const;
-
-private:
-
- struct LLWearableTypeOrder
- {
- ETypeListOrder mOrderPriority;
- bool mSortAssetTypeByName;
- bool mSortWearableTypeByName;
-
- LLWearableTypeOrder(ETypeListOrder order_priority, bool sort_asset_by_name, bool sort_wearable_by_name);
- LLWearableTypeOrder(){};
- };
-
- ETypeListOrder getTypeListOrder(LLAssetType::EType item_type) const;
-
- bool sortAssetTypeByName(LLAssetType::EType item_type) const;
- bool sortWearableTypeByName(LLAssetType::EType item_type) const;
-
- typedef std::map<LLAssetType::EType,LLWearableTypeOrder> wearable_type_order_map_t;
- wearable_type_order_map_t mWearableOrder;
-};
/**
* @class LLWearableItemsList
@@ -384,71 +47,19 @@ private:
*/
class LLWearableItemsList : public LLInventoryItemsList
{
- LOG_CLASS(LLWearableItemsList);
public:
- /**
- * Context menu.
- *
- * This menu is likely to be used from outside
- * (e.g. for items selected across multiple wearable lists),
- * so making it a singleton.
- */
- class ContextMenu : public LLListContextMenu, public LLSingleton<ContextMenu>
- {
- public:
- ContextMenu();
- /*virtual*/ void show(LLView* spawning_view, const uuid_vec_t& uuids, S32 x, S32 y);
-
- protected:
- enum {
- MASK_CLOTHING = 0x01,
- MASK_BODYPART = 0x02,
- MASK_ATTACHMENT = 0x04,
- MASK_UNKNOWN = 0x08,
- };
-
- /* virtual */ LLContextMenu* createMenu();
- void updateItemsVisibility(LLContextMenu* menu);
- void updateItemsLabels(LLContextMenu* menu);
- static void setMenuItemVisible(LLContextMenu* menu, const std::string& name, bool val);
- static void setMenuItemEnabled(LLContextMenu* menu, const std::string& name, bool val);
- static void updateMask(U32& mask, LLAssetType::EType at);
- static void createNewWearable(const LLUUID& item_id);
- static bool canAddWearable(const LLUUID& item_id);
-
- LLWearableItemsList* mParent;
- };
-
struct Params : public LLInitParam::Block<Params, LLInventoryItemsList::Params>
{
- Optional<bool> standalone;
- Optional<bool> worn_indication_enabled;
-
Params();
};
virtual ~LLWearableItemsList();
- /*virtual*/ void addNewItem(LLViewerInventoryItem* item, bool rearrange = true);
-
void updateList(const LLUUID& category_id);
- /**
- * Update items that match UUIDs from changed_items_uuids
- * or links that point at such items.
- */
- void updateChangedItems(const LLInventoryModel::changed_items_t& changed_items_uuids);
-
- bool isStandalone() const { return mIsStandalone; }
-
protected:
friend class LLUICtrlFactory;
LLWearableItemsList(const LLWearableItemsList::Params& p);
-
- void onRightClick(S32 x, S32 y);
-
- bool mIsStandalone;
- bool mWornIndicationEnabled;
};
#endif //LL_LLWEARABLEITEMSLIST_H
diff --git a/indra/newview/llwearablelist.cpp b/indra/newview/llwearablelist.cpp
index ddbcdfc3f7..20266706da 100644
--- a/indra/newview/llwearablelist.cpp
+++ b/indra/newview/llwearablelist.cpp
@@ -2,25 +2,31 @@
* @file llwearablelist.cpp
* @brief LLWearableList class implementation
*
- * $LicenseInfo:firstyear=2002&license=viewerlgpl$
- * Second Life Viewer Source Code
- * Copyright (C) 2010, Linden Research, Inc.
+ * $LicenseInfo:firstyear=2002&license=viewergpl$
+ *
+ * Copyright (c) 2002-2009, 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.
+ * 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
*
- * 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.
+ * 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
*
- * 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
+ * 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.
*
- * Linden Research, Inc., 945 Battery Street, San Francisco, CA 94111 USA
+ * 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$
*/
@@ -115,7 +121,7 @@ void LLWearableList::processGetAssetReply( const char* filename, const LLAssetID
bool res = wearable->importFile( fp );
if (!res)
{
- if (wearable->getType() == LLWearableType::WT_COUNT)
+ if (wearable->getType() == WT_COUNT)
{
isNewWearable = TRUE;
}
@@ -222,14 +228,14 @@ LLWearable* LLWearableList::createCopy(const LLWearable* old_wearable, const std
return wearable;
}
-LLWearable* LLWearableList::createNewWearable( LLWearableType::EType type )
+LLWearable* LLWearableList::createNewWearable( EWearableType type )
{
lldebugs << "LLWearableList::createNewWearable()" << llendl;
LLWearable *wearable = generateNewWearable();
wearable->setType( type );
- std::string name = LLTrans::getString( LLWearableType::getTypeDefaultNewName(wearable->getType()) );
+ std::string name = LLTrans::getString( LLWearableDictionary::getTypeDefaultNewName(wearable->getType()) );
wearable->setName( name );
LLPermissions perm;
diff --git a/indra/newview/llworldmapview.cpp b/indra/newview/llworldmapview.cpp
index 151180aae7..081a3721b1 100644
--- a/indra/newview/llworldmapview.cpp
+++ b/indra/newview/llworldmapview.cpp
@@ -1072,18 +1072,10 @@ BOOL LLWorldMapView::handleToolTip( S32 x, S32 y, MASK mask )
// zoomed out, so don't display anything about the count. JC
if (agent_count > 0)
{
- // Merov: i18n horror!!! Even using gettext(), concatenating strings is not localizable.
- // The singular/plural switch form here under might make no sense in some languages. Don't do that.
- message += llformat("\n%d ", agent_count);
-
- if (agent_count == 1)
- {
- message += "person";
- }
- else
- {
- message += "people";
- }
+ LLStringUtil::format_map_t string_args;
+ string_args["[NUMBER]"] = llformat("%d", agent_count);
+ message += '\n';
+ message += getString((agent_count == 1 ? "world_map_person" : "world_map_people") , string_args);
}
}
tooltip_msg.assign( message );
diff --git a/indra/newview/skins/default/textures/icons/Progress_1.png b/indra/newview/skins/default/textures/icons/Progress_1.png
new file mode 100644
index 0000000000..5d6efbfa2a
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_1.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_10.png b/indra/newview/skins/default/textures/icons/Progress_10.png
new file mode 100644
index 0000000000..28203324f1
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_10.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_11.png b/indra/newview/skins/default/textures/icons/Progress_11.png
new file mode 100644
index 0000000000..6b87be0c3f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_11.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_12.png b/indra/newview/skins/default/textures/icons/Progress_12.png
new file mode 100644
index 0000000000..089d58b090
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_12.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_2.png b/indra/newview/skins/default/textures/icons/Progress_2.png
new file mode 100644
index 0000000000..94cb73b1f7
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_2.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_3.png b/indra/newview/skins/default/textures/icons/Progress_3.png
new file mode 100644
index 0000000000..a04a5b5263
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_3.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_4.png b/indra/newview/skins/default/textures/icons/Progress_4.png
new file mode 100644
index 0000000000..a467098d82
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_4.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_5.png b/indra/newview/skins/default/textures/icons/Progress_5.png
new file mode 100644
index 0000000000..ea64f1d907
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_5.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_6.png b/indra/newview/skins/default/textures/icons/Progress_6.png
new file mode 100644
index 0000000000..fe4447935f
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_6.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_7.png b/indra/newview/skins/default/textures/icons/Progress_7.png
new file mode 100644
index 0000000000..64fa294771
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_7.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_8.png b/indra/newview/skins/default/textures/icons/Progress_8.png
new file mode 100644
index 0000000000..a1c9a7f2eb
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_8.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/icons/Progress_9.png b/indra/newview/skins/default/textures/icons/Progress_9.png
new file mode 100644
index 0000000000..f3e9723184
--- /dev/null
+++ b/indra/newview/skins/default/textures/icons/Progress_9.png
Binary files differ
diff --git a/indra/newview/skins/default/textures/textures.xml b/indra/newview/skins/default/textures/textures.xml
index 84a99ba92a..bbb82d86b1 100644
--- a/indra/newview/skins/default/textures/textures.xml
+++ b/indra/newview/skins/default/textures/textures.xml
@@ -580,4 +580,17 @@ with the same filename but different name
<texture name="default_profile_picture.j2c" />
<texture name="locked_image.j2c" />
+ <texture name="Progress_1" file_name="icons/Progress_1.png" preload="true" />
+ <texture name="Progress_2" file_name="icons/Progress_2.png" preload="true" />
+ <texture name="Progress_3" file_name="icons/Progress_3.png" preload="true" />
+ <texture name="Progress_4" file_name="icons/Progress_4.png" preload="true" />
+ <texture name="Progress_5" file_name="icons/Progress_5.png" preload="true" />
+ <texture name="Progress_6" file_name="icons/Progress_6.png" preload="true" />
+ <texture name="Progress_7" file_name="icons/Progress_7.png" preload="true" />
+ <texture name="Progress_8" file_name="icons/Progress_8.png" preload="true" />
+ <texture name="Progress_9" file_name="icons/Progress_9.png" preload="true" />
+ <texture name="Progress_10" file_name="icons/Progress_10.png" preload="true" />
+ <texture name="Progress_11" file_name="icons/Progress_11.png" preload="true" />
+ <texture name="Progress_12" file_name="icons/Progress_12.png" preload="true" />
+
</textures>
diff --git a/indra/newview/skins/default/xui/de/floater_about_land.xml b/indra/newview/skins/default/xui/de/floater_about_land.xml
index 5f00fc4f77..38e72dbadf 100644
--- a/indra/newview/skins/default/xui/de/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/de/floater_about_land.xml
@@ -62,9 +62,6 @@
<panel.string name="no_selection_text">
Keine Parzelle ausgewählt.
</panel.string>
- <panel.string name="time_stamp_template">
- [wkday,datetime,local] [mth,datetime,local] [day,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local] [year,datetime,local]
- </panel.string>
<text name="Name:">
Name:
</text>
@@ -356,7 +353,7 @@ Nur große Parzellen können in der Suche aufgeführt werden.
<combo_box.item label="Shopping" name="item11"/>
<combo_box.item label="Sonstige" name="item12"/>
</combo_box>
- <combo_box name="land category">
+ <combo_box left="266" name="land category" width="130">
<combo_box.item label="Alle Kategorien" name="item0"/>
<combo_box.item label="Lindenort" name="item1"/>
<combo_box.item label="Kunst und Kultur" name="item3"/>
diff --git a/indra/newview/skins/default/xui/en/floater_about_land.xml b/indra/newview/skins/default/xui/en/floater_about_land.xml
index 59f1889808..40c6b14a4a 100644
--- a/indra/newview/skins/default/xui/en/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/en/floater_about_land.xml
@@ -1061,7 +1061,8 @@ Leyla Linden </text>
left="10"
name="Autoreturn"
top_pad="0"
- width="310">
+ width="412"
+ wrap="true">
Auto return other Residents&apos; objects (minutes, 0 for off):
</text>
<line_editor
@@ -1073,9 +1074,9 @@ Leyla Linden </text>
layout="topleft"
max_length="6"
name="clean other time"
- right="-72"
- width="56"
- top_delta="-6"/>
+ left_pad="0"
+ width="46"
+ top_delta="-2"/>
<text
type="string"
length="1"
diff --git a/indra/newview/skins/default/xui/en/floater_customize.xml b/indra/newview/skins/default/xui/en/floater_customize.xml
index 32460e937d..01bced81d0 100644
--- a/indra/newview/skins/default/xui/en/floater_customize.xml
+++ b/indra/newview/skins/default/xui/en/floater_customize.xml
@@ -11,7 +11,7 @@
save_rect="true"
title="APPEARANCE"
top_delta="-185"
- width="524">
+ width="600">
<tab_container
height="517"
layout="topleft"
@@ -21,7 +21,7 @@
tab_position="left"
tab_height="50"
top="26"
- width="506">
+ width="580">
<text
type="string"
length="1"
@@ -65,15 +65,15 @@
mouse_opaque="true"
width="16" />
<button
- follows="right|bottom"
+ follows="left|top"
height="23"
- label="Revert"
- label_selected="Revert"
+ label="Create New Shape"
+ label_selected="Create New Shape"
layout="topleft"
- right="390"
- name="Revert"
- top="477"
- width="82" />
+ left="10"
+ name="Create New"
+ top="104"
+ width="160" />
<button
follows="left|top"
height="23"
@@ -280,46 +280,46 @@
type="string"
length="1"
top="488"
- follows="left|top|right"
+ follows="left|top"
font="SansSerif"
halign="right"
height="23"
layout="topleft"
+ left="10"
name="Item Action Label"
- right="90"
- width="100">
+ width="130">
Shape:
</text>
<button
- follows="left|top"
- height="23"
- label="Create New Shape"
- label_selected="Create New Shape"
- layout="topleft"
- left="10"
- name="Create New"
- top="104"
- width="160" />
- <button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
name="Save"
- right="186"
+ left_pad="2"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
name="Save As"
top="477"
- right="304"
+ left_pad="3"
width="115" />
+ <button
+ follows="left|bottom"
+ height="23"
+ label="Revert"
+ label_selected="Revert"
+ layout="topleft"
+ left_pad="3"
+ name="Revert"
+ top="477"
+ width="120" />
</panel>
<panel
border="false"
@@ -352,6 +352,16 @@
<button
follows="left|top"
height="23"
+ label="Create New Skin"
+ label_selected="Create New Skin"
+ layout="topleft"
+ left_delta="0"
+ name="Create New"
+ top_delta="-249"
+ width="160" />
+ <button
+ follows="left|top"
+ height="23"
label="Skin Color"
label_selected="Skin Color"
layout="topleft"
@@ -479,20 +489,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- top="488"
- follows="left|top|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="topleft"
- name="Item Action Label"
- right="90"
- width="100">
- Skin:
- </text>
<texture_picker
allow_no_texture="true"
can_apply_immediately="true"
@@ -532,46 +528,50 @@
tool_tip="Click to choose a picture"
top_delta="102"
width="82" />
- <button
+ <text
+ type="string"
+ length="1"
+ top="488"
follows="left|top"
+ font="SansSerif"
+ halign="right"
height="23"
- label="Create New Skin"
- label_selected="Create New Skin"
layout="topleft"
- left_delta="0"
- name="Create New"
- top_delta="-249"
- width="160" />
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Skin:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -729,20 +729,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- top="488"
- follows="left|top|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="topleft"
- name="Item Action Label"
- right="90"
- width="100">
- Hair:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -765,36 +751,50 @@
name="Create New"
top_delta="-89"
width="160" />
+ <text
+ type="string"
+ length="1"
+ top="488"
+ follows="left|top"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="topleft"
+ name="Item Action Label"
+ left="10"
+ width="130">
+ Hair:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -914,20 +914,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Eyes:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -949,36 +935,50 @@
name="Create New"
top="66"
width="160" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ name="Item Action Label"
+ left="10"
+ width="130">
+ Eyes:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<text
type="string"
@@ -1063,36 +1063,50 @@
name="Create New"
top="66"
width="160" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ name="Item Action Label"
+ left="10"
+ width="130">
+ Shirt:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
<text
type="string"
length="1"
@@ -1183,20 +1197,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Shirt:
- </text>
</panel>
<panel
border="false"
@@ -1266,36 +1266,50 @@
name="Create New"
top="66"
width="160" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ name="Item Action Label"
+ left="10"
+ width="130">
+ Pants:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
<text
type="string"
length="1"
@@ -1386,20 +1400,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Pants:
- </text>
</panel>
<panel
border="false"
@@ -1528,20 +1528,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Shoes:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -1573,36 +1559,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Shoes:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -1731,20 +1731,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Socks:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -1776,36 +1762,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Socks:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -1934,20 +1934,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Jacket:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -1990,36 +1976,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Jacket:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2148,20 +2148,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Gloves:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2193,36 +2179,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Gloves:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2351,20 +2351,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Undershirt:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2396,36 +2382,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Undershirt:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2554,20 +2554,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Underpants:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2599,36 +2585,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Underpants:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2757,20 +2757,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Skirt:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -2802,36 +2788,50 @@
name="Take Off"
top_pad="4"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Skirt:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -2960,20 +2960,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Tattoo:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -3018,36 +3004,50 @@
top_pad="4"
left="10"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Tattoo:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
<panel
border="false"
@@ -3176,20 +3176,6 @@
width="373">
You do not have permission to modify this wearable.
</text>
- <text
- type="string"
- length="1"
- bottom="4"
- follows="left|bottom|right"
- font="SansSerif"
- halign="right"
- height="23"
- layout="bottomleft"
- name="Item Action Label"
- right="90"
- width="100">
- Alpha:
- </text>
<texture_picker
can_apply_immediately="true"
default_image_name="Default"
@@ -3299,47 +3285,61 @@
left="10"
top_pad="20"
width="82" />
+ <text
+ type="string"
+ length="1"
+ bottom="4"
+ follows="left|bottom"
+ font="SansSerif"
+ halign="right"
+ height="23"
+ layout="bottomleft"
+ left="10"
+ name="Item Action Label"
+ width="130">
+ Alpha:
+ </text>
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save"
label_selected="Save"
layout="topleft"
- right="186"
+ left_pad="2"
name="Save"
top="477"
width="82" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Save As..."
label_selected="Save As..."
layout="topleft"
- right="304"
+ left_pad="3"
name="Save As"
top="477"
width="115" />
<button
- follows="right|bottom"
+ follows="left|bottom"
height="23"
label="Revert"
label_selected="Revert"
layout="topleft"
- right="390"
+ left_pad="3"
name="Revert"
top="477"
- width="82" />
+ width="120" />
</panel>
</tab_container>
<scroll_container
follows="left|top|right|bottom"
height="409"
layout="topleft"
- left="211"
+ left="247"
mouse_opaque="false"
name="panel_container"
top="92"
- width="292">
+ width="330">
<scrolling_panel_list
follows="left|bottom"
layout="topleft"
@@ -3355,7 +3355,7 @@
name="script_info"
tool_tip="Show scripts attached to your avatar"
left="13"
- width="90" />
+ width="90" ></button>
<button
bottom="574"
follows="right|bottom"
diff --git a/indra/newview/skins/default/xui/en/floater_im_container.xml b/indra/newview/skins/default/xui/en/floater_im_container.xml
index 65a05f3ec5..ced8c29199 100644
--- a/indra/newview/skins/default/xui/en/floater_im_container.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_container.xml
@@ -11,7 +11,7 @@
save_visibility="true"
single_instance="true"
title="CONVERSATIONS"
- width="392">
+ width="396">
<tab_container
follows="left|right|top|bottom"
height="390"
@@ -27,7 +27,7 @@
halign="left"
use_ellipses="true"
top="0"
- width="390" />
+ width="394" />
<icon
color="DefaultShadowLight"
enabled="false"
@@ -38,5 +38,5 @@
left="1"
name="im_box_tab_container_icon"
bottom="10"
- width="390" />
+ width="394" />
</multi_floater>
diff --git a/indra/newview/skins/default/xui/en/floater_im_session.xml b/indra/newview/skins/default/xui/en/floater_im_session.xml
index c9b013099b..f537c81860 100644
--- a/indra/newview/skins/default/xui/en/floater_im_session.xml
+++ b/indra/newview/skins/default/xui/en/floater_im_session.xml
@@ -33,6 +33,7 @@
name="panel_im_control_panel"
layout="topleft"
follows="left"
+ label="IM Control Panel"
min_width="115"
auto_resize="false"
user_resize="true" />
diff --git a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
index 5ea207675b..9db6568ee3 100644
--- a/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
+++ b/indra/newview/skins/default/xui/en/floater_outgoing_call.xml
@@ -119,7 +119,7 @@ No Answer. Please try again later.
layout="topleft"
left="77"
name="leaving"
- top="52"
+ top="62"
width="315"
word_wrap="true">
Leaving [CURRENT_CHAT].
diff --git a/indra/newview/skins/default/xui/en/floater_preferences.xml b/indra/newview/skins/default/xui/en/floater_preferences.xml
index 50d0011338..6e82bb09ee 100644
--- a/indra/newview/skins/default/xui/en/floater_preferences.xml
+++ b/indra/newview/skins/default/xui/en/floater_preferences.xml
@@ -1,7 +1,8 @@
<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<floater
legacy_header_height="18"
- open_centered="true"
+ center_horiz="true"
+ center_vert="true"
default_tab_group="1"
height="460"
layout="topleft"
diff --git a/indra/newview/skins/default/xui/en/menu_object.xml b/indra/newview/skins/default/xui/en/menu_object.xml
index 8b10c7b049..6ca8766e3f 100644
--- a/indra/newview/skins/default/xui/en/menu_object.xml
+++ b/indra/newview/skins/default/xui/en/menu_object.xml
@@ -18,16 +18,16 @@
name="Edit...">
<menu_item_call.on_click
function="Object.Edit" />
- <menu_item_call.on_visible
+ <menu_item_call.on_visible
function="EnableEdit"/>
</menu_item_call>
<menu_item_call
label="Build"
name="Build">
<menu_item_call.on_click
- function="Object.Edit" />
- <menu_item_call.on_visible
- function="VisibleBuild"/>
+ function="Object.Build" />
+ <menu_item_call.on_visible
+ function="EnableEdit"/>
</menu_item_call>
<menu_item_call
enabled="false"
diff --git a/indra/newview/skins/default/xui/en/mime_types.xml b/indra/newview/skins/default/xui/en/mime_types.xml
index 8e1e5ff062..a585069faa 100644
--- a/indra/newview/skins/default/xui/en/mime_types.xml
+++ b/indra/newview/skins/default/xui/en/mime_types.xml
@@ -120,7 +120,7 @@
none
</widgettype>
<impl>
- media_plugin_quicktime
+ media_plugin_webkit
</impl>
</mimetype>
<mimetype name="none/none">
@@ -130,6 +130,9 @@
<widgettype>
none
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/*">
<label name="audio2_label">
@@ -160,6 +163,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
@@ -179,6 +185,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
@@ -187,6 +196,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
@@ -195,6 +207,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
@@ -203,6 +218,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/rtf">
<label name="application/rtf_label">
@@ -211,6 +229,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
@@ -219,6 +240,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
@@ -227,6 +251,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
@@ -235,6 +262,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
diff --git a/indra/newview/skins/default/xui/en/mime_types_linux.xml b/indra/newview/skins/default/xui/en/mime_types_linux.xml
index 4748c14554..e95b371d00 100644
--- a/indra/newview/skins/default/xui/en/mime_types_linux.xml
+++ b/indra/newview/skins/default/xui/en/mime_types_linux.xml
@@ -120,7 +120,7 @@
none
</widgettype>
<impl>
- media_plugin_gstreamer
+ media_plugin_webkit
</impl>
</mimetype>
<mimetype name="none/none">
@@ -130,6 +130,9 @@
<widgettype>
none
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/*">
<label name="audio2_label">
@@ -160,6 +163,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
@@ -179,6 +185,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
@@ -187,6 +196,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_gstreamer
+ </impl>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
@@ -195,6 +207,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
@@ -203,6 +218,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/rtf">
<label name="application/rtf_label">
@@ -211,6 +229,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
@@ -219,6 +240,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
@@ -227,6 +251,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
@@ -235,6 +262,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
diff --git a/indra/newview/skins/default/xui/en/mime_types_mac.xml b/indra/newview/skins/default/xui/en/mime_types_mac.xml
index 8e1e5ff062..7931e55c0a 100644
--- a/indra/newview/skins/default/xui/en/mime_types_mac.xml
+++ b/indra/newview/skins/default/xui/en/mime_types_mac.xml
@@ -130,6 +130,9 @@
<widgettype>
none
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/*">
<label name="audio2_label">
@@ -160,6 +163,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype menu="1" name="video/vnd.secondlife.qt.legacy">
<label name="vnd.secondlife.qt.legacy_label">
@@ -179,6 +185,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/ogg">
<label name="application/ogg_label">
@@ -187,6 +196,9 @@
<widgettype>
audio
</widgettype>
+ <impl>
+ media_plugin_quicktime
+ </impl>
</mimetype>
<mimetype name="application/pdf">
<label name="application/pdf_label">
@@ -195,6 +207,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/postscript">
<label name="application/postscript_label">
@@ -203,6 +218,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/rtf">
<label name="application/rtf_label">
@@ -211,6 +229,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/smil">
<label name="application/smil_label">
@@ -219,6 +240,9 @@
<widgettype>
movie
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/xhtml+xml">
<label name="application/xhtml+xml_label">
@@ -227,6 +251,9 @@
<widgettype>
web
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="application/x-director">
<label name="application/x-director_label">
@@ -235,6 +262,9 @@
<widgettype>
image
</widgettype>
+ <impl>
+ media_plugin_webkit
+ </impl>
</mimetype>
<mimetype name="audio/mid">
<label name="audio/mid_label">
diff --git a/indra/newview/skins/default/xui/en/notifications.xml b/indra/newview/skins/default/xui/en/notifications.xml
index 07304eb14e..4479a3dd4d 100644
--- a/indra/newview/skins/default/xui/en/notifications.xml
+++ b/indra/newview/skins/default/xui/en/notifications.xml
@@ -5066,6 +5066,7 @@ No valid parcel could be found.
<notification
icon="notify.tga"
name="ObjectGiveItem"
+ persist="true"
type="offer">
An object named [OBJECTFROMNAME] owned by [NAME_SLURL] has given you this [OBJECTTYPE]:
[ITEM_SLURL]
@@ -5110,6 +5111,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
<notification
icon="notify.tga"
name="UserGiveItem"
+ persist="true"
type="offer">
[NAME_SLURL] has given you this [OBJECTTYPE]:
[ITEM_SLURL]
@@ -5162,10 +5164,11 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
<notification
icon="notify.tga"
name="TeleportOffered"
+ persist="true"
type="offer">
[NAME_SLURL] has offered to teleport you to their location:
-[MESSAGE], ([MATURITY])
+[MESSAGE] - [MATURITY_STR] &lt;icon&gt;[MATURITY_ICON]&lt;/icon&gt;
<form name="form">
<button
index="0"
@@ -5207,6 +5210,7 @@ An object named [OBJECTFROMNAME] owned by (an unknown Resident) has given you th
<notification
icon="notify.tga"
name="OfferFriendship"
+ persist="true"
type="offer">
[NAME_SLURL] is offering friendship.
diff --git a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
index 06bd1e9ff4..5fcc9b012b 100644
--- a/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
+++ b/indra/newview/skins/default/xui/en/outfit_accordion_tab.xml
@@ -3,12 +3,11 @@
<!-- All accordion tabs in the My Appearance/My Outfits panel will be created from this one at runtime-->
<!-- Non of string values of controls below are visible to user. They are not need to be translated. -->
<accordion_tab
- expanded="false"
+ display_children="false"
follows="all"
height="45"
layout="topleft"
name="Mockup Tab"
- selection_enabled="true"
title="Mockup Tab"
translate="false"
width="0">
@@ -16,9 +15,7 @@
allow_select="true"
follows="all"
keep_one_selected="true"
- multi_select="true"
name="wearable_items_list"
translate="false"
- standalone="false"
/>
</accordion_tab>
diff --git a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
index f438e3d42d..01c7ae61d2 100644
--- a/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
+++ b/indra/newview/skins/default/xui/en/panel_cof_wearables.xml
@@ -3,59 +3,49 @@
background_visible="true"
bg_alpha_color="DkGray"
border="false"
+ bottom="0"
follows="all"
height="200"
left="0"
name="cof_wearables"
- width="311">
+ width="313">
<accordion
- fit_parent="true"
follows="all"
- height="198"
+ height="373"
layout="topleft"
- left="0"
- single_expansion="true"
+ left="3"
top="0"
name="cof_wearables_accordion"
background_visible="true"
bg_alpha_color="DkGray2"
- width="311">
+ width="307">
<accordion_tab
layout="topleft"
- name="tab_clothing"
- title="Clothing">
+ name="tab_attachments"
+ title="Attachments">
<flat_list_view
allow_select="true"
follows="all"
- height="10"
- item_pad="3"
- keep_selection_visible_on_reshape="true"
+ height="150"
layout="topleft"
left="0"
- multi_select="true"
- name="list_clothing"
+ name="list_attachments"
top="0"
- width="311" />
+ width="307" />
</accordion_tab>
<accordion_tab
layout="topleft"
- name="tab_attachments"
- title="Attachments">
+ name="tab_clothing"
+ title="Clothing">
<flat_list_view
allow_select="true"
follows="all"
- height="10"
- item_pad="3"
+ height="150"
layout="topleft"
left="0"
- keep_selection_visible_on_reshape="true"
- multi_select="true"
- name="list_attachments"
+ name="list_clothing"
top="0"
- width="311">
- <flat_list_view.no_items_text
- value="No attachments worn" />
- </flat_list_view>
+ width="307" />
</accordion_tab>
<accordion_tab
layout="topleft"
@@ -64,15 +54,12 @@
<flat_list_view
allow_select="true"
follows="all"
- height="10"
- item_pad="3"
- keep_selection_visible_on_reshape="true"
+ height="150"
layout="topleft"
left="0"
- multi_select="true"
name="list_body_parts"
top="0"
- width="311" />
+ width="307" />
</accordion_tab>
</accordion>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_group_land_money.xml b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
index 9e99a8ceaf..76f7484c68 100644
--- a/indra/newview/skins/default/xui/en/panel_group_land_money.xml
+++ b/indra/newview/skins/default/xui/en/panel_group_land_money.xml
@@ -17,6 +17,10 @@
You don&apos;t have permission to view group owned land
</panel.string>
<panel.string
+ name="epmty_view_group_land_text">
+ No entries
+ </panel.string>
+ <panel.string
name="cant_view_group_accounting_text">
You don&apos;t have permission to view the group&apos;s accounting information.
</panel.string>
diff --git a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
index 29c6a17c31..33a5e01e4c 100644
--- a/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
+++ b/indra/newview/skins/default/xui/en/panel_im_control_panel.xml
@@ -3,14 +3,14 @@
border="false"
height="300"
name="panel_im_control_panel"
- width="110">
+ width="119">
<avatar_icon
follows="left|top"
height="105"
left_delta="5"
name="avatar_icon"
top="-5"
- width="105"/>
+ width="114"/>
<layout_stack
mouse_opaque="false"
border_size="0"
@@ -22,7 +22,7 @@
name="button_stack"
orientation="vertical"
top_pad="5"
- width="105">
+ width="114">
<layout_panel
mouse_opaque="false"
auto_resize="true"
@@ -31,7 +31,7 @@
layout="topleft"
left="2"
min_height="0"
- width="100"
+ width="109"
top="0"
name="spacer"
user_resize="false" />
@@ -41,7 +41,7 @@
height="20"
layout="topleft"
min_height="20"
- width="100"
+ width="109"
name="view_profile_btn_panel"
user_resize="false">
<button
@@ -50,7 +50,7 @@
label="Profile"
name="view_profile_btn"
top="0"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -58,7 +58,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="add_friend_btn_panel"
user_resize="false">
<button
@@ -67,7 +67,7 @@
label="Add Friend"
name="add_friend_btn"
top="5"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -75,7 +75,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="teleport_btn_panel"
user_resize="false">
<button
@@ -85,7 +85,7 @@
label="Teleport"
name="teleport_btn"
tool_tip = "Offer to teleport this person"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -93,7 +93,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="share_btn_panel"
user_resize="false">
<button
@@ -102,7 +102,7 @@
height="23"
label="Share"
name="share_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -110,7 +110,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="pay_btn_panel"
user_resize="false">
<button
@@ -119,7 +119,7 @@
height="23"
label="Pay"
name="pay_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -127,7 +127,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="call_btn_panel"
user_resize="false">
<button
@@ -135,7 +135,7 @@
height="23"
label="Call"
name="call_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -143,7 +143,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="end_call_btn_panel"
user_resize="false"
visible="false">
@@ -152,7 +152,7 @@
height="23"
label="End Call"
name="end_call_btn"
- width="100" />
+ width="109" />
</layout_panel>
<layout_panel
auto_resize="false"
@@ -160,7 +160,7 @@
height="25"
layout="topleft"
min_height="25"
- width="100"
+ width="109"
name="voice_ctrls_btn_panel"
user_resize="false"
visible="false">
@@ -169,7 +169,7 @@
height="23"
label="Voice Controls"
name="voice_ctrls_btn"
- width="100" />
+ width="109" />
</layout_panel>
</layout_stack>
</panel>
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 5e41d65720..841a4f5713 100644
--- a/indra/newview/skins/default/xui/en/panel_my_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_my_profile.xml
@@ -401,14 +401,6 @@
name="edit_profile_btn"
tool_tip="Edit your personal information"
width="152" />
- <button
- follows="bottom|right"
- height="23"
- label="Edit Appearance"
- left_pad="3"
- name="edit_appearance_btn"
- tool_tip="Create/edit your appearance: physical data, clothes and etc."
- width="153" />
</layout_panel>
</layout_stack>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
index 184ea54fcb..5dbd8bfe6a 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_chat_bar.xml
@@ -17,7 +17,7 @@
layout="topleft"
left_delta="3"
left="0"
- max_length="512"
+ max_length="1024"
name="chat_box"
text_pad_left="5"
text_pad_right="25"
diff --git a/indra/newview/skins/default/xui/en/panel_nearby_media.xml b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
index ff2aae645b..f5a78fc929 100644
--- a/indra/newview/skins/default/xui/en/panel_nearby_media.xml
+++ b/indra/newview/skins/default/xui/en/panel_nearby_media.xml
@@ -7,7 +7,7 @@
background_opaque="true"
background_visible="true"
layout="topleft"
- width="270"
+ width="328"
height="230"
name="nearby_media"
help_topic="nearby_media">
@@ -29,7 +29,7 @@
follows="left"
tool_tip="Turn all nearby media off"
left="8"
- width="66"
+ width="95"
height="22"
label="Stop All">
<button.commit_callback
@@ -40,7 +40,7 @@
follows="left"
tool_tip="Turn all nearby media on"
left_pad="4"
- width="66"
+ width="95"
height="22"
label="Start All">
<button.commit_callback
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 c77e4e8d5e..73181392c9 100644
--- a/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfit_edit.xml
@@ -149,29 +149,18 @@
auto_resize="true"
user_resize="true">
- <scroll_list
- width="300"
- column_padding="0"
- draw_heading="false"
- draw_stripes="false"
+ <!-- List containing items from the COF and Base outfit -->
+ <panel
+ background_visible="false"
+ class="cof_wearables"
+ filename="panel_cof_wearables.xml"
follows="left|top|right|bottom"
+ height="193"
layout="topleft"
- name="look_items_list"
- search_column="1"
- sort_column="2"
left="0"
- height="193"
- top="0">
- <scroll_list.columns
- label="Look Item"
- name="look_item"
- width="285" />
- <scroll_list.columns
- label="Outfit Item Sort"
- width="0"
- sort_column="look_item_sort"
- name="look_item_sort" />
- </scroll_list>
+ name="cof_wearables_list"
+ top="0"
+ width="300" />
<panel
background_visible="true"
@@ -222,6 +211,30 @@
top="1"
width="31" />
<button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Movement_Forward_On"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="move_closer_btn"
+ top="1"
+ width="31" />
+ <button
+ follows="bottom|left"
+ height="25"
+ image_hover_unselected="Toolbar_Middle_Over"
+ image_overlay="Movement_Backward_On"
+ image_selected="Toolbar_Middle_Selected"
+ image_unselected="Toolbar_Middle_Off"
+ layout="topleft"
+ left_pad="1"
+ name="move_further_btn"
+ top="1"
+ width="31" />
+ <button
follows="bottom|right"
height="25"
image_hover_unselected="Toolbar_Middle_Over"
@@ -342,6 +355,30 @@
width="300"/>
<panel
+ name="filtered_wearables_panel"
+ background_opaque="true"
+ background_visible="true"
+ layout="topleft"
+ follows="left|top|right|bottom"
+ border="false"
+ height="155"
+ left="0"
+ mouse_opaque="false"
+ width="300"
+ top_delta="0"
+ visible="false">
+ <wearable_items_list
+ name="filtered_wearables_list"
+ allow_select="true"
+ layout="topleft"
+ follows="all"
+ width="300"
+ height="155"
+ left="0"
+ top="0" />
+ </panel>
+
+ <panel
background_visible="true"
bevel_style="none"
follows="left|right|bottom"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
index 66ed43efec..b8ad278da7 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_inventory.xml
@@ -23,20 +23,16 @@
tab_position="top"
halign="center"
width="312">
- <inventory_panel
+ <panel
+ class="outfits_list"
+ filename="panel_outfits_list.xml"
+ height="490"
+ name="outfitslist_tab"
background_visible="true"
- background_opaque="true"
- label="MY OUTFITS"
- help_topic="my_outfits_tab"
- allow_multi_select="true"
follows="all"
- border="false"
- left="0"
- top="0"
- width="315"
- mouse_opaque="true"
- name="outfitslist_tab"
- start_folder="My Outfits" />
+ label="MY OUTFITS"
+ layout="topleft"
+ width="315" />
<inventory_panel
follows="all"
background_visible="true"
diff --git a/indra/newview/skins/default/xui/en/panel_outfits_list.xml b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
index d18f0d57ca..5cf94c25d7 100644
--- a/indra/newview/skins/default/xui/en/panel_outfits_list.xml
+++ b/indra/newview/skins/default/xui/en/panel_outfits_list.xml
@@ -4,69 +4,22 @@
bg_alpha_color="DkGray"
border="false"
follows="all"
- height="430"
+ height="400"
name="Outfits"
layout="topleft"
left="0"
top="0"
- width="312">
+ width="313">
<accordion
background_visible="true"
bg_alpha_color="DkGray2"
bg_opaque_color="DkGray2"
- no_matched_tabs_text.value="Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search]."
- no_matched_tabs_text.v_pad="10"
- no_visible_tabs_text.value="You don't have any outfits yet. Try [secondlife:///app/search/all/ Search]"
follows="all"
height="400"
layout="topleft"
left="3"
name="outfits_accordion"
top="0"
- width="309">
+ width="307">
</accordion>
- <panel
- background_visible="true"
- follows="bottom|left|right"
- height="28"
- layout="topleft"
- left="4"
- top_pad="0"
- visible="true"
- name="bottom_panel"
- width="312">
- <button
- follows="bottom|left"
- tool_tip="Show additional options"
- height="25"
- image_hover_unselected="Toolbar_Left_Over"
- image_overlay="OptionsMenu_Off"
- image_selected="Toolbar_Left_Selected"
- image_unselected="Toolbar_Left_Off"
- layout="topleft"
- left="0"
- name="options_gear_btn"
- top="1"
- width="31" />
- <icon
- follows="bottom|left|right"
- height="25"
- image_name="Toolbar_Middle_Off"
- layout="topleft"
- left_pad="1"
- name="dummy_icon"
- width="243"/>
- <button
- follows="bottom|right"
- height="25"
- image_hover_unselected="Toolbar_Right_Over"
- image_overlay="TrashItem_Off"
- image_selected="Toolbar_Right_Selected"
- image_unselected="Toolbar_Right_Off"
- layout="topleft"
- left_pad="1"
- name="trash_btn"
- tool_tip="Delete selected outfit"
- width="31"/>
- </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_people.xml b/indra/newview/skins/default/xui/en/panel_people.xml
index 61784fede4..066ea3be6e 100644
--- a/indra/newview/skins/default/xui/en/panel_people.xml
+++ b/indra/newview/skins/default/xui/en/panel_people.xml
@@ -16,13 +16,13 @@
value="No recent people. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." />
<string
name="no_filtered_recent_people"
- value="Didn't find what you're looking for? Try [secondlife:///app/search/people Search]." />
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." />
<string
name="no_one_near"
value="No one nearby. Looking for people to hang out with? Try [secondlife:///app/search/people Search] or the [secondlife:///app/worldmap World Map]." />
<string
name="no_one_filtered_near"
- value="Didn't find what you're looking for? Try [secondlife:///app/search/people Search]." />
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search]." />
<string
name="no_friends_online"
value="No friends online" />
@@ -30,6 +30,15 @@
name="no_friends"
value="No friends" />
<string
+ name="no_friends_msg">
+ Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend.
+Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map].
+ </string>
+ <string
+ name="no_filtered_friends_msg">
+ Didn't find what you're looking for? Try [secondlife:///app/search/people/[SEARCH_TERM] Search].
+ </string>
+ <string
name="people_filter_label"
value="Filter People" />
<string
@@ -41,7 +50,7 @@
-->
<string
name="no_filtered_groups_msg"
- value="Didn't find what you're looking for? Try [secondlife:///app/search/groups Search]." />
+ value="Didn't find what you're looking for? Try [secondlife:///app/search/groups/[SEARCH_TERM] Search]." />
<string
name="no_groups_msg"
value="Looking for Groups to join? Try [secondlife:///app/search/groups Search]." />
@@ -265,14 +274,11 @@
<text
follows="all"
height="450"
- left="10"
- name="no_friends_msg"
+ left="13"
+ name="no_friends_help_text"
top="10"
width="293"
- wrap="true">
- Find friends using [secondlife:///app/search/people Search] or right-click on a Resident to add them as a friend.
-Looking for people to hang out with? Try the [secondlife:///app/worldmap World Map].
- </text>
+ wrap="true" />
</panel>
<panel
background_opaque="true"
@@ -293,6 +299,7 @@ Looking for people to hang out with? Try the [secondlife:///app/worldmap World M
Values are set from appropriate strings at the top of file via LLPeoplePanel::postBuild()
-->
<group_list
+ allow_select="true"
background_visible="true"
bg_alpha_color="DkGray2"
bg_opaque_color="DkGray2"
diff --git a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
index 500e65b916..2c6ceeef2e 100644
--- a/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
+++ b/indra/newview/skins/default/xui/en/panel_preferences_setup.xml
@@ -374,5 +374,5 @@
min_val="10"
name="web_proxy_port"
top_delta="0"
- width="140" />
+ width="145" />
</panel>
diff --git a/indra/newview/skins/default/xui/en/panel_profile.xml b/indra/newview/skins/default/xui/en/panel_profile.xml
index a666608103..d7a601d7a3 100644
--- a/indra/newview/skins/default/xui/en/panel_profile.xml
+++ b/indra/newview/skins/default/xui/en/panel_profile.xml
@@ -389,14 +389,6 @@
name="edit_profile_btn"
tool_tip="Edit your personal information"
width="130" />
- <button
- follows="bottom|right"
- height="23"
- label="Edit Appearance"
- left_pad="10"
- name="edit_appearance_btn"
- tool_tip="Create/edit your appearance: physical data, clothes and etc."
- width="130" />
</layout_panel>
</layout_stack>
diff --git a/indra/newview/skins/default/xui/en/strings.xml b/indra/newview/skins/default/xui/en/strings.xml
index 80fddcba43..b0e43e72ed 100644
--- a/indra/newview/skins/default/xui/en/strings.xml
+++ b/indra/newview/skins/default/xui/en/strings.xml
@@ -1842,7 +1842,8 @@ Clears (deletes) the media and all params from the given face.
<string name="LeaveMouselook">Press ESC to return to World View</string>
<!-- inventory -->
- <string name="InventoryNoMatchingItems">No matching items found in inventory. Try [secondlife:///app/search/groups "Search"].</string>
+ <string name="InventoryNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/all/[SEARCH_TERM] Search].</string>
+ <string name="PlacesNoMatchingItems">Didn't find what you're looking for? Try [secondlife:///app/search/places/[SEARCH_TERM] Search].</string>
<string name="FavoritesNoMatchingItems">Drag a landmark here to add it to your favorites.</string>
<string name="InventoryNoTexture">You do not have a copy of this texture in your inventory</string>
<!-- use value="" because they have preceding spaces -->
@@ -2897,6 +2898,9 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
<string name="LocationCtrlBuildTooltip">Building/dropping objects not allowed</string>
<string name="LocationCtrlScriptsTooltip">Scripts not allowed</string>
<string name="LocationCtrlDamageTooltip">Health</string>
+ <string name="LocationCtrlAdultIconTooltip">Adult Region</string>
+ <string name="LocationCtrlModerateIconTooltip">Moderate Region</string>
+ <string name="LocationCtrlGeneralIconTooltip">General Region</string>
<!-- Strings used by the (currently Linux) auto-updater app -->
<string name="UpdaterWindowTitle">
@@ -2930,6 +2934,10 @@ If you continue to receive this message, contact the [SUPPORT_SITE].
Failed to start viewer
</string>
+ <!-- System Messages -->
+ <string name="ItemsComingInTooFastFrom">[APP_NAME]: Items coming in too fast from [FROM_NAME], automatic preview disabled for [TIME] seconds</string>
+ <string name="ItemsComingInTooFast">[APP_NAME]: Items coming in too fast, automatic preview disabled for [TIME] seconds</string>
+
<!-- IM system messages -->
<string name="IM_logging_string">-- Instant message logging enabled --</string>
<string name="IM_typing_start_string">[NAME] is typing...</string>
@@ -3110,4 +3118,7 @@ Abuse Report</string>
<string name="DefaultMimeType">none/none</string>
<string name="texture_load_dimensions_error">Can't load images larger than [WIDTH]*[HEIGHT]</string>
+ <!-- language specific white-space characters, delimiters, spacers, item separation symbols -->
+ <string name="sentences_separator" value=" "></string>
+
</strings>
diff --git a/indra/newview/skins/default/xui/en/widgets/location_input.xml b/indra/newview/skins/default/xui/en/widgets/location_input.xml
index 37d60f1671..02ea661da3 100644
--- a/indra/newview/skins/default/xui/en/widgets/location_input.xml
+++ b/indra/newview/skins/default/xui/en/widgets/location_input.xml
@@ -7,7 +7,7 @@
icon_maturity_general="Parcel_PG_Light"
icon_maturity_adult="Parcel_R_Light"
icon_maturity_moderate="Parcel_M_Light"
- maturity_help_topic="maturity_rating"
+ maturity_help_topic="TODO"
add_landmark_image_enabled="Favorite_Star_Active"
add_landmark_image_disabled="Favorite_Star_Off"
add_landmark_image_hover="Favorite_Star_Over"
diff --git a/indra/newview/skins/default/xui/es/floater_about_land.xml b/indra/newview/skins/default/xui/es/floater_about_land.xml
index 6118a63872..f3a278945c 100644
--- a/indra/newview/skins/default/xui/es/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/es/floater_about_land.xml
@@ -263,7 +263,7 @@ Vaya al menú Mundo &gt; Acerca del terreno o seleccione otra parcela para ver s
<text left="204" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
+ <text name="Autoreturn">
Devolución automát. de objetos de otros (en min., 0 la desactiva):
</text>
<line_editor name="clean other time" right="-20"/>
diff --git a/indra/newview/skins/default/xui/es/floater_customize.xml b/indra/newview/skins/default/xui/es/floater_customize.xml
index b7058d4314..77b670d5f0 100644
--- a/indra/newview/skins/default/xui/es/floater_customize.xml
+++ b/indra/newview/skins/default/xui/es/floater_customize.xml
@@ -81,7 +81,7 @@
<texture_picker label="Tatuaje: inferior" name="Lower Tattoos" tool_tip="Pulse para elegir una imagen" width="90"/>
<button label="Crear una piel nueva" label_selected="Crear una piel nueva" name="Create New"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Pelo" name="Hair">
@@ -116,7 +116,7 @@
<texture_picker label="Textura" name="Texture" tool_tip="Pulse para elegir una imagen"/>
<button label="Crear un pelo nuevo" label_selected="Crear un pelo nuevo" name="Create New"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Ojos" name="Eyes">
@@ -147,7 +147,7 @@
<texture_picker label="Iris" name="Iris" tool_tip="Pulse para elegir una imagen"/>
<button label="Crear unos ojos nuevos" label_selected="Crear unos ojos nuevos" name="Create New"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<text label="Ropa" name="clothes_placeholder">
@@ -159,7 +159,7 @@
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
<button label="Crear una falda nueva" label_selected="Crear una falda nueva" name="Create New"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<text name="title">
[DESC]
@@ -192,7 +192,7 @@
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
<button label="Crear unos pantalones nuevos" label_selected="Crear unos pantalones nuevos" name="Create New" width="185"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
<text name="title">
[DESC]
@@ -249,7 +249,7 @@
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Calcetines" name="Socks">
@@ -282,7 +282,7 @@
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Chaqueta" name="Jacket">
@@ -316,7 +316,7 @@
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Guantes" name="Gloves">
@@ -349,7 +349,7 @@
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarlos" label_selected="Quitarlos" name="Take Off"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Camiseta" name="Undershirt">
@@ -382,7 +382,7 @@
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Ropa interior" name="Underpants">
@@ -415,7 +415,7 @@
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Falda" name="Skirt">
@@ -448,7 +448,7 @@
<color_swatch label="Color/Tinte" name="Color/Tint" tool_tip="Pulsa para abrir el selector de color"/>
<button label="Quitarla" label_selected="Quitarla" name="Take Off"/>
<button label="Guardar" label_selected="Guardar" left="113" name="Save"/>
- <button label="Guardar como..." label_selected="Guardar como..." left="199" name="Save As" width="102"/>
+ <button label="Guardar como..." label_selected="Guardar como..." name="Save As"/>
<button label="Restablecer" label_selected="Restablecer" name="Revert"/>
</panel>
<panel label="Tatuaje" name="Tattoo">
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..2e52a90373 100644
--- a/indra/newview/skins/default/xui/fr/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/fr/floater_about_land.xml
@@ -62,9 +62,6 @@
<panel.string name="no_selection_text">
Aucune parcelle sélectionnée.
</panel.string>
- <panel.string name="time_stamp_template">
- [wkday,datetime,local] [day,datetime,local] [mth,datetime,local] [year,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
- </panel.string>
<text name="Name:">
Nom :
</text>
@@ -220,10 +217,10 @@ ou divisé.
[COUNT] sur [MAX] ([DELETED] seront supprimés)
</panel.string>
<text name="parcel_object_bonus">
- Facteur Bonus objets : [BONUS]
+ Facteur Bonus Objets : [BONUS]
</text>
<text name="Simulator primitive usage:">
- Utilisation des primitives :
+ Utilisation des prims :
</text>
<text left="214" name="objects_available" width="230">
[COUNT] sur [MAX] ([AVAILABLE] disponibles)
diff --git a/indra/newview/skins/default/xui/fr/floater_color_picker.xml b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
index 2bcf567655..c54e3e9ce0 100644
--- a/indra/newview/skins/default/xui/fr/floater_color_picker.xml
+++ b/indra/newview/skins/default/xui/fr/floater_color_picker.xml
@@ -25,7 +25,7 @@
<text left="8" name="Current color:">
Couleur actuelle :
</text>
- <text left="8" name="(Drag below to save.)" width="220">
+ <text name="(Drag below to save.)">
Enr. : faire glisser dessous
</text>
</floater>
diff --git a/indra/newview/skins/default/xui/fr/floater_customize.xml b/indra/newview/skins/default/xui/fr/floater_customize.xml
index 6da010776e..ff407b25c1 100644
--- a/indra/newview/skins/default/xui/fr/floater_customize.xml
+++ b/indra/newview/skins/default/xui/fr/floater_customize.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APPARENCE" width="548">
- <tab_container name="customize tab container" tab_min_width="150" width="546">
+<floater name="floater customize" title="APPARENCE">
+ <tab_container name="customize tab container" tab_min_width="150">
<text label="Parties du corps" name="body_parts_placeholder">
Parties du corps
</text>
<panel label="Silhouette" left="154" name="Shape" width="389">
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
<button label="Corps" label_selected="Corps" name="Body"/>
<button label="Tête" label_selected="Tête" name="Head"/>
<button label="Yeux" label_selected="Yeux" name="Eyes"/>
@@ -44,8 +44,8 @@
Silhouette :
</text>
<button label="Créer une silhouette" label_selected="Créer une silhouette" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
</panel>
<panel label="Peau" name="Skin">
<button label="Couleur" label_selected="Couleur" name="Skin Color" width="84"/>
@@ -80,9 +80,9 @@
<texture_picker label="Tatouages haut" name="Upper Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
<texture_picker label="Tatouages bas" name="Lower Tattoos" tool_tip="Cliquez pour sélectionner une image" width="78"/>
<button label="Créer une peau" label_selected="Créer une peau" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Cheveux" name="Hair">
<button label="Couleur" label_selected="Couleur" name="Color"/>
@@ -115,9 +115,9 @@
</text>
<texture_picker label="Texture" name="Texture" tool_tip="Cliquez pour sélectionner une image"/>
<button label="Créer des cheveux" label_selected="Créer des cheveux" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Yeux" name="Eyes">
<text name="title">
@@ -146,9 +146,9 @@
</text>
<texture_picker label="Iris" name="Iris" tool_tip="Cliquez pour sélectionner une image"/>
<button label="Créer des yeux" label_selected="Créer des yeux" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<text label="Habits" name="clothes_placeholder">
Habits
@@ -158,9 +158,9 @@
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Créer une chemise" label_selected="Créer une chemise" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
<text name="title">
[DESC]
</text>
@@ -191,9 +191,9 @@
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
<button label="Créer un pantalon" label_selected="Créer un pantalon" name="Create New"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
<text name="title">
[DESC]
</text>
@@ -248,9 +248,9 @@
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Chaussettes" name="Socks">
<text name="title">
@@ -281,9 +281,9 @@
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Veste" name="Jacket">
<text name="title">
@@ -315,9 +315,9 @@
<texture_picker label="Tissu (dessous)" name="Lower Fabric" tool_tip="Cliquez pour sélectionner une image" width="81"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="81"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Gants" name="Gloves">
<text name="title">
@@ -348,9 +348,9 @@
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Débardeur" name="Undershirt">
<text name="title">
@@ -375,15 +375,15 @@
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
- <text bottom="-470" name="Item Action Label" right="92">
+ <text name="Item Action Label">
Débardeur :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Caleçon" name="Underpants">
<text name="title">
@@ -408,15 +408,15 @@
<text name="no modify instructions">
Vous n&apos;avez pas la permission de modifier cet objet.
</text>
- <text bottom="-470" name="Item Action Label" right="92">
+ <text name="Item Action Label">
Caleçon :
</text>
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Jupe" name="Skirt">
<text name="title">
@@ -447,9 +447,9 @@
<texture_picker label="Tissu" name="Fabric" tool_tip="Cliquez pour sélectionner une image" width="74"/>
<color_swatch label="Coul./Teinte" name="Color/Tint" tool_tip="Cliquez pour ouvrir le sélecteur de couleurs" width="74"/>
<button label="Enlever" label_selected="Enlever" left="12" name="Take Off" width="82"/>
- <button label="Enregistrer" label_selected="Enregistrer" left="100" name="Save" width="82"/>
- <button label="Enregistrer sous..." label_selected="Enregistrer sous..." left="188" name="Save As" width="111"/>
- <button label="Rétablir" label_selected="Rétablir" left="305" name="Revert" width="82"/>
+ <button label="Enregistrer" label_selected="Enregistrer" name="Save"/>
+ <button label="Enregistrer sous..." label_selected="Enregistrer sous..." name="Save As"/>
+ <button label="Rétablir" label_selected="Rétablir" name="Revert"/>
</panel>
<panel label="Tatouage" name="Tattoo">
<text name="title">
diff --git a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
index 73770dce5f..4cfdfd2614 100644
--- a/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
+++ b/indra/newview/skins/default/xui/fr/menu_inventory_gear_default.xml
@@ -6,10 +6,9 @@
<menu_item_call label="Afficher les filtres" name="show_filters"/>
<menu_item_call label="Réinitialiser les filtres" name="reset_filters"/>
<menu_item_call label="Fermer tous les dossiers" name="close_folders"/>
+ <menu_item_call label="Vider la corbeille" name="empty_trash"/>
<menu_item_call label="Vider les objets trouvés" name="empty_lostnfound"/>
<menu_item_call label="Enregistrer la texture sous" name="Save Texture As"/>
- <menu_item_call label="Partager" name="Share"/>
<menu_item_call label="Trouver l&apos;original" name="Find Original"/>
<menu_item_call label="Trouver tous les liens" name="Find All Links"/>
- <menu_item_call label="Vider la corbeille" name="empty_trash"/>
</menu>
diff --git a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
index f631cf8b85..6cd9db2a5e 100644
--- a/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
+++ b/indra/newview/skins/default/xui/fr/panel_main_inventory.xml
@@ -9,20 +9,62 @@
<text name="ItemcountText">
Objets :
</text>
+ <menu_bar name="Inventory Menu">
+ <menu label="Fichier" name="File">
+ <menu_item_call label="Ouvrir" name="Open"/>
+ <menu label="Charger" name="upload">
+ <menu_item_call label="Image ([COST] L$)..." name="Upload Image"/>
+ <menu_item_call label="Son ([COST] L$)..." name="Upload Sound"/>
+ <menu_item_call label="Animation ([COST] L$)..." name="Upload Animation"/>
+ <menu_item_call label="Lot ([COST] L$ par fichier)..." name="Bulk Upload"/>
+ </menu>
+ <menu_item_call label="Nouvelle fenêtre" name="New Window"/>
+ <menu_item_call label="Afficher les filtres" name="Show Filters"/>
+ <menu_item_call label="Réinitialiser les filtres" name="Reset Current"/>
+ <menu_item_call label="Fermer tous les dossiers" name="Close All Folders"/>
+ <menu_item_call label="Vider la corbeille" name="Empty Trash"/>
+ <menu_item_call label="Vider les objets trouvés" name="Empty Lost And Found"/>
+ </menu>
+ <menu label="Créer" name="Create">
+ <menu_item_call label="Nouveau dossier" name="New Folder"/>
+ <menu_item_call label="Nouveau script" name="New Script"/>
+ <menu_item_call label="Nouvelle note" name="New Note"/>
+ <menu_item_call label="Nouveau geste" name="New Gesture"/>
+ <menu label="Nouveaux habits" name="New Clothes">
+ <menu_item_call label="Nouvelle chemise" name="New Shirt"/>
+ <menu_item_call label="Nouveau pantalon" name="New Pants"/>
+ <menu_item_call label="Nouvelles chaussures" name="New Shoes"/>
+ <menu_item_call label="Nouvelles chaussettes" name="New Socks"/>
+ <menu_item_call label="Nouvelle veste" name="New Jacket"/>
+ <menu_item_call label="Nouvelle jupe" name="New Skirt"/>
+ <menu_item_call label="Nouveaux gants" name="New Gloves"/>
+ <menu_item_call label="Nouveau débardeur" name="New Undershirt"/>
+ <menu_item_call label="Nouveau caleçon" name="New Underpants"/>
+ <menu_item_call label="Nouvel alpha" name="New Alpha"/>
+ <menu_item_call label="Nouveau tatouage" name="New Tattoo"/>
+ </menu>
+ <menu label="Nouvelles parties du corps" name="New Body Parts">
+ <menu_item_call label="Nouvelle silhouette" name="New Shape"/>
+ <menu_item_call label="Nouvelle peau" name="New Skin"/>
+ <menu_item_call label="Nouveaux cheveux" name="New Hair"/>
+ <menu_item_call label="Nouveaux yeux" name="New Eyes"/>
+ </menu>
+ </menu>
+ <menu label="Trier" name="Sort">
+ <menu_item_check label="Par nom" name="By Name"/>
+ <menu_item_check label="Par date" name="By Date"/>
+ <menu_item_check label="Dossiers toujours par nom" name="Folders Always By Name"/>
+ <menu_item_check label="Dossiers système en premier" name="System Folders To Top"/>
+ </menu>
+ </menu_bar>
<filter_editor label="Filtrer l&apos;inventaire" name="inventory search editor"/>
<tab_container name="inventory filter tabs">
<inventory_panel label="MON INVENTAIRE" name="All Items"/>
- <recent_inventory_panel label="RÉCENT" name="Recent Items"/>
+ <inventory_panel label="RÉCENT" name="Recent Items"/>
</tab_container>
- <layout_stack name="bottom_panel">
- <layout_panel name="options_gear_btn_panel">
- <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
- </layout_panel>
- <layout_panel name="add_btn_panel">
- <button name="add_btn" tool_tip="Ajouter un nouvel article"/>
- </layout_panel>
- <layout_panel name="trash_btn_panel">
- <dnd_button name="trash_btn" tool_tip="Supprimer l&apos;article sélectionné"/>
- </layout_panel>
- </layout_stack>
+ <panel name="bottom_panel">
+ <button name="options_gear_btn" tool_tip="Afficher d&apos;autres options"/>
+ <button name="add_btn" tool_tip="Ajouter un nouvel article"/>
+ <dnd_button name="trash_btn" tool_tip="Supprimer l&apos;article sélectionné"/>
+ </panel>
</panel>
diff --git a/indra/newview/skins/default/xui/fr/strings.xml b/indra/newview/skins/default/xui/fr/strings.xml
index 61659d386b..6d81df5cdb 100644
--- a/indra/newview/skins/default/xui/fr/strings.xml
+++ b/indra/newview/skins/default/xui/fr/strings.xml
@@ -2085,7 +2085,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Large
</string>
<string name="Brow Size">
- Taille
+ Taille du front
</string>
<string name="Bug Eyes">
Yeux globuleux
@@ -2235,7 +2235,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Extrémités
</string>
<string name="Egg Head">
- Forme de la tête
+ Proéminence
</string>
<string name="Eye Bags">
Cernes
@@ -2559,7 +2559,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Fente labiale
</string>
<string name="Lip Cleft Depth">
- Fente labiale
+ Prof. fente labiale
</string>
<string name="Lip Fullness">
Volume des lèvres
@@ -2643,7 +2643,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Abaisser
</string>
<string name="Lower Bridge">
- Arête plus basse
+ Arête inférieure
</string>
<string name="Lower Cheeks">
Joue inférieure
@@ -2817,10 +2817,10 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Épaisseur du nez
</string>
<string name="Nose Tip Angle">
- Bout du nez
+ Angle bout du nez
</string>
<string name="Nose Tip Shape">
- Bout du nez
+ Forme bout du nez
</string>
<string name="Nose Width">
Largeur du nez
@@ -2946,7 +2946,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Plus
</string>
<string name="Puffy Eyelids">
- Cernes
+ Paup. gonflées
</string>
<string name="Rainbow Color">
Couleur arc en ciel
@@ -3237,7 +3237,7 @@ Si ce message persiste, veuillez aller sur la page [SUPPORT_SITE].
Arête supérieure
</string>
<string name="Upper Cheeks">
- Pommette
+ Joue supérieure
</string>
<string name="Upper Chin Cleft">
Menton supérieur
diff --git a/indra/newview/skins/default/xui/it/floater_about_land.xml b/indra/newview/skins/default/xui/it/floater_about_land.xml
index bc23c2e8ff..742cdf44a5 100644
--- a/indra/newview/skins/default/xui/it/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/it/floater_about_land.xml
@@ -266,7 +266,7 @@ o suddivisa.
<text left="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
+ <text name="Autoreturn">
Restituzione automatica degli oggetti di altri residenti (minuti, 0 per disattivarla):
</text>
<line_editor name="clean other time" right="-20"/>
diff --git a/indra/newview/skins/default/xui/it/floater_customize.xml b/indra/newview/skins/default/xui/it/floater_customize.xml
index 75ddf43f65..63c26b4d73 100644
--- a/indra/newview/skins/default/xui/it/floater_customize.xml
+++ b/indra/newview/skins/default/xui/it/floater_customize.xml
@@ -1,11 +1,11 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="ASPETTO" width="551">
- <tab_container name="customize tab container" tab_min_width="120" width="549">
+<floater name="floater customize" title="ASPETTO">
+ <tab_container name="customize tab container" tab_min_width="120">
<text label="Parti del corpo" name="body_parts_placeholder">
Parti del corpo
</text>
- <panel label="Forma del corpo" left="124" name="Shape" width="389">
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <panel label="Forma del corpo" left="124" name="Shape">
+ <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/>
<button label="Corpo" label_selected="Corpo" name="Body"/>
<button label="Testa" label_selected="Testa" name="Head"/>
<button label="Occhi" label_selected="Occhi" name="Eyes"/>
@@ -40,12 +40,12 @@
<text name="no modify instructions">
Non hai il permesso di modificare questo indumento.
</text>
- <text name="Item Action Label" right="89">
+ <text name="Item Action Label">
Forma del corpo:
</text>
- <button label="Crea una nuova forma del corpo" label_selected="Crea una nuova forma del corpo" name="Create New" width="190"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
- <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
+ <button label="Salva come..." label_selected="Salva come..." name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
</panel>
<panel label="Pelle" name="Skin">
<button label="Colore della pelle" label_selected="Colore della pelle" name="Skin Color" width="115"/>
@@ -80,9 +80,9 @@
<texture_picker label="Tatuaggi: superiori" name="Upper Tattoos" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
<texture_picker label="Tatuaggi: inferiori" name="Lower Tattoos" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
<button label="Crea una nuova pelle" label_selected="Crea una nuova pelle" name="Create New"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
- <button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
+ <button label="Salva come..." label_selected="Salva come..." name="Save As"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert"/>
</panel>
<panel label="Capelli" name="Hair">
<button label="Capelli" label_selected="Colore" name="Color"/>
@@ -115,9 +115,9 @@
</text>
<texture_picker label="Texture" name="Texture" tool_tip="Clicca per scegliere un&apos;immagine"/>
<button label="Crea nuovi capelli" label_selected="Crea nuovi capelli" name="Create New"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Occhi" name="Eyes">
<text name="title">
@@ -146,9 +146,9 @@
</text>
<texture_picker label="Iride" name="Iris" tool_tip="Clicca per scegliere un&apos;immagine"/>
<button label="Crea nuovi occhi" label_selected="Crea nuovi occhi" name="Create New"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<text label="Vestiti" name="clothes_placeholder">
Abiti
@@ -158,9 +158,9 @@
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
<button label="Crea una nuova camicia" label_selected="Crea una nuova camicia" name="Create New"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
<text name="title">
[DESC]
</text>
@@ -191,9 +191,9 @@
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
<button label="Crea nuovi pantaloni" label_selected="Crea nuovi pantaloni" name="Create New"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
<text name="title">
[DESC]
</text>
@@ -248,9 +248,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Calze" name="Socks">
<text name="title">
@@ -281,9 +281,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Giacca" name="Jacket">
<text name="title">
@@ -315,9 +315,9 @@
<texture_picker label="Tessuto: inferiore" name="Lower Fabric" tool_tip="Clicca per scegliere un&apos;immagine" width="96"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button label="Togli" label_selected="Togli" name="Take Off"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Guanti" name="Gloves">
<text name="title">
@@ -348,9 +348,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Canottiera" name="Undershirt">
<text name="title">
@@ -381,9 +381,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Mutande" name="Underpants">
<text name="title">
@@ -414,9 +414,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Gonna" name="Skirt">
<text name="title">
@@ -447,9 +447,9 @@
<texture_picker label="Tessuto" name="Fabric" tool_tip="Clicca per scegliere un&apos;immagine"/>
<color_swatch label="Colore/Tinta" name="Color/Tint" tool_tip="Clicca per aprire il selettore dei colori"/>
<button font="SansSerifSmall" label="Rimuovi l&apos;indumento" label_selected="Rimuovi l&apos;indumento" name="Take Off" width="115"/>
- <button label="Salva" label_selected="Salva" left="95" name="Save" width="72"/>
+ <button label="Salva" label_selected="Salva" name="Save"/>
<button label="Salva come..." label_selected="Salva come..." left="171" name="Save As"/>
- <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" left="267" name="Revert" width="120"/>
+ <button font="SansSerifSmall" label="Annulla le modifiche" label_selected="Annulla le modifiche" name="Revert" width="120"/>
</panel>
<panel label="Tatuaggio" name="Tattoo">
<text name="title">
@@ -522,7 +522,7 @@
<button label="Ripristina" label_selected="Ripristina" name="Revert"/>
</panel>
</tab_container>
- <scroll_container left="254" name="panel_container"/>
+ <scroll_container name="panel_container"/>
<button label="Informazioni script" label_selected="Informazioni script" name="script_info" tool_tip="Mostra gli script collegati al tuo avatar"/>
<button label="Crea vestiario" label_selected="Crea vestiario" name="make_outfit_btn"/>
<button label="Annulla" label_selected="Annulla" name="Cancel"/>
diff --git a/indra/newview/skins/default/xui/ja/floater_about_land.xml b/indra/newview/skins/default/xui/ja/floater_about_land.xml
index 2f5065c05f..d23ab3565b 100644
--- a/indra/newview/skins/default/xui/ja/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/ja/floater_about_land.xml
@@ -62,9 +62,6 @@
<panel.string name="no_selection_text">
区画が選択されていません。
</panel.string>
- <panel.string name="time_stamp_template">
- [year,datetime,local] [mth,datetime,local] [day,datetime,local] [wkday,datetime,local] [hour,datetime,local]:[min,datetime,local]:[second,datetime,local]
- </panel.string>
<text name="Name:">
名前:
</text>
@@ -311,10 +308,10 @@
(なし)
</panel.string>
<panel.string name="push_restrict_text">
- プッシュ禁止
+ プッシングを制限
</panel.string>
<panel.string name="push_restrict_region_text">
- プッシュ禁止 (地域設定優先)
+ プッシングを制限 (地域設定優先)
</panel.string>
<text name="allow_label">
他の住人への許可:
@@ -340,7 +337,7 @@
土地オプション:
</text>
<check_box label="安全(ダメージなし)" name="check safe" tool_tip="チェックを入れるとこの土地でのダメージコンバットが無効になり、「安全」に設定されます。 チェックを外すとダメージコンバットが有効になります。"/>
- <check_box label="プッシュ禁止" name="PushRestrictCheck" tool_tip="スクリプトによるプッシュを禁止します。 このオプションを選択することにより、あなたの土地での破壊的行動を防ぐことができます。"/>
+ <check_box label="プッシングを制限" name="PushRestrictCheck" tool_tip="スクリプトによるプッシングを制限します。 このオプションを選択することにより、あなたの土地での破壊的行動を防ぐことができます。"/>
<check_box label="検索に区画を表示(週 L$ 30)" name="ShowDirectoryCheck" tool_tip="この区画を検索結果に表示します"/>
<combo_box name="land category with adult">
<combo_box.item label="全カテゴリ" name="item0"/>
@@ -358,7 +355,7 @@
<combo_box.item label="その他" name="item12"/>
</combo_box>
<combo_box name="land category">
- <combo_box.item label="全カテゴリ" name="item0"/>
+ <combo_box.item label="全カテゴリー" name="item0"/>
<combo_box.item label="Linden 所在地" name="item1"/>
<combo_box.item label="アート&amp;カルチャー" name="item3"/>
<combo_box.item label="ビジネス" name="item4"/>
@@ -382,7 +379,7 @@
<button label="設定" label_selected="設定" name="Set" tool_tip="訪問者の着地点の設定を行います。この区画内に立って行ってください。"/>
<button label="クリア" label_selected="クリア" name="Clear" tool_tip="着地点をクリア"/>
<text name="Teleport Routing: ">
- テレポート経路:
+ テレポート制限:
</text>
<combo_box name="landing type" tool_tip="テレポート経路 -- あなたの土地へのテレポート経路を選択">
<combo_box.item label="不可" name="Blocked"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_about_land.xml b/indra/newview/skins/default/xui/pt/floater_about_land.xml
index 252969609a..cebf03755b 100644
--- a/indra/newview/skins/default/xui/pt/floater_about_land.xml
+++ b/indra/newview/skins/default/xui/pt/floater_about_land.xml
@@ -265,7 +265,7 @@ ou sub-divididos.
<text left="214" name="selected_objects_text" width="48">
[COUNT]
</text>
- <text left="4" name="Autoreturn" width="412">
+ <text name="Autoreturn">
Devolver objetos de outros residentes (p/ desligar tecle 0)
</text>
<line_editor name="clean other time" right="-10"/>
diff --git a/indra/newview/skins/default/xui/pt/floater_customize.xml b/indra/newview/skins/default/xui/pt/floater_customize.xml
index 2a367cb24a..a9ec0b9b1f 100644
--- a/indra/newview/skins/default/xui/pt/floater_customize.xml
+++ b/indra/newview/skins/default/xui/pt/floater_customize.xml
@@ -1,6 +1,6 @@
<?xml version="1.0" encoding="utf-8" standalone="yes"?>
-<floater name="floater customize" title="APARÊNCIA" width="546">
- <tab_container name="customize tab container" tab_min_width="115" width="544">
+<floater name="floater customize" title="APARÊNCIA">
+ <tab_container name="customize tab container" tab_min_width="115">
<text label="Corpo" name="body_parts_placeholder">
Partes do corpo
</text>
diff --git a/indra/newview/viewer_manifest.py b/indra/newview/viewer_manifest.py
index 18ac10fe38..668e21c253 100755
--- a/indra/newview/viewer_manifest.py
+++ b/indra/newview/viewer_manifest.py
@@ -332,6 +332,12 @@ class WindowsManifest(ViewerManifest):
self.path("media_plugin_webkit.dll")
self.end_prefix()
+ # winmm.dll shim
+ if self.prefix(src='../media_plugins/winmmshim/%s' % self.args['configuration'], dst="llplugin"):
+ self.path("winmm.dll")
+ self.end_prefix()
+
+
if self.args['configuration'].lower() == 'debug':
if self.prefix(src=os.path.join(os.pardir, os.pardir, 'libraries', 'i686-win32', 'lib', 'debug'),
dst="llplugin"):
@@ -639,10 +645,14 @@ class DarwinManifest(ViewerManifest):
self.path("../mac_crash_logger/" + self.args['configuration'] + "/mac-crash-logger.app", "mac-crash-logger.app")
self.path("../mac_updater/" + self.args['configuration'] + "/mac-updater.app", "mac-updater.app")
+ # plugin launcher
+ self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin.app", "SLPlugin.app")
+
# our apps dependencies on shared libs
if dylibs["llcommon"]:
mac_crash_logger_res_path = self.dst_path_of("mac-crash-logger.app/Contents/Resources")
mac_updater_res_path = self.dst_path_of("mac-updater.app/Contents/Resources")
+ slplugin_res_path = self.dst_path_of("SLPlugin.app/Contents/Resources")
for libfile in ("libllcommon.dylib",
"libapr-1.0.3.7.dylib",
"libaprutil-1.0.3.8.dylib",
@@ -656,9 +666,10 @@ class DarwinManifest(ViewerManifest):
{'target': target_lib,
'link' : os.path.join(mac_updater_res_path, libfile)}
)
-
- # plugin launcher
- self.path("../llplugin/slplugin/" + self.args['configuration'] + "/SLPlugin", "SLPlugin")
+ self.run_command("ln -sf %(target)r %(link)r" %
+ {'target': target_lib,
+ 'link' : os.path.join(slplugin_res_path, libfile)}
+ )
# plugins
if self.prefix(src="", dst="llplugin"):